跳到主要内容

ChatOpenAI

OpenAI 是一个人工智能 (AI) 研究实验室。

本指南将帮助您开始使用 ChatOpenAI 聊天模型。有关所有 ChatOpenAI 功能和配置的详细文档,请访问 API 参考

概述

集成详情

本地可序列化PY 支持包下载包最新版
ChatOpenAI@langchain/openaiNPM - DownloadsNPM - Version

模型功能

有关如何使用特定功能的指南,请参阅下方表格标题中的链接。

工具调用结构化输出JSON 模式图像输入音频输入视频输入令牌级流式传输令牌使用量Logprobs

设置

要访问 OpenAI 聊天模型,您需要创建一个 OpenAI 帐户、获取 API 密钥并安装 @langchain/openai 集成包。

凭据

访问 OpenAI 网站 注册 OpenAI 并生成 API 密钥。完成后,设置 OPENAI_API_KEY 环境变量

export OPENAI_API_KEY="your-api-key"

如果您想获取模型调用的自动跟踪,您还可以通过取消以下注释来设置您的 LangSmith API 密钥

# export LANGCHAIN_TRACING_V2="true"
# export LANGCHAIN_API_KEY="your-api-key"

安装

LangChain ChatOpenAI 集成位于 @langchain/openai 包中

提示

有关安装集成包的一般说明,请参阅 本节

yarn add @langchain/openai @langchain/core

实例化

现在我们可以实例化我们的模型对象并生成聊天完成

import { ChatOpenAI } from "@langchain/openai";

const llm = new ChatOpenAI({
model: "gpt-4o",
temperature: 0,
// other params...
});

调用

const aiMsg = await llm.invoke([
{
role: "system",
content:
"You are a helpful assistant that translates English to French. Translate the user sentence.",
},
{
role: "user",
content: "I love programming.",
},
]);
aiMsg;
AIMessage {
"id": "chatcmpl-ADItECqSPuuEuBHHPjeCkh9wIO1H5",
"content": "J'adore la programmation.",
"additional_kwargs": {},
"response_metadata": {
"tokenUsage": {
"completionTokens": 5,
"promptTokens": 31,
"totalTokens": 36
},
"finish_reason": "stop",
"system_fingerprint": "fp_5796ac6771"
},
"tool_calls": [],
"invalid_tool_calls": [],
"usage_metadata": {
"input_tokens": 31,
"output_tokens": 5,
"total_tokens": 36
}
}
console.log(aiMsg.content);
J'adore la programmation.

链式调用

我们可以 链式调用 我们的模型和提示模板,如下所示

import { ChatPromptTemplate } from "@langchain/core/prompts";

const prompt = ChatPromptTemplate.fromMessages([
[
"system",
"You are a helpful assistant that translates {input_language} to {output_language}.",
],
["human", "{input}"],
]);

const chain = prompt.pipe(llm);
await chain.invoke({
input_language: "English",
output_language: "German",
input: "I love programming.",
});
AIMessage {
"id": "chatcmpl-ADItFaWFNqkSjSmlxeGk6HxcBHzVN",
"content": "Ich liebe Programmieren.",
"additional_kwargs": {},
"response_metadata": {
"tokenUsage": {
"completionTokens": 5,
"promptTokens": 26,
"totalTokens": 31
},
"finish_reason": "stop",
"system_fingerprint": "fp_5796ac6771"
},
"tool_calls": [],
"invalid_tool_calls": [],
"usage_metadata": {
"input_tokens": 26,
"output_tokens": 5,
"total_tokens": 31
}
}

自定义 URL

您可以通过传递 configuration 参数来自定义 SDK 发送请求的基 URL,如下所示

import { ChatOpenAI } from "@langchain/openai";

const llmWithCustomURL = new ChatOpenAI({
temperature: 0.9,
configuration: {
baseURL: "https://your_custom_url.com",
},
});

await llmWithCustomURL.invoke("Hi there!");

configuration 字段还接受官方 SDK 接受的其他 ClientOptions 参数。

如果您是在 Azure OpenAI 上托管,请参阅 专用页面

自定义标题

您可以在同一个 configuration 字段中指定自定义标题

import { ChatOpenAI } from "@langchain/openai";

const llmWithCustomHeaders = new ChatOpenAI({
temperature: 0.9,
configuration: {
defaultHeaders: {
Authorization: `Bearer SOME_CUSTOM_VALUE`,
},
},
});

await llmWithCustomHeaders.invoke("Hi there!");

禁用流式使用元数据

一些代理或第三方提供商提供了与 OpenAI 基本相同的 API 接口,但不支持最近添加的 stream_options 参数来返回流式使用量。您可以使用 ChatOpenAI 通过禁用流式使用量来访问这些提供商,如下所示

import { ChatOpenAI } from "@langchain/openai";

const llmWithoutStreamUsage = new ChatOpenAI({
temperature: 0.9,
streamUsage: false,
configuration: {
baseURL: "https://proxy.com",
},
});

await llmWithoutStreamUsage.invoke("Hi there!");

调用微调模型

您可以通过传入相应的 modelName 参数来调用微调的 OpenAI 模型。

这通常采用 ft:{OPENAI_MODEL_NAME}:{ORG_NAME}::{MODEL_ID} 的形式。例如

import { ChatOpenAI } from "@langchain/openai";

const fineTunedLlm = new ChatOpenAI({
temperature: 0.9,
model: "ft:gpt-3.5-turbo-0613:{ORG_NAME}::{MODEL_ID}",
});

await fineTunedLlm.invoke("Hi there!");

生成元数据

如果您需要其他信息,例如 logprobs 或令牌使用量,这些信息将直接在 .invoke 响应中的 response_metadata 字段中的消息中返回。

提示

需要 @langchain/core 版本 >=0.1.48。

import { ChatOpenAI } from "@langchain/openai";

// See https://cookbook.openai.com/examples/using_logprobs for details
const llmWithLogprobs = new ChatOpenAI({
logprobs: true,
// topLogprobs: 5,
});

const responseMessageWithLogprobs = await llmWithLogprobs.invoke("Hi there!");
console.dir(responseMessageWithLogprobs.response_metadata.logprobs, {
depth: null,
});
{
content: [
{
token: 'Hello',
logprob: -0.0004740447,
bytes: [ 72, 101, 108, 108, 111 ],
top_logprobs: []
},
{
token: '!',
logprob: -0.00004334534,
bytes: [ 33 ],
top_logprobs: []
},
{
token: ' How',
logprob: -0.000030113732,
bytes: [ 32, 72, 111, 119 ],
top_logprobs: []
},
{
token: ' can',
logprob: -0.0004797665,
bytes: [ 32, 99, 97, 110 ],
top_logprobs: []
},
{
token: ' I',
logprob: -7.89631e-7,
bytes: [ 32, 73 ],
top_logprobs: []
},
{
token: ' assist',
logprob: -0.114006,
bytes: [
32, 97, 115,
115, 105, 115,
116
],
top_logprobs: []
},
{
token: ' you',
logprob: -4.3202e-7,
bytes: [ 32, 121, 111, 117 ],
top_logprobs: []
},
{
token: ' today',
logprob: -0.00004501419,
bytes: [ 32, 116, 111, 100, 97, 121 ],
top_logprobs: []
},
{
token: '?',
logprob: -0.000010206721,
bytes: [ 63 ],
top_logprobs: []
}
],
refusal: null
}

工具调用

使用 OpenAI 模型进行工具调用与 其他模型 的方式类似。此外,以下指南中包含了一些特别适用于 OpenAI 的信息

strict: true

截至 2024 年 8 月 6 日,OpenAI 支持在调用工具时使用 strict 参数,该参数将强制执行工具参数模式受到模型的尊重。在此处查看更多信息:https://platform.openai.com/docs/guides/function-calling

需要 @langchain/openai >= 0.2.6

注意: 如果 strict: true,工具定义也会被验证,并且只接受 JSON schema 的子集。重要的是,schema 不能包含可选参数(带有默认值的参数)。阅读完整文档,了解支持的 schema 类型:https://platform.openai.com/docs/guides/structured-outputs/supported-schemas.

以下是一个使用工具调用的示例。在 .bindTools 中传递额外的 strict: true 参数将把该参数传递给所有工具定义。

import { ChatOpenAI } from "@langchain/openai";
import { tool } from "@langchain/core/tools";
import { z } from "zod";

const weatherTool = tool((_) => "no-op", {
name: "get_current_weather",
description: "Get the current weather",
schema: z.object({
location: z.string(),
}),
});

const llmWithStrictTrue = new ChatOpenAI({
model: "gpt-4o",
}).bindTools([weatherTool], {
strict: true,
tool_choice: weatherTool.name,
});

// Although the question is not about the weather, it will call the tool with the correct arguments
// because we passed `tool_choice` and `strict: true`.
const strictTrueResult = await llmWithStrictTrue.invoke(
"What is 127862 times 12898 divided by 2?"
);

console.dir(strictTrueResult.tool_calls, { depth: null });
[
{
name: 'get_current_weather',
args: { location: 'current' },
type: 'tool_call',
id: 'call_hVFyYNRwc6CoTgr9AQFQVjm9'
}
]

如果您只想将此参数应用于部分工具,您也可以直接传递 OpenAI 格式的工具 schema。

import { zodToJsonSchema } from "zod-to-json-schema";

const toolSchema = {
type: "function",
function: {
name: "get_current_weather",
description: "Get the current weather",
strict: true,
parameters: zodToJsonSchema(
z.object({
location: z.string(),
})
),
},
};

const llmWithStrictTrueTools = new ChatOpenAI({
model: "gpt-4o",
}).bindTools([toolSchema], {
strict: true,
});

const weatherToolResult = await llmWithStrictTrueTools.invoke([
{
role: "user",
content: "What is the current weather in London?",
},
]);

weatherToolResult.tool_calls;
[
{
name: 'get_current_weather',
args: { location: 'London' },
type: 'tool_call',
id: 'call_EOSejtax8aYtqpchY8n8O82l'
}
]

结构化输出

我们也可以将 strict: true 传递给 .withStructuredOutput()。以下是一个示例。

import { ChatOpenAI } from "@langchain/openai";

const traitSchema = z.object({
traits: z
.array(z.string())
.describe("A list of traits contained in the input"),
});

const structuredLlm = new ChatOpenAI({
model: "gpt-4o-mini",
}).withStructuredOutput(traitSchema, {
name: "extract_traits",
strict: true,
});

await structuredLlm.invoke([
{
role: "user",
content: `I am 6'5" tall and love fruit.`,
},
]);
{ traits: [ `6'5" tall`, 'love fruit' ] }

提示缓存

较新的 OpenAI 模型将自动 缓存您提示的一部分,如果您的输入大小超过一定限制(在撰写本文时为 1024 个 token),以便为需要长上下文的使用场景降低成本。

注意: 对于给定查询缓存的 token 数量在 AIMessage.usage_metadata 中尚未标准化,而是包含在 AIMessage.response_metadata 字段中。

以下是一个示例。

import { ChatOpenAI } from "@langchain/openai";

const modelWithCaching = new ChatOpenAI({
model: "gpt-4o-mini-2024-07-18",
});

// CACHED_TEXT is some string longer than 1024 tokens
const LONG_TEXT = `You are a pirate. Always respond in pirate dialect.

Use the following as context when answering questions:

${CACHED_TEXT}`;

const longMessages = [
{
role: "system",
content: LONG_TEXT,
},
{
role: "user",
content: "What types of messages are supported in LangChain?",
},
];

const originalRes = await modelWithCaching.invoke(longMessages);

console.log("USAGE:", originalRes.response_metadata.usage);
USAGE: {
prompt_tokens: 2624,
completion_tokens: 263,
total_tokens: 2887,
prompt_tokens_details: { cached_tokens: 0 },
completion_tokens_details: { reasoning_tokens: 0 }
}
const resWitCaching = await modelWithCaching.invoke(longMessages);

console.log("USAGE:", resWitCaching.response_metadata.usage);
USAGE: {
prompt_tokens: 2624,
completion_tokens: 272,
total_tokens: 2896,
prompt_tokens_details: { cached_tokens: 2432 },
completion_tokens_details: { reasoning_tokens: 0 }
}

API 参考

有关所有 ChatOpenAI 功能和配置的详细文档,请访问 API 参考:https://api.js.langchain.com/classes/langchain_openai.ChatOpenAI.html


此页面是否有用?


您也可以留下详细的反馈 在 GitHub 上.