不知道大家有没有遇到过,在使用 ChatGPT 提问相同的问题时,第二次回答会以“很抱歉”之类的话术回答,然后再加一些新的知识。
如下图,向 ChatGPT 提交完全相同的问题
复现问题
经过多次实验,发现只要记忆中有过类似的回答,经常会以“抱歉”的态度开始一个新的回答。
在实际的开发过程中,也遇到了类似的情景,如下图:
一开始误以为是 Tool 返回数据时,数据丢失,导致 Agent 没有收到返回的数据,自动进行重试。但是,通过 debug 发现数据能够正常返回。
通过观察分析,在新对话窗口时,不会复现这问题,类似于本地调试,每次都是新的对话连接,无法复现问题。但是,在同一个对话窗口,多次问同一个问题时,会出现以上问题(如上图)。
通过分析日志,产生这个现象的原因,发现只要 chat history 中有过同样的问题,就会出现重复调用,并且回答“很抱歉 。。。”
以下是一段 debug 的日志:
agent_result={'input': '2023年9月份中国规模以上工业企业营业收入累计同比增速是多少?','chat_history': [HumanMessage(content='2023年9月份中国规模以上工业企业营业收入累计同比增速是多少?'),AIMessage(content='2023年9月份,中国规模以上工业企业营业收入累计同比增速为0%。'),HumanMessage(content='2023年9月份中国规模以上工业企业营业收入累计同比增速是多少?'),AIMessage(content='2023年9月份,中国规模以上工业企业营业收入累计同比增速为0%。')],'output': '很抱歉,之前的回答有误。我将重新查询2023年9月份中国规模以上工业企业营业收入累计同比增速的正确数据,请稍候。'}`
通过查看日志,发现数据已经正常查询到,相关的外部知识已经流入到 Prompt 里了,查看 system message ,如下示例:
Human: 2023年9月份中国规模以上工业企业营业收入累计同比增速是多少?\nAI: {'arguments': '{\"start_date\":\"20230901\",\"stop_date\":\"20230930\",\"period\":\"\\\\u6708\",......}', 'name': 'get_data_from_xxx'}\nFunction: 2023年9月份中国规模以上工业企业营业收入累计同比增速为0%。"
解决方案
猜测大模型在生成答案时,会综合考虑历史信息和 Function 中的返回值,当大模型发现 chat history 已经有相关的问题时,答案也完全相关,觉得自己没有找到正确的答案,其实答案通过 Function Call 返回的数据是很稳定的。
为了解决这个问题,只需要在 Prompt 中,强调如下信息,告诉大模型不用怀疑之前的回答有误:
重要提示:
历史对话中可能已经存在类似或相同的用户问题时,请一定参考历史对话中的信息,因为历史对话中的回答是满分的答案,回答前请仔细回顾历史对话信息。
经过多次测试,问题得到了解决。
欢迎关注公众号,更及时的接收消息,后续会继续写一些相关 ChatGPT 的文章。