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."),
]);
相关推荐
一 铭1 分钟前
llamaindex实战-Agent-在Agent中和数据库对话(本地部署)
人工智能·chatgpt·大模型·llm
zyq~17 分钟前
【自学笔记】推荐系统
人工智能·笔记·机器学习
fanxbl95718 分钟前
模糊神经网络学习方法探讨
人工智能·神经网络·学习方法
花花鱼31 分钟前
vscode vite+vue3项目启动调试
前端·javascript·vue.js
秋迟言说38 分钟前
webstorm中 ‘@/**‘报 未安装模块 无法Ctrl定位
前端·javascript·webstorm
流沙QS1 小时前
时钟之CSS+JS版
前端·javascript·css
取个名字真难呐1 小时前
3、PyTorch张量的运算API(下)
人工智能·pytorch·python
冻感糕人~1 小时前
利用RAGflow和LM Studio建立食品法规问答系统
人工智能·程序人生·llm·问答系统·大语言模型·大模型微调·ragflow
老码沉思录1 小时前
React Native 全栈开发实战班 - 图片加载与优化
javascript·react native·react.js
StarRocks_labs1 小时前
StarRocks Summit Asia 2024 全部议程公布!
人工智能·湖仓一体·lakehouse