64 lines
3.7 KiB
Python
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()
|