主要变更: - 移除Hermes智能体及相关回调服务 - 新增知识库RAG、同步、调度、规范化和索引任务服务 - 重构orchestrator服务,增强运行时聊天功能 - 更新前端聊天、政策制度、设置等页面样式和逻辑 - 更新expense_claims和document_intelligence服务 - 删除llm_wiki相关服务和测试文件 - 更新docker-compose配置和启动脚本
96 lines
3.4 KiB
Python
96 lines
3.4 KiB
Python
from __future__ import annotations
|
|
|
|
from app.services import knowledge_rag as knowledge_rag_module
|
|
from app.services.knowledge_rag import KnowledgeRagService
|
|
|
|
|
|
def test_build_hits_prioritizes_structured_table_evidence_for_standard_queries() -> None:
|
|
hits = KnowledgeRagService._build_hits_from_query_data(
|
|
query="住宿费标准是多少?",
|
|
chunks=[
|
|
{
|
|
"chunk_id": "plain-1",
|
|
"file_path": "/tmp/doc-1__差旅制度.md",
|
|
"content": "住宿费说明文字,提到了出差和报销要求,但没有清晰表格。",
|
|
},
|
|
{
|
|
"chunk_id": "table-1",
|
|
"file_path": "/tmp/doc-1__差旅制度.md",
|
|
"content": "# 结构化表格补充\n\n| 城市 | 住宿费标准 |\n| 北京 | 500 |",
|
|
},
|
|
],
|
|
entities=[],
|
|
limit=2,
|
|
)
|
|
|
|
assert [item["candidate_id"] for item in hits] == ["table-1", "plain-1"]
|
|
|
|
|
|
def test_build_hits_boosts_query_term_matches() -> None:
|
|
hits = KnowledgeRagService._build_hits_from_query_data(
|
|
query="招待费报销标准",
|
|
chunks=[
|
|
{
|
|
"chunk_id": "travel-1",
|
|
"file_path": "/tmp/doc-1__费用制度.md",
|
|
"content": "差旅费包含交通费、住宿费和餐补标准。",
|
|
},
|
|
{
|
|
"chunk_id": "ent-1",
|
|
"file_path": "/tmp/doc-1__费用制度.md",
|
|
"content": "业务招待费报销标准:应结合客户接待场景、人数和审批要求执行。",
|
|
},
|
|
],
|
|
entities=[],
|
|
limit=2,
|
|
)
|
|
|
|
assert [item["candidate_id"] for item in hits] == ["ent-1", "travel-1"]
|
|
|
|
|
|
def test_build_hits_prioritizes_answer_clue_appendix_for_rule_queries() -> None:
|
|
hits = KnowledgeRagService._build_hits_from_query_data(
|
|
query="报销时限是多少?",
|
|
chunks=[
|
|
{
|
|
"chunk_id": "plain-1",
|
|
"file_path": "/tmp/doc-1__费用制度.md",
|
|
"content": "本制度用于规范报销流程,员工应遵守公司审批要求。",
|
|
},
|
|
{
|
|
"chunk_id": "clue-1",
|
|
"file_path": "/tmp/doc-1__费用制度.md",
|
|
"content": (
|
|
"# 问答线索补充\n\n"
|
|
"- 第二章 报销时限:费用发生后 30 日内提交申请。\n"
|
|
"- 第二章 报销时限:超过 30 日需补充审批说明。"
|
|
),
|
|
},
|
|
],
|
|
entities=[],
|
|
limit=2,
|
|
)
|
|
|
|
assert [item["candidate_id"] for item in hits] == ["clue-1", "plain-1"]
|
|
|
|
|
|
def test_resolve_default_qdrant_url_prefers_container_host(monkeypatch) -> None:
|
|
monkeypatch.setattr(
|
|
knowledge_rag_module.socket,
|
|
"getaddrinfo",
|
|
lambda hostname, port: [("family", "type", "proto", "canonname", ("172.21.0.2", 0))]
|
|
if hostname == "qdrant"
|
|
else [],
|
|
)
|
|
|
|
assert knowledge_rag_module._resolve_default_qdrant_url() == "http://qdrant:6333"
|
|
|
|
|
|
def test_resolve_default_qdrant_url_falls_back_to_loopback(monkeypatch) -> None:
|
|
def raise_lookup_error(_hostname, _port):
|
|
raise OSError("lookup failed")
|
|
|
|
monkeypatch.setattr(knowledge_rag_module.socket, "getaddrinfo", raise_lookup_error)
|
|
|
|
assert knowledge_rag_module._resolve_default_qdrant_url() == "http://127.0.0.1:6333"
|