入门指南
聊天模型: 消息作为输入, 消息作为输出
js
import { ChatOpenAI } from "langchain/chat_models/openai";
import { HumanChatMessage } from "langchain/schema";
// 创建一个ChatOpenAI实例
const chat = new ChatOpenAI({
modelName: "gpt-3.5-turbo",
openAIApiKey: process.env.VUE_APP_OPENAI_API_KEY,
});
// 使用chat.call方法执行一个聊天对话,并获取生成的响应结果
const response = await chat.call([
// 人类消息,指定了需要翻译的文本"I love programming."
new HumanChatMessage(
"Translate this sentence from English to Chinese. I love programming."
),
]);
// {"lc":1,"type":"constructor","id":["langchain","schema","AIMessage"],"kwargs":{"content":"我喜欢编程。 (Wǒ xǐhuān biānchéng.)","additional_kwargs":{}}}
console.log(response);
使用chat.call
方法执行一个聊天对话,并获取生成的响应结果
js
import { ChatOpenAI } from "langchain/chat_models/openai";
import { HumanChatMessage, SystemChatMessage } from "langchain/schema";
// 创建一个ChatOpenAI实例
const chat = new ChatOpenAI({
modelName: "gpt-3.5-turbo",
openAIApiKey: process.env.VUE_APP_OPENAI_API_KEY,
});
// 这里发送了多条消息
const responseB = await chat.call([
// 系统消息,告诉助手它的功能是将英语翻译为中文
new SystemChatMessage(
"You are a helpful assistant that translates English to Chinese."
),
// 人类消息,指定了需要翻译的文本"I love programming."
new HumanChatMessage("Translate: I love programming."),
]);
// {"lc":1,"type":"constructor","id":["langchain","schema","AIMessage"],"kwargs":{"content":"我喜欢编程。 (Wǒ xǐhuān biānchéng.)","additional_kwargs":{}}}
console.log(responseB);
可以进一步生成多个消息集的完成,使用generate
。这将返回具有额外消息参数的LLMResult
。
js
import { ChatOpenAI } from "langchain/chat_models/openai";
import { HumanChatMessage, SystemChatMessage } from "langchain/schema";
// 创建一个ChatOpenAI实例
const chat = new ChatOpenAI({
modelName: "gpt-3.5-turbo",
openAIApiKey: process.env.VUE_APP_OPENAI_API_KEY,
});
// 使用chat.generate方法执行多组对话,并获取生成的响应结果
const responseC = await chat.generate([
// 第一组对话
[
new SystemChatMessage(
"You are a helpful assistant that translates English to Chinese."
),
new HumanChatMessage(
"Translate this sentence from English to Chinese. I love programming."
),
],
// 第二组对话
[
new SystemChatMessage(
"You are a helpful assistant that translates English to Chinese."
),
new HumanChatMessage(
"Translate this sentence from English to Chinese. I love artificial intelligence."
),
],
]);
// {"generations":[[{"text":"我喜欢编程。","message":{"lc":1,"type":"constructor","id":["langchain","schema","AIMessage"],"kwargs":{"content":"我喜欢编程。","additional_kwargs":{}}}}],[{"text":"我喜欢人工智能。","message":{"lc":1,"type":"constructor","id":["langchain","schema","AIMessage"],"kwargs":{"content":"我喜欢人工智能。","additional_kwargs":{}}}}]],"llmOutput":{"tokenUsage":{"completionTokens":19,"promptTokens":69,"totalTokens":88}}}
console.log(responseC);
聊天提示模板: 管理聊天模型的提示
您可以通过使用MessagePromptTemplate
来利用模板。您可以从一个或多个MessagePromptTemplate
构建ChatPromptTemplate
。您可以使用ChatPromptTemplate
的formatPromptValue
- 这将返回一个PromptValue
您可以将PromptValue
转换为字符串或消息对象,具体取决于您是否想将格式化值用作llm或聊天模型的输入。
js
import { ChatOpenAI } from "langchain/chat_models/openai";
import { SystemMessagePromptTemplate, HumanMessagePromptTemplate, ChatPromptTemplate, MessagesPlaceholder } from "langchain/prompts";
// 创建一个ChatOpenAI实例
const chat = new ChatOpenAI({
modelName: "gpt-3.5-turbo",
openAIApiKey: process.env.VUE_APP_OPENAI_API_KEY,
});
// 1. 首先,我们创建一个可重复使用的模板:
// 2. 创建一个ChatPromptTemplate实例,使用一系列PromptMessage来组成翻译助手的模板
// 3. 使用SystemMessagePromptTemplate来定义对话的初始系统消息
// 4. 使用HumanMessagePromptTemplate来处理人类输入
const translationPrompt = ChatPromptTemplate.fromPromptMessages([
SystemMessagePromptTemplate.fromTemplate(
"You are a helpful assistant that translates {input_language} to {output_language}."
),
HumanMessagePromptTemplate.fromTemplate("{text}"),
]);
// 使用translationPrompt模板,通过formatPromptValue方法生成响应
// 传入输入参数{input_language: "English", output_language: "Chinese", text: "I love programming."}
const responseA = await chat.generatePrompt([
await translationPrompt.formatPromptValue({
input_language: "English", // 输入文本的语言为英语
output_language: "Chinese", // 输出文本的语言为中文
text: "I love programming.", // 需要翻译的文本
}),
]);
// {"generations": [[{"text": "我喜欢编程。","message": {"lc": 1,"type": "constructor","id": ["langchain","schema","AIMessage"],"kwargs": {"content": "我喜欢编程。","additional_kwargs": {}}}}]],"llmOutput": {"tokenUsage": {"completionTokens": 8,"promptTokens": 26,"totalTokens": 34}}}
console.log(responseA);
模型+提示=LLMChain
js
import { ChatOpenAI } from "langchain/chat_models/openai";
import { SystemMessagePromptTemplate, HumanMessagePromptTemplate, ChatPromptTemplate, MessagesPlaceholder } from "langchain/prompts";
// 创建一个ChatOpenAI实例
const chat = new ChatOpenAI({
modelName: "gpt-3.5-turbo",
openAIApiKey: process.env.VUE_APP_OPENAI_API_KEY,
});
// 创建一个ChatPromptTemplate实例,使用一系列PromptMessage来组成翻译助手的模板
// 使用SystemMessagePromptTemplate来定义对话的初始系统消息
// 使用HumanMessagePromptTemplate来处理人类输入
const translationPrompt = ChatPromptTemplate.fromPromptMessages([
SystemMessagePromptTemplate.fromTemplate(
"You are a helpful assistant that translates {input_language} to {output_language}."
),
HumanMessagePromptTemplate.fromTemplate("{text}"),
]);
// 创建一个LLMChain实例,设置聊天模板为translationPrompt,指定ChatOpenAI模型为chat
const chain = new LLMChain({
prompt: translationPrompt,
llm: chat,
});
// 调用LLMChain的call方法,传入输入参数作为参数
// 这将触发ChatOpenAI模型的执行,并返回翻译后的结果
const responseB = await chain.call({
input_language: "English", // 输入文本的语言为英语
output_language: "Chinese", // 输出文本的语言为中文
text: "I love programming.", // 需要翻译的文本
});
// 打印ChatOpenAI模型对输入参数的响应结果
// responseB应该包含翻译后的文本,例如:{"text": "我喜欢编程。"}
console.log(responseB);
代理: 根据用户输入动态运行链
工具和代理通过其他能力扩展了模型,例如搜索或计算器。
工具是一个函数,它接受一个字符串并返回一个字符串。它们还有一个名称和描述,由聊天模型用于识别应该调用哪个工具。
代理是对代理提示链(例如MRKL)的无状态包装器,它负责将工具按格式放入提示中,并解析从聊天模型获取的响应。
要使代理更强大,我们需要使它们迭代,即多次调用模型,直到它们到达最终答案。这是AgentExecutor的工作。
js
import { ChatOpenAI } from "langchain/chat_models/openai";
import { SerpAPI } from "langchain/tools";
import { AgentExecutor, ChatAgent } from 'langchain/agents';
// 创建一个包含SerpAPI工具的tools数组,用于使用Google搜索
// 使用VUE_APP_SERPAPI_API_KEY作为API密钥,指定搜索位置和语言
const tools = [
new SerpAPI(process.env.VUE_APP_SERPAPI_API_KEY, {
location: "Guangdong,China",
hl: "en",
gl: "us",
}),
];
// 使用ChatOpenAI模型和tools数组创建一个ChatAgent实例
const agent = ChatAgent.fromLLMAndTools(
new ChatOpenAI({
modelName: "gpt-3.5-turbo",
openAIApiKey: process.env.VUE_APP_OPENAI_API_KEY,
}),
tools
);
// 使用ChatAgent和tools数组创建一个AgentExecutor实例
// AgentExecutor用于调用ChatAgent,直到找到答案为止
const executor = AgentExecutor.fromAgentAndTools({ agent, tools });
// 使用executor调用ChatAgent,传入问题文本作为参数
// 这将触发ChatOpenAI模型的执行和使用SerpAPI进行搜索
const responseG = await executor.run(
"How many people live in Canada as of 2023?"
);
// 打印ChatAgent的响应结果
// responseG应该包含一个关于问题的回答,例如:"38,781,291 people"
console.log(responseG);
内存: 向链和代理添加状态
还可以使用链来存储状态。这对于聊天机器人等应用程序非常有用,因为您需要跟踪会话历史记录。MessagesPlaceholder
是一个特殊的提示模板,每次调用将替换为传递的消息。
js
// 创建一个ChatOpenAI实例
const chat = new ChatOpenAI({
modelName: "gpt-3.5-turbo",
openAIApiKey: process.env.VUE_APP_OPENAI_API_KEY,
});
// 创建一个ChatPromptTemplate实例,使用一系列PromptMessage来组成对话的模板
const chatPrompt = ChatPromptTemplate.fromPromptMessages([
SystemMessagePromptTemplate.fromTemplate(
"以下是一段人类与人工智能之间的友好对话。 人工智能很健谈,并根据上下文提供了许多具体细节。 如果人工智能不知道问题的答案,它就会如实说它不知道。"
),
new MessagesPlaceholder("history"), // 这是一个占位符,用于指代对话的历史消息
HumanMessagePromptTemplate.fromTemplate("{input}"), // 这个模板用于处理人类输入
]);
// 创建一个ConversationChain实例,设置内存、聊天模板和ChatOpenAI模型
const chain = new ConversationChain({
memory: new BufferMemory({ returnMessages: true, memoryKey: "history" }), // 使用BufferMemory作为内存存储历史消息
prompt: chatPrompt,
llm: chat,
});
// 调用ConversationChain的call方法,传入人类输入文本作为参数
// 这将触发聊天对话,与ChatOpenAI模型进行交互
const responseH = await chain.call({
input: "你好,我来自深圳,你今天过得怎么样",
});
// responseH包含了模型对输入文本的响应结果,可根据需要对其进行处理或输出
// {"response":"你好!我是一个人工智能,请问有什么我可以帮助你的吗?由于我是一个虚拟存在,所以没有具体的生活经历,也没有过日子的概念。但是,我始终保持正常运转,随时准备回答你的问题。"}
console.log(responseH);
流式处理
和上一篇笔记《Langchain初体验:使用LLM》一样
js
import { ChatOpenAI } from "langchain/chat_models/openai";
import { HumanChatMessage } from "langchain/schema";
const chat = new ChatOpenAI({
streaming: true,
callbacks: [
{
handleLLMNewToken(token: string) {
// 在浏览器中直接逐字更新状态
that.msg = that.msg + token;
// 在 node 中可以使用 process.stdout.write 逐字输出
process.stdout.write(token);
},
},
],
});
await chat.call([
new HumanChatMessage("Write me a song about sparkling water."),
]);