LangChain 1.0的核心革新
LangChain 1.0 的发布,意味着 IT 公司可以放心将其用于核心业务系统开发,而不再是“玩具项目”。它不仅是工具升级,更是企业拥抱生成式 AI 的基础设施成熟标志。可以快速构建 RAG、Agent、多模态等复杂应用,减少 70%+ 的底层 LLM 集成代码(如重试、流式输出)。
完整示例代码:
import os
from typing import TypedDict
from dotenv import load_dotenv
from langchain.agents import create_agent
# 引入模型,默认使用 ChatOpenAI方式,本次我们使用了下面的模型tongyi
from langchain_community.chat_models import ChatTongyi
load_dotenv()
def get_weather(city: str) -> str:
"""根据给定的城市名称获取天气"""
return f"{city}一直是晴天!"
from langchain.agents.middleware import wrap_model_call, ModelRequest, ModelResponse, dynamic_prompt
# 初始化模型,系统会默认使用 qwen-turbo 模型。查看免费额度https://bailian.console.aliyun.com/?tab=model#/model-market/detail/qwen-turbo
llm = ChatTongyi(dashscope_api_key=os.environ.get("DASHSCOPE_API_KEY"))
llm_qwen_flash = ChatTongyi(model="qwen-flash", dashscope_api_key=os.environ.get("DASHSCOPE_API_KEY"))
@wrap_model_call
def dynamic_model_selection(request: ModelRequest, handler) -> ModelResponse:
"""Choose model based on conversation complexity."""
message_count = len(request.state["messages"])
if message_count > 5:
# Use an advanced model for longer conversations
model = llm_qwen_flash
else:
model = llm
request.model = model
return handler(request)
from langchain.tools import tool
@tool("database", description="通过数据库中搜索数据")
def search_database(query: str, limit: int = 10) -> str:
return f"Found {limit} results for '{query}'"
@tool("calculator", description="Performs arithmetic calculations. Use this for any math problems.")
def calc(expression: str) -> str:
return str(eval(expression))
# 1. 定义上下文结构(必须是 TypedDict,LangChain 1.0 强制要求)
class Context(TypedDict):
user_role: str # 上下文字段:用户角色(expert/beginner/user)
# 2. 动态提示生成函数(被 @dynamic_prompt 装饰)
@dynamic_prompt
def user_role_prompt(request: ModelRequest) -> str:
# 从上下文获取用户角色(默认值:user)
user_role = request.runtime.context.get("user_role", "user")
print(f"Generating prompt for user role: {user_role}")
base_prompt = "You are a helpful assistant."
# 根据角色生成不同提示
if user_role == "expert":
return f"{base_prompt} Provide technical details (e.g., algorithms, parameters)."
elif user_role == "beginner":
return f"{base_prompt} Explain with examples, no technical terms."
return base_prompt
agent = create_agent(
model=llm_qwen_flash,
tools=[get_weather, search_database, calc],
middleware=[user_role_prompt],
system_prompt="You are a helpful assistant",
)
from langgraph.checkpoint.memory import InMemorySaver
for chunk in agent.stream(
{"messages": [{"role": "user", "content": "搜索一下前5条数据??"}]},
checkpoint_saver=InMemorySaver(),
context={"user_role": "expert"},
stream_mode="updates",
):
for step, data in chunk.items():
print(f"step: {step}")
print(f"content: {data['messages'][-1].content_blocks}")
checkpoint_saver = InMemorySaver()
# response = agent.invoke(
# {"messages": [{"role": "user", "content": "搜索一下前5条数据?"}]},
# checkpoint_saver=InMemorySaver(),
# context={"user_role": "beginner"} # 切换为“新手视角”提示
# )
# print(response)
1. 统一的Agent抽象:create_agent
LangChain 1.0最大的变化之一是引入了全新的create_agent抽象。这个统一的接口将之前分散的ReAct、Plan-and-Execute、React-Retry等模式整合为一个标准化的高层接口,显著降低了学习和集成成本。
在我们分析的[run.py](file://D:/WORK/WORKSPACE_PY/langchain/run.py)文件中,可以看到如何使用这个新接口:
agent = create_agent(
model=llm_qwen_flash,
tools=[get_weather, search_database, calc],
middleware=[user_role_prompt],
system_prompt="You are a helpful assistant",
)
这种设计使得开发者可以快速构建功能丰富的AI智能体,而无需深入了解底层实现细节。
2. 中间件系统与动态提示词
LangChain 1.0引入了强大的中间件系统,允许开发者在智能体执行过程中插入自定义逻辑。在[run.py](file://D:/WORK/WORKSPACE_PY/langchain/run.py)中,我们看到了一个很好的示例:
# 1. 定义上下文结构(必须是 TypedDict,LangChain 1.0 强制要求)
class Context(TypedDict):
user_role: str # 上下文字段:用户角色(expert/beginner/user)
# 2. 动态提示生成函数(被 @dynamic_prompt 装饰)
@dynamic_prompt
def user_role_prompt(request: ModelRequest) -> str:
# 从上下文获取用户角色(默认值:user)
user_role = request.runtime.context.get("user_role", "user")
print(f"Generating prompt for user role: {user_role}")
base_prompt = "You are a helpful assistant."
# 根据角色生成不同提示
if user_role == "expert":
return f"{base_prompt} Provide technical details (e.g., algorithms, parameters)."
elif user_role == "beginner":
return f"{base_prompt} Explain with examples, no technical terms."
return base_prompt
这段代码展示了如何根据用户角色动态调整提示词,为不同类型的用户提供个性化的响应。通过@dynamic_prompt装饰器,我们可以轻松地将这种自定义逻辑集成到智能体的工作流中。
3. 标准化内容块(Content Blocks)
LangChain 1.0引入了标准化的内容块概念,将所有模型输出统一为.content_blocks结构。这一特性实现了跨模型、跨供应商的一致性,使得开发者可以更容易地处理不同来源的AI输出。
在[run.py](file://D:/WORK/WORKSPACE_PY/langchain/run.py)的流式处理部分,我们可以看到如何使用这一特性:
for chunk in agent.stream(
{"messages": [{"role": "user", "content": "搜索一下前5条数据??"}]},
checkpoint_saver=InMemorySaver(),
context={"user_role": "expert"},
stream_mode="updates",
):
for step, data in chunk.items():
print(f"step: {step}")
print(f"content: {data['messages'][-1].content_blocks}")
4. 状态持久化与检查点机制
LangChain 1.0内置了状态持久化机制,通过checkpoint_saver参数,可以轻松实现对话状态的保存和恢复。这对于构建需要长期运行或需要在不同会话间保持状态的AI应用至关重要。
from langgraph.checkpoint.memory import InMemorySaver
# ...
for chunk in agent.stream(
{"messages": [{"role": "user", "content": "搜索一下前5条数据??"}]},
checkpoint_saver=InMemorySaver(), # 状态保存器
context={"user_role": "expert"},
stream_mode="updates",
):
# ...
代码详解:LangChain 1.0实战
让我们更详细地分析[run.py](file://D:/WORK/WORKSPACE_PY/langchain/run.py)中的关键部分:
模型初始化与动态选择
# 初始化模型
llm = ChatTongyi(dashscope_api_key=os.environ.get("DASHSCOPE_API_KEY"))
llm_qwen_flash = ChatTongyi(model="qwen-flash", dashscope_api_key=os.environ.get("DASHSCOPE_API_KEY"))
@wrap_model_call
def dynamic_model_selection(request: ModelRequest, handler) -> ModelResponse:
"""Choose model based on conversation complexity."""
message_count = len(request.state["messages"])
if message_count > 5:
# Use an advanced model for longer conversations
model = llm_qwen_flash
else:
model = llm
request.model = model
return handler(request)
这段代码展示了如何根据对话复杂度动态选择模型,这是一种优化成本和性能的有效策略。
工具定义与集成
@tool("database", description="通过数据库中搜索数据")
def search_database(query: str, limit: int = 10) -> str:
return f"Found {limit} results for '{query}'"
@tool("calculator", description="Performs arithmetic calculations. Use this for any math problems.")
def calc(expression: str) -> str:
return str(eval(expression))
LangChain 1.0简化了工具定义过程,通过@tool装饰器可以快速将函数转换为AI智能体可以调用的工具。
LangChain 1.0与LangGraph的关系
LangChain 1.0与LangGraph 1.0同步发布,两者相辅相成:
- LangChain:提供快速构建AI智能体的高层抽象
- LangGraph:为需要复杂控制流和状态管理的生产级应用提供底层运行时
LangChain 1.0的智能体构建在LangGraph之上,这意味着开发者可以从快速原型开始,逐步升级到复杂的业务工作流,而无需重写逻辑。
总结
LangChain 1.0代表了AI应用开发框架的一次重大进步,通过统一的抽象、灵活的中间件系统、标准化的内容模型和强大的状态管理机制,为开发者提供了更高效、更可靠的工具来构建下一代AI应用。
新版本不仅保持了向后兼容性(通过langchain-classic包),还引入了许多企业级特性,如持久化执行、流式处理、人工监督机制等,使得构建生产级AI应用变得更加容易。
对于希望在项目中集成AI能力的开发者来说,掌握LangChain 1.0的新特性和最佳实践将是非常有价值的技能。
引言
2025年10月20日, LangChain推出了1.0版本,在对象管理和消息结构上做了一些优化,新老版本的主要区别如下:

一、 快速上手
可以设置uv的镜像为阿里,管理员身份运行PowerShell:
mkdir -Force "$env:LOCALAPPDATA\uv"
echo '[install]\nindex-url = "https://mirrors.aliyun.com/pypi/simple/"' | Out-File "$env:LOCALAPPDATA\uv\config.toml" -Encoding utf8
安装依赖:
uv add langchain dotenv langchain-openai langchain-community dashscope --only-binary=all
官方给的示例采用claude-sonnet-4-5作为基础模型,在国内使用颇为不便。
下面的示例,我改成tongyi-burbo。
开始编码之前,我们需要准备以下环境:
- Python 3.8或更高版本
- 安装必要的依赖包
- 获取通义千问API密钥
代码实现详解
让我们逐步分析核心代码文件[tongyi.py]:
from langchain_community.chat_models import ChatTongyi
from langchain_core.messages import HumanMessage
from dotenv import load_dotenv
import os
# 加载.env文件中的环境变量
load_dotenv()
# 初始化模型
llm = ChatTongyi(dashscope_api_key=os.environ.get("DASHSCOPE_API_KEY"))
# 发送消息
response = llm.invoke([HumanMessage(content="你好,我公司搭建高代码的大模型应用,推荐开发框架。")])
print(response.content)
导入必要模块
首先,我们导入了所需的模块:
-
ChatTongyi:LangChain提供的通义千问模型封装类 -
HumanMessage:用于表示人类用户发送的消息 -
load_dotenv:用于加载环境变量文件 -
os:用于操作系统相关功能
运行效果:

二、 创建一个调用工具的 agent
2.1 什么是 Agent?
LangChain Agent 是结合语言模型(LLM)与工具(Tools)的智能系统,能通过推理分析任务目标、动态选择工具、迭代执行步骤,直至满足停止条件(生成最终答案或达到迭代上限)。其核心价值是突破 LLM 静态响应的局限,实现“思考-行动-反馈”的闭环。

2.2 模型(Model)
模型是智能体的推理引擎。它们驱动智能体的决策过程,决定调用哪些工具、如何解释结果以及何时给出最终答案。
模型基本分两种模式:静态模型和动态模型。
2.2.1 静态模型
静态模型可以通过开篇提到的示例进行创建,除了ChatOpenAI之外,还可以用其它的拓展包去适配不同平台,具体可参考API接口文档.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
base_url="https://api.siliconflow.cn/v1",
api_key=os.getenv("SILICONFLOW_API_KEY"),
model="deepseek-ai/DeepSeek-V3.2-Exp",
# stream_usage=True,
# temperature=None,
# max_tokens=None,
# timeout=None,
# reasoning_effort="low",
# max_retries=2,
)

2.2.3动态模型
动态模型是指在运行时让Agent运行时根据当前状态和上下文信息,动态去调用不同的模型。
具体方式是wrap_model_call装饰器是创建中间件,然后在创建智能体时,添加middleware参数。
下面这个示例是根据上下文长度进行模型切换,如果上下文长度高于5,则采用advanced_model,否则采用basic_model。
如果需要在国内网络环境下跑通下面这个示例,可以参考上一节的方式去创建模型。
import os
from dotenv import load_dotenv
from langchain.agents import create_agent
# 引入模型,默认使用 ChatOpenAI方式,本次我们使用了下面的模型tongyi
from langchain_community.chat_models import ChatTongyi
load_dotenv()
def get_weather(city: str) -> str:
"""根据给定的城市名称获取天气"""
return f"{city}一直是晴天!"
from langchain.agents.middleware import wrap_model_call, ModelRequest, ModelResponse
# 初始化模型,系统会默认使用 qwen-turbo 模型。查看免费额度https://bailian.console.aliyun.com/?tab=model#/model-market/detail/qwen-turbo
llm = ChatTongyi(dashscope_api_key=os.environ.get("DASHSCOPE_API_KEY"))
llm_qwen_flash = ChatTongyi(model="qwen-flash", dashscope_api_key=os.environ.get("DASHSCOPE_API_KEY"))
@wrap_model_call
def dynamic_model_selection(request: ModelRequest, handler) -> ModelResponse:
"""Choose model based on conversation complexity."""
message_count = len(request.state["messages"])
if message_count > 5:
# Use an advanced model for longer conversations
model = llm_qwen_flash
else:
model = llm
request.model = model
return handler(request)
agent = create_agent(
model=llm_qwen_flash,
tools=[get_weather],
system_prompt="You are a helpful assistant",
)
response = agent.invoke(
{"messages": [{"role": "user", "content": "北京的天气如何?"}]}
)
print(response)
2.2.4 核心实现:create_agent
上述代码的create_agent 是 LangChain 提供的生产级 Agent 构建函数,基于 LangGraph 实现“图结构”运行时(节点=步骤,边=流程连接),支持模型、工具、中间件的灵活集成。
这个示例是给定了一个函数,用来反馈模拟的天气信息,正常运行,返回的response包含以下内容:输出:
{'messages': [HumanMessage(content='北京的天气如何?', additional_kwargs={}, response_metadata={}, id='531624a4-bb46-4c7f-a725-694b65c51300'), AIMessage(content='', additional_kwargs={'tool_calls': [{'function': {'arguments': '{"city": "北京"}', 'name': 'get_weather'}, 'id': 'call_1388c82b444e4e1e9a38fc', 'index': 0, 'type': 'function'}]}, response_metadata={'model_name': 'qwen-turbo', 'finish_reason': 'tool_calls', 'request_id': 'bb03a589-642a-4f07-9cff-ea5666e9c744', 'token_usage': {'input_tokens': 162, 'output_tokens': 19, 'prompt_tokens_details': {'cached_tokens': 0}, 'total_tokens': 181}}, id='lc_run--7ff00a78-8a25-408a-97ca-4bda1c1c5081-0', tool_calls=[{'name': 'get_weather', 'args': {'city': '北京'}, 'id': 'call_1388c82b444e4e1e9a38fc', 'type': 'tool_call'}]), ToolMessage(content='北京一直是晴天!', name='get_weather', id='435d7d0b-6e2b-4dae-8066-18fcf4c1fe3e', tool_call_id='call_1388c82b444e4e1e9a38fc'), AIMessage(content='北京一直是晴天!', additional_kwargs={}, response_metadata={'model_name': 'qwen-turbo', 'finish_reason': 'stop', 'request_id': 'e296d2f9-056d-4c68-91f2-e4d92e2a733d', 'token_usage': {'input_tokens': 199, 'output_tokens': 5, 'prompt_tokens_details': {'cached_tokens': 0}, 'total_tokens': 204}}, id='lc_run--0d0257bd-4ebb-4f7e-b237-f52ad7537f6e-0')]}

消息(Message)
消息是模型的基本上下文单元。它们代表模型的输入和输出,携带与 LLM 交互时表示对话状态所需的内容和元数据。
在 LangChain 中,包含四种类型消息:
系统消息:告诉模型如何运行,并为交互提供上下文。
人类消息:代表用户输入以及与模型的交互
AI消息:模型生成的响应,包括文本内容、工具调用和元数据
工具消息:表示工具调用的输出
通过不同的消息定义,模型在交互时,可以辨别不同的消息来源。
2.3 工具(Tool)
工具是智能体调用以执行操作的组件。
创建工具可以采用@tool装饰器,下面是一个基本示例:
@tool("database", description="通过数据库中搜索数据")
def search_database(query: str, limit: int = 10) -> str:
return f"Found {limit} results for '{query}'"
@tool("calculator", description="Performs arithmetic calculations. Use this for any math problems.")
def calc(expression: str) -> str:
return str(eval(expression))
agent = create_agent(
model=llm_qwen_flash,
tools=[get_weather,search_database, calc],
system_prompt="You are a helpful assistant",
)
response = agent.invoke(
{"messages": [{"role": "user", "content": "搜索一下前5条数据?"}]}
)
返回:

2.4 系统提示(System prompt)
系统提示是指创建Agent时,指定Agent处理任务的具体方式。
在创建Agent时,可以通过system_prompt参数进行指定。
对于复杂的系统,可以进一步通过@dynamic_prompt创建中间件的方式来进行设定,这里不作详细描述。
# 1. 定义上下文结构(必须是 TypedDict,LangChain 1.0 强制要求)
class Context(TypedDict):
user_role: str # 上下文字段:用户角色(expert/beginner/user)
# 2. 动态提示生成函数(被 @dynamic_prompt 装饰)
@dynamic_prompt
def user_role_prompt(request: ModelRequest) -> str:
# 从上下文获取用户角色(默认值:user)
user_role = request.runtime.context.get("user_role", "user")
print(f"Generating prompt for user role: {user_role}")
base_prompt = "You are a helpful assistant."
# 根据角色生成不同提示
if user_role == "expert":
return f"{base_prompt} Provide technical details (e.g., algorithms, parameters)."
elif user_role == "beginner":
return f"{base_prompt} Explain with examples, no technical terms."
return base_prompt
agent = create_agent(
model=llm_qwen_flash,
tools=[get_weather,search_database, calc],
middleware=[user_role_prompt],
system_prompt="You are a helpful assistant",
)
response = agent.invoke(
{"messages": [{"role": "user", "content": "搜索一下前5条数据?"}]},
context={"user_role": "beginner"} # 切换为“新手视角”提示
)
2.5 短期记忆(Short-term memory)
短期记忆可以让应用程序记住单个线程或对话中的先前交互。
在创建agent时,可以指定checkpointer为InMemorySaver,用于保存保存对话历史记录,该信息临时存储在内存中,不持久。
from langgraph.checkpoint.memory import InMemorySaver
response = agent.invoke(
{"messages": [{"role": "user", "content": "搜索一下前5条数据?"}]},
checkpoint_saver=InMemorySaver(),
context={"user_role": "beginner"} # 切换为“新手视角”提示
)
如果需要将记忆持久化,可以采用PostgresSaver,将记录存储到postgresql里面。
from langchain.agents import create_agent
from langgraph.checkpoint.postgres import PostgresSaver
DB_URI = "postgresql://postgres:postgres@localhost:5442/postgres?sslmode=disable"
with PostgresSaver.from_conn_string(DB_URI) as checkpointer:
checkpointer.setup() # auto create tables in PostgresSql
agent = create_agent(
"openai:gpt-5",
[get_user_info],
checkpointer=checkpointer,
)
除此之外,langchain还有一些接口,可以实现对记忆的修剪、删除和总结,以防超出模型的上下文窗口。
2.6 流式输出(Streaming)
流式输出逐步显示输出内容,以提升交互体验。
在langchain中,可通过以下方式获取流式响应信息:
agent = create_agent(
model=llm_qwen_flash,
tools=[get_weather, search_database, calc],
middleware=[user_role_prompt],
system_prompt="You are a helpful assistant",
)
from langgraph.checkpoint.memory import InMemorySaver
for chunk in agent.stream(
{"messages": [{"role": "user", "content": "搜索一下前5条数据??"}]},
checkpoint_saver=InMemorySaver(),
context={"user_role": "expert"},
stream_mode="updates",
):
for step, data in chunk.items():
print(f"step: {step}")
print(f"content: {data['messages'][-1].content_blocks}")
checkpoint_saver = InMemorySaver()
2.7 中间件(Middleware)
中间件提供了一种更严格地控制代理内部运行方式的方法,通过它能更好地控制Agent执行的内部逻辑。
在下图中,在agent/model/tool执行前后都可以插入中间件,以实现额外处理。

中间件有基于装饰器和基于类的两种模式。
基于装饰器的模式主要有以下分类:

基于类的模式关键词差不多,只是调用方式略有区别。
langchain内置了一些常用中间件:
- 总结(Summarization):当接近Token限制时自动总结对话历史。
- 人机交互(HumanInTheLoop):在工具调用执行之前,暂停代理执行,以便人工批准、编辑或拒绝。
- 人类提示缓存(AnthropicPromptCaching):使用 Anthropic 模型缓存重复的提示前缀,从而降低成本。
- 模型调用限制(ModelCallLimit):限制模型调用次数,以防止无限循环或过高的成本。
- 工具调用限制(ToolCallLimit):限制工具调用次数,只能调用特定工具或所有工具。
- 模型回退(ModelFallback):当主模型失效时,自动回退到备用模型。
- PII 检测(PII):检测和处理对话中的个人身份信息。
- 规划(TodoList):为复杂的多步骤任务添加待办事项列表管理功能。
- LLM工具选择器(LLMToolSelector):使用 LLM 在调用主模型之前智能地选择相关工具。
- 工具重试(ToolRetry):使用可配置的指数退避算法自动重试失败的工具调用。
- LLM 工具模拟器(LLMToolEmulator):使用 LLM 模拟工具执行以进行测试,用 AI 生成的响应替换实际的工具调用。
- 上下文编辑(ContextEditing):通过精简、总结或清除工具使用情况来管理对话上下文。