LangChain与LangGraph入门指南:构建AI工作流的完整教程

本文详细介绍了如何使用LangChain和LangGraph构建AI工作流,包括两者的区别、适用场景、内存管理以及使用LangSmith进行监控调试的完整技术方案。

如何使用LangChain和LangGraph:AI工作流初学者指南

人工智能正在快速发展。每周都会出现新的工具,使得构建由大型语言模型驱动的应用程序变得更加容易。但许多初学者仍然困扰于一个问题:如何构建AI应用程序的逻辑?如何以清晰的方式连接提示、内存、工具和API?

这就是像LangChain和LangGraph这样流行的开源框架的用武之地。两者都属于同一个生态系统,旨在帮助您构建复杂的AI工作流,而无需重复造轮子。

LangChain专注于构建称为链的步骤序列,而LangGraph通过添加内存、分支和反馈循环进一步推进,使您的AI更加智能和灵活。

本指南将帮助您了解这些工具的功能、它们之间的区别,以及如何开始使用它们来构建自己的AI项目。

我们将涵盖的内容

  • 什么是LangChain?
  • 为什么LangChain不够用
  • 什么是LangGraph?
  • LangChain vs LangGraph
  • 何时使用每种工具
  • 添加内存和持久性
  • 使用LangSmith进行监控和调试
  • LangChain生态系统
  • 结论

什么是LangChain?

LangChain是一个Python和JavaScript框架,可帮助您构建由语言模型驱动的应用程序。它提供了一个结构,用于将像GPT这样的模型、数据源和工具连接到单个流程中。

您可以使用链、工具和代理等组件,而不是编写长提示模板或硬编码逻辑。

一个简单的例子是将提示链接在一起。例如,您可能首先要求模型总结文本,然后使用摘要生成标题。LangChain允许您定义这两个步骤并在代码中连接它们。

以下是Python中的一个基本示例:

1
2
3
4
5
6
7
8
9
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")
prompt = PromptTemplate.from_template("Summarize the following text:\n{text}")
chain = LLMChain(prompt=prompt, llm=llm)
result = chain.run({"text": "LangChain helps developers build AI apps faster."})
print(result)

这个简单的链接受文本并通过OpenAI模型运行它以获得摘要。您可以添加更多步骤,例如第二个链将该摘要转换为标题或问题。

LangChain为提示模板、模型、检索器和工具提供模块,因此您可以在不管理原始API逻辑的情况下构建工作流。

这里是完整的LangChain文档

为什么LangChain不够用

LangChain使得构建直线工作流变得容易。但大多数真实世界的应用程序不是线性的。在构建聊天机器人、摘要器或自主代理时,您通常需要循环、内存和条件。

例如,如果AI做出了错误的假设,您可能希望它重试。如果它需要更多数据,它应该调用搜索工具。或者如果用户更改上下文,AI应该记住之前讨论的内容。

LangChain的链和代理可以完成其中一些工作,但流程难以可视化和管理。您必须编写嵌套链或使用回调来处理决策。

开发人员希望有一种更好的方式来表示AI系统实际如何思考。不是直线,而是作为图形,其中输出可以导致不同的路径。

这就是LangGraph的由来。

什么是LangGraph?

LangGraph是LangChain的扩展,引入了基于图形的AI工作流方法。

LangGraph允许您像流程图一样定义节点和边,而不是单向链接步骤。每个节点可以表示任务、操作或模型调用。

这种结构允许循环、分支和并行路径。它非常适合构建类似代理的系统,其中模型进行推理、决策和行动。

以下是一个简单的LangGraph设置示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
from langgraph.graph import StateGraph, END
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
from langchain.agents import Tool

def multiply(a: int, b: int):
    return a * b
tools = [Tool(name="multiply", func=multiply, description="Multiply two numbers")]
llm = ChatOpenAI(model="gpt-4o-mini")
agent_executor = create_react_agent(llm, tools)
graph = StateGraph()
graph.add_node("agent", agent_executor)
graph.set_entry_point("agent")
graph.add_edge("agent", END)
app = graph.compile()
response = app.invoke({"input": "Use the multiply tool to get 8 times 7"})
print(response)

这个例子展示了一个基本的代理图。

AI接收请求,进行推理,决定使用工具,并完成任务。您可以想象将其扩展到更复杂的图,其中AI可以重试、调用API或获取新信息。

LangGraph让您完全控制AI在状态之间的移动方式。每个节点都可以有条件。例如,如果答案不完整,您可以将其发送回另一个节点进行优化。

这使得LangGraph非常适合构建需要多个推理步骤的系统,如文档分析机器人、代码审查器或研究助手。

这里是完整的LangGraph文档

LangChain vs LangGraph

LangChain和LangGraph共享相同的基础,但它们处理工作流的方式不同。

LangChain是线性的。每个链或代理按顺序从一个步骤移动到下一个步骤。它更简单易上手,特别适用于提示工程、检索增强生成和结构化管道。

LangGraph是动态的。它将工作流表示为可以循环、分支和自我纠正的图。在构建需要推理、规划或内存的代理时,它更强大。

一个很好的类比是:LangChain就像按顺序编写任务列表。LangGraph就像绘制流程图,其中决策可以导致不同的操作或回到先前的步骤。

大多数开发人员从LangChain开始学习基础知识,然后在想要构建更具交互性或自主的AI系统时转向LangGraph。

何时使用每种工具

如果您正在构建简单的工具,如文本摘要器、聊天机器人或文档检索器,LangChain就足够了。它易于上手,并且与像GPT、Claude和Gemini这样的流行模型很好地集成。

如果您想构建多步骤代理,或能够思考和适应的应用程序,请选择LangGraph。您可以定义AI对不同结果的反应方式,并且对重试逻辑、上下文切换和反馈循环有更多控制。

在实践中,许多开发人员结合使用两者。LangChain提供构建块,而LangGraph组织这些块如何交互。

添加内存和持久性

LangChain和LangGraph都支持内存,这允许您的AI在交互之间记住上下文。这在构建聊天机器人、助手或需要在步骤之间传递信息的代理时非常有用。

例如,如果用户介绍自己一次,AI应该能够在对话的后面回忆起该细节。

在LangChain中,内存通过内置模块处理,如ConversationBufferMemory或ConversationSummaryMemory。这些允许您存储先前的输入和输出,以便模型可以在未来的响应中引用它们。

以下是使用LangChain的简单示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
from langchain_openai import ChatOpenAI

memory = ConversationBufferMemory()
llm = ChatOpenAI(model="gpt-4o-mini")
conversation = ConversationChain(llm=llm, memory=memory)

conversation.predict(input="Hello, I am Manish.")
response = conversation.predict(input="What did I just tell you?")
print(response)

在这种情况下,模型记住您先前的消息并相应回答。内存对象就像一个运行中的对话日志,随着对话的演变跟踪对话。

LangGraph通过将内存嵌入到图的状态中进一步推进这一点。图中的每个节点都可以访问或更新共享内存,允许您的AI在多个推理步骤或分支之间维护上下文。这种方法在构建循环、重新访问节点或依赖先前交互的代理时特别有用。

以下是如何在LangGraph工作流中添加内存:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langgraph.prebuilt import create_react_agent

llm = ChatOpenAI(model="gpt-4o-mini")
memory = ConversationBufferMemory()

agent = create_react_agent(llm)
graph = StateGraph()

# 添加可访问内存的节点
graph.add_node("chat", lambda state: agent.invoke({"input": state["input"], "memory": memory}))
graph.set_entry_point("chat")
graph.add_edge("chat", END)

app = graph.compile()

app.invoke({"input": "Hello, I am Manish."})
response = app.invoke({"input": "What did I just tell you?"})
print(response)

在这里,图在调用之间跟踪内存。即使每次调用都通过同一个节点运行,共享的ConversationBufferMemory保留了之前所说的内容。这种设计让您构建能够记住用户上下文、维护历史记录并在节点之间移动时适应的代理。

无论您使用LangChain还是LangGraph,添加内存都是将简单工作流转变为有状态系统的关键,该系统可以持续对话、优化其推理并随时间更自然地响应。

使用LangSmith进行监控和调试

LangSmith是LangChain生态系统中的另一个重要工具。它帮助您可视化、监控和调试AI应用程序。

在构建工作流时,您通常希望查看模型的行为方式、成本多少以及问题出在哪里。

LangSmith记录您的链和代理进行的每次调用。您可以查看输入和输出数据、计时、令牌使用情况和错误。它提供了一个仪表板,显示您的系统在多次运行中的性能。

您可以通过设置环境变量轻松集成LangSmith:

1
2
export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="your_api_key_here"

然后,您运行的每个LangChain或LangGraph进程将自动记录到LangSmith。这有助于开发人员找到错误、优化提示并了解工作流在每个步骤的行为方式。

请注意,虽然Langchain和LangGraph是开源的,但Langsmith是一个付费平台。Langsmith是一个很好的工具,但不是构建AI工作流的必需工具。

LangChain生态系统

LangChain不只是一个库。它已经发展成一个协同工作的工具生态系统。

  • LangChain Core:用于链、提示和内存的主要框架
  • LangGraph:用于构建自适应工作流的基于图的扩展
  • LangSmith:用于AI应用程序的调试和监控平台
  • LangServe:一个部署层,让您用一个命令将链和图转换为API

这些工具共同形成了一个完整的堆栈,用于构建、管理和部署语言模型应用程序。您可以从一个简单的链开始,将其发展成基于图的系统,使用LangSmith进行测试,并使用LangServe进行部署。

结论

LangChain和LangGraph使得从提示到生产就绪的AI系统变得更加容易。LangChain帮助您构建连接模型、数据和工具的线性流。LangGraph让您通过构建能够推理和学习的自适应智能工作流走得更远。

对于初学者,从LangChain开始是理解语言模型如何与其他组件交互的最佳方式。随着项目的增长,LangGraph将为您提供处理复杂逻辑和长期状态的灵活性。

无论您是构建聊天机器人、代理还是知识助手,这些工具都将帮助您更快、更可靠地从想法到实现。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计