![](https://s5-media.51cto.com/aigc/pc/static/noavatar.gif)
基于Langbase Memory Agents将任意LLM转为可对话式AI文档助手 原创
在 2025 年当下,大语言模型(LLM)依旧无法获取用户的私有数据。当用户向其询问某些与个人相关的问题时,大语言模型要么凭借推测进行回应,要么给出错误的解答。这体现了大语言模型存在的固有局限性——它们仅基于公开信息进行训练,无法获取用户的私有上下文信息。
内存代理(Memory Agent)则通过实时且安全地将用户的私有数据与任意大语言模型进行链接,有效解决了上述问题。在本教程中,笔者将详细指导你如何借助Langbase(一个流行的开发工具平台,它提供了一套用于构建 AI 应用的工具和基础设施)内存代理,把大语言模型转变为一个能够与你的个人文档进行交互对话的人工智能。
目录
1. 内存代理是什么?
2. 使用内存代理保护你的数据
3. 内存代理的应用场景
4. 前提条件
5. 步骤 1:创建一个目录并初始化npm
6. 步骤 2:创建一个管道代理
7. 步骤 3:添加一个.env文件
8. 步骤 4:创建一个内存代理
9. 步骤 5:将文档添加到内存代理
10. 步骤 6:生成内存嵌入
- 内存嵌入是什么?
- 为什么需要内存嵌入?
- 如何生成嵌入?
11. 步骤 7:在管道代理(Pipe Agent)中集成内存
12. 步骤 8:在Node.js中集成内存代理
13. 步骤 9:启动BaseAI服务器
14. 步骤 10:运行内存代理
15. 结果
内存代理是什么?
内存代理是使人机交互变得有意义的关键,它是系统存储和检索先前信息的机制,是构建真正智能AI代理的核心要素。
实际上,尽管大型语言模型(LLM)看似人性化,但从设计本质上讲,其内部并未内置的存储机制,在设计架构上属于无状态模式。鉴于现实世界中的任务往往具有复杂性与多样性,若要让大语言模型在这些实际任务中发挥有效作用,为其增添存储能力就显得尤为必要。而内存代理恰恰在这一需求场景中发挥关键作用。
Langbase内存代理作为一种长期存储解决方案,其核心设计目标就在于实现信息获取、处理、保留以及检索各个环节之间的无缝衔接。借助该内存代理,可以动态地为任意大语言模型添加私有数据,这不仅使得大语言模型在交互过程中能够实现实时的上下文感知响应,还能显著减少“幻觉生成(指的是大语言模型生成的与当前上下文不相符或错误的信息)”现象。
这些内存代理通过整合向量存储、检索增强生成(RAG)以及互联网访问功能,构建了一个功能强大的托管上下文搜索API。借助这一API,开发人员能够开发出更加智能、功能更为强大的人工智能应用程序。
在检索增强生成(RAG)的架构体系中,当内存与Langbase管道代理(Pipe Agent:是Langbase框架中的一个核心概念,它本质上是一个数据处理和流转的管道代理)实现直接连接时,便形成了一个完整意义上的内存代理。这种组合方式赋予了大语言模型获取相关数据的能力,并使其能够基于这些私有数据提供精确且上下文贴合的回答,从而有效克服了大语言模型在处理私有数据时面临的诸多局限性。
需要注意的是,管道是一种无服务器的AI代理,它集成了代理内存和工具。
以下将以图示的方式,对整个过程进行直观展示:
使用内存代理保护你的数据
内存代理高度重视数据安全,通过将私密信息进行隔离,并在本地环境或安全的环境中进行处理,以此作为保障数据安全的首要举措。具体而言,用于创建内存嵌入的数据,在未进行明确配置的情况下,不会被发送至外部服务器,这种严格的设定从源头上确保了敏感信息能够得到妥善保护。
除此之外,内存系统的访问权限通过 API 密钥和相关权限设置进行严格管控。只有经过授权的操作才能访问内存系统,这一措施有效防止了未经授权的访问行为发生。如此一来,这种精心设计的安全设置,不仅能够显著增强人工智能(AI)能力,更通过全方位保护用户数据,切实维护了用户对系统的信任。
内存代理的应用场景
以下为这些内存代理在实际中的具体应用领域:
- 客户支持:内存代理能够回调交互历史记录,以此为基础提供个性化且具备上下文感知能力的支持服务。
- 文档搜索:在处理大型数据集、手册或者常见问题解答文档时,内存代理可实现快速且语义化的搜索功能。
- 代码辅助:针对开发人员,内存代理可以提供与项目特定相关的文档资料,并基于项目历史和代码逻辑给出调试建议,助力开发者更高效地完成开发工作。
- 知识管理:内存代理有助于将团队内部信息进行高效集中存储,并实现便捷的检索功能。团队成员能够快速获取所需信息,提升团队整体的知识流转和工作效率。
- 教育与培训:在教育与培训场景中,内存代理可以为学生或员工提供定制化的培训材料,通过跟踪学习进度,基于存储的知识库回答学习者提出的问题。
- 医疗保健:在医疗领域,内存代理可安全地检索患者记录或病史信息,为医护人员提供准确的数据支持,辅助他们做出更精准的医疗决策。
- 协调工作流程:内存代理能够追踪项目历史记录并结合各类工具来实现团队成员之间的协调与沟通,确保项目顺利推进。
- 法律合规:在法律事务和合规管理方面,内存代理可以帮助相关人员快速参考法律指南和合规标准,确保决策过程准确无误且完全符合法律规定要求。
上述由内存代理所赋能的众多应用场景,正不断开拓新的可能性,并且逐步改变着人工通用智能(AGI)的发展格局与能力边界。
前提条件
在着手创建能够与文档进行交互的内存代理之前,你需要完成以下设置并准备相应工具。
本教程将采用以下技术栈:
- BaseAI:一款用于在本地构建AI代理的Web框架。
- Langbase:一个专门用于构建和部署无服务器AI代理的平台。
- OpenAI:通过该平台获取首选模型所需的 LLM 密钥。
此外,你还需完成以下操作:
- 在Langbase平台上完成注册,以便获取API密钥。
- 在OpenAI平台上进行注册,从而生成所需模型(本演示使用的是 GPT - 4o mini)的 LLM 密钥 。
当上述准备工作全部完成后,我们即可正式开启后续操作!
步骤 1:创建一个目录并初始化npm
若要着手创建一个能够与你的文档实现交互的内存代理,首先需要在本地计算机中创建一个专门的目录,并在该目录下安装所有与之相关的开发依赖项。具体操作方法为:导航至目标目录,然后在终端中运行相应命令,以此完成相关设置:
mkdir my-project
npm init -y
npm install dotenv
此命令会在你的项目目录下创建一个具有默认值的package.json文件。与此同时,该命令还会执行dotenv包的安装操作。安装dotenv包的目的在于,使项目能够从.env文件中顺利读取环境变量,从而为项目的运行提供必要的配置支持。
步骤 2:创建一个管道代理
接下来,我们着手创建一个管道代理。管道代理在特性上区别于其他代理,它属于无服务器AI代理,并且配备了代理工具,具备与任意语言或框架协同运作的能力。管道代理的部署过程较为简便,仅需借助一个API,就能将 100 多个大型语言模型与任何数据相连接,进而助力开发人员构建各类API工作流程。
若要创建你的AI代理管道,请先进入项目目录,然后运行以下命令:
npx baseai@latest pipe
在运行该命令后,你将会看到如下提示:
BaseAI is not installed but required to run. Would you like to install it? Yes/No
Name of the pipe? pipe-with-memory
Description of the pipe? Pipe attached to a memory
Status of the pipe? Public/Private
System prompt? You are a helpful AI assistant
当你完成 AI 管道代理的名称、描述以及状态设置后,系统会自动完成所有相关配置,你的管道代理将成功创建在 /baseai/pipes/pipe-with-memory.ts 路径下。
步骤 3:添加一个.env文件
完成上述操作后,需在项目根目录中创建一个.env 文件,并在其中添加OpenAI和Langbase的 API 密钥。你可从指定位置获取你的Langbase API密钥 。
步骤 4:创建一个内存代理
接下来,我们要创建一个内存,并将其附加到管道(Pipe)中,以此让它转变为内存代理。要达成这一目标,请在终端中运行以下命令:
npx baseai@latest memory
运行此命令后,将会得到以下提示:
Name of the memory? chat-with-docs-agent
Description of the pipe? FAQs docs
Do you want to create memory from the current project git repository? Yes/No
执行上述操作之后,系统会自动完成所有相关设置。你便能够访问成功创建在 /baseai/memory/chat-with-docs-agent.ts 路径下的内存。
步骤 5:将文档添加到内存代理
在 /baseai/memory/chat-with-docs-agent.ts 路径下,你会看到一个名为 documents 的文件夹。此文件夹专门用于存储期望 AI 代理能够访问的文件。在本次演示过程中,我先将管道(Pipe)的常见问题页面另存为.pdf 或.txt 格式的文件。随后,把该文件转换为markdown格式,并将转换后的文件放置在 baseai/memory/chat-with-docs/documents 目录中。
执行这一步骤,能够切实保证内存代理具备处理和检索文档信息的能力。如此一来,AI代理在面对用户提出的查询时,便能够根据你所提供的文档内容做出准确回答。
步骤 6:生成内存嵌入
目前,你已成功将文档添加至内存。接下来的关键步骤是生成内存嵌入。不过在此之前,有必要先了解一下:嵌入究竟是什么,以及为什么它们对于整个系统而言是不可或缺的 ?
内存嵌入是什么?
嵌入是文档的一种数字表现形式。借助这种形式,人工智能能够理解单词、短语以及句子之间的上下文关联和语义关系。我们不妨把嵌入看作是一种将文档“翻译”成人工智能能够处理的“语言”的方式,以便实现语义搜索与检索功能。
为什么需要内存嵌入?
若缺少嵌入这一关键环节,AI代理便无法将用户提出的查询与文档中的相关内容进行有效匹配。而通过生成嵌入向量,实际上是在创建一个可供搜索的索引。这个索引对于内存代理给出准确且高效的响应起着至关重要的支持作用。
如何生成嵌入?
若要为你的文档生成嵌入,请在终端中执行以下命令:
npx baseai@latest embed -m chat-with-docs-agent
至此,你的内存已准备就绪,可以与管道(即内存代理)进行连接。连接完成后,你的 AI 代理便能从你提供的文档中获取精准的、具备上下文感知能力的响应。
步骤 7:在管道代理(Pipe Agent)中集成内存
接下来,你需要将此前创建的内存附加到管道(Pipe)代理上,以此让它成为一个内存代理。要完成这一操作,请进入 /baseai/pipes/pipe-with-memory.ts 文件。以下是该文件目前的内容展示:
import { PipeI } from '@baseai/core';
const pipePipeWithMemory = (): PipeI => ({ apiKey: process.env.LANGBASE_API_KEY!, // Replace with your API key https://langbase.com/docs/api-reference/api-keys name: 'pipe-with-memory', description: 'Pipe attached to a memory', status: 'public', model: 'openai:gpt-4o-mini', stream: true, json: false, store: true, moderate: true, top_p: 1, max_tokens: 1000, temperature: 0.7, presence_penalty: 1, frequency_penalty: 1, stop: [], tool_choice: 'auto', parallel_tool_calls: false, messages: [ { role: 'system', content: `You are a helpful AI assistant.` }], variables: [], memory: [], tools: []});
export default pipePipeWithMemory;
现在,需将内存集成到管道中。具体做法是在文件顶部导入内存,并将其作为内存数组中的函数进行调用。以下是完成所有这些操作后代码呈现的样子:
import { PipeI } from '@baseai/core';
import chatWithDocsAgentMemory from '../memory/chat-with-docs-agent';
const pipePipeWithMemory = (): PipeI => ({
apiKey: process.env.LANGBASE_API_KEY!, // Replace with your API key https://langbase.com/docs/api-reference/api-keys
name: 'pipe-with-memory',
description: 'Pipe attached to a memory',
status: 'public',
model: 'openai:gpt-4o-mini',
stream: true,
json: false,
store: true,
moderate: true,
top_p: 1,
max_tokens: 1000,
temperature: 0.7,
presence_penalty: 1,
frequency_penalty: 1,
stop: [],
tool_choice: 'auto',
parallel_tool_calls: false,
messages: [
{ role: 'system', content: `You are a helpful AI assistant.` }],
variables: [],
memory: [chatWithDocsAgentMemory()],
tools: []
});
export default pipePipeWithMemory;
步骤 8:在Node.js中集成内存代理
接下来,我们要把之前创建的内存代理集成到 Node.js 项目中,目的是为所关联的文档构建一个交互式命令行界面(CLI)。这个 Node.js 项目将充当测试内存代理以及与内存代理进行交互的基础环境(在本教程开篇部分,我们已经通过初始化npm完成了一个 Node.js 项目的初步设置 )。
现在,创建一个 index.ts 文件:
touch index.ts
在这个TypeScript文件里,需要导入你此前创建的管道代理。后续我们会借助@baseai/core里的管道原语(pipe primitive:用于构建和操作管道的基本元素)来运行该管道。
将以下代码添加到 index.ts 文件中:
import 'dotenv/config';import { Pipe } from '@baseai/core';import inquirer from 'inquirer';import ora from 'ora';import chalk from 'chalk';import pipePipeWithMemory from './baseai/pipes/pipe-with-memory';
const pipe = new Pipe(pipePipeWithMemory());
async function main() {
const initialSpinner = ora('Conversation with Memory agent...').start(); try { const { completion: calculatorTool} = await pipe.run({ messages: [{ role: 'user', content: 'Hello' }], }); initialSpinner.stop(); console.log(chalk.cyan('Report Generator Agent response...')); console.log(calculatorTool); } catch (error) { initialSpinner.stop(); console.error(chalk.red('Error processing initial request:'), error); }
while (true) { const { userMsg } = await inquirer.prompt([ { type: 'input', name: 'userMsg', message: chalk.blue('Enter your query (or type "exit" to quit):'), }, ]);
if (userMsg.toLowerCase() === 'exit') { console.log(chalk.green('Goodbye!')); break; }
const spinner = ora('Processing your request...').start();
try { const { completion: reportAgentResponse } = await pipe.run({ messages: [{ role: 'user', content: userMsg }], });
spinner.stop(); console.log(chalk.cyan('Agent:')); console.log(reportAgentResponse); } catch (error) { spinner.stop(); console.error(chalk.red('Error processing your request:'), error); } }}
main();
这段代码旨在创建一个交互式命令行界面(CLI),以便与 AI 代理进行聊天互动,它借助 @baseai/core 库中的管道来处理用户输入。下面为你详细介绍代码的运行逻辑及相关操作:
- 首先,代码需要导入一些必要的库。其中,dotenv 用于环境配置,inquirer 用于获取用户输入,ora 用于加载微调器,而 chalk 则用于实现彩色输出。在运行代码前,请务必在终端中使用以下命令安装这些库:npm install ora inquirer 。
- 接着,管道对象是基于 BaseAI 库,利用一个名为 pipe-with-memory 的预定义内存创建而成。
然后,在 main() 函数内部:
- 当与 AI 代理的初始对话开始时,旋转图标会随即启动,并展示 “Hello” 这条消息。
- 之后,来自 AI 的响应将会呈现出来。
- 程序会进入循环运行状态,持续要求用户输入内容,并将用户的查询发送给 AI 代理。
- 每次接收到 AI 的响应后都会显示出来,这一过程会不断重复,直至用户输入 “exit” 为止。
步骤 9:启动BaseAI服务器
若要在本地运行内存代理,首先需要启动 BaseAI 服务器。请在终端中运行以下命令:
npx baseai@latest dev
步骤 10:运行内存代理
使用以下命令运行 index.ts 文件:
npx tsx index.ts
结果
在你的终端中,系统会提示“输入你的查询”。例如,我们不妨提问:“什么是 Langbase 上的管道?” 此时,内存代理将会给出回应,并且还会提供正确的来源或引用信息。
通过上述一系列设置,我们成功构建了一个“Chat with Your Document”代理。该代理充分利用了大型语言模型(LLM)和 Langbase 内存代理的强大功能,有效克服了 LLM 自身存在的局限性。它不仅能够确保给出准确的响应,而且在处理私有数据时不会出现“幻觉”现象。
译者介绍
刘涛,51CTO社区编辑,某大型央企系统上线检测管控负责人。
原文标题:How to Use Langbase Memory Agents to Make Any LLM a Conversational AI for Your Docs
作者:Maham Codes
![](https://s5-media.51cto.com/aigc/pc/static/noavatar.gif)