LangChain 开发 Agent 第一课:理解 LangChain 并构建你的第一个工具调用 Agent
无论你想学什么技术,先知道它“是什么”,再亲手“搭一个最小示例”跑起来,是最快消除陌生感的方法。
欢迎来到《Langchain开发agent》系列第一课!这一课,我们先来搞懂 LangChain 是什么,然后用最少的代码,亲手搭一个能调用工具的 Agent,并以此展开说明它到底为 Agent 开发提供了哪些基础能力。
目录
五、通过上面的例子,看 LangChain 提供了哪些基础功能
一、LangChain 是什么?为什么要学它?
LangChain 是一个用于构建 大语言模型驱动应用 的开源框架(支持 Python / JavaScript)。它并不自己开发语言模型,而是提供一套标准化、模块化的工具和接口,帮助你把大模型的能力与外部世界连接起来,从而实现比单纯聊天问答复杂得多的智能应用。
一个Agent 架构师 的核心任务是:设计能够感知、规划、记忆、行动、协作的智能体系统。LangChain 就是做这件事最核心的框架之一,它让你不必每次都从零开始造轮子。
LangChain 的本质,是把大语言模型从“只会聊天的文本生成器”变成一个“能调用工具、能记住对话、能规划任务的智能中枢”。
从架构上看,LangChain 大致包含六类核心模块:
-
LLMs / Chat Models:为各种大模型(OpenAI、DeepSeek、本地 Ollama 等)提供统一的调用接口,换模型就像换插件。
-
Prompts:动态构建和管理给模型的提示词,支持模板化和少量示例学习。
-
Chains:把多个 LLM 调用或多个组件串联成一个连贯的处理流程——这也是它名字中“Chain”的由来。
-
Data Connection / Retrievers:负责加载、转换、存储和检索外部数据,是实现 RAG(检索增强生成)的基石。
-
Agents / Tools:用 LLM 做决策中枢,自主判断何时调用什么工具(如搜索引擎、计算器、API),这是 Agent 架构 的核心能力模块。
-
Memory:在多轮对话或多次调用之间持久化状态,让 Agent 能“记住”之前说过的内容。
2025 年 10 月,LangChain 发布了 1.0 版本,最大的变化是把原先各自为政的 Chain 和 Agent 统一整合到了基于 LangGraph 的执行模型上,支持流程图式编排、并行执行和条件判断。后面我们有专门的一课来讲 LangGraph。
二、环境准备(5分钟)
先安装必要的依赖:
# 创建虚拟环境(推荐)
python -m venv langchain_env
# 激活虚拟环境(Windows)
langchain_env\Scripts\activate
# 激活虚拟环境(Mac / Linux)
source langchain_env/bin/activate
# 安装核心依赖
pip install langchain langchain-openai python-dotenv
如果你没有 OpenAI API Key,可以使用国内的 DeepSeek 或其他兼容 OpenAI 接口的服务,只需替换
base_url即可。下面代码中会展示这种方式。
三、让你的第一行 Agent 代码跑起来
我们从一个最经典的场景开始——让 Agent 调用天气查询工具。
LLM 的训练数据有“截止时间”。比如 GPT-4 的知识停留在 2023 年,它不知道今天北京的天气,更无法实时帮你查航班价格或发送邮件。如果不给它工具,它只能给你一个“抱歉,我无法获取实时天气”的回复,或者凭空编造一个明显不靠谱的答案。工具调用就是 Agent 突破知识边界的关键能力。
# weather_agent.py
import os
from dotenv import load_dotenv
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
# 加载环境变量(API Key)
load_dotenv()
# === 定义工具 ===
def get_weather(city: str) -> str:
"""获取指定城市的天气信息。输入参数为城市名称,返回天气描述。"""
# 这里是模拟数据,你可以替换成真实的天气 API 调用
weather_data = {
"北京": "晴,24°C,湿度45%,空气质量良好",
"上海": "多云转阴,26°C,可能有阵雨",
"深圳": "雷阵雨,28°C,记得带伞",
"杭州": "小雨,22°C,体感舒适",
}
return weather_data.get(city, f"抱歉,暂时没有 {city} 的天气数据")
# === 初始化模型 ===
# 使用 OpenAI(需在 .env 中配置 OPENAI_API_KEY)
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# 如果想用国产大模型,把上面这行换成下面这几行(取消注释,并注释上面的 OpenAI 配置):
# llm = ChatOpenAI(
# base_url="https://api.siliconflow.cn/v1",
# api_key=os.getenv("SILICONFLOW_API_KEY"),
# model="deepseek-ai/DeepSeek-V3.2-Exp",
# temperature=0,
# )
# === 创建 Agent ===
agent = create_agent(
model=llm,
tools=[get_weather], # 传入工具列表,这里只给了天气查询这一个工具
system_prompt="你是一个智能天气助手,帮助用户查询天气信息。",
)
# === 运行 Agent ===
response = agent.invoke(
{"messages": [{"role": "user", "content": "帮我查一下北京现在的天气怎么样"}]}
)
# 打印完整的响应
print(response)
执行这段代码,你会得到一个包含四个阶段的消息序列的响应:
-
HumanMessage:用户提出问题“帮我查一下北京现在的天气怎么样”
-
AIMessage(带 tool_call):模型决定调用
get_weather工具,参数{"city": "北京"} -
ToolMessage:工具执行并返回结果
-
AIMessage:模型根据工具返回的结果,生成最终的自然语言回答
这时候,你已经成功构建了一个能够自主判断何时调用外部工具的 Agent。
四、亲手写一个带多工具的智能体
上面的 Agent 只挂了一个天气工具,看起来还很简单。实际业务中,一个 Agent 往往需要同时具备多种能力。我们加一个简单的计算器工具,让 Agent 能同时处理“天气查询”和“数学计算”两类任务。
# multi_tool_agent.py
import os
from dotenv import load_dotenv
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
load_dotenv()
# === 工具 1:天气查询 ===
def get_weather(city: str) -> str:
"""获取指定城市的天气信息。输入参数为城市名称,返回天气描述。"""
weather_data = {
"北京": "晴,24°C,湿度45%,空气质量良好",
"上海": "多云转阴,26°C,可能有阵雨",
"深圳": "雷阵雨,28°C,记得带伞",
}
return weather_data.get(city, f"抱歉,暂时没有 {city} 的天气数据")
# === 工具 2:计算器 ===
def calculator(expression: str) -> float:
"""计算数学表达式的结果。输入应为合法的数学表达式(如 '3 + 5 * 2'),返回计算结果。"""
try:
# 注意:eval 在生产环境中需要谨慎使用,此处仅作演示
return eval(expression)
except Exception as e:
return f"计算错误: {str(e)}"
# === 初始化模型 ===
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# === 创建带有多工具的 Agent ===
agent = create_agent(
model=llm,
tools=[get_weather, calculator], # 这里同时传入了两个工具
system_prompt="""你是一个智能助手,可以查询天气和进行数学计算。
对于天气查询,调用 get_weather 工具。
对于数学计算,调用 calculator 工具。
""",
)
# === 测试 1:查询天气 ===
print("=" * 40)
print("测试 1:查询天气")
weather_response = agent.invoke(
{"messages": [{"role": "user", "content": "深圳今天天气怎么样?"}]}
)
print(weather_response)
# === 测试 2:数学计算 ===
print("\n" + "=" * 40)
print("测试 2:数学计算")
calc_response = agent.invoke(
{"messages": [{"role": "user", "content": "帮我计算 (123 + 456) * 2 的结果"}]}
)
print(calc_response)
# === 测试 3:混合任务 ===
print("\n" + "=" * 40)
print("测试 3:混合任务")
mixed_response = agent.invoke(
{"messages": [{"role": "user", "content": "北京天气怎么样?还有,89 + 34 等于多少?"}]}
)
print(mixed_response)
在这个例子中,大模型会自主决策:先识别用户问的是天气还是数学问题,然后选择调用对应的工具。调用完工具后,它会根据工具返回的结果组织成自然语言的回答。你可以观察“测试 3”的输出——当用户同时问了两个问题时,模型会在一次思考过程中连续调用多个工具,然后统一回复。
五、通过上面的例子,看 LangChain 提供了哪些基础功能
现在我们把上面的代码拆开,看看 LangChain 在背后悄悄替你做了哪些事:
1. 统一模型接口
Agent 开发并不一定非要用 OpenAI 的模型。你可以用任何支持工具调用(function calling / tool calling)的大模型:DeepSeek、Claude、Llama、Qwen 等。LangChain 提供了一个 统一的 ChatOpenAI 接口,把不同厂商的模型调用方式封装成一致的格式。你只需要修改 model 参数和 base_url,代码的其他部分——包括 Agent 的逻辑和工具调用——完全不需要改动。这是 LangChain 最基础也是最实用的能力之一。
2. 工具抽象与标准化封装
create_agent 接收到 tools=[get_weather, calculator] 这个列表后,LangChain 会自动完成以下工作:
-
提取 Python 函数的名称、参数签名 和 docstring(注释),将它们转换成大模型能够理解和识别的 JSON Schema
-
将这个 Schema 作为系统消息的一部分,悄悄地拼接发送给大模型
-
当模型返回“我要调用
get_weather工具,参数是{"city": "深圳"}”这样的指令时,LangChain 自动找到对应的 Python 函数并执行它
换句话说,你只需要写普通的 Python 函数,LangChain 包揽了模型和函数之间的协议转换。
3. Agent 执行循环
agent.invoke() 并不是简单地把用户问题扔给模型就结束了。LangChain 内部实现了一个 Agent 执行循环,大致流程如下:
-
用户输入 → 拼接成完整的消息结构(包含 system_prompt、工具定义、对话历史)
-
调用大模型,模型返回“决定调用某个工具 + 工具参数”
-
解析工具调用指令 → 自动执行对应的工具函数 → 获取工具返回结果
-
把工具执行结果加入消息链,再次调用大模型
-
模型根据工具返回结果生成最终回答
如果你观察上面的输出,会发现整个过程有 两轮 LLM 调用:第一轮模型说“我需要查天气”,第二轮模型说“天气查到了,这就是答案”。LangChain 把这套完整的“感知-决策-执行”闭环封装成了一个极其简单的 invoke 方法。
<1.0 与 ≥1.0 版本差异提示:在早期的 LangChain 中,构造 Agent 的代码会比较冗长,并且需要显式构造 Agent Executor。在 LangChain ≥1.0 中,
create_agent已经把这些复杂度全部封装了,它不仅可以直接运行,还在底层集成了 LangGraph,用图(Graph)结构来编排 Agent 的执行流程,支持更复杂的条件判断和分支控制。
4. 消息管理(你目前还没用到的能力,但非常重要)
LangChain 的 Memory 组件解决了 Agent 的“断片”问题。如果 Agent 没有记忆,你问完“今天天气怎么样”之后,再问“那明天呢”,它根本不知道“那”指的是什么。LangChain 内置了多种记忆策略:
-
ConversationBufferMemory:把完整对话历史一股脑塞给模型(简单,但会越聊越贵)
-
ConversationSummaryMemory:把历史对话压缩成摘要再传给模型(省钱,但会丢失细节)
-
VectorStoreRetrieverMemory:把长期记忆存进向量数据库,需要时智能检索(跨会话记忆)
这些能力我们在后面的课程中会专门做一节来实践。
六、LangChain 的生态全景:未来的学习地图
现在我们对 LangChain 有了直观的认识,可以看看它在整个生态中的位置:
-
LangChain Core:今天我们用的
create_agent、ChatOpenAI、Tool 抽象,都属于核心层 -
LangGraph:专门做 有状态的图式工作流编排。如果 Agent 的逻辑不再是简单的“调用工具→返回结果”,而是需要循环、条件分支、状态持久化、多 Agent 协作,LangGraph 就是解决方案
-
LangSmith:LangChain 提供的调试和监控平台,可以查看 Agent 每一步的决策过程、追踪 token 消耗、调试工具调用失败的原因
-
LangServe:用一行命令把 Agent 部署成 REST API 服务
用一张图来总结它们的关系:

七、一些必须知道的注意事项
⚠️ 版本选择
LangChain 在 1.0 版本 前后发生了很大的 API 变化。网络上很多教程依然在使用 initialize_agent、AgentExecutor、LLMChain 这些旧 API,它们在新版本中已经不推荐使用,甚至被移到了 langchain-classic 包里。建议直接学习 ≥1.0 版本中推荐的 create_agent 和 LangGraph 方案。
⚠️ 工具描述的清晰度
上面代码中,我们用了 def get_weather(city: str) -> str: 加上 docstring。你写函数的注释(docstring)越清晰,大模型就越不会用错参数。如果 docstring 写得模糊,模型可能会把 "北京" 传给一个本该接收邮编的参数。
⚠️ 模型必须支持“工具调用”
不是所有模型都能做 Agent。只有那些在训练或微调阶段专门加入了 function calling / tool calling 能力的模型才行。gpt-4o-mini、gpt-4o、deepseek-chat、claude-3-sonnet 等常见模型都支持。如果你看到模型报错 tool_calls 相关的内容,先检查一下模型是否支持工具调用。在硅基流动等平台上,模型的详情页通常会标注是否具备工具调用能力。
⚠️ 执行环境的安全性
上面的计算器用了 eval(),这在生产环境中是非常危险的——恶意用户可能通过构造表达式来执行系统命令。LangChain 提供了更安全的替代方案,比如 PythonREPLTool 会在独立的沙箱环境中执行代码。我们在后续课程中会专门讲到如何保障 Agent 的执行安全。
八、课后实践
课程结束之后,如果还想继续,推荐做这几个小练习:
-
增加更多工具:写一个
search_web(query)工具(可以用requests+ 搜索引擎 API),创建一个带“搜索+天气+计算器”三合一的 Agent -
换模型试一次:把模型从
gpt-4o-mini换成本地运行的 Ollama(ollama run llama3),看看 Agent 的行为有什么变化 -
调试工具调用:把
create_agent的参数中加上debug=True(新版本可能是通过langsmith配置),观察模型每一步的思考过程 -
GitHub 学习资料推荐:在 GitHub 上有一个非常系统的免费课程资料 LangChain Academy(
https://github.com/langchain-ai/langchain-academy),包含了从基础概念到高级 Agent 构建的完整教程。此外,还可以看 LangChain Official Cookbook(https://github.com/langchain-ai/langchain/tree/master/cookbook),里面有大量官方示例代码,都是 1.0 版本的写法,非常适合配合这一课来动手练习。
小结
这一课,我们做了三件事:
-
理解了 LangChain 是什么——它是连接大语言模型与现实世界的“中间层”框架,提供了模型接口、工具抽象、记忆管理、链式编排等核心能力
-
用最少的代码跑通了第一个 Agent——它能调用工具、自主决策,总共不到 30 行 Python 代码
-
看到了 LangChain 与 Agent 开发的关系——LangChain 的
create_agent只是入口,背后还有 LangGraph(流程编排)、LangSmith(调试)、LangServe(部署)组成的完整生态
下一课我们会进入 Memory:深入理解记忆系统是什么、如何分层,然后用 LangChain 实际动手,从最简单的缓冲记忆到跨会话的持久化存储,最后通过一个完整的 Agent Demo 把所有东西串联起来。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)