LangChain和LangGraph
- LangChain:搭 LLM 应用的「零件箱」——模型、Prompt、工具、消息、RAG 组件等,帮你快速拼出应用。
- LangGraph:搭复杂 Agent 的「流程图引擎」——用图(节点 + 边 + 共享状态)编排多步、分支、循环、重试、人机协作。
关系可以记成:
LangChain 负责「调用什么能力」;LangGraph 负责「按什么流程、带什么状态去调用」。
对各种 LLM / Chat Model 做统一封装。你不用关心供应商细节,统一用 invoke / stream 调。
通俗理解:插座标准化了,换 GPT、Claude、豆包都能插。
对话不再是一坨纯文本,而是结构化消息:
| 角色 | 含义 |
|---|---|
| system | 人设与规则 |
| user | 用户输入 |
| assistant | 模型回复 |
| tool | 工具返回结果 |
多轮对话本质就是维护一份 message 列表,不断追加上下文。
让模型不只「会说」,还能「会做」:查库、搜网、算数、调 API。
每个工具通常有:名字、描述、入参 schema、执行函数。模型根据描述决定何时调用——这就是常见的 ReAct / Tool Calling 模式。
早期核心是 Chain:Prompt → LLM → Parser 串起来。
现在更统一的是 Runnable / LCEL(| 管道):
prompt | model | output_parser
适合固定流水线:总结 → 翻译 → 格式化这类一路往下走的任务。
Agent = 模型 + 工具 +「自己决定下一步」的循环:
想 → 调工具 → 看结果 → 再想 → …… → 给出最终答案
LangChain 提供高层 Agent 抽象,上手快;流程一复杂(重试、分支、多人协作),就容易不够用——这时上 LangGraph。
- 结构化输出:强制模型吐 JSON / Pydantic,方便程序消费。
- Memory:短期(当前对话)+ 长期(跨会话记忆)。复杂场景里,记忆往往也挂在 Graph 的 State / Checkpointer 上。
Chain 像一条单行道:A → B → C,假设一路绿灯。
真实业务里常见:
- 质量不行 → 打回重做(循环)
- 根据结果走不同分支(条件路由)
- 多段并行处理再汇总(并发)
- 中途让人审批再继续(人机协同)
- 挂了要能从断点恢复(持久化)
这些 Chain 很难优雅表达,Graph 才是正解。
LangGraph框架的核心能力是以图的形式实现多Agent的编排,采用“分而治之”的思想,由四个核心概念构成:
- state:整个应用中共享的一种数据结构,给全局Agent提供统一的状态管理,是LangGraph框架的灵魂。
- Node:一个处理数据的节点。LangGraph中一般为一个函数,state作为输入,更新后的state作为输出。
- Edge:表示Node之间的关联关系。在LangGraph中一般是一个函数,根据当前Node输出的state来决定下一个执行的Node
所有节点读写同一份状态,节点之间不直接打电话,只改白板。
常见用 TypedDict / Pydantic 定义,例如:
class AgentState(TypedDict):
| 1 | messages: Annotated\[list, operator.add\] *# 追加,不覆盖* |
| 2 | current_step: str *# 默认:新值覆盖旧值* |
| 3 | retry_count: int |
关键点是 Reducer(归约器):
- 普通字段:后写覆盖先写
- 列表字段(如 messages):常用
operator.add追加,避免并行节点互相踩掉结果
通俗说:State 是数据总线;Reducer 规定「多人同时改同一字段时怎么合并」。
节点就是函数:读 State → 做事 → 返回要更新的字段。
def call_llm(state):
| 1 | reply = llm.invoke(state\["messages"\]) |
return {"messages": \[reply\]} # 只返回变更部分
原则:
- 一节点一事(调模型 / 调工具 / 审校……)
- 不直接调别的节点,协作全靠 State
- 可返回
Command(goto=..., update=...),把「改状态」和「下一步去哪」绑在一起
| 类型 | 含义 | 例子 |
|---|---|---|
| 固定边 | A 完了一定去 B | 翻译完 → 审校 |
| 条件边 | 看 State 再决定 | 质量 pass → 结束;fail → 重译 |
| Send | 动态扇出并行 | 文档切 10 片,10 个 summarize 一起跑 |
再加上 START / END,一张可运行的图就齐了。
三者关系一句话:
State 管存什么,Node 管做什么,Edge 管接下来去哪。
用于支持多轮对话,LangGraph提供了多种短时记忆的存储方案,包括内存、Redis等。
短时记忆如果过多(尤其历史记忆内容不连贯的情况下),会导致模型的上下文理解出现偏差,产生幻觉。LangGraph提供了短期记忆的管理方法,主要包括两种:
- Summarization:用大模型的方式,对短期记忆进行总结,然后把总结的结果作为新的短期记忆。
- Trimming:把短期记忆中最旧的记忆删除,对短期记忆进行截断处理。
比较典型的长期记忆存储策略主要包括:
- Semantic memory(语义记忆):原始对话中提取到的一般性的知识、概念、事实和语言信息等,不依赖于个人的具体经历或特定时间和地点。
- Episodic memory(情节记忆):主要设计个人亲身经历的特定时间和情景,这些经历通常与时间、地点和相关的情感有关。
- Procedural memory(程序性记忆):一种长期的潜意识记忆,用于执行特定类型的动作。例如人的本能或某种技能。
登录后可以选中正文添加批注(仅自己可见)。
评论 (0)
登录后参与评论。
还没有评论,来做第一个。