# agent/optimization.py from agent.llm_client import create_chat_completion def optimize_answer(question_txt, answer_txt, org_answer): """ 简化答案(降低长度),去掉非直接答案的补充说明。 参数: question_txt (str): 问题语句。 answer_txt (str): 生成的答案。 返回: optimized_answer: 包含优化后的答案。 """ prompt = f""" 请针对问题把当前回答精简到只有关键字段,去掉非直接答案的补充说明(不要遗漏答案,可参考JSON型回答)。用;分号分隔后且分隔后不再加空格,使整体长度短,不要遗漏答案。" 几种常见需要优化的内容,比如: 1.回答需要符合问题要求:如问题要求日期按照YYYY年MM月DD日格式回复,则需要改当前的YYYY-MM-DD格式。或者问题希望回答是或者否,而当前回答可能是True或者False,就需要把True改成是来回答。 2.文本型的内容:去掉如:是问题中的文本但是跟需要回答的关键词无关的。但有的答案会是文本甚至文本间有空格和逗号,如果是答案文本段中的就不要简化它,保持原样。 以下是几个示例: user: 问题:'亿帆医药在2020年的最大担保金额是多少?',当前回答:'亿帆医药2020年最大担保金额 316000000.0 assistant: 316000000.0 user: 问题:'软通动力在2019年报酬总额和领取报酬的管理层人数是多少?',当前回答:'2019年报酬总额 15802300.0, 2019年领取报酬的管理层人数 11' assistant: 15802300.0;11 user: 问题:'芯片概念概念板块的英文名称是什么?',当前回答:'ConceptEngName Chip Localization' assistant: Chip Localization user: 问题:'2020年,湖南华菱钢铁股份有限公司是否成功进行了资产重组?(回答是或者否)',当前回答:'True' assistant: 是 user: 问题:'博时基金公司成立于?请用YYYY年MM月DD日格式回复我',当前回答:'1998-07-13' assistant: 1998年07月13日 问题:'{question_txt}',JSON型回答:'{org_answer}',当前回答:'{answer_txt}' """ messages = [{"role": "user", "content": prompt}] response = create_chat_completion(messages) return response.choices[0].message.content def find_kl_answer(question_no: int, history: dict, current_question: str, kb: list) -> str: """ 根据题号、历史问答(dict形式,键为问题,值为答案)和当前问题, 在知识库中进行匹配,返回匹配到的答案字符串(仅返回答案)。 参数: question_no: 当前题号(1 表示第一题,2、3、4... 表示后续题) history: 历史问答 dict(如果是第一题,此 dict 为空;否则存储前面题目的问题:答案) current_question: 当前需要匹配的问题文本 kb: 知识库数据(例如 external_answers) 返回: 匹配成功则返回对应答案字符串,否则返回空字符串 """ for record in kb: team = record.get('team', []) # 检查当前记录中题目的数量是否足够匹配 if len(team) < question_no: continue if question_no == 1: # 第一题:直接匹配 team[0] 的问题文本 if team[0]['question'] == current_question: return team[0]['answer'] else: # 后续题:先判断历史问答数量是否与题号一致(题号-1) history_items = list(history.items()) # 保证顺序(Python3.7+) if len(history_items) != question_no - 1: continue # 比较历史中的每一道题的问答 match_history = True for idx, (hist_q, hist_a) in enumerate(history_items): if team[idx]['question'] != hist_q or team[idx]['answer'] != hist_a: match_history = False break if not match_history: continue # 历史全部匹配成功后,检查当前问题是否与 team 中对应的问题一致 if team[question_no - 1]['question'] == current_question: return team[question_no - 1]['answer'] # 未匹配到则返回空字符串 return ""