译:使用 LangChain 和 OpenAI 在 Node.js 中构建 CLI 聊天机器人

247 阅读3分钟

本教程是该系列 3 部分中的第 3 部分。

ezgif-61d355c18be954.gif

想使用 JavaScript 在 Node.js 终端中构建一个聊天机器人吗?我们将介绍使用 LangChain 和 OpenAI 时的最基本场景。在本指南中,我们将逐步介绍如何使用 Node.js 创建一个简单的 CLI 聊天机器人。你将学习如何与 OpenAI 的语言模型进行交互,并在基于终端的界面中处理用户输入。

最后,你将拥有一个可以回答问题、生成文本,甚至进行对话的可用聊天机器人 —— 直接在你的终端中!

首先,安装必要的依赖项:

npm install @langchain/core @langchain/openai dotenv

其次,要使用 OpenAI,我们需要设置 API 密钥。在 OpenAI 上注册一个账户并创建一个 API 密钥(国内可以使用 302.ai 代理 )。然后,将该密钥设置为环境变量:

# .env
OPENAI_API_KEY="sk-proj-123abc"
OPENAI_BASE_URL="https://api.302.ai/v1/chat/completions"

现在,让我们编写使用 LangChain 与 OpenAI 交互的核心函数。我们将创建一个函数,用于向聊天机器人发送消息并接收响应:

import { SystemMessage, HumanMessage } from "@langchain/core/messages";
import { ChatOpenAI } from "@langchain/openai";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";
import "dotenv/config";

const model = new ChatOpenAI({
  configuration: {
    baseURL: process.env.OPENAI_BASE_URL,
    apiKey: process.env.OPENAI_API_KEY,
  },
});

const askModel = async (input: string) => {
  const prompt = ChatPromptTemplate.fromMessages([
    new SystemMessage("You're a helpful assistant"),
    new HumanMessage(input),
  ]);

  const parser = new StringOutputParser();
  const chain = prompt.pipe(model).pipe(parser);

  return await chain.invoke(input);
};

以下是代码的工作原理:

  • 我们使用 LangChain 的 ChatOpenAI 定义一个聊天模型。
  • 我们创建一个提示模板,其中系统指示聊天机器人充当有用的助手。
  • 用户的输入消息会动态添加。
  • 我们使用 LangChain 的 StringOutputParser 处理响应。

我们希望用户能从命令行与聊天机器人进行交互。为了实现这一点,我们将使用 Node.js 内置的 readline 模块。查看之前的教程以获取更详细的解释:

// src/index.ts
const chat = () => {
  rl.question('Enter a command (type "exit" to quit): ', async (input) => {
    if (input.toLowerCase() === "exit") {
      console.log("Goodbye!");
      rl.close();
    } else {
      const result = await askModel(input);

      console.log(result);

      chat();
    }
  });
};

让我们通过运行 npm run dev 来调用聊天函数进行测试。现在,你应该会看到一个提示,要求你输入命令。试着问它一个问题,比如:

Enter a command (type "exit" to quit): What is LangChain?

完整代码:

import { SystemMessage, HumanMessage } from "@langchain/core/messages";
import { ChatOpenAI } from "@langchain/openai";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";
import readline from "readline";
import "dotenv/config";

const model = new ChatOpenAI({
  configuration: {
    baseURL: process.env.OPENAI_BASE_URL,
    apiKey: process.env.OPENAI_API_KEY,
    
  },
});

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const askModel = async (input: string) => {
  const prompt = ChatPromptTemplate.fromMessages([
    new SystemMessage("You're a helpful assistant"),
    new HumanMessage(input),
  ]);

  const parser = new StringOutputParser();
  const chain = prompt.pipe(model).pipe(parser);

  return await chain.invoke(input);
};

const chat = () => {
  rl.question('Enter a command (type "exit" to quit): ', async (input) => {
    if (input.toLowerCase() === "exit") {
      console.log("Goodbye!");
      rl.close();
    } else {
      const result = await askModel(input);

      console.log(result);

      chat();
    }
  });
};

chat()

聊天机器人应该会给出有用的回答!既然你已经有了一个可用的聊天机器人,以下是一些改进它的方法:

  • 添加对话记忆
    • 当前,聊天机器人不会记住之前的消息。你可以使用 LangChain 的记忆模块来跟踪对话历史。
  • 支持多种模型
    • 除了使用 OpenAI 的聊天模型,你还可以集成其他大语言模型,如 Anthropic Claude、Cohere,或者通过 Llama.cpp 使用本地模型。
  • 创建图形用户界面 (GUI)
    • 想要更友好的用户体验?考虑为你的聊天机器人构建一个基于 React 或 Electron 的用户界面。
  • 增强提示词
    • 你可以尝试少样本提示(few-shot prompting),即提供多个示例来提高回复质量。

恭喜!你已经使用 LangChain 和 OpenAI 在 Node.js 中构建了一个 CLI 聊天机器人。这只是一个开始 —— 你可以通过添加记忆、API 集成甚至不同的 AI 模型来扩展它。现在轮到你了!尝试修改聊天机器人,添加新功能,并探索 LangChain 的更多功能。