如何解决ChatGPT+LangChain实现PDF聊天机器人的上下文丢失问题
问题分析
你的核心问题是没有在API请求中携带历史对话上下文。每次调用ChatGPT API时,模型只会处理当前传入的内容,不会自动留存之前的对话记录,因此无法理解“它们是什么颜色”这类指代性问题。
修复方案
要解决这个问题,你需要维护一个对话历史列表,每次用户提问时,把历史对话(包括之前的用户问题和AI回复)与当前问题、PDF上下文一起传入API请求。
具体实现步骤
- 初始化一个符合OpenAI API格式的对话历史列表,开头加入系统提示词明确助手定位
- 每次用户发送新问题,将用户消息添加到对话历史
- 调用API时,把整个对话历史作为
messages参数传入 - 收到AI回复后,将回复也添加到对话历史,用于后续上下文关联
代码示例(Python)
假设你之前使用openai.ChatCompletion.create调用API,修改后的关键代码如下:
import openai # 初始化对话历史,系统提示词定义助手行为 conversation_history = [ {"role": "system", "content": "你是基于提供的PDF文档内容回答问题的助手,需结合文档信息与对话上下文回复。"} ] def process_user_question(user_question, relevant_pdf_content): global conversation_history # 组合PDF相关内容与用户问题,添加到对话历史 user_msg = f"参考PDF内容:{relevant_pdf_content}\n用户问题:{user_question}" conversation_history.append({"role": "user", "content": user_msg}) # 调用ChatGPT API response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=conversation_history ) assistant_reply = response.choices[0].message['content'] # 将AI回复存入对话历史 conversation_history.append({"role": "assistant", "content": assistant_reply}) return assistant_reply
额外优化建议
- 控制对话历史长度:避免Token消耗过高,可定期清理早期对话,或只保留最近3-5轮有效对话
- 优化PDF内容传入:通过向量检索匹配当前问题相关的PDF片段,而非每次传入全部文档内容,进一步减少Token使用
内容的提问来源于stack exchange,提问作者Ali Q
相关产品推荐
相关产品推荐

