用LangChain搭一个Agent:框架实战入门详解
完整版合集、面试题库、项目实战,全网同名【图解 AI 系列】
前面讲了那么多理论,这一篇来点实战。
怎么用框架快速搭一个Agent?
目前最流行的两个框架是LangChain和LangGraph。LangChain适合快速上手,LangGraph适合复杂工作流。这篇先讲LangChain,下一篇再对比LangGraph。
LangChain是什么
LangChain是一个AI应用开发框架。
它的作用是:帮你把大模型、工具、知识库串起来,快速搭建AI应用。
不用LangChain,你可以自己写代码调用大模型API、拼接工具、处理返回。但很繁琐。你要自己处理API调用、错误重试、上下文管理、输出解析——每件事都要写代码。
用LangChain,它帮你把常用的模式封装好,你只需要组合调用。就像搭积木,框架提供各种形状的积木块,你只需要按自己的想法拼起来。
类比一下:
不用框架,就像自己买零件组装电脑。你要懂CPU、主板、内存、硬盘怎么搭配,接口对不对,驱动装不装。费时费力。
用LangChain,就像买整机模块化组装。框架提供了现成的模块——大模型是CPU,工具是各种外设,知识库是存储。你只需要按说明书把它们连起来。
对于想快速验证想法的人来说,LangChain的价值在于降低开发成本。你不需要从头写所有代码,只需要关注业务逻辑本身。
LangChain的核心概念
开始动手之前,先搞懂几个核心概念。
概念一:Model。
LangChain支持各种大模型。OpenAI的GPT系列、Anthropic的Claude系列、国内的文心、通义、GLM系列,甚至本地运行的Llama、Qwen等开源模型。
使用的时候,只需要切换模型名称,其他代码基本不用改。这让换模型变得非常方便——先用GPT-4验证想法,效果好了想省钱,换成GPT-3.5或者本地模型,代码改动很小。
概念二:Prompt。
Prompt是给大模型的指令。Prompt模板是带变量的指令,把不变的部分固定下来,把变的部分留成变量。
比如一个客服Agent的Prompt模板:“你是{role}的客服助手,用户的问题是:{question}”。运行时,把role换成"技术支持",把question换成用户实际的问题。这个模板可以重复使用,每次只需要替换变量。
LangChain提供了丰富的Prompt模板功能,包括对话模板、Few-shot示例、输出格式控制等。
概念三:Chain。
Chain是LangChain的核心概念。它把多个组件串联起来,形成一个处理流程。
最简单的Chain是这样的:Prompt模板 → 大模型 → 输出。Prompt模板处理用户输入,把处理结果给大模型,大模型返回结果。
复杂的Chain可以很长:Prompt → 大模型 → 输出解析 → 条件判断 → 另一个Prompt → 另一个大模型 → 输出。Chain可以嵌套,可以分叉,形成复杂的处理流程。
概念四:Tool。
Tool是Agent能调用的外部能力。包括搜索引擎、数据库查询、API调用、代码执行、文件操作等。
定义一个Tool,需要提供三样东西:Tool的名称(让Agent知道什么时候调用)、Tool的描述(让Agent知道Tool能做什么)、Tool的具体实现(实际执行逻辑)。
搭一个最简单的Agent
目标:一个能查天气的Agent。
整体思路。首先定义一个天气查询的工具。然后把这个工具交给Agent。最后让Agent来处理用户问题,Agent会自动判断什么时候该调用工具。
第一步,定义工具。
天气查询工具接收一个城市名称,返回该城市的天气信息。这里用一个模拟函数,实际项目中会调用真实的天气API。
def get_weather(city: str) -> str:
"""获取城市天气"""
# 实际项目中,这里调用真实天气API
return f"{city}今天晴天,15-25度"
定义工具的时候,函数的docstring非常重要。LangChain会用docstring来理解这个工具是做什么的,然后告诉Agent什么时候该调用它。所以docstring要写得清晰准确。
第二步,把工具交给Agent。
tools = [get_weather]
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
这里用了ZERO_SHOT_REACT_DESCRIPTION类型的Agent。这种Agent的工作方式是ReAct框架——先思考要不要调用工具、调用什么工具,然后调用,观察结果,再思考下一步。
verbose=True会让Agent把思考过程打印出来,方便调试和理解Agent在做什么。
第三步,运行Agent。
result = agent.invoke("北京今天天气怎么样?")
print(result)
Agent收到问题后,会经历这样的过程:
Thought阶段:用户问北京天气,我需要调用天气查询工具。
Action阶段:调用get_weather工具,参数是"北京"。
Observation阶段:获取到"北京今天晴天,15-25度"。
Thought阶段:有了天气信息,可以回答用户了。
Final Answer阶段:给出回答。
运行结果示例:
> Entering new Agent chain...
Thought: 用户问北京天气,我需要调用天气查询工具。
Action: get_weather
Action Input: 北京
Observation: 北京今天晴天,15-25度
Thought: 天气信息拿到了,可以回答用户了。
Final Answer: 北京今天天气晴朗,气温15-25度。
> Finished chain.
这就是一个完整的Agent。它能理解用户意图,判断需要调用工具,调用工具获取结果,基于结果给出回答。
搭一个更复杂的Agent
天气查询太简单了,来一个实用场景:市场调研Agent。
目标:用户说"帮我调研一下新能源车市场",Agent自动完成以下步骤:第一步搜索行业数据,第二步搜索竞品信息,第三步生成调研报告。
第一步,定义工具。
搜索行业数据的工具。实际项目中,这里会调用真实的行业数据API或者搜索引擎。
def search_industry(keyword: str) -> str:
"""搜索行业数据和报告"""
return f"{keyword}行业2024年市场规模约5000亿,同比增长25%。"
def search_competitor(keyword: str) -> str:
"""搜索竞品信息和市场份额"""
return f"{keyword}主要竞品:A品牌占比35%,B品牌占比28%,C品牌占比20%。"
def generate_report(data: dict) -> str:
"""基于收集的数据生成调研报告"""
return f"# 市场调研报告\n\n行业规模:{data['market_size']}\n竞品分析:{data['competitors']}"
第二步,初始化Agent。
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
第三步,运行。
result = agent.invoke("帮我调研一下新能源车市场")
print(result)
Agent会自动规划执行步骤:
首先判断,这是一个市场调研任务,需要先了解行业整体情况。然后调用行业数据搜索工具,获取市场规模、增长率等基础信息。
接着判断,还需要了解竞品情况。然后调用竞品分析工具,获取主要竞品、市场份额等竞争信息。
最后判断,信息收集得差不多了,可以生成报告了。调用报告生成工具,把之前收集的数据整理成报告格式输出。
Agent的核心价值在这里体现:用户只需要说"帮我调研新能源车市场",Agent自动完成剩余所有工作。用户不需要告诉它先查什么再查什么,它自己判断、自己规划、自己执行。
加上记忆系统
上面的Agent没有记忆。每次对话都是独立的,用户之前说过什么,Agent完全不记得。
加上记忆,让Agent能跨对话记住用户。
第一步,定义记忆。
memory = ConversationSummaryMemory(
llm=llm,
memory_key="chat_history",
return_messages=True
)
ConversationSummaryMemory是一种特殊的记忆类型。它不只是保存对话历史,还会定期把对话摘要压缩存储,节省上下文空间。
第二步,带记忆的Agent。
agent = initialize_agent(
tools,
llm,
agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
memory=memory,
verbose=True
)
CONVERSATIONAL_REACT_DESCRIPTION是专门为对话场景优化的Agent类型。它在ReAct的基础上,增加了对话历史的处理能力。
第三步,对话。
agent.invoke("我叫张三")
agent.invoke("我叫什么呢?")
第一句,Agent说:“好的,张三,我记住了。”
第二句,Agent说:“您叫张三。” 它记住了。
这就是带记忆的Agent和普通聊天的区别。普通聊天每次都是新对话,带记忆的Agent能积累信息,越用越了解用户。
加上RAG(知识检索)
给Agent接入知识库。
第一步,准备知识库。
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
embeddings = OpenAIEmbeddings()
vectorstore = Chroma(
persist_directory="./knowledge_base",
embedding_function=embeddings
)
vectorstore.add_documents(documents)
这里用了Chroma作为向量数据库。向量数据库的作用是把文档转换成向量存储起来,检索的时候通过向量相似度来找到相关文档。
embeddings是嵌入模型,负责把文字转换成向量。LangChain支持OpenAI的嵌入模型,也可以用其他提供商或本地模型。
第二步,创建检索工具。
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
as_retriever把向量数据库包装成一个Retriever对象。search_kwargs里的k=3表示检索返回最相关的3条文档。
第三步,Agent使用检索。
agent = initialize_agent(
tools + [retriever],
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)
把retriever作为工具加到Agent的工具箱里。Agent遇到问题,会自动判断要不要用知识库检索。
完整架构一览
一个完整的LangChain Agent,从输入到输出,经历了这些环节:
用户输入层。用户说"帮我分析一下新能源车市场"。
记忆层。Agent检查是否有相关历史对话。如果有,把历史信息也纳入考虑。
工具层。Agent判断需要调用哪些工具。行业数据工具、竞品分析工具、知识库检索工具,根据任务需求选择。
大模型层。Agent调用大模型进行推理。大模型决定下一步做什么、调用什么工具、给出什么回答。
输出层。Agent把结果返回给用户。如果需要,把这次对话存到记忆里。
整个流程中,大模型是中枢。它接收用户输入、调用记忆、决定使用哪些工具、分析工具返回的结果、生成最终回答。每个环节都有大模型的参与。
LangChain vs LangGraph
两个框架有什么区别,什么时候该用哪个?
LangChain的核心抽象是Chain。Chain是线性的,一步接一步,适合处理流程相对固定的任务。比如"用户问问题 → 检索知识库 → 生成回答"这种线性流程,用Chain表达很自然。
LangGraph的核心抽象是Graph。Graph是图状的,有节点有边,节点之间可以互相跳转,适合处理复杂工作流。比如有分支、有循环、有回退的流程,用Graph表达更清晰。
什么时候用LangChain?
快速原型验证阶段。想快速搭一个原型看看效果,不需要复杂的流程控制。线性流程的工具调用。步骤之间是简单的先后关系,不需要来回跳转。单一Agent的场景。不涉及多Agent协作、循环执行等复杂模式。
什么时候用LangGraph?
需要多轮对话的场景。Graph支持循环,Chain不支持。Agent需要回退重试的场景。比如Agent执行出错了,需要回到之前的步骤重新执行。有多Agent协作的场景。Graph可以清晰地表达Agent之间的通信和依赖关系。需要自定义状态管理的场景。Graph的状态是显式管理的,可以随时查看和修改。
实际建议:先用LangChain上手,验证了想法再考虑是否需要LangGraph。如果发现LangChain的表达能力不够,再迁移到LangGraph。
我的观点
LangChain和LangGraph是当前最流行的Agent开发框架,但框架是手段,不是目的。
很多人沉迷于"用什么框架",忘了真正重要的是Agent的能力。框架选得再好,如果工具设计得不好、Prompt写得不好、知识库建设得不好,Agent的效果也好不了。
工具设计决定Agent能做什么。工具描述决定Agent什么时候该用。工具质量决定Agent输出的质量。
Prompt优化决定Agent的理解能力。同一套工具,换一个Prompt,效果可能天差地别。
知识库建设决定Agent的知识边界。知识库内容不对,Agent回答就错。知识库内容不全,Agent回答就漏。
框架选型,建议是这样的:快速验证想法用LangChain,生产级复杂应用用LangGraph,不想学框架直接调用API自己搭也行。
关键是跑通业务逻辑,而不是被框架束缚。先让Agent能工作,再考虑怎么优化。
下期预告
聊完了框架,来看看实际应用。
Agent现在到底能做什么?哪些场景已经成熟,哪些还在探索?
下一期,我们来盘点Agent现在能做什么:15个典型应用场景,从客服到编程,从分析到创作。
完整版合集、面试题库、项目实战,全网同名【图解 AI 系列】
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)