创建向量 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 从本地文件摄取数据,将数据拆分为块(chunks),在向量数据库中加载并索引数据,然后计算这些块的嵌入(embeddings)。嵌入也会随加载的数据一起存储。此流程仅在您需要将数据加载到向量数据库时运行。
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/', {_37method: 'POST',_37headers,_37body: data_37});_37const uploadData = await uploadRes.json();_37const uploadedPath = uploadData.path;_37_37// 3. 使用上传的文件路径调用 Langflow 运行端点_37const payload = {_37input_value: "Analyze this file",_37output_type: "chat",_37input_type: "text",_37tweaks: {_37'FILE_COMPONENT_NAME': {_37path: uploadedPath_37 }_37 }_37};_37const runRes = await fetch('LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID', {_37method: 'POST',_37headers: { 'Content-Type': 'application/json', 'x-api-key': 'LANGFLOW_API_KEY' },_37body: 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(API 访问)面板中的代码片段获取此值。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输入和输出类型与您的工作流通信,并针对向量数据库中的内容进行对话。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 发动机的重要安全和安装指南。它强调这些发动机不应用于三轮全地形车 (ATVs)、摩托车、航空产品或用于竞技赛事的车辆,因为此类用途未获得 Briggs & Stratton 的批准。_10_10如果您对 Briggs & Stratton 发动机有任何具体问题或需要进一步信息,请随时提问!
下一步
有关构建或扩展本教程的更多信息,请参阅以下内容