Langchain初体验:使用聊天模型

入门指南

聊天模型: 消息作为输入, 消息作为输出

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。您可以使用ChatPromptTemplateformatPromptValue - 这将返回一个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."),
]);
相关推荐
nuise_30 分钟前
李沐《动手学深度学习》 | 多层感知机
人工智能·深度学习
进取星辰1 小时前
23、Next.js:时空传送门——React 19 全栈框架
开发语言·javascript·react.js
究极无敌暴龙战神X1 小时前
hot100-子串-JS
javascript·数据结构·算法
大有数据可视化2 小时前
人工智能如何革新数据可视化领域?探索未来趋势
人工智能·信息可视化
AI technophile3 小时前
OpenCV计算机视觉实战(4)——计算机视觉核心技术全解析
人工智能·opencv·计算机视觉
云和数据.ChenGuang3 小时前
人工智能 机器学习期末考试题
开发语言·人工智能·python·机器学习·毕业设计
珊珊而川4 小时前
3.1监督微调
人工智能
我是小伍同学4 小时前
基于卷积神经网络和Pyqt5的猫狗识别小程序
人工智能·python·神经网络·qt·小程序·cnn
星空寻流年6 小时前
css3伸缩盒模型第二章(侧轴相关)
javascript·css·css3
界面开发小八哥6 小时前
界面控件DevExpress WinForms v25.1新功能预览 - 功能区组件全新升级
人工智能·.net·界面控件·winform·devexpress