本指南概述了 LangChain v1 与先前版本之间的主要变更。

简化的软件包

在 v1 中,langchain 软件包的命名空间被大幅精简,以专注于代理的核心构建块。精简后的软件包使核心功能更易于发现和使用。

命名空间

langchain-classic

如果您之前使用了 langchain 软件包中的以下任何功能,您需要安装 langchain-classic 并更新您的导入语句:
  • 旧版链(LLMChain, ConversationChain 等)
  • 检索器(例如 MultiQueryRetriever 或来自之前 langchain.retrievers 模块的任何内容)
  • 索引 API
  • Hub 模块(用于以编程方式管理提示词)
  • 嵌入模块(例如 CacheBackedEmbeddings 和社区嵌入)
  • langchain-community 的重新导出内容
  • 其他已弃用的功能
通过以下方式安装:

迁移到 create_agent

在 v1.0 之前,我们推荐使用 langgraph.prebuilt.create_react_agent 来构建代理。现在,我们推荐您使用 langchain.agents.create_agent 来构建代理。 下表概述了从 create_react_agent 到 create_agent 的功能变更:

导入路径

代理预构建的导入路径已从 langgraph.prebuilt 更改为 langchain.agents。 函数名称已从 create_react_agent 更改为 create_agent:
更多信息,请参阅 代理。

提示词

静态提示词重命名

prompt 参数已重命名为 system_prompt:

SystemMessage 转为字符串

如果在系统提示词中使用了 SystemMessage 对象,请提取字符串内容:

动态提示词

动态提示词是一种核心上下文工程模式——它们根据当前对话状态调整您告诉模型的内容。为此,请使用 @dynamic_prompt 装饰器:

模型前钩子

模型前钩子现在作为具有 before_model 方法的中间件实现。 这种新模式更具扩展性——您可以在调用模型之前定义多个中间件, 在不同代理之间复用常见模式。 常见用例包括:
  • 总结对话历史
  • 裁剪消息
  • 输入防护,例如 PII 脱敏
v1 现在内置了总结中间件作为可选项:

模型后钩子

模型后钩子现在作为具有 after_model 方法的中间件实现。 这种新模式更具扩展性——您可以在调用模型之后定义多个中间件, 在不同代理之间复用常见模式。 常见用例包括: v1 具有一个用于人在回路中审批工具调用的内置中间件:

自定义状态

自定义状态通过附加字段扩展默认代理状态。您可以通过两种方式定义自定义状态:
  1. 通过 create_agent 上的 state_schema - 最适合在工具中使用的状态
  2. 通过中间件 - 最适合由特定中间件钩子及附加到该中间件的工具管理的状态
通过中间件定义自定义状态优于通过 create_agent 上的 state_schema 定义,因为它允许您将状态扩展在概念上限定在相关的中间件和工具范围内。state_schema 仍然支持在 create_agent 上使用以保持向后兼容性。

通过 state_schema 定义状态

当您的自定义状态需要被工具访问时,使用 state_schema 参数:

通过中间件定义状态

中间件也可以通过设置 state_schema 属性来定义自定义状态。 这有助于将状态扩展在概念上限定在相关的中间件和工具范围内。
有关通过中间件定义自定义状态的更多详细信息,请参阅中间件文档。

状态类型限制

create_agent 仅支持 TypedDict 作为状态模式。不再支持 Pydantic 模型和 dataclass。
只需从 langchain.agents.AgentState 继承,而不是 BaseModel 或使用 dataclass 装饰器。 如果需要执行验证,请在中间件钩子中处理。

模型

动态模型选择允许您根据运行时上下文(例如,任务复杂性、成本限制或用户偏好)选择不同的模型。langgraph-prebuilt v0.6 中发布的 create_react_agent 支持通过传递给 model 参数的可调用对象实现动态模型和工具选择。 此功能在 v1 中已移植到中间件接口。

动态模型选择

预绑定模型

为了更好地支持结构化输出,create_agent 不再接受预绑定的模型与工具或配置:
如果未使用结构化输出,动态模型函数可以返回预绑定的模型。

工具

create_agent 的 @[tools] 参数接受以下列表:
  • LangChain BaseTool 实例(使用 @tool 装饰的函数)
  • 具有正确类型提示和文档字符串的可调用对象(函数)
  • 表示内置提供者工具的 dict
该参数将不再接受 ToolNode 实例。

处理工具错误

您现在可以使用实现 wrap_tool_call 方法的中间件来配置工具错误的处理。

结构化输出

节点变更

结构化输出以前在主代理之外的单独节点中生成。情况已不再如此。 我们直接在主循环中生成结构化输出,从而降低成本和延迟。

工具和提供者策略

在 v1 中,有两种新的结构化输出策略:
  • ToolStrategy 使用人工工具调用来生成结构化输出
  • ProviderStrategy 使用提供者原生的结构化输出生成

提示输出已移除

提示输出 不再通过 response_format 参数支持。与人工工具调用和提供者原生结构化输出等策略相比,提示输出尚未被证明特别可靠。

流式节点名称重命名

从代理流式传输事件时,节点名称已从 "agent" 更改为 "model",以更好地反映节点的用途。

运行时上下文

当您调用代理时,通常希望传递两类数据:
  • 在整个对话过程中动态变化的状态(例如消息历史记录)
  • 在对话期间不会变化的静态上下文(例如用户元数据)
在 v1 中,通过在 invoke 和 stream 上设置 context 参数来支持静态上下文。
旧的 config["configurable"] 模式仍然适用于向后兼容,但对于新应用程序或迁移到 v1 的应用程序,建议使用新的 context 参数。

标准内容

在 v1 中,消息获得了与提供者无关的标准内容块。通过 message.content_blocks 访问它们,可以在不同提供者之间提供一致的、类型化的视图。现有的 message.content 字段对于字符串或提供者原生结构保持不变。

变更了什么

  • 消息上新增 content_blocks 属性,用于规范化内容
  • 标准化的块形状,记录在 消息 中
  • 可通过 LC_OUTPUT_VERSION=v1 或 output_version="v1" 选择将标准块序列化到 content 中

读取标准化内容

创建多模态消息

块形状示例

更多详细信息,请参阅内容块参考。

序列化标准内容

标准内容块默认不会序列化到 content 属性中。如果您需要访问 content 属性中的标准内容块(例如,向客户端发送消息时),您可以选择将其序列化到 content 中。
了解更多:消息、标准内容块 和 多模态。

简化的软件包

在 v1 中,langchain 软件包的命名空间被大幅精简,以专注于代理的核心构建块。精简后的软件包使核心功能更易于发现和使用。

命名空间

langchain-classic

如果您之前使用了 langchain 软件包中的以下任何功能,您需要安装 langchain-classic 并更新您的导入语句:
  • 旧版链(LLMChain, ConversationChain 等)
  • 检索器(例如 MultiQueryRetriever 或来自之前 langchain.retrievers 模块的任何内容)
  • 索引 API
  • Hub 模块(用于以编程方式管理提示词)
  • 嵌入模块(例如 CacheBackedEmbeddings 和社区嵌入)
  • langchain-community 的重新导出内容
  • 其他已弃用的功能
安装:

破坏性变更

放弃 Python 3.9 支持

所有 LangChain 软件包现在需要 Python 3.10 或更高版本。Python 3.9 将在 2025 年 10 月停止支持。

更新聊天模型的返回类型

聊天模型调用的返回类型签名已从 BaseMessage 修复为 AIMessage。实现 bind_tools 的自定义聊天模型应更新其返回签名:

OpenAI Responses API 的默认消息格式

与 Responses API 交互时,langchain-openai 现在默认将响应项存储在消息 content 中。要恢复之前的行为,请将 LC_OUTPUT_VERSION 环境变量设置为 v0,或在实例化 ChatOpenAI 时指定 output_version="v0"。

langchain-anthropic 中的默认 max_tokens

langchain-anthropic 中的 max_tokens 参数现在根据所选模型默认为更高的值,而不是之前的默认值 1024。如果您依赖旧的默认值,请显式设置 max_tokens=1024。

旧版代码移至 langchain-classic

标准接口和代理焦点之外的现有功能已移至 langchain-classic 软件包。有关核心 langchain 软件包中可用的内容以及移至 langchain-classic 的内容,请参阅简化的命名空间部分。

删除已弃用的 API

已经弃用并计划在 1.0 中删除的方法、函数和其他对象已被删除。请查看先前版本的弃用通知以获取替代 API。

text 属性

消息对象上使用 .text() 方法应删除括号,因为它现在是一个属性:
现有的使用模式(即 .text())将继续有效,但现在会发出警告。方法形式将在 v2 中移除。

AIMessage 中的 example 参数已移除

example 参数已从 AIMessage 对象中移除。我们建议迁移使用 additional_kwargs 来根据需要传递额外的元数据。

次要变更

  • AIMessageChunk 对象现在包含一个 chunk_position 属性,位置为 'last' 以表示流中的最后一个块。这有助于更清晰地处理流式消息。如果不是最后一个块,chunk_position 将为 None。
  • LanguageModelOutputVar 现在类型为 AIMessage 而不是 BaseMessage。
  • 合并消息块的逻辑(AIMessageChunk.add)已更新,对合并块的最终 id 有更复杂的选择处理。它优先考虑提供者分配的 ID,而不是 LangChain 生成的 ID。
  • 我们现在默认使用 utf-8 编码打开文件。
  • 标准测试现在使用多模态内容块。

已存档的文档

旧文档已存档以供参考: