fix(chat): 拦截无依据的非业务问题
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import pytest
|
||||
|
||||
from review_agent.models import KnowledgeBaseDocument
|
||||
from review_agent.services import build_knowledge_context
|
||||
from review_agent.services import build_knowledge_context, send_message, stream_message
|
||||
|
||||
|
||||
pytestmark = pytest.mark.django_db
|
||||
@@ -57,3 +57,67 @@ def test_build_knowledge_context_uses_full_document_when_name_matches(settings,
|
||||
assert "全文材料" in context
|
||||
assert "来源:用户知识库/孙之烨-260510.txt" in context
|
||||
assert "完整经历:曾组织技术分享并带队参加竞赛" in context
|
||||
|
||||
|
||||
def test_send_message_refuses_out_of_scope_answer_without_knowledge_context(monkeypatch, django_user_model):
|
||||
from review_agent.models import Conversation
|
||||
|
||||
user = django_user_model.objects.create_user(username="owner", password="pass")
|
||||
conversation = Conversation.objects.create(user=user, title="会话")
|
||||
monkeypatch.setattr(
|
||||
"review_agent.services.search_knowledge_base",
|
||||
lambda query, n_results=5: {"query": query, "results": [], "error_message": ""},
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
"review_agent.services.generate_reply",
|
||||
lambda *args, **kwargs: pytest.fail("out-of-scope answer without knowledge context must not call LLM"),
|
||||
)
|
||||
|
||||
_, assistant_message = send_message(conversation, "孙之烨是谁")
|
||||
|
||||
assert "没有在当前启用的知识库材料中找到" in assistant_message.content
|
||||
assert "与当前主营业务无关" in assistant_message.content
|
||||
|
||||
|
||||
def test_stream_message_refuses_out_of_scope_answer_without_knowledge_context(monkeypatch, django_user_model):
|
||||
from review_agent.models import Conversation
|
||||
|
||||
user = django_user_model.objects.create_user(username="owner", password="pass")
|
||||
conversation = Conversation.objects.create(user=user, title="会话")
|
||||
monkeypatch.setattr(
|
||||
"review_agent.services.search_knowledge_base",
|
||||
lambda query, n_results=5: {"query": query, "results": [], "error_message": ""},
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
"review_agent.services.stream_reply",
|
||||
lambda *args, **kwargs: pytest.fail("out-of-scope answer without knowledge context must not call streaming LLM"),
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
"review_agent.services.generate_reply",
|
||||
lambda *args, **kwargs: pytest.fail("out-of-scope answer without knowledge context must not call fallback LLM"),
|
||||
)
|
||||
|
||||
frames = list(stream_message(conversation, "给我一份红烧肉菜谱"))
|
||||
|
||||
assert any("没有在当前启用的知识库材料中找到" in frame for frame in frames)
|
||||
assert any("与当前主营业务无关" in frame for frame in frames)
|
||||
assert any("done" in frame for frame in frames)
|
||||
|
||||
|
||||
def test_business_question_without_knowledge_context_can_use_llm(monkeypatch, django_user_model):
|
||||
from review_agent.models import Conversation
|
||||
|
||||
user = django_user_model.objects.create_user(username="owner", password="pass")
|
||||
conversation = Conversation.objects.create(user=user, title="会话")
|
||||
monkeypatch.setattr(
|
||||
"review_agent.services.search_knowledge_base",
|
||||
lambda query, n_results=5: {"query": query, "results": [], "error_message": ""},
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
"review_agent.services.generate_reply",
|
||||
lambda *args, **kwargs: "注册检验报告通常用于证明产品性能符合要求。",
|
||||
)
|
||||
|
||||
_, assistant_message = send_message(conversation, "注册检验报告有什么作用")
|
||||
|
||||
assert "注册检验报告" in assistant_message.content
|
||||
|
||||
Reference in New Issue
Block a user