认识LangChain
LangChain 由 Harrison Chase 创建于 2022年10月,是用于开发智能体工程 (Agent Engineering)的平台。
1.1 架构体系
LangChain 并不仅仅是一个框架,而是一整个智能体开发平台,包含很多不同的组件。
其中,包含一系列开源的智能体(Agent)开发框架,而且兼容 Python和 TypeScript 两种语言:

-
LangChain:用于快速构建智能体,可兼容任何模型提供商。
-
LangGraph:从底层一步步控制智能体的构建,包括记忆(Memory)、人机协同(HITL)等
-
Deep Agents:用于构建复杂的、处理多步骤的任务的智能体
另外,LangChain 还包含一套帮助人工智能团队利用实时生产数据进行持续测试和改进的平台,叫做LangSmith。
总结:
LangChain是智能体开发平台,包含一套各种帮助开发、测试、评估智能体的框架。核心包括:
-
LangChain:用于快速构建智能体,可兼容任何模型提供商。
-
LangGraph:从底层一步步控制智能体的构建,包括记忆(Memory)、人机协同(HITL)等
-
Deep Agents:用于构建复杂的、处理多步骤的任务的智能体
-
LangSmith:用于测试、观察、评估、部署智能体
可以看到,LangChain平台的所有框架都是围绕着构建智能体(Agent)这一目标的,那么问题来了:
什么是智能体(Agent)呢?
1.2 什么是Agent
什么是 Agent,这其实没有一个标准的答案,每个人都有自己的理解。
对于这个问题,LangChain 创始人 Harrison Chase 有一个偏向技术性的答案:
Agent 是一种使用大语言模型(LLM)来决定应用程序控制流的系统。
在人工智能领域,Agent(通常翻译为智能体或代理)是指一种能感知环境、进行推理、自主决策并采取行动以实现特定目标的智能系统。
| 特性 | 传统聊天机器人/LLM | AI Agent |
|---|---|---|
| 交互模式 | 被动响应,问一句答一句 | 主动规划,以目标为导向 |
| 执行力 | 停留在文本生成层面 | 能操作软件、发送邮件、分析数据 |
| 自主性 | 需要人类给出详细步骤 | 只需给定最终目标,自主寻找路径 |
如果说大模型(LLM)是"大脑",那么 Agent 就是**"拥有手脚和思维逻辑的独立个体"**。它不再只是被动地回答问题,而是能主动拆解任务并调用各种工具来完成工作。
例如:要开发一个《AI旅游助手》的应用。
如果是传统LLM应用,程序流程是这样的:
用户提出需求,例如:帮我计划一个5天的北京之旅,预算8000元,我喜欢历史。
调用LLM,分析用户需求,直接由LLM生成一个简单旅游计划
这个计划基于它训练数据中的通用知识,可能没有考虑当前的天气、景点是否关闭、门票是否可预订等实时信息。
如果是Agent应用,Agent可以自主规划程序流程:
用户提出需求,例如:帮我计划一个5天的北京之旅,预算8000元,我喜欢历史。
Agent分析用户需求,分步执行:
规划: 将大目标分解为:查询机票酒店价格 -> 查询天气和景点信息 -> 设计每日行程 -> 计算总预算。
调用工具:
调用机票/酒店API,查询用户指定日期范围内的价格和可选酒店。
调用天气预报API,查询未来5天北京的天气,建议携带的衣物。
调用搜索引擎/景点API,查询故宫、国博等热门景点的最新开放时间、预约政策和当前展览。
感知与反馈: 综合感知所有查询到的实时信息,生成一个动态的、可执行的计划。例如:"根据预算和您对历史的兴趣,我推荐入住胡同里的XX酒店。第一天去故宫,但请注意下周一故宫闭馆,所以调整到第二天......总花费预计7500元,还在预算内。需要我现在帮您预订酒店和机票吗?"
Agent通过主动规划任务流程,主动使用工具,整合了实时信息,并进行了动态调整,最终产出的是一个真正可落地的方案。
总结如下:
-
LLM = 聪明的大脑
-
Agent = 聪明的大脑 + 手脚
当然,Agent的模式也是在不断演进的:
-
阶段一:ReAct + Tool Calling
-
阶段二:Reflection + Long Memory
-
阶段三:Multi Agent System,MAS
接下来,我们会从最简单的Agent开始学习,逐渐升级到更复杂的Agent结构。
1.3 快速入门
1.3.1 准备工作
python
uv add langchain
LangChain支持各种不同的模型,而且提供了对应的兼容SDK,不过也都需要安装对应依赖,你可以按需添加:
python
# 集成 DeepSeek
uv add langchain-deepseek
# 集成 OpenAI
uv add langchain-openai
# 集成 Anthropic
uv add langchain-anthropic
1.3.2 代码示例
开发Agent了,基本步骤如下:
-
加载环境变量
-
定义工具
-
定义Agent
-
调用Agent
Langchain提供了create_agent 方法用来快速创建Agent,我们只需要提供好Agent所需的模型(Models) 、**工具(Tools)**即可。
示例代码如下:
python
# 1.加载环境变量
from dotenv import load_dotenv
load_dotenv()
# 2.定义工具,基础版,通过注释描述工具
@tool
def getWeather(location: str) -> str:
"""
Get the weather in a given location.
Args:
location: city name or coordinates
"""
return f"Current weather in {location} is sunny"
# 3.定义Agent
agent = create_agent(
"deepseek-chat", # 模型名称(必须是LangChain支持的模型)
tools=[getWeather] # 工具集
)
# 4.调用模型
print("🚀 正在调用大模型...")
response = agent.invoke({
"messages": [
{"role": "user", "content": "杭州今天天气如何?"}
]
})
# 5.打印结果
print(response)
运行结果如下:
python
🚀 正在调用大模型...
{'messages': [HumanMessage(content='杭州今天天气如何?',
additional_kwargs={}, response_metadata={}, id='216c9cd1-8ebc-4365-a192-6b1a30ae788c'),
AIMessage(content='我来帮您查询杭州今天的天气情况。',
additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 51, 'prompt_tokens': 313, 'total_tokens': 364, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 256}, 'prompt_cache_hit_tokens': 256, 'prompt_cache_miss_tokens': 57}, 'model_provider': 'deepseek', 'model_name': 'deepseek-chat', 'system_fingerprint': 'fp_eaab8d114b_prod0820_fp8_kvcache', 'id': 'bbeda11e-7653-4c3d-9cc5-9a58491f63f0', 'finish_reason': 'tool_calls', 'logprobs': None}, id='lc_run--019c92f4-8395-7852-8e36-d4645f86d443-0', tool_calls=[{'name': 'getWeather', 'args': {'location': '杭州'}, 'id': 'call_00_H7Yklbf4osnSeFOj3k4TP33N', 'type': 'tool_call'}], invalid_tool_calls=[], usage_metadata={'input_tokens': 313, 'output_tokens': 51, 'total_tokens': 364, 'input_token_details': {'cache_read': 256}, 'output_token_details': {}}), ToolMessage(content='Current weather in 杭州 is sunny', name='getWeather', id='911eda0e-a5a8-4375-909d-b8707b3a08a9', tool_call_id='call_00_H7Yklbf4osnSeFOj3k4TP33N'), AIMessage(content='根据查询结果,杭州今天的天气是**晴朗**的。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 13, 'prompt_tokens': 388, 'total_tokens': 401, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 320}, 'prompt_cache_hit_tokens': 320, 'prompt_cache_miss_tokens': 68}, 'model_provider': 'deepseek', 'model_name': 'deepseek-chat', 'system_fingerprint': 'fp_eaab8d114b_prod0820_fp8_kvcache', 'id': '692c1420-4a06-4080-adf7-54250207e86a', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019c92f4-8d74-7770-89fd-da1e9d67efca-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 388, 'output_tokens': 13, 'total_tokens': 401, 'input_token_details': {'cache_read': 320}, 'output_token_details': {}})]}
原本大模型不具备查询天气的能力,所以无法回答天气问题。但是,当我们提供了一个查询添加的Tool以后,它就能自动查询天气来回答问题,是不是很神奇。
那么,Agent是如何做到的呢?
传统的LLM应用都是一问一答的形式,模型只能根据自己的训练数据来回答,流程非常简单:

而智能体则可以调用工具与外界交互,获取实时信息,工作流程则要复杂很多,是这样的:

流程如下:
-
用户提问(Input):杭州今天天气如何?
-
模型分析(Reasoning):用户询问杭州天气,我不知道,需要调用查询天气的工具
get_weather -
调用工具(Action):调用工具,get_weather,传入城市"杭州"
-
分析结果(Observation):工具返回结果,模型分析结果,判断是否足以回答用户问题
-
是:整理生成响应结果
-
否:重复前面步骤
-
-
生成结果(Output):根据工具的结果生成响应给用户
那么,模型是如何知道工具的信息的呢?
其实,在大模型提供的API接口中,有一个tools参数,描述了工具的详细信息:

所以,LangChain会帮助我们把tool的信息封装为此tool参数,与message一起发送给大模型,大模型就了解tool的详细信息,根据用户需求判断是否需要调用tool,需要调用哪个tool.
那么问题来了,当大模型决定调用某个tool时,该如何调用呢?毕竟,tool是我们定义的,模型是没有调用能力的。
模型确实不能直接调用tool,只能返回字符串。但是它可以把要调用的tool信息、参数信息都以Json格式返回:

这样一来,LangChain就会帮我们解析响应结果中的Function信息,也就是tool信息,就知道了要调用哪个函数,以及参数是什么了。LangChain就会执行该函数,再把得到的结果再次发送给大模型。
具体的工作流程如图:

OK,弄明白了Agent的原理,我们不难发现,Agent中最重要的两个部分,就是:
-
Model:负责推理分析、思考,相当于Agent的大脑
-
Tools:负责执行任务,相当于Agent与外界交互的手脚
当然,Agent中肯定不止这两个部分,接下来,我们就逐一解析Agent创建的各个细节。