feat: 完成 issue #83 [树脂] 树脂 RAG 知识库导出
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""树脂 RAG 知识库导出测试(issue #83)。
|
||||
|
||||
覆盖:
|
||||
1. kb.resin.template.yaml 清单声明的 9 篇文档全部导出且非空(validate_export);
|
||||
2. resin_kb_loader 按标题返回文本(含 GB/T 标题规范化);
|
||||
3. loader 可直接用于 RagKnowledgeBase(from_template_config + loader);
|
||||
4. 未知标题 → 空串。
|
||||
"""
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
_RAGKB_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
sys.path.insert(0, _RAGKB_DIR)
|
||||
from loader import ( # noqa: E402
|
||||
DEFAULT_KB_CONFIG,
|
||||
resin_kb_loader,
|
||||
validate_export,
|
||||
)
|
||||
|
||||
|
||||
class TestExportCompleteness(unittest.TestCase):
|
||||
"""导出完整性:清单 ↔ 文档文件一致。"""
|
||||
|
||||
def test_all_listed_documents_exported(self):
|
||||
problems = validate_export()
|
||||
self.assertEqual(problems, [], f"导出不完整: {problems}")
|
||||
|
||||
def test_document_count(self):
|
||||
docs = os.listdir(os.path.join(_RAGKB_DIR, "documents"))
|
||||
self.assertEqual(len(docs), 8)
|
||||
|
||||
|
||||
class TestLoader(unittest.TestCase):
|
||||
"""加载器行为。"""
|
||||
|
||||
def test_process_doc(self):
|
||||
text = resin_kb_loader("吸附树脂合成工艺规范")
|
||||
self.assertIn("悬浮聚合法", text)
|
||||
|
||||
def test_gbt_title_normalization(self):
|
||||
# 标题含 / → 文件名用 -(GB/T 5475 → GB-T-5475)
|
||||
text = resin_kb_loader("GB/T 5475 离子交换树脂取样方法")
|
||||
self.assertIn("取样", text)
|
||||
|
||||
def test_unknown_title_empty(self):
|
||||
self.assertEqual(resin_kb_loader("不存在的文档"), "")
|
||||
|
||||
def test_kb_config_loads(self):
|
||||
import yaml
|
||||
with open(DEFAULT_KB_CONFIG, "r", encoding="utf-8") as fh:
|
||||
raw = yaml.safe_load(fh)
|
||||
self.assertEqual(raw["template"], "resin")
|
||||
|
||||
|
||||
class TestRagKbIntegration(unittest.TestCase):
|
||||
"""与内核 rag-kb 集成(loader 直接可用)。"""
|
||||
|
||||
def test_build_kb_from_export(self):
|
||||
import importlib.util
|
||||
# 挂载 core/rag-kb(目录含连字符)
|
||||
repo_root = os.path.dirname(os.path.dirname(os.path.dirname(
|
||||
os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
|
||||
rag_kb_dir = os.path.join(repo_root, "core", "rag-kb")
|
||||
if "rag_kb" not in sys.modules:
|
||||
spec = importlib.util.spec_from_file_location(
|
||||
"rag_kb", os.path.join(rag_kb_dir, "__init__.py"),
|
||||
submodule_search_locations=[rag_kb_dir])
|
||||
_kb = importlib.util.module_from_spec(spec)
|
||||
sys.modules["rag_kb"] = _kb
|
||||
spec.loader.exec_module(_kb)
|
||||
|
||||
from rag_kb import RagKnowledgeBase, load_kb_config # noqa: E402
|
||||
|
||||
kb = RagKnowledgeBase.from_template_config(
|
||||
load_kb_config(DEFAULT_KB_CONFIG), loader=resin_kb_loader)
|
||||
self.assertGreater(kb.doc_count, 0)
|
||||
hits = kb.search("交换容量测定", top_k=3, categories=None)
|
||||
self.assertGreater(len(hits), 0)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user