附加功能: 聊天模型
我们为聊天模型提供了许多附加功能。在以下示例中,我们将使用 ChatOpenAI
模型。
附加方法
L angChain 为与聊天模型交互提供了许多附加方法:
import { ChatOpenAI } from "langchain/chat_models/openai";
import { HumanChatMessage, SystemChatMessage } from "langchain/schema";
export const run = async () => {
const chat = new ChatOpenAI({ modelName: "gpt-3.5-turbo" });
// Pass in a list of messages to `call` to start a conversation. In this simple example, we only pass in one message.
const responseA = await chat.call([
new HumanChatMessage(
"What is a good name for a company that makes colorful socks?"
),
]);
console.log(responseA);
// AIChatMessage { text: '\n\nRainbow Sox Co.' }
// You can also pass in multiple messages to start a conversation.
// The first message is a system message that describes the context of the conversation.
// The second message is a human message that starts the conversation.
const responseB = await chat.call([
new SystemChatMessage(
"You are a helpful assistant that translates English to French."
),
new HumanChatMessage("Translate: I love programming."),
]);
console.log(responseB);
// AIChatMessage { text: "J'aime programmer." }
// Similar to LLMs, you can also use `generate` to generate chat completions for multiple sets of messages.
const responseC = await chat.generate([
[
new SystemChatMessage(
"You are a helpful assistant that translates English to French."
),
new HumanChatMessage(
"Translate this sentence from English to French. I love programming."
),
],
[
new SystemChatMessage(
"You are a helpful assistant that translates English to French."
),
new HumanChatMessage(
"Translate this sentence from English to French. I love artificial intelligence."
),
],
]);
console.log(responseC);
/*
{
generations: [
[
{
text: "J'aime programmer.",
message: AIChatMessage { text: "J'aime programmer." },
}
],
[
{
text: "J'aime l'intelligence artificielle.",
message: AIChatMessage { text: "J'aime l'intelligence artificielle." }
}
]
]
}
*/
};
流式传输
与 LLMs 类似,您可以从聊天模型中流式传输响应。这对于需要实时响应用户输入的聊天机器人非常有用。
import { ChatOpenAI } from "langchain/chat_models/openai";
import { HumanChatMessage } from "langchain/schema";
const chat = new ChatOpenAI({
maxTokens: 25,
streaming: true,
});
const response = await chat.call(
[new HumanChatMessage("Tell me a joke.")],
undefined,
[
{
handleLLMNewToken(token: string) {
console.log({ token });
},
},
]
);
console.log(response);
// { token: '' }
// { token: '\n\n' }
// { token: 'Why' }
// { token: ' don' }
// { token: "'t" }
// { token: ' scientists' }
// { token: ' trust' }
// { token: ' atoms' }
// { token: '?\n\n' }
// { token: 'Because' }
// { token: ' they' }
// { token: ' make' }
// { token: ' up' }
// { token: ' everything' }
// { token: '.' }
// { token: '' }
// AIChatMessage {
// text: "\n\nWhy don't scientists trust atoms?\n\nBecause they make up everything."
// }
添加超时
默认情况下,LangChain 会无限期等待模型提供者的响应。如果您想添加超时,可以在调用模型时传递一个以毫秒为单位的 timeout
选项。例如,对于 OpenAI:
import { ChatOpenAI } from "langchain/chat_models/openai";
import { HumanChatMessage } from "langchain/schema";
const chat = new ChatOpenAI({ temperature: 1 });
const response = await chat.call(
[
new HumanChatMessage(
"What is a good name for a company that makes colorful socks?"
),
],
{ timeout: 1000 } // 1s timeout
);
console.log(response);
// AIChatMessage { text: '\n\nRainbow Sox Co.' }
取消请求
您可以在调用模型时通过传递 signal
选项来取消请求。例如,对于 OpenAI:
import { ChatOpenAI } from "langchain/chat_models/openai";
import { HumanChatMessage } from "langchain/schema";
const model = new ChatOpenAI({ temperature: 1 });
const controller = new AbortController();
// Call `controller.abort()` somewhere to cancel the request.
const res = await model.call(
[
new HumanChatMessage(
"What is a good name for a company that makes colorful socks?"
),
],
{ signal: controller.signal }
);
console.log(res);
/*
'\n\nSocktastic Colors'
*/
注意,只有底层提供程序暴露该选项时,才会取消正在进行的请求。如果可能,LangChain 将取消底层请求,否则将取消响应的处理。
处理速率限制
一些提供程序具有速率限制。如果超过速率限制,您将收到错误提示。为帮助您处理这种情况,LangChain 在实例化聊天模型时提供了 maxConcurrency
选项。该选项允许您指定要向提供程序发出的并发请求的最大数量。如果超出此数字,则 LangChain 将自动将您的请求排队,以在之前的请求完成后发送。
例如,如果您设置maxConcurrency:5
,则LangChain一次仅会向提供程序发送5个请求。如果您发送10个请求,则会立即发送前5个请求,并将下一个5个请求排队。一旦前5个请求中的一个完成,队列中的下一个请求将被发送。
要使用此功能,只需在实例化LLM时传递maxConcurrency:<number>
即可。例如:
import { ChatOpenAI } from "langchain/chat_models/openai";
const model = new ChatOpenAI({ maxConcurrency: 5 });
处理API错误
如果模型提供程序从其API返回错误,则默认情况下,LangChain将在指数回退上重试最多6次。这使得错误恢复无需任何额外的努力。如果您想更改此行为,则可以在实例化模型时传递maxRetries
选项。例如@#:
import { ChatOpenAI } from "langchain/chat_models/openai";
const model = new ChatOpenAI({ maxRetries: 10 });
订阅事件
特别是使用代理时,作为聊天模型处理提示时可能会有很多事情来回发生。对于代理,响应对象包含一个intermediateSteps对象,您可以打印以查看它所采取的步骤概述。如果这还不够,您想查看与聊天模型的每个交换,您可以将回调传递给聊天模型以进行自定义日志记录(或任何其他您想要执行的操作),因为模型通过这些步骤@#。
有关可用事件的更多信息,请参见文档中的回调(Callbacks)Callbacks部分。
import { HumanChatMessage, LLMResult } from "langchain/schema";
import { ChatOpenAI } from "langchain/chat_models/openai";
// We can pass in a list of CallbackHandlers to the LLM constructor to get callbacks for various events.
const model = new ChatOpenAI({
callbacks: [
{
handleLLMStart: async (llm: { name: string }, prompts: string[]) => {
console.log(JSON.stringify(llm, null, 2));
console.log(JSON.stringify(prompts, null, 2));
},
handleLLMEnd: async (output: LLMResult) => {
console.log(JSON.stringify(output, null, 2));
},
handleLLMError: async (err: Error) => {
console.error(err);
},
},
],
});
await model.call([
new HumanChatMessage(
"What is a good name for a company that makes colorful socks?"
),
]);
/*
{
"name": "openai"
}
[
"Human: What is a good name for a company that makes colorful socks?"
]
{
"generations": [
[
{
"text": "Rainbow Soles",
"message": {
"text": "Rainbow Soles"
}
}
]
],
"llmOutput": {
"tokenUsage": {
"completionTokens": 4,
"promptTokens": 21,
"totalTokens": 25
}
}
}
*/