跳到主要内容

创建矢量 RAG 聊天机器人

本教程演示了如何使用 Langflow 创建一个聊天机器人应用程序,该程序使用检索增强生成 (RAG) 将您的数据作为矢量嵌入到矢量数据库中,然后与数据进行对话。

前置条件

创建矢量 RAG 流

  1. 在 Langflow 中,点击 New Flow,然后选择 Vector Store RAG 模板。

    关于 Vector Store RAG 模板

    此模板有两个流。

    Load Data Flow(加载数据流)使用来自文件的数据填充矢量存储。 此数据用于响应提交给 Retriever Flow(检索器流)的查询。

    具体来说,Load Data Flow 从本地文件摄取数据,将数据拆分为块,在矢量数据库中加载并索引数据,然后为块计算嵌入。嵌入也与加载的数据一起存储。此流仅在您需要将数据加载到矢量数据库时运行。

    Retriever Flow 接收聊天输入,为输入生成嵌入,然后使用多个组件将块重构为文本,并通过将新嵌入与存储的嵌入进行比较以找到相似数据来生成响应。

  2. 将您的 OpenAI API 密钥添加到两个 OpenAI Embeddings 组件中。

  3. 可选:将两个 Astra DB 矢量存储组件替换为 Chroma DB 或您选择的其他矢量存储组件。 本教程使用 Chroma DB。

    Load Data Flow 应包含 Read FileSplit TextEmbedding Model、矢量存储(例如 Chroma DB)和 Chat Output 组件:

    文件加载器聊天流

    Retriever Flow 应包含 Chat InputEmbedding Model、矢量存储、ParserPromptLanguage ModelChat Output 组件:

    RAG 聊天流

    流已准备就绪。 继续本教程以了解如何使用加载流将数据加载到矢量存储中,然后在聊天机器人应用程序中调用聊天流。

加载数据并生成嵌入

要加载数据并生成嵌入,您可以使用可视化编辑器或 /v2/files 端点。

可视化编辑器选项更简单,但仅建议用于创建流的用户与将数据加载到数据库的用户是同一人的场景。

在许多用户加载数据或您需要以编程方式加载数据的情况下,请使用 Langflow API 选项。

  1. 在您的 RAG 聊天机器人流中,点击 Read File 组件,然后点击 File
  2. 选择要上传的本地文件,然后点击 Open。 文件已加载到您的 Langflow 服务器。
  3. 要将数据加载到矢量数据库中,点击矢量存储组件,然后点击 Run component 以运行所选组件及其所有之前的依赖组件。

当流运行时,流会摄取所选文件,对数据进行分块,将数据加载到矢量存储数据库中,然后为块生成嵌入,这些嵌入也存储在矢量存储中。

您的数据库现在包含带有矢量嵌入的数据,LLM 可以将其用作上下文来响应查询,如本教程的下一部分所示。

从 JavaScript 应用程序与您的流进行对话

要与矢量数据库中的数据进行对话,请创建一个以编程方式运行 Retriever Flow 的聊天机器人应用程序。

本教程使用 JavaScript 进行演示。

  1. 要构建聊天机器人,请收集以下信息:

    • LANGFLOW_SERVER_ADDRESS: 您的 Langflow 服务器域名。默认值为 127.0.0.1:7860。您可以从流的 API access 面板上的代码片段中获取此值。
    • FLOW_ID: 您的流的 UUID 或自定义端点名称。您可以从流的 API access 面板上的代码片段中获取此值。
    • LANGFLOW_API_KEY: 一个有效的 Langflow API 密钥
  2. 将以下脚本复制到 JavaScript 文件中,然后用您在上一步中收集的信息替换占位符:


    _50
    const readline = require('readline');
    _50
    const { LangflowClient } = require('@datastax/langflow-client');
    _50
    _50
    # pragma: allowlist nextline secret
    _50
    const API_KEY = 'LANGFLOW_API_KEY';
    _50
    const SERVER = 'LANGFLOW_SERVER_ADDRESS';
    _50
    const FLOW_ID = 'FLOW_ID';
    _50
    _50
    const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
    _50
    _50
    // 初始化 Langflow 客户端
    _50
    const client = new LangflowClient({
    _50
    baseUrl: SERVER,
    _50
    apiKey: API_KEY
    _50
    });
    _50
    _50
    async function sendMessage(message) {
    _50
    try {
    _50
    const response = await client.flow(FLOW_ID).run(message, {
    _50
    session_id: 'user_1'
    _50
    });
    _50
    _50
    // 使用便捷方法获取聊天输出文本
    _50
    return response.chatOutputText() || '无响应';
    _50
    } catch (error) {
    _50
    return `错误: ${error.message}`;
    _50
    }
    _50
    }
    _50
    _50
    function chat() {
    _50
    console.log('🤖 Langflow RAG 聊天机器人 (输入 "quit" 退出)\n');
    _50
    _50
    const ask = () => {
    _50
    rl.question('👤 您: ', async (input) => {
    _50
    if (['quit', 'exit', 'bye'].includes(input.trim().toLowerCase())) {
    _50
    console.log('👋 再见!');
    _50
    rl.close();
    _50
    return;
    _50
    }
    _50
    _50
    const response = await sendMessage(input.trim());
    _50
    console.log(`🤖 助手: ${response}\n`);
    _50
    ask();
    _50
    });
    _50
    };
    _50
    _50
    ask();
    _50
    }
    _50
    _50
    chat();

    该脚本创建了一个 Node 应用程序,该程序可以与矢量数据库中的内容进行对话,使用 chat 输入和输出类型与您的流进行通信。 聊天会在多条消息之间维持持续的对话上下文。如果您使用 text 类型的输入和输出,则每个请求都是一个独立的文本字符串。

    提示

    Langflow TypeScript 客户端 具有 chatOutputText() 便捷方法,可简化 Langflow 复杂的 JSON 响应结构的处理。 客户端会自动提取消息文本并优雅地处理可能未定义的值,而无需手动导航多层嵌套对象(如 data.outputs[0].outputs[0].results.message.data.text)。

  3. 保存并运行脚本以发送请求并测试流。

    结果

    以下是本教程流的一个示例响应。由于 LLM 的性质和输入的变化,您的响应可能会有所不同。


    _10
    👤 您: 你有关于引擎的文档吗?
    _10
    🤖 助手: 是的数据,提供的文本包含多项与引擎安装、维护和选择相关的警告和指南。它强调了在特定应用中使用正确引擎、确保所有组件处于良好状态以及遵循安全预防措施以防止火灾或爆炸的重要性。如果您需要更多具体信息或细节,请告诉我!
    _10
    _10
    👤 您: 应该是关于 Briggs and Stratton 引擎的。
    _10
    🤖 助手: 文本提供了 Briggs & Stratton 引擎的重要安全和安装指南。它强调这些引擎不应在三轮全地形车 (ATV)、摩托车、航空产品或用于竞技活动的车辆上使用,因为此类用途未获得 Briggs & Stratton 的批准。
    _10
    _10
    如果您有任何关于 Briggs & Stratton 引擎的具体问题或需要更多信息,请随时提问!

后续步骤

有关构建或扩展本教程的更多信息,请参阅以下内容:

Search