1. 从线性流程到状态图:RAG系统的进阶之路
在构建RAG(检索增强生成)系统时,大多数初级开发者都会从最简单的线性流程开始:用户提问→检索文档→生成回答。这种模式确实能快速验证概念,但我在实际企业级应用中发现了它的三大致命缺陷:
-
无效检索问题:当用户输入"你好"这类问候语时,系统仍会机械地执行知识库检索,既浪费计算资源,又影响响应速度。根据我的日志分析,约23%的对话请求属于这类"无效检索"场景。
-
模糊查询困境:用户常使用口语化表达(如"那个请假条要怎么搞啊"),与知识库中的规范术语(如"年假申请流程")匹配度低,导致检索结果质量差。
-
质量反馈缺失:传统流程缺乏对检索结果的评估机制,即使返回无关内容也会强行生成回答,造成"一本正经胡说八道"的现象。
1.1 状态图模型的破局思路
LangGraph提供的状态图(State Graph)模型完美解决了这些问题。其核心在于将流程拆解为三个关键组件:
-
State(状态):贯穿全流程的数据总线,类似React中的全局状态管理。在我们的RAG系统中,状态对象包含:
python复制class RAGState(TypedDict): question: str # 原始问题 query: str # 改写后的查询 retrieved_docs: list # 检索结果 retrieval_score: float # 相关性评分(0-1) needs_retrieval: bool # 是否需要检索 retry_count: int # 重试计数器 -
Node(节点):每个处理步骤都是纯函数,接收当前状态,返回状态更新。这种设计带来两个优势:
- 无副作用:方便调试和单元测试
- 可组合性:节点可像乐高积木一样自由拼装
-
Edge(边):通过条件路由实现非线性逻辑。例如当
retrieval_score<0.5时触发重新检索,形成闭环反馈。
提示:状态图与有限状态机(FSM)的关键区别在于,前者可以携带丰富的数据上下文(State),而后者通常只跟踪
