概述
集成详情
模型功能
设置
要访问 OpenAI 模型,您需要安装langchain-openai 集成包并获取 OpenAI 平台 API 密钥。
安装
凭证
前往 OpenAI 平台 注册并生成 API 密钥。完成后,在您的环境中设置OPENAI_API_KEY 环境变量:
实例化
现在我们可以实例化模型对象并生成响应:ChatOpenAI API 参考。
令牌参数弃用OpenAI 在 2024 年 9 月弃用了
max_tokens,转而使用 max_completion_tokens。虽然 max_tokens 仍然支持向后兼容,但它在内部会自动转换为 max_completion_tokens。调用
流式传输使用量元数据
OpenAI 的 Chat Completions API 默认不流式传输令牌使用量统计信息(参见 OpenAI API 参考中的流式选项)。 要在使用ChatOpenAI 或 AzureChatOpenAI 进行流式传输时恢复令牌计数,请将 stream_usage=True 设置为初始化参数或在调用时设置:
与 Azure OpenAI 一起使用
Azure OpenAI v1 API 支持从
langchain-openai>=1.0.1 开始,ChatOpenAI 可以直接与 Azure OpenAI 端点一起使用新的 v1 API。这提供了一种统一的方式来使用 OpenAI 模型,无论它们托管在 OpenAI 还是 Azure 上。对于传统的特定于 Azure 的实现,请继续使用 AzureChatOpenAI。使用 API 密钥与 Azure OpenAI v1 API
使用 API 密钥与 Azure OpenAI v1 API
要将
ChatOpenAI 与 Azure OpenAI 一起使用,请将 base_url 设置为您的 Azure 端点,并附加 /openai/v1/:使用 Microsoft Entra ID 与 Azure OpenAI
使用 Microsoft Entra ID 与 Azure OpenAI
v1 API 增加了对 Microsoft Entra ID(前身为 Azure AD)身份验证的原生支持,并支持自动令牌刷新。将令牌提供程序可调用对象传递给 令牌提供程序是一个可调用对象,它会自动获取和刷新身份验证令牌,无需手动管理令牌过期。您也可以在使用异步函数时将令牌提供程序可调用对象传递给
api_key 参数:api_key 参数。您必须从 azure.identity.aio 导入 DefaultAzureCredential:当使用异步可调用对象作为 API 密钥时,您必须使用异步方法(
ainvoke、astream 等)。同步方法将引发错误。工具调用
OpenAI 有一个工具调用(我们在此处将“工具调用”和“函数调用”互换使用)API,允许您描述工具及其参数,并让模型返回一个 JSON 对象,其中包含要调用的工具和该工具的输入。工具调用对于构建使用工具的链和代理,以及更普遍地从模型获取结构化输出非常有用。绑定工具
通过ChatOpenAI.bind_tools,我们可以轻松地将 Pydantic 类、字典模式、LangChain 工具甚至函数作为工具传递给模型。在底层,这些被转换为 OpenAI 工具模式,如下所示:
严格模式
需要
langchain-openai>=0.1.21strict 参数,该参数将强制模型遵守工具参数模式。了解更多。
如果
strict=True,工具定义也将被验证,并且只接受 JSON 模式的一个子集。关键是,模式不能有可选参数(那些具有默认值的参数)。阅读完整文档了解支持的模式类型。工具调用
请注意,AIMessage 有一个tool_calls 属性。它包含在标准化的 ToolCall 格式中,该格式与模型提供商无关。
自定义工具
需要
langchain-openai>=0.3.29上下文无关文法
上下文无关文法
结构化输出
OpenAI 支持原生的结构化输出功能,保证其响应遵循给定的模式。 您可以在单个模型调用中访问此功能,也可以通过指定 LangChain 代理的响应格式来访问。示例如下。单个模型调用
单个模型调用
代理响应格式
代理响应格式
结合工具调用的结构化输出
OpenAI 的结构化输出功能可以与工具调用同时使用。模型将生成工具调用或遵循所需模式的响应。示例如下:Responses API
需要
langchain-openai>=0.3.9ChatOpenAI 将路由到 Responses API。您也可以在实例化 ChatOpenAI 时指定 use_responses_api=True。
网络搜索
要触发网络搜索,请将{"type": "web_search_preview"} 作为工具传递给模型。
图像生成
需要
langchain-openai>=0.3.19{"type": "image_generation"} 作为工具传递给模型。

文件搜索
要触发文件搜索,请将文件搜索工具作为工具传递给模型。您需要填充一个 OpenAI 管理的向量存储,并在工具定义中包含向量存储 ID。详情请参阅 OpenAI 文档。工具搜索
需要
langchain-openai>=1.1.11@tool(extras={"defer_loading": True}) 标记工具,并将 OpenAI 的搜索工具添加到可用工具中。示例如下。
服务器端工具搜索
服务器端工具搜索
OpenAI 可以搜索可用工具,并在同一个响应中返回加载的工具(如果合适,还包括工具调用):
客户端执行的工具搜索
客户端执行的工具搜索
计算机使用
ChatOpenAI 支持 "computer-use-preview" 模型,这是一个用于内置计算机使用工具的专用模型。要启用,请像传递其他工具一样传递计算机使用工具。
目前,计算机使用的工具输出存在于消息的 content 字段中。要回复计算机使用工具调用,请构造一个 ToolMessage,并在其 additional_kwargs 中包含 {"type": "computer_call_output"}。消息的内容将是一个截图。下面我们演示一个简单的示例。
首先,加载两个截图:
content 中包含对计算机使用工具的调用:
ToolMessage:
- 它有一个
tool_call_id,与计算机调用中的call_id匹配。 - 它的
additional_kwargs中包含{"type": "computer_call_output"}。 - 它的内容要么是
image_url,要么是input_image输出块(格式参见 OpenAI 文档)。
previous_response_id 代替传递整个序列:
代码解释器
OpenAI 实现了一个代码解释器工具,以支持代码的沙盒生成和执行。示例用法
远程 MCP
OpenAI 实现了一个远程 MCP工具,允许模型生成对 MCP 服务器的调用。示例用法
MCP 审批
MCP 审批
OpenAI 有时会在与远程 MCP 服务器共享数据之前请求批准。在上面的命令中,我们指示模型永远不需要批准。我们也可以配置模型始终请求批准,或者始终为特定工具请求批准:响应可能随后包含类型为
"mcp_approval_request" 的块。要提交审批请求的批准,请将其构造为输入消息中的内容块:管理对话状态
Responses API 支持管理对话状态。手动管理状态
您可以像使用其他聊天模型一样,手动或使用 LangGraph 管理状态:传递 previous_response_id
使用 Responses API 时,LangChain 消息将在其元数据中包含一个 "id" 字段。将此 ID 传递给后续调用将继续对话。请注意,从计费角度来看,这与手动传递消息等效。
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。
微调
您可以通过传递相应的modelName 参数来调用微调的 OpenAI 模型。
这通常采用 ft:{OPENAI_MODEL_NAME}:{ORG_NAME}::{MODEL_ID} 的形式。例如:
多模态输入(图像、PDF、音频)
OpenAI 有支持多模态输入的模型。您可以将图像、PDF 或音频传递给这些模型。有关如何在 LangChain 中执行此操作的更多信息,请参阅多模态输入文档。 您可以在 OpenAI 文档中查看支持不同模态的模型列表。 对于所有模态,LangChain 都支持其跨提供商标准以及 OpenAI 的原生内容块格式。 要将多模态数据传递给ChatOpenAI,请创建一个包含数据的内容块并将其合并到消息中,例如,如下所示:
图像
图像
PDF
注意:OpenAI 要求为 PDF 输入指定文件名。使用 LangChain 的格式时,请包含
filename 键。阅读更多关于 OpenAI 多模态消息文件名的信息。请参阅 PDF 文档操作指南中的示例。内联 base64 数据
预测输出
需要
langchain-openai>=0.2.6gpt-4o 和 gpt-4o-mini 系列)支持预测输出,允许您提前传递 LLM 预期输出的已知部分以减少延迟。这对于编辑文本或代码等情况很有用,因为模型输出中只有一小部分会发生变化。
以下是一个示例:
预测作为额外令牌计费,可能会增加您的使用量和成本,以换取降低的延迟。
音频生成(预览)
需要
langchain-openai>=0.2.3gpt-4o-audio-preview 模型进行音频输入和输出。
output_message.additional_kwargs['audio'] 将包含一个类似以下的字典
model_kwargs['audio']['format'] 中传递的内容。
我们也可以在 openai expires_at 到达之前,将此包含音频数据的消息作为消息历史的一部分传递回模型。
输出音频存储在
AIMessage.additional_kwargs 的 audio 键下,但输入内容块在 HumanMessage.content 列表中使用 input_audio 类型和键进行类型化。有关更多信息,请参阅 OpenAI 的音频文档。提示缓存
OpenAI 的提示缓存功能会自动缓存超过 1024 个令牌的提示,以降低成本并提高响应时间。此功能对所有最新模型(gpt-4o 及更新版本)启用。
手动缓存
您可以使用prompt_cache_key 参数来影响 OpenAI 的缓存并优化缓存命中率:
缓存键策略
您可以根据应用程序的需要使用不同的缓存键策略:模型级缓存
您也可以使用model_kwargs 在模型级别设置默认缓存键:
弹性处理
OpenAI 提供多种服务层级。“弹性”层级提供更便宜的请求定价,但代价是响应可能需要更长时间,并且资源可能并不总是可用。此方法最适合非关键任务,包括模型测试、数据增强或可以异步运行的任务。 要使用它,请使用service_tier="flex" 初始化模型:
API 参考
有关所有功能和配置选项的详细文档,请参阅ChatOpenAI API 参考。
将这些文档通过 MCP 连接到 Claude、VSCode 等,以获取实时答案。

