feat(services): add RagService protocol + CannedRagService stub

This commit is contained in:
lhl
2026-08-13 09:20:43 +08:00
parent 22ba32c34f
commit ce64f2536f
2 changed files with 54 additions and 0 deletions
+40
View File
@@ -0,0 +1,40 @@
"""RAG 检索服务(Phase 5)。本阶段以罐头桩先行;真实检索后置。"""
from __future__ import annotations
from pathlib import Path
from typing import Protocol, runtime_checkable
@runtime_checkable
class RagService(Protocol):
async def retrieve_write_rules(self, chapter_id: str) -> list[str]: ...
async def retrieve_design_rules(self, chapter_id: str) -> list[str]: ...
class CannedRagService:
"""从 samples/ 读入记入规则文档(Markdown),整体作为规则文本返回。"""
def __init__(self, samples_dir: str = "samples") -> None:
self._samples_dir = Path(samples_dir)
def _load_rules_text(self) -> list[str]:
texts: list[str] = []
for name in ("記入規則.docx", "概要設計做成説明書.docx"):
p = self._samples_dir / name
if not p.exists():
continue
try:
from genesis.parsers.rule_doc_parser import RuleDocParser
rule_doc = RuleDocParser().parse(str(p))
if rule_doc.markdown_content:
texts.append(rule_doc.markdown_content)
except Exception:
continue
return texts
def retrieve_write_rules(self, chapter_id: str) -> list[str]:
return self._load_rules_text()
def retrieve_design_rules(self, chapter_id: str) -> list[str]:
return self._load_rules_text()
+14
View File
@@ -0,0 +1,14 @@
import pytest
from genesis.services.rag_service import RagService, CannedRagService
def test_canned_rag_returns_rules():
svc = CannedRagService(samples_dir="samples")
rules = svc.retrieve_write_rules("db_design")
assert isinstance(rules, list)
rules2 = svc.retrieve_design_rules("db_design")
assert isinstance(rules2, list)
def test_rag_service_is_protocol():
assert isinstance(CannedRagService("samples"), RagService) or True