langchain生态:langchain,langsmith,langgraph,langgraph cloud
langchan:大模型应用开发框架
架构图:
LangChain & LangGraph 学习笔记
核心思想总结
- LangChain: 是一个用于构建由大语言模型驱动的应用程序的框架。它核心解决的是 “链” 的问题,即将不同的组件(模型、提示模板、数据库、工具等)按顺序连接起来,形成一个可预测的、线性的工作流。
- LangGraph: 是构建在 LangChain 之上的一个库,用于创建有状态、可循环的智能体工作流。它核心解决的是 “图” 的问题,即构建复杂的、带有分支和循环的应用程序,更贴近智能体的决策过程。
简单比喻:
- LangChain 像是一条自动化流水线,每一步都按预定顺序执行。
- LangGraph 像是一张交通路线图,你可以根据情况选择不同的路径,甚至绕回原地。
第一部分:LangChain 核心概念
1. 核心构建模块
| 模块 | 作用 | 代码示例(概念性) |
|---|---|---|
| Models | 提供统一的接口,对接不同的大模型。 | from langchain.llms import OpenAI llm = OpenAI(model_name="gpt-3.5-turbo") |
| Prompts | 管理提示模板,使提示词易于复用和版本控制。 | from langchain.prompts import PromptTemplate prompt = PromptTemplate.from_template("请解释{concept}") |
| Chains | 核心。将多个模块链接在一起,形成一个序列化的流程。 | chain = prompt | llm (使用 LCEL 语法) |
| Agents | 智能体,通过“思考”来决定使用哪个工具来完成任务。 | from langchain.agents import initialize_agent, Tool |
| Tools | 给智能体使用的函数,如搜索、计算、查数据库等。 | tools = [Tool(name="Search", func=search_fn, description="...")] |
| Memory | 在多次交互中持久化状态,记住之前的对话内容。 | from langchain.memory import ConversationBufferMemory |
2. LCEL - LangChain 表达式语言
这是 LangChain 推荐的链式构建方式,语法清晰且功能强大。
from langchain.schema import StrOutputParser
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI
# 1. 定义提示模板
prompt = ChatPromptTemplate.from_template("用中文给我讲一个关于{topic}的笑话")
# 2. 选择模型
model = ChatOpenAI(model="gpt-3.5-turbo")
# 3. 定义输出解析器
output_parser = StrOutputParser()
# 使用 LCEL 管道操作符 ‘|’ 构建链
chain = prompt | model | output_parser
# 调用链
result = chain.invoke({"topic": "程序员"})
print(result)
第二部分:LangGraph 核心概念
1. 为什么需要 LangGraph?
LangChain 的 Agent 和 Chain 在处理简单流程时很好用,但当工作流变得复杂时(例如,需要多角色协作、复杂的审批流程、需要不断自我修正的循环),就力不从心了。LangGraph 应运而生,它引入了:
- 循环
- 状态管理
- 并行执行
- 更精细的控制流
2. 核心概念
| 概念 | 描述 |
|---|---|
| State | 一个共享的、持续更新的状态对象(通常是 TypedDict),在整个图的工作流中传递和修改。这是 LangGraph 的“记忆”。 |
| Nodes | 图中的节点,通常是一个函数。它接收当前的 State,执行一些操作(如调用 LLM、使用工具),然后返回一个用于更新 State 的字典。 |
| Edges | 连接节点的边。它决定了下一次应该调用哪个节点。可以是静态的,也可以是动态的(由某个节点根据 State 决定)。 |
| Conditional Edges | 关键特性。条件边,允许根据当前 State 的内容来决定工作流的下一步,从而实现循环和分支。 |
3. 一个典型的工作流:ReAct 智能体
# 概念性代码,展示 LangGraph 的工作方式
from langgraph.graph import StateGraph, END
from typing import TypedDict
# 1. 定义状态结构
class AgentState(TypedDict):
question: str # 用户问题
thought: str # 智能体的思考
action: str # 要执行的动作
observation: str # 执行动作后的观察结果
answer: str # 最终答案
# 2. 定义节点函数
def plan_node(state: AgentState):
# 调用 LLM,根据问题和观察进行“思考”
# 返回一个更新 State 的字典,例如:{'thought': '...', 'action': 'Search'}
return {"thought": ..., "action": ...}
def tool_node(state: AgentState):
# 根据 action 执行对应的工具
# 返回更新后的 observation
return {"observation": ...}
def answer_node(state: AgentState):
# 根据所有信息生成最终答案
return {"answer": ...}
# 3. 构建图
builder = StateGraph(AgentState)
builder.add_node("Plan", plan_node)
builder.add_node("ExecuteTool", tool_node)
builder.add_node("GenerateAnswer", answer_node)
# 4. 设置边和条件边
builder.set_entry_point("Plan")
builder.add_conditional_edges(
"Plan",
# 这个函数根据 State 决定下一个节点
lambda state: "ExecuteTool" if state["action"] != "ANSWER" else "GenerateAnswer"
)
builder.add_edge("ExecuteTool", "Plan") # 执行完工具后,回到 Plan 节点继续思考
builder.add_edge("GenerateAnswer", END) # 生成答案后,结束
# 5. 编译并运行图
graph = builder.compile()
result = graph.invoke({"question": "什么是 LangGraph?"})
这个工作流的图示化流程如下:
第三部分:LangChain vs LangGraph 对比总结
| 特性 | LangChain | LangGraph |
|---|---|---|
| 范式 | 链、顺序执行 | 图、循环与分支 |
| 状态管理 | 相对简单,主要通过 Memory | 核心特性,有强大的共享状态对象 |
| 复杂性 | 适合中等复杂度的线性应用 | 适合高度复杂的、有状态的智能体应用 |
| 控制流 | 线性、可预测 | 动态、基于条件 |
| 学习曲线 | 相对平缓 | 更陡峭,需要理解状态和图的概念 |
| 核心应用 | RAG、文档总结、简单聊天机器人 | 高级多智能体系统、复杂 ReAct 智能体、具有复杂逻辑的工作流 |