Files
kefu/deploy/recognition-audit-20260916/live_knowledge_probe.py
T
2026-09-21 10:34:06 +08:00

64 lines
3.7 KiB
Python

"""Real model response to knowledge retrieved from an isolated synthetic library."""
import json
import os
import sys
import tempfile
import uuid
from pathlib import Path
from unittest import mock
from urllib import request,error
root=Path(sys.argv[1]).resolve()
sys.path.insert(0,str(root))
import backend_client
settings=backend_client.load_settings()
token=backend_client.desktop_access_token()
import runtime_paths
os.environ['KNOWLEDGE_QDRANT_URL']=''
os.environ['KNOWLEDGE_EMBEDDING_URL']=''
os.environ['KNOWLEDGE_EMBEDDING_MODEL']=''
nonce='KREF-'+uuid.uuid4().hex[:12]
with tempfile.TemporaryDirectory(prefix='live-rag-audit-') as temp, mock.patch.object(runtime_paths,'application_data_dir',return_value=Path(temp)):
import test_knowledge as fixtures
from knowledge_retriever import KnowledgeRetriever,inject_references
import model_protocol
fixture=fixtures.KnowledgeGatewayTest('test_reply_receives_evidence_and_records_version')
fixture.setUp()
try:
item=fixture.seed()
tenant=fixture.desktop_account['tenant_id']
item['answer']='本条仅用于合成测试。预约挂号资料指引码是 '+nonce+'。请确认就诊日期和科室。'
item['conditions']='仅适用于本次合成接口验收,不能用于真实客户。'
item=fixture.store.save(tenant,item['id'],item,fixture.actor,'')
fixture.store.transition(tenant,item['id'],item['revision'],'approve',fixture.actor,'',True)
fixture.store.publish(tenant,item['id'],item['revision'],fixture.actor,'')
retrieval=KnowledgeRetriever(fixture.store).search(tenant,'预约挂号资料指引码')
assert retrieval['hits']
messages=inject_references([
{'role':'system','content':'你是合成测试助手,只回答本次测试问题。'},
{'role':'user','content':'这是合成接口验收。预约挂号的资料指引码是什么?仅返回知识参考里的完整指引码。'}],retrieval['hits'])
# Existing production Dify drops history/system: preformat only this test
# to evaluate the fixed adapter without modifying production services.
messages=[{'role':'user','content':model_protocol.dify_query(messages)}]
payload={'messages':messages,'customer_text':'合成知识引用验收','purpose':'chat','task_id':'recognition-rag-audit-'+uuid.uuid4().hex}
req=request.Request(settings['gateway']['url'],data=json.dumps(payload,ensure_ascii=False).encode(),
headers={'Authorization':'Bearer '+token,'Content-Type':'application/json'},method='POST')
result={'synthetic_only':True,'isolated_local_library':True,'production_library_unchanged':True,
'local_retrieval_hits':len(retrieval['hits']),'expected':nonce,'task_id':payload['task_id']}
try:
with request.urlopen(req,timeout=65) as response:
data=json.load(response)
result.update(http_status=response.status,chosen=data.get('chosen'),
reply_matches_reference=nonce in str(data.get('reply') or ''),
reply_excerpt=str(data.get('reply') or '')[:500],
production_knowledge=data.get('knowledge'),
candidates=[{'provider':row.get('provider'),'matches_reference':nonce in str(row.get('text') or '')} for row in data.get('candidates',[])])
except error.HTTPError as exc:
result.update(http_status=exc.code,error_type=type(exc).__name__)
except Exception as exc:
result.update(error_type=type(exc).__name__)
Path(sys.argv[2]).write_text(json.dumps(result,ensure_ascii=False,indent=2),encoding='utf-8')
print(json.dumps(result,ensure_ascii=False))
finally:
fixture.tearDown()