创建矢量 RAG 聊天机器人
本教程演示了如何使用 Langflow 创建一个聊天机器人应用程序,该程序使用检索增强生成 (RAG) 将您的数据作为矢量嵌入到矢量数据库中,然后与数据进行对话。
前置条件
- 安装并启动 Langflow
- 创建 Langflow API 密钥
- 创建 OpenAI API 密钥
- 安装 Langflow JavaScript 客户端
- 熟悉矢量搜索概念和应用,例如矢量数据库和 RAG
创建矢量 RAG 流
-
在 Langflow 中,点击 New Flow,然后选择 Vector Store RAG 模板。
关于 Vector Store RAG 模板
此模板有两个流。
Load Data Flow(加载数据流)使用来自文件的数据填充矢量存储。 此数据用于响应提交给 Retriever Flow(检索器流)的查询。
具体来说,Load Data Flow 从本地文件摄取数据,将数据拆分为块,在矢量数据库中加载并索引数据,然后为块计算嵌入。嵌入也与加载的数据一起存储。此流仅在您需要将数据加载到矢量数据库时运行。
Retriever Flow 接收聊天输入,为输入生成嵌入 ,然后使用多个组件将块重构为文本,并通过将新嵌入与存储的嵌入进行比较以找到相似数据来生成响应。
-
将您的 OpenAI API 密钥添加到两个 OpenAI Embeddings 组件中。
-
可选:将两个 Astra DB 矢量存储组件替换为 Chroma DB 或您选择的其他矢量存储组件。 本教程使用 Chroma DB。
Load Data Flow 应包含 Read File、Split Text、Embedding Model、矢量存储(例如 Chroma DB)和 Chat Output 组件:

Retriever Flow 应包含 Chat Input、Embedding Model、矢量存储、Parser、Prompt、Language Model 和 Chat Output 组件:

流已准备就绪。 继续本教程以了解如何使用加载流将数据加载到矢量存储中,然后在聊天机器人应用程序中调用聊天流。
加载数据并生成嵌入
要加载数据并生成嵌入,您可以使用可视化编辑器或 /v2/files 端点。
可视化编辑器选项更简单,但仅建议用于创建流的用户与将数据 加载到数据库的用户是同一人的场景。
在许多用户加载数据或您需要以编程方式加载数据的情况下,请使用 Langflow API 选项。
- 可视化编辑器
- Langflow API
- 在您的 RAG 聊天机器人流中,点击 Read File 组件,然后点击 File。
- 选择要上传的本地文件,然后点击 Open。 文件已加载到您的 Langflow 服务器。
- 要将数据加载到矢量数据库中,点击矢量存储组件,然后点击 Run component 以运行所选组件及其所有之前的依赖组件。
要以编程方式加载数据,请使用 /v2/files/ 和 /v1/run/$FLOW_ID 端点。第一个端点将文件加载到您的 Langflow 服务器,然后返回上传的文件路径。第二个端点运行 Load Data Flow,引用上传的文件路径,以对数据进行分块、嵌入并将其加载到矢量存储中。
以下脚本演示了此过程。 有关创建此脚本的帮助,请使用 Langflow 文件上传实用程序。
_37// Node 18+ 示例,使用全局 fetch、FormData 和 Blob_37import fs from 'fs/promises';_37_37// 1. 准备带有要上传文件的表单数据_37const fileBuffer = await fs.readFile('FILE_NAME');_37const data = new FormData();_37data.append('file', new Blob([fileBuffer]), 'FILE_NAME');_37const headers = { 'x-api-key': 'LANGFLOW_API_KEY' };_37_37// 2. 将文件上传到 Langflow_37const uploadRes = await fetch('LANGFLOW_SERVER_ADDRESS/api/v2/files/', {_37 method: 'POST',_37 headers,_37 body: data_37});_37const uploadData = await uploadRes.json();_37const uploadedPath = uploadData.path;_37_37// 3. 使用上传的文件路径调用 Langflow 运行端点_37const payload = {_37 input_value: "分析此文件",_37 output_type: "chat",_37 input_type: "text",_37 tweaks: {_37 'FILE_COMPONENT_NAME': {_37 path: uploadedPath_37 }_37 }_37};_37const runRes = await fetch('LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID', {_37 method: 'POST',_37 headers: { 'Content-Type': 'application/json', 'x-api-key': 'LANGFLOW_API_KEY' },_37 body: JSON.stringify(payload)_37});_37const langflowData = await runRes.json();_37// 仅输出消息_37console.log(langflowData.outputs?.[0]?.outputs?.[0]?.results?.message?.data?.text);
当流运行时,流会摄取所选文件,对数据进行分块,将数据加载到矢量存储数据库中,然后为块生成嵌入,这些嵌入也存储在矢量存储中。
您的数据库现在包含带有矢量嵌入的数据,LLM 可以将其用作上下文来响应查询,如本教程的下一部分所示。
从 JavaScript 应用程序与您的流进行对话
要与矢量数据库中的数据进行对话,请创建一个以编程方式运行 Retriever Flow 的聊天机器人应用程序。
本教程使用 JavaScript 进行演示。
-
要构建聊天机器人,请收集以下信息:
LANGFLOW_SERVER_ADDRESS: 您的 Langflow 服务器域名。默认值为127.0.0.1:7860。您可以从流的 API access 面板上的代码片段中获取此值。FLOW_ID: 您的流的 UUID 或自定义端点名称。您可以从流的 API access 面板上的代码片段中获取此值。LANGFLOW_API_KEY: 一个有效的 Langflow API 密钥。
-
将以下脚本复制到 JavaScript 文件中,然后用您在上一步中收集的信息替换占位符:
_50const readline = require('readline');_50const { LangflowClient } = require('@datastax/langflow-client');_50_50# pragma: allowlist nextline secret_50const API_KEY = 'LANGFLOW_API_KEY';_50const SERVER = 'LANGFLOW_SERVER_ADDRESS';_50const FLOW_ID = 'FLOW_ID';_50_50const rl = readline.createInterface({ input: process.stdin, output: process.stdout });_50_50// 初始化 Langflow 客户端_50const client = new LangflowClient({_50baseUrl: SERVER,_50apiKey: API_KEY_50});_50_50async function sendMessage(message) {_50try {_50const response = await client.flow(FLOW_ID).run(message, {_50session_id: 'user_1'_50});_50_50// 使用便捷方法获取聊天输出文本_50return response.chatOutputText() || '无响应';_50} catch (error) {_50return `错误: ${error.message}`;_50}_50}_50_50function chat() {_50console.log('🤖 Langflow RAG 聊天机器人 (输入 "quit" 退出)\n');_50_50const ask = () => {_50rl.question('👤 您: ', async (input) => {_50if (['quit', 'exit', 'bye'].includes(input.trim().toLowerCase())) {_50console.log('👋 再见!');_50rl.close();_50return;_50}_50_50const response = await sendMessage(input.trim());_50console.log(`🤖 助手: ${response}\n`);_50ask();_50});_50};_50_50ask();_50}_50_50chat();该脚本创建了一个 Node 应用程序,该程序可以与矢量数据库中的内容进行对话,使用
chat输入和输出类型与您的流进行通信。 聊天会在多条消息之间维持持续的对话上下文。如果您使用text类型的输入和输出,则每个请求都是一个独立的文本字符串。提示Langflow TypeScript 客户端 具有
chatOutputText()便捷方法,可简化 Langflow 复杂的 JSON 响应结构的处理。 客户端会自动提取消息文本并优雅地处理可能未定义的值,而无需手动导航多层嵌套对象(如data.outputs[0].outputs[0].results.message.data.text)。 -
保存并运行脚本以发送请求并测试流。
结果
以下是本教程流的一个示例响应。由于 LLM 的性质和输入的变化,您的响应可能会有所不同。
_10👤 您: 你有关于引擎的文档吗?_10🤖 助手: 是的数据,提供的文本包含多项与引擎安装、维护和选择相关的警告和指南。它强调了在特定应用中使用正确引擎、确保所有组件处于良好状态以及遵循安全预防措施以防止火灾或爆炸的重要性。如果您需要更多具体信息或细节,请告诉我!_10_10👤 您: 应该是关于 Briggs and Stratton 引擎的。_10🤖 助手: 文本提供了 Briggs & Stratton 引擎的重要安全和安装指南。它强调这些引擎不应在三轮全地形车 (ATV)、摩托车、航空产品或用于竞技活动的车辆上使用,因为此类用途未获得 Briggs & Stratton 的批准。_10_10如果您有任何关于 Briggs & Stratton 引擎的具体问题或需要更多信息,请随时提问!
后续步骤
有关构建或扩展本教程的更多信息,请参阅以下内容: