dp-zp-agent/tools/answer_evaluation/checked_generation.py

57 lines
2.9 KiB
Python

"""One bounded corrective request based solely on retrieval evidence."""
import json
from .answer_format import parse_answer, Answer
from .context_policy import answer_context_issues
from .render_answer import render_graph_answer
def generate_checked_answer(question: str, context: dict, prompt: str, complete) -> dict:
messages=[{'role':'system','content':prompt},{'role':'user','content':json.dumps(
{'question':question,'graph_context':context},ensure_ascii=False)}]
result={'attempts':[],'accepted_for_delivery':False}
for number in range(2):
record={};text=''
try:
response=complete(messages)
result['response']=response;record['response']=response
text=response['choices'][0]['message']['content'].strip()
except Exception as error:
result['error']=f'{type(error).__name__}: {str(error)[:500]}'
result['attempts'].append(record)
return result
result['attempts'].append(record)
try:
answer,normalized=parse_answer(text)
record['answer']=answer;record['format_normalized']=normalized
except (ValueError,TypeError) as error:
record['format_error']=type(error).__name__
if number==1:
result['error']='InvalidAnswerFormat: two invalid JSON/schema responses'
return result
feedback='Vráť jediný platný JSON objekt podľa schémy, bez zmeny faktov z pôvodného kontextu. Schéma: '+json.dumps(Answer.model_json_schema(),ensure_ascii=False)
else:
issues=answer_context_issues(answer,context,check_text=False)
record['context_issues']=issues
result['answer']=answer
if not issues:
rendered = render_graph_answer(answer, context)
delivery_issues = answer_context_issues(rendered, context)
if delivery_issues:
issues = delivery_issues
record['context_issues'] = issues
else:
record['rendered_answer'] = rendered
result['model_answer'] = answer
result['answer'] = rendered
result['accepted_for_delivery']=True
return result
if number==1:
result['context_rejected']=True
return result
feedback=('Odpoveď porušila pravidlá dodaného kontextu: '+', '.join(issues)+'. '
'Oprav jediný JSON objekt výhradne z pôvodných podkladov. Použi iba source_urls zo sources. '
'Typ práce nie je keyword. answer_candidates dokladajú spojenie požadovaného názvu alebo roku a tagu cez tú istú osobu. '
'Answer ponechaj prázdny; text aj upozornenie zostaví aplikácia.')
messages += [{'role':'assistant','content':text},{'role':'user','content':feedback}]
return result