Skip to main content
您可以在 OpenAI 平台 文档中找到有关 OpenAI 最新模型、其成本、上下文窗口和支持的输入类型的信息。
API 参考有关所有功能和配置选项的详细文档,请参阅 ChatOpenAI API 参考。
API 范围ChatOpenAI 仅针对官方 OpenAI API 规范。来自第三方提供商的非标准响应字段(例如 reasoning_contentreasoningreasoning_details不会被提取或保留。如果您使用的是扩展了 Chat Completions 或 Responses 格式的提供商,例如 OpenRouterLiteLLMvLLMDeepSeek,请改用特定于提供商的包。详情请参阅 Chat Completions API 兼容性

概述

集成详情

模型功能

设置

要访问 OpenAI 模型,您需要安装 langchain-openai 集成包并获取 OpenAI 平台 API 密钥。

安装

凭证

前往 OpenAI 平台 注册并生成 API 密钥。完成后,在您的环境中设置 OPENAI_API_KEY 环境变量:
如果您想获得模型调用的自动跟踪,也可以设置您的 LangSmith API 密钥:

实例化

现在我们可以实例化模型对象并生成响应:
有关所有可用模型参数的完整集合,请参阅 ChatOpenAI API 参考。
令牌参数弃用OpenAI 在 2024 年 9 月弃用了 max_tokens,转而使用 max_completion_tokens。虽然 max_tokens 仍然支持向后兼容,但它在内部会自动转换为 max_completion_tokens

调用


流式传输使用量元数据

OpenAI 的 Chat Completions API 默认不流式传输令牌使用量统计信息(参见 OpenAI API 参考中的流式选项)。 要在使用 ChatOpenAIAzureChatOpenAI 进行流式传输时恢复令牌计数,请将 stream_usage=True 设置为初始化参数或在调用时设置:

与 Azure OpenAI 一起使用

Azure OpenAI v1 API 支持langchain-openai>=1.0.1 开始,ChatOpenAI 可以直接与 Azure OpenAI 端点一起使用新的 v1 API。这提供了一种统一的方式来使用 OpenAI 模型,无论它们托管在 OpenAI 还是 Azure 上。对于传统的特定于 Azure 的实现,请继续使用 AzureChatOpenAI
要将 ChatOpenAI 与 Azure OpenAI 一起使用,请将 base_url 设置为您的 Azure 端点,并附加 /openai/v1/
v1 API 增加了对 Microsoft Entra ID(前身为 Azure AD)身份验证的原生支持,并支持自动令牌刷新。将令牌提供程序可调用对象传递给 api_key 参数:
令牌提供程序是一个可调用对象,它会自动获取和刷新身份验证令牌,无需手动管理令牌过期。
安装要求要使用 Microsoft Entra ID 身份验证,请安装 Azure Identity 库:
您也可以在使用异步函数时将令牌提供程序可调用对象传递给 api_key 参数。您必须从 azure.identity.aio 导入 DefaultAzureCredential:
当使用异步可调用对象作为 API 密钥时,您必须使用异步方法(ainvokeastream 等)。同步方法将引发错误。

工具调用

OpenAI 有一个工具调用(我们在此处将“工具调用”和“函数调用”互换使用)API,允许您描述工具及其参数,并让模型返回一个 JSON 对象,其中包含要调用的工具和该工具的输入。工具调用对于构建使用工具的链和代理,以及更普遍地从模型获取结构化输出非常有用。

绑定工具

通过 ChatOpenAI.bind_tools,我们可以轻松地将 Pydantic 类、字典模式、LangChain 工具甚至函数作为工具传递给模型。在底层,这些被转换为 OpenAI 工具模式,如下所示:
…并在每次模型调用时传递。

严格模式

需要 langchain-openai>=0.1.21
自 2024 年 8 月 6 日起,OpenAI 在调用工具时支持 strict 参数,该参数将强制模型遵守工具参数模式。了解更多
如果 strict=True,工具定义也将被验证,并且只接受 JSON 模式的一个子集。关键是,模式不能有可选参数(那些具有默认值的参数)。阅读完整文档了解支持的模式类型。

工具调用

请注意,AIMessage 有一个 tool_calls 属性。它包含在标准化的 ToolCall 格式中,该格式与模型提供商无关。
有关绑定工具和工具调用输出的更多信息,请参阅工具调用文档。

自定义工具

需要 langchain-openai>=0.3.29
自定义工具支持具有任意字符串输入的工具。当您预期字符串参数较长或复杂时,它们特别有用。
OpenAI 支持为自定义工具输入指定 上下文无关文法,格式为 larkregex。详情请参阅 OpenAI 文档format 参数可以传递给 @custom_tool,如下所示:

结构化输出

OpenAI 支持原生的结构化输出功能,保证其响应遵循给定的模式。 您可以在单个模型调用中访问此功能,也可以通过指定 LangChain 代理响应格式来访问。示例如下。
使用 with_structured_output 方法生成结构化的模型响应。指定 method="json_schema" 以启用 OpenAI 的原生结构化输出功能;否则该方法默认使用函数调用。
使用 ProviderStrategy 指定 response_format,以便在生成最终响应时启用 OpenAI 的结构化输出功能。

结合工具调用的结构化输出

OpenAI 的结构化输出功能可以与工具调用同时使用。模型将生成工具调用或遵循所需模式的响应。示例如下:

Responses API

需要 langchain-openai>=0.3.9
OpenAI 支持一个 Responses API,该 API 面向构建代理应用程序。它包含一套内置工具,包括网络和文件搜索。它还支持管理对话状态,允许您继续对话线程而无需显式传递之前的消息,以及来自推理过程的输出。 如果使用了这些功能之一,ChatOpenAI 将路由到 Responses API。您也可以在实例化 ChatOpenAI 时指定 use_responses_api=True

网络搜索

要触发网络搜索,请将 {"type": "web_search_preview"} 作为工具传递给模型。
您也可以将内置工具作为调用参数传递:
请注意,响应包含结构化的内容块,其中包括响应文本和引用其来源的 OpenAI 注释。输出消息还将包含来自任何工具调用的信息:
您可以使用 response.text 仅将响应的文本内容作为字符串恢复。例如,要流式传输响应文本:
有关更多详细信息,请参阅流式传输指南

图像生成

需要 langchain-openai>=0.3.19
要触发图像生成,请将 {"type": "image_generation"} 作为工具传递给模型。
您也可以将内置工具作为调用参数传递:

文件搜索

要触发文件搜索,请将文件搜索工具作为工具传递给模型。您需要填充一个 OpenAI 管理的向量存储,并在工具定义中包含向量存储 ID。详情请参阅 OpenAI 文档
网络搜索一样,响应将包含带有引用的内容块:
它还将包含来自内置工具调用的信息:

工具搜索

需要 langchain-openai>=1.1.11
OpenAI 支持工具搜索功能,允许模型根据需要搜索并将工具加载到其上下文中。OpenAI 会将检索到的工具定义注入到活动上下文的末尾,以保留其缓存 要启用工具搜索,请使用 @tool(extras={"defer_loading": True}) 标记工具,并将 OpenAI 的搜索工具添加到可用工具中。示例如下。
OpenAI 可以搜索可用工具,并在同一个响应中返回加载的工具(如果合适,还包括工具调用):
要完全控制底层的工具搜索过程,您可以在搜索工具定义中指定 "execution": "client"。如果模型选择搜索工具,它将在响应中包含一个 tool_search_call 块。然后您可以提供一个包含工具定义的 tool_search_output 块。以下示例展示了如何使用自定义中间件来编排此过程。该示例实现了一个定义搜索逻辑的可调用对象。中间件包括:
  1. 一个 after_model 钩子,用于检查 tool_search_call 块并调用我们的可调用对象
  2. 一个 wrap_tool_call 钩子,用于运行时工具注册

计算机使用

ChatOpenAI 支持 "computer-use-preview" 模型,这是一个用于内置计算机使用工具的专用模型。要启用,请像传递其他工具一样传递计算机使用工具 目前,计算机使用的工具输出存在于消息的 content 字段中。要回复计算机使用工具调用,请构造一个 ToolMessage,并在其 additional_kwargs 中包含 {"type": "computer_call_output"}。消息的内容将是一个截图。下面我们演示一个简单的示例。 首先,加载两个截图:
响应将在其 content 中包含对计算机使用工具的调用:
接下来,我们构造一个具有以下属性的 ToolMessage
  1. 它有一个 tool_call_id,与计算机调用中的 call_id 匹配。
  2. 它的 additional_kwargs 中包含 {"type": "computer_call_output"}
  3. 它的内容要么是 image_url,要么是 input_image 输出块(格式参见 OpenAI 文档)。
我们现在可以使用消息历史再次调用模型:
我们也可以使用 previous_response_id 代替传递整个序列:

代码解释器

OpenAI 实现了一个代码解释器工具,以支持代码的沙盒生成和执行。
示例用法
请注意,上述命令创建了一个新容器。我们也可以指定一个现有的容器 ID:

远程 MCP

OpenAI 实现了一个远程 MCP工具,允许模型生成对 MCP 服务器的调用。
示例用法
OpenAI 有时会在与远程 MCP 服务器共享数据之前请求批准。在上面的命令中,我们指示模型永远不需要批准。我们也可以配置模型始终请求批准,或者始终为特定工具请求批准:
响应可能随后包含类型为 "mcp_approval_request" 的块。要提交审批请求的批准,请将其构造为输入消息中的内容块:

管理对话状态

Responses API 支持管理对话状态

手动管理状态

您可以像使用其他聊天模型一样,手动或使用 LangGraph 管理状态:
您可以使用 LangGraph 在各种后端(包括内存和 Postgres)为您管理对话线程。请参阅此教程开始使用。

传递 previous_response_id

使用 Responses API 时,LangChain 消息将在其元数据中包含一个 "id" 字段。将此 ID 传递给后续调用将继续对话。请注意,从计费角度来看,这与手动传递消息等效
ChatOpenAI 也可以使用消息序列中的最后一个响应自动指定 previous_response_id
如果我们设置 use_previous_response_id=True,输入消息(直到最近的响应)将从请求负载中丢弃,并且 previous_response_id 将使用最近响应的 ID 设置。 也就是说,
…等同于:

上下文管理

Responses API 支持自动的服务器端上下文压缩。当对话达到令牌阈值时,这会减少对话大小,从而支持长时间运行的交互:
启用后,AIMessage 响应可能在内容中包含类型为 "compaction" 的块。这些应保留在对话历史中,并可以以通常的方式附加到消息序列中。可以保留最近 compaction 项之前的消息,也可以丢弃它们以提高延迟。

推理输出

一些 OpenAI 模型将生成单独的文本内容来说明其推理过程。详情请参阅 OpenAI 的推理文档 OpenAI 可以返回模型推理的摘要(尽管它不暴露原始推理令牌)。要配置 ChatOpenAI 返回此摘要,请指定 reasoning 参数。如果设置了此参数,ChatOpenAI 将自动路由到 Responses API。
故障排除:推理模型的空响应如果您从 gpt-5-nano 等推理模型获得空响应,这可能是由于令牌限制过于严格。模型使用令牌进行内部推理,可能没有剩余令牌用于最终输出。确保 max_tokens 设置为 None 或增加令牌限制,以允许足够的令牌用于推理和输出生成。

微调

您可以通过传递相应的 modelName 参数来调用微调的 OpenAI 模型。 这通常采用 ft:{OPENAI_MODEL_NAME}:{ORG_NAME}::{MODEL_ID} 的形式。例如:

多模态输入(图像、PDF、音频)

OpenAI 有支持多模态输入的模型。您可以将图像、PDF 或音频传递给这些模型。有关如何在 LangChain 中执行此操作的更多信息,请参阅多模态输入文档。 您可以在 OpenAI 文档中查看支持不同模态的模型列表。 对于所有模态,LangChain 都支持其跨提供商标准以及 OpenAI 的原生内容块格式。 要将多模态数据传递给 ChatOpenAI,请创建一个包含数据的内容块并将其合并到消息中,例如,如下所示:
内容块示例如下。
请参阅多模态消息操作指南中的示例。
URLs
内联 base64 数据
注意:OpenAI 要求为 PDF 输入指定文件名。使用 LangChain 的格式时,请包含 filename 键。阅读更多关于 OpenAI 多模态消息文件名的信息。请参阅 PDF 文档操作指南中的示例。
内联 base64 数据
请参阅支持的模型,例如 "gpt-4o-audio-preview"请参阅音频操作指南中的示例。
内联 base64 数据

预测输出

需要 langchain-openai>=0.2.6
一些 OpenAI 模型(例如其 gpt-4ogpt-4o-mini 系列)支持预测输出,允许您提前传递 LLM 预期输出的已知部分以减少延迟。这对于编辑文本或代码等情况很有用,因为模型输出中只有一小部分会发生变化。 以下是一个示例:
预测作为额外令牌计费,可能会增加您的使用量和成本,以换取降低的延迟。

音频生成(预览)

需要 langchain-openai>=0.2.3
OpenAI 有一个新的音频生成功能,允许您使用 gpt-4o-audio-preview 模型进行音频输入和输出。
output_message.additional_kwargs['audio'] 将包含一个类似以下的字典
…格式将是 model_kwargs['audio']['format'] 中传递的内容。 我们也可以在 openai expires_at 到达之前,将此包含音频数据的消息作为消息历史的一部分传递回模型。
输出音频存储在 AIMessage.additional_kwargsaudio 键下,但输入内容块在 HumanMessage.content 列表中使用 input_audio 类型和键进行类型化。有关更多信息,请参阅 OpenAI 的音频文档

提示缓存

OpenAI 的提示缓存功能会自动缓存超过 1024 个令牌的提示,以降低成本并提高响应时间。此功能对所有最新模型(gpt-4o 及更新版本)启用。

手动缓存

您可以使用 prompt_cache_key 参数来影响 OpenAI 的缓存并优化缓存命中率:
缓存命中要求提示前缀完全匹配

缓存键策略

您可以根据应用程序的需要使用不同的缓存键策略:

模型级缓存

您也可以使用 model_kwargs 在模型级别设置默认缓存键:

弹性处理

OpenAI 提供多种服务层级。“弹性”层级提供更便宜的请求定价,但代价是响应可能需要更长时间,并且资源可能并不总是可用。此方法最适合非关键任务,包括模型测试、数据增强或可以异步运行的任务。 要使用它,请使用 service_tier="flex" 初始化模型:
请注意,这是一个仅对部分模型可用的 beta 功能。详情请参阅 OpenAI 文档

API 参考

有关所有功能和配置选项的详细文档,请参阅 ChatOpenAI API 参考。