51 lines
3.0 KiB
Python
51 lines
3.0 KiB
Python
"""Exercise real retrieval/injection with synthetic archive data and mocked LLMs."""
|
|
import json
|
|
from unittest import TestCase, mock
|
|
import httpx
|
|
import test_knowledge as fixtures
|
|
|
|
class KnowledgeContextAudit(TestCase):
|
|
setUp = fixtures.KnowledgeGatewayTest.setUp
|
|
tearDown = fixtures.KnowledgeGatewayTest.tearDown
|
|
seed = fixtures.KnowledgeGatewayTest.seed
|
|
_post_then_drain = fixtures.KnowledgeGatewayTest._post_then_drain
|
|
|
|
def request(self, messages, customer_text=''):
|
|
item = self.seed()
|
|
captured = []
|
|
def upstream(request):
|
|
data = json.loads(request.content)
|
|
captured.append(data)
|
|
return httpx.Response(200, json={'choices':[{'message':{'content':'请先确认就诊日期和科室。'}}]})
|
|
response, _ = self._post_then_drain(upstream, body={'messages':messages,'customer_text':customer_text,'task_id':'context-audit'})
|
|
self.assertEqual(response.status_code,200,response.text)
|
|
return item,response.json(),captured
|
|
|
|
def test_multimodal_messages_only_retrieves_and_preserves_image(self):
|
|
image = {'type':'image_url','image_url':{'url':'data:image/png;base64,AUDIT_IMAGE'}}
|
|
item, response, captured = self.request([{'role':'user','content':[image,{'type':'text','text':'预约挂号需要什么材料?'}]}])
|
|
self.assertEqual([hit['id'] for hit in response['knowledge']['hits']],[item['id']])
|
|
self.assertIn('已审核知识参考',json.dumps(captured[0],ensure_ascii=False))
|
|
self.assertIn('AUDIT_IMAGE',json.dumps(captured[0]))
|
|
|
|
def test_followup_uses_recent_topic_for_retrieval_and_keeps_history(self):
|
|
messages=[{'role':'system','content':'你是测试客服。'},
|
|
{'role':'user','content':'预约挂号需要什么材料?'},
|
|
{'role':'assistant','content':'请先确认就诊日期和科室。'},
|
|
{'role':'user','content':'那需要提前准备什么?'}]
|
|
item,response,captured=self.request(messages,'那需要提前准备什么?')
|
|
self.assertEqual([hit['id'] for hit in response['knowledge']['hits']],[item['id']])
|
|
self.assertEqual(captured[0]['messages'][:3],messages[:3])
|
|
|
|
def test_full_current_question_is_prioritized_over_long_preamble(self):
|
|
messages=[{'role':'user','content':'旧说明文字。'*600+'\n客户 10:01\n预约挂号需要什么材料?'}]
|
|
item,response,_=self.request(messages)
|
|
self.assertEqual([hit['id'] for hit in response['knowledge']['hits']],[item['id']])
|
|
|
|
def test_new_self_contained_topic_does_not_inherit_old_knowledge(self):
|
|
messages=[{'role':'user','content':'预约挂号需要什么材料?'},
|
|
{'role':'assistant','content':'请先确认就诊日期和科室。'},
|
|
{'role':'user','content':'请问蓝牙耳机怎么连接电脑?'}]
|
|
_,response,_=self.request(messages,'请问蓝牙耳机怎么连接电脑?')
|
|
self.assertEqual(response['knowledge']['hits'],[])
|