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."),
]);
相关推荐
神经美学_茂森2 分钟前
【自由能系列(初级),论文解读】神经网络中,熵代表系统的不确定性,自由能则引导系统向更低能量的状态演化,而动力学则描述了系统状态随时间的变化。
人工智能·神经网络·php
GISer_Jing15 分钟前
前端面试题合集(一)——HTML/CSS/Javascript/ES6
前端·javascript·html
清岚_lxn17 分钟前
es6 字符串每隔几个中间插入一个逗号
前端·javascript·算法
cnbestec25 分钟前
Kinova在开源家庭服务机器人TidyBot++研究里大展身手
人工智能·科技·机器人
deflag36 分钟前
第T4周:TensorFlow实现猴痘识别(Tensorboard的使用)
人工智能·tensorflow·neo4j
刺客-Andy39 分钟前
React 第十九节 useLayoutEffect 用途使用技巧注意事项详解
前端·javascript·react.js·typescript·前端框架
谢道韫66643 分钟前
今日总结 2024-12-27
开发语言·前端·javascript
四口鲸鱼爱吃盐1 小时前
Pytorch | 利用GNP针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python·深度学习·神经网络·计算机视觉
小码贾1 小时前
OpenCV-Python实战(6)——图相运算
人工智能·python·opencv
大今野1 小时前
node.js和js
开发语言·javascript·node.js