langchain学习记录

79 阅读4分钟

langchain生态:langchain,langsmith,langgraph,langgraph cloud

langchan:大模型应用开发框架

架构图:

image.png


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 的 AgentChain 在处理简单流程时很好用,但当工作流变得复杂时(例如,需要多角色协作、复杂的审批流程、需要不断自我修正的循环),就力不从心了。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?"})

这个工作流的图示化流程如下:

image.png

第三部分:LangChain vs LangGraph 对比总结

特性LangChainLangGraph
范式链、顺序执行图、循环与分支
状态管理相对简单,主要通过 Memory核心特性,有强大的共享状态对象
复杂性适合中等复杂度的线性应用适合高度复杂的、有状态的智能体应用
控制流线性、可预测动态、基于条件
学习曲线相对平缓更陡峭,需要理解状态和图的概念
核心应用RAG、文档总结、简单聊天机器人高级多智能体系统、复杂 ReAct 智能体、具有复杂逻辑的工作流