LangChain v1.0学习笔记(2)
本节笔记针对 LangChain v1.0 的发展历程以及安装和快速构建一个智能体出发,让我们更深入的了解 LangChain 的各个模块,对它有个大体的认知。
本节笔记针对 LangChain v1.0 的发展历程以及安装和快速构建一个智能体出发,让我们更深入的了解 LangChain 的各个模块,对它有个大体的认知。
一、LangChain的发展节点与历程
LangChain 的存在,是为了成为最易于上手的大语言模型(LLM)开发工具,同时兼具灵活性与生产环境可用性。
1.1 特点
LangChain 由以下几个核心信念驱动:
- 大型语言模型(LLM)是一项出色且强大的新技术。
- 当 LLM 与外部数据源结合时,其能力会更上一层楼。
- LLM 将重塑未来应用的形态——具体而言,未来的应用将越来越具备智能体(agentic)特性。
- 目前,这场变革仍处于非常早期的阶段。
- 构建这类智能体应用的原型虽易,但打造足够可靠、可投入生产的智能体仍极具挑战。
借助 LangChain,我们有两个核心侧重点:
-
助力开发者使用最优秀的模型
不同提供商的 API 接口、模型参数和消息格式各不相同。标准化这些模型的输入输出是我们的核心重点,让开发者能够轻松切换到最新的尖端模型,避免被单一供应商锁定。 -
简化模型编排复杂流程的难度
模型不应仅用于文本生成——还应被用于编排更复杂的流程,与其他数据和计算资源交互。LangChain 简化了工具定义(让 LLM 可动态调用),同时助力非结构化数据的解析与访问。
1.2 发展历程
鉴于该领域的快速变化,LangChain 也在不断演进。以下是 LangChain 多年来的简要发展时间线,它始终与 LLM 应用开发的演进同步:
-
2022-10-24
v0.0.1
在 ChatGPT 发布前一个月,LangChain 以 Python 包的形式推出,包含两个核心组件:
- LLM 抽象层
- “链(Chains)”——即针对常见场景预设的计算步骤。例如检索增强生成(RAG):先执行检索步骤,再执行生成步骤。“LangChain” 的名称源于“Language”(语言模型相关)和“Chains”(链)的结合。
-
2022-12
LangChain 新增首批通用智能体(general purpose agents)。
这些智能体基于 ReAct 论文(ReAct 代表 Reasoning and Acting,即“推理与行动”)构建,利用 LLM 生成表示工具调用的 JSON,再通过解析该 JSON 确定要调用的工具。 -
2023-01
OpenAI 发布“聊天补全(Chat Completion)”API。
在此之前,模型接收字符串并返回字符串;而在聊天补全 API 中,模型演进为接收消息列表并返回消息。其他模型提供商纷纷跟进,LangChain 也随之更新以支持消息列表格式。
LangChain 发布 JavaScript 版本。
LLM 和智能体将改变应用的构建方式,而 JavaScript 是应用开发者的主流语言。 -
2023-02
围绕开源的 LangChain 项目,LangChain 公司正式成立。
其核心目标是“让智能体无处不在”。团队意识到,尽管 LangChain 是关键基础(让 LLM 开发易于上手),但还需要其他配套组件的支持。 -
2023-03
OpenAI 在其 API 中新增“函数调用(function calling)”功能。
该功能允许 API 明确生成表示工具调用的负载。其他模型提供商纷纷跟进,LangChain 也随之更新,将函数调用作为工具调用的首选方式(替代原有的 JSON 解析方式)。 -
2023-06
LangSmith 作为闭源平台发布,提供可观测性(observability)和评估(evals)功能。
构建智能体的核心痛点是确保其可靠性,而 LangSmith 正是为解决这一需求而生。LangChain 也随之更新,实现与 LangSmith 的无缝集成。 -
2024-01
v0.1.0
LangChain 发布首个非 0.0.x 版本(v0.1.0)。
行业已从原型开发阶段迈向生产落地阶段,因此 LangChain 进一步聚焦稳定性提升。 -
2024-02
LangGraph 作为开源库发布。
早期的 LangChain 有两个核心侧重点:LLM 抽象层,以及面向常见应用的高阶入门接口;但它缺少低阶编排层,无法让开发者精确控制智能体的执行流程——LangGraph 应运而生。
在构建 LangGraph 时,我们借鉴了 LangChain 的开发经验,新增了经实践验证必需的功能:流式传输、持久化执行、短期记忆、人机协作(human-in-the-loop)等。 -
2024-06
LangChain 拥有超过 700 个集成项。
集成功能从核心 LangChain 包中拆分出来,要么迁移到独立的专属包(核心集成项),要么归入langchain-community包。 -
2024-10
LangGraph 成为构建复杂 AI 应用(不止单次 LLM 调用)的首选方式。
随着开发者试图提升应用的可靠性,他们需要比高阶接口更强的控制能力——LangGraph 提供了这种低阶灵活性。LangChain 中的大多数链和智能体被标记为弃用,并提供了迁移至 LangGraph 的指南。LangGraph 中仍保留一个高阶抽象:智能体抽象层,它基于 LangGraph 低阶能力构建,与 LangChain 中的 ReAct 智能体拥有相同接口。 -
2025-04
模型 API 向多模态方向演进。
模型开始支持接收文件、图片、视频等输入。我们相应更新了langchain-core的消息格式,让开发者能够以标准化方式指定这些多模态输入。 -
2025-10-20
v1.0.0
LangChain 发布 1.0 版本,包含两项重大变更:- 彻底重构了
langchain中的所有链和智能体——现在仅保留一个高阶抽象:基于 LangGraph 构建的智能体抽象层。该抽象层最初诞生于 LangGraph,现迁移至 LangChain 核心包。 - 对于仍在使用旧版 LangChain 链/智能体且暂不打算升级的用户(注:我们建议升级),可通过安装
langchain-classic包继续使用旧版功能。
- 彻底重构了
此外,还推出了标准化的消息内容格式:模型 API 已从返回仅含简单字符串内容的消息,演进为返回更复杂的输出类型——推理块(reasoning blocks)、引用(citations)、服务端工具调用等。LangChain 也相应升级了消息格式,以实现跨提供商的标准化支持。
二、安装 LangChain
安装 LangChain 包:
# 使用pip安装
pip install -U langchain # 需要 Python 3.10 及以上版本
# 使用uv安装
uv add langchain # 需要 Python 3.10 及以上版本
LangChain 提供了与数百个大语言模型(LLM)和数千个其他工具的集成能力,这些集成功能分布在独立的提供商(provider)包中。例如:
# pip安装
# 安装 OpenAI 集成
pip install -U langchain-openai
# 安装 Anthropic 集成
pip install -U langchain-anthropic
# uv安装
# 安装 OpenAI 集成
uv add langchain-openai
# 安装 Anthropic 集成
uv add langchain-anthropic
三、快速入门
本教程将在几分钟内带你从简单设置过渡到功能完备的AI智能体。
3.1 构建基础智能体
首先创建一个能回答问题并调用工具的简单智能体。该智能体将使用 Claude Sonnet 4.5 作为语言模型,一个基础的天气查询函数作为工具,以及一个简单的提示词来指导其行为。
对于本示例,你需要先创建 Anthropic 账户并获取 API 密钥,然后在终端中设置 ANTHROPIC_API_KEY 环境变量。
from langchain.agents import create_agent
def get_weather(city: str) -> str:
"""获取指定城市的天气。"""
return f"{city}的天气总是晴天!"
agent = create_agent(
model="claude-sonnet-4-5-20250929",
tools=[get_weather],
system_prompt="你是一个乐于助人的助手",
)
# 运行智能体
agent.invoke(
{"messages": [{"role": "user", "content": "旧金山的天气怎么样?"}]}
)
3.2 构建实际应用智能体
接下来,构建一个实用的天气预报智能体,展示关键的生产级概念:
- 详细的系统提示词,优化智能体行为
- 创建集成外部数据的工具
- 模型配置,确保响应一致性
- 结构化输出,保证结果可预测
- 会话记忆,支持类聊天交互
3.2.1 创建并运行完整功能智能体
让我们逐步拆解实现过程:
-
定义系统提示词
系统提示词定义了智能体的角色和行为,需具体且可执行:
SYSTEM_PROMPT = """你是一位擅长说双关语的专业天气预报员。你可以使用以下两个工具: - get_weather_for_location:用于获取特定地点的天气 - get_user_location:用于获取用户所在位置 如果用户询问天气,请确保确认地点。如果能从问题中判断用户指的是自己所在位置,请使用 get_user_location 工具获取其位置。""" -
创建工具
工具允许模型通过调用你定义的函数与外部系统交互。工具可依赖运行时上下文,也能与智能体记忆交互。
注意下方的
get_user_location工具如何使用运行时上下文:from dataclasses import dataclass from langchain.tools import tool, ToolRuntime @tool def get_weather_for_location(city: str) -> str: """获取指定城市的天气。""" return f"{city}的天气总是晴天!" @dataclass class Context: """自定义运行时上下文 schema。""" user_id: str @tool def get_user_location(runtime: ToolRuntime[Context]) -> str: """根据用户ID获取用户信息。""" user_id = runtime.context.user_id return "佛罗里达" if user_id == "1" else "旧金山"工具需具备完善的文档说明:其名称、描述和参数名将成为模型提示词的一部分。LangChain 的
@tool装饰器会添加元数据,并支持通过ToolRuntime参数实现运行时注入。 -
配置模型
根据使用场景设置语言模型的参数:
from langchain.chat_models import init_chat_model model = init_chat_model( "claude-sonnet-4-5-20250929", temperature=0.5, timeout=10, max_tokens=1000 ) -
定义响应格式
如果需要智能体的响应符合特定结构,可选择性定义结构化响应格式:
from dataclasses import dataclass # 此处使用 dataclass,也支持 Pydantic 模型 @dataclass class ResponseFormat: """智能体的响应 schema。""" # 必须包含的双关语响应 punny_response: str # 可选:天气相关的有趣信息(如有) weather_conditions: str | None = None -
添加记忆功能
为智能体添加记忆功能以维持交互过程中的状态,使其能够记住之前的对话和上下文:
from langgraph.checkpoint.memory import InMemorySaver checkpointer = InMemorySaver()生产环境中,请使用持久化检查点(checkpointer),将数据存储到数据库。详见「添加和管理记忆」章节。
-
创建并运行智能体
现在将所有组件组装成智能体并运行:
agent = create_agent( model=model, system_prompt=SYSTEM_PROMPT, tools=[get_user_location, get_weather_for_location], context_schema=Context, response_format=ResponseFormat, checkpointer=checkpointer ) # `thread_id` 是特定对话的唯一标识 config = {"configurable": {"thread_id": "1"}} response = agent.invoke( {"messages": [{"role": "user", "content": "外面的天气怎么样?"}]}, config=config, context=Context(user_id="1") ) print(response['structured_response']) # 输出: # ResponseFormat( # punny_response="佛罗里达依然是‘阳光灿烂’的一天!阳光全天都在播放‘射线电台’热门歌曲!我得说,这天气太适合‘阳光庆典’了!如果你盼着下雨,恐怕这个想法已经‘泡汤’了——预报依旧‘晴朗’无比!", # weather_conditions="佛罗里达的天气总是晴天!" # ) # 注意:可使用相同的 `thread_id` 继续对话 response = agent.invoke( {"messages": [{"role": "user", "content": "谢谢!"}]}, config=config, context=Context(user_id="1") ) print(response['structured_response']) # 输出: # ResponseFormat( # punny_response="‘雷霆万钧’地不客气!帮你掌握最新天气动态向来‘轻而易举’。我只是在‘云里雾里’等着,随时准备在你需要时‘ shower ’你更多预报(双关:既指‘提供’也指‘淋浴’)。祝你在佛罗里达的阳光下度过‘阳光灿烂’的一天!", # weather_conditions=None # ) -
完整代码整合
from dataclasses import dataclass from langchain.agents import create_agent from langchain.chat_models import init_chat_model from langchain.tools import tool, ToolRuntime from langgraph.checkpoint.memory import InMemorySaver # 定义系统提示词 SYSTEM_PROMPT = """你是一位擅长说双关语的专业天气预报员。你可以使用以下两个工具: - get_weather_for_location:用于获取特定地点的天气 - get_user_location:用于获取用户所在位置 如果用户询问天气,请确保确认地点。如果能从问题中判断用户指的是自己所在位置,请使用 get_user_location 工具获取其位置。""" # 定义上下文 schema @dataclass class Context: """自定义运行时上下文 schema。""" user_id: str # 定义工具 @tool def get_weather_for_location(city: str) -> str: """获取指定城市的天气。""" return f"{city}的天气总是晴天!" @tool def get_user_location(runtime: ToolRuntime[Context]) -> str: """根据用户ID获取用户信息。""" user_id = runtime.context.user_id return "佛罗里达" if user_id == "1" else "旧金山" # 配置模型 model = init_chat_model( "claude-sonnet-4-5-20250929", temperature=0 ) # 定义响应格式 @dataclass class ResponseFormat: """智能体的响应 schema。""" # 必须包含的双关语响应 punny_response: str # 可选:天气相关的有趣信息(如有) weather_conditions: str | None = None # 设置记忆功能 checkpointer = InMemorySaver() # 创建智能体 agent = create_agent( model=model, system_prompt=SYSTEM_PROMPT, tools=[get_user_location, get_weather_for_location], context_schema=Context, response_format=ResponseFormat, checkpointer=checkpointer ) # 运行智能体 # `thread_id` 是特定对话的唯一标识 config = {"configurable": {"thread_id": "1"}} response = agent.invoke( {"messages": [{"role": "user", "content": "外面的天气怎么样?"}]}, config=config, context=Context(user_id="1") ) print(response['structured_response']) # 输出: # ResponseFormat( # punny_response="佛罗里达依然是‘阳光灿烂’的一天!阳光全天都在播放‘射线电台’热门歌曲!我得说,这天气太适合‘阳光庆典’了!如果你盼着下雨,恐怕这个想法已经‘泡汤’了——预报依旧‘晴朗’无比!", # weather_conditions="佛罗里达的天气总是晴天!" # ) # 注意:可使用相同的 `thread_id` 继续对话 response = agent.invoke( {"messages": [{"role": "user", "content": "谢谢!"}]}, config=config, context=Context(user_id="1") ) print(response['structured_response']) # 输出: # ResponseFormat( # punny_response="‘雷霆万钧’地不客气!帮你掌握最新天气动态向来‘轻而易举’。我只是在‘云里雾里’等着,随时准备在你需要时‘ shower ’你更多预报(双关:既指‘提供’也指‘淋浴’)。祝你在佛罗里达的阳光下度过‘阳光灿烂’的一天!", # weather_conditions=None # )
恭喜!你现在拥有了一个具备以下能力的AI智能体:
- 理解上下文并记忆对话内容
- 智能使用多个工具
- 以一致的格式提供结构化响应
- 通过上下文处理用户特定信息
- 在多轮交互中维持对话状态
今天的内容就到这里了,我们下期再见!
更多推荐



所有评论(0)