跳到主要内容

创建向量 RAG 聊天机器人

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

前提条件

创建向量 RAG 工作流

  1. 在 Langflow 中,点击 New Flow(新工作流),然后选择 Vector Store RAG 模板。

    关于 Vector Store RAG 模板

    此模板包含两个流。

    Load Data Flow(加载数据流)从文件中提取数据并填充到向量库。这些数据用于响应提交给 Retriever Flow(检索流)的查询。

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

    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 组件

    File loader chat flow

    Retriever Flow 应包含 Chat InputEmbedding Model、向量库、ParserPromptLanguage ModelChat Output 组件

    Chat with RAG flow

    工作流已准备就绪。继续阅读教程,了解如何使用加载流将数据加载到向量库中,然后在聊天机器人应用程序中调用聊天流。

加载数据并生成嵌入

要加载数据并生成嵌入,您可以使用可视化编辑器或 /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(API 访问)面板中的代码片段获取此值。
    • 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 输入和输出类型与您的工作流通信,并针对向量数据库中的内容进行对话。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 发动机的重要安全和安装指南。它强调这些发动机不应用于三轮全地形车 (ATVs)、摩托车、航空产品或用于竞技赛事的车辆,因为此类用途未获得 Briggs & Stratton 的批准。
    _10
    _10
    如果您对 Briggs & Stratton 发动机有任何具体问题或需要进一步信息,请随时提问!

下一步

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

Search