让问答机器人真正“听懂”你的前后文
在许多问答应用中,用户真正渴望的是流畅自然的对话体验——不是机械的一问一答,而是像与真人交流那样,能够理解整个对话的来龙去脉。这背后的一项关键技术升级,就是让RAG系统具备对话能力。
传统的RAG工作模式较为直接:用户输入问题→检索文档→生成答案。但在多轮对话场景下,这条链路必须引入一个关键变量——历史消息。当前的主流做法分为两类:一类是“链”(Chain),仅执行一次检索;另一类是“智能体”(Agent),让模型根据实际需求多次检索,直至找到合适的答案。
消息序列:对话状态的“记事本”
在对话式应用中,每一轮交互的消息类型都会被精确记录:用户的提问(HumanMessage)、助手的回复(AIMessage),以及工具调用返回的结果(ToolMessage)。整段对话形成一条消息链条,模型不仅能清楚“谁说了什么”,还能结合工具调用的反馈,生成更合理的回复。这才是真正意义上的上下文理解。
自动补全:让模糊提问不再尴尬
多轮对话中,用户的提问往往比较简略。例如:
用户:耐克在美国有多少个配送中心?
AI:耐克在美国有8个配送中心。
用户:在美国之外有哪些?
此时,模型会自动将用户的模糊问题改写成完整的检索查询,变成“耐克在美国之外有哪些配送中心?”——即使没有说全,系统也能自动补全上下文。这一点在实际应用中至关重要,直接决定了对话的流畅度。
架构设计:灵活节点的组合
应用的核心流程可拆分为三个节点:用户输入节点(决定是检索还是直接回复)、检索工具节点(执行向量数据库查询)、响应生成节点(基于检索结果生成答案)。这种架构的优势在于灵活性:当用户打招呼时可以直接回应,提出问题时再触发检索与推理,而无需每次都访问数据库。
记忆机制:让机器人“记住”你
要支持多轮对话,应用必须具备记忆能力。这里采用LangGraph的持久化机制:每一轮消息都会追加到状态中,通过设置thread_id,不同会话线程可以独立保存。这意味着用户随时可以继续之前的对话,而机器人依然认得上下文。
实际效果如何?
来看几个典型场景:
- 输入“你好” → 系统直接回应,不检索
- 输入“耐克,包括匡威在美国有多少个配送中心?” → 检索并回答
- 输入“在美国之外有哪些?” → 自动补全查询,基于历史对话给出答案
这让应用从“单问单答”的工具,进化为一个真正能对话的助手。从体验上看,这是一种本质的跃迁。
总结
对话式RAG的核心要点其实只有三个:用消息序列管理对话状态,借助工具调用让模型自动生成检索查询,利用持久化机制让应用拥有“记忆”。
当然,这并非终点。未来值得探索的方向包括:在对话中融合更复杂的多工具协作,甚至让智能体像人一样自主选择信息来源。这些并不是遥不可及的设想——它们正在成为现实。
