BoxLang AI 深度解析:第 6 部分——内存系统与 RAG
目录
:brain: 两种内存类别 :clipboard: 标准内存类型
:office: 基于调用的多租户身份路由 :books: 文档加载器 :link: 构建完整的 RAG 流水线
:wrench: Token 管理 :building_construction: 每个 Agent 配置多个内存 :package: aiPopulate() BIF —— 无需实时调用的结构化内存 后续内容
BoxLang AI 3.0 系列 · 第 6 部分,共 7 部分
没有内存的聊天机器人根本称不上对话——它只是一系列孤立的查询。每一条消息都从零开始,用户必须不断重复解释自己是谁、正在做什么以及刚才说了什么。这不仅令人疲惫,也意味着 AI 并没有真正“聆听”。
内存是区分有用 AI 应用与玩具的关键。BoxLang AI 提供了 AI 框架中最全面的内存系统之一——涵盖两大类、20 多种内存类型、支持语义检索的向量嵌入、用于 RAG 流水线的 30 多种文档加载器,以及一套使多租户应用默认安全的“基于调用的身份路由系统”。
本文将带您全面了解这些功能。
🧠 两种内存类别
BoxLang AI 内存分为两个截然不同的类别,分别解决两类问题。
标准内存存储对话历史——即用户与助手之间的顺序消息。它让代理能够记住“我叫 Luis”这类三条消息前的信息。
向量内存存储语义知识——即文档、历史对话或领域内容的嵌入,可以通过含义(而非时间顺序)进行检索。它实现了 RAG 功能:“为当前查询从知识库中找到最相关的三段话。”
这两类内存共享相同的 IAiMemory 接口、相同的 aiMemory() BIF 以及相同的身份路由机制,因此您的应用代码在两者之间几乎不需要改动。
📋 标准内存类型
使用我们的全局函数即可创建任何内存:aiMemory( type, config: {} )。默认内存类型是包含 20 条消息的 window 内存:
摘要内存 —— 原理解析
summary 类型值得特别关注。当消息数量超过 summaryThreshold 时,它会调用配置的 LLM 对最旧的消息进行单段落总结,用该总结替换掉旧消息作为一条系统消息,然后继续累积。这样既保留了对话上下文,又避免了因存储完整历史记录而产生的 Token 成本。
🔍 向量内存类型
向量内存存储嵌入并根据语义相似度进行检索——当“寻找相关上下文”比“回顾刚才说了什么”更重要时,这是最佳工具。
完整向量内存列表:
混合内存 —— 兼具二者之长
hybrid 结合了最近消息窗口和语义向量检索,让您同时拥有“时效性”和“相关性”:
对于大多数生产环境的客服机器人或助手场景,hybrid 是最佳选择——既有用于保持连贯性的近期上下文,又有用于提供深度的语义检索。
🏢 基于调用的多租户身份路由
这是使 BoxLang AI 内存具有可扩展性的架构特性。内存实例是无状态的,可安全地作为单例使用——userId 和 conversationId 会将每个操作路由到正确的隔离对话中。您也可以使用特定的标识符来创建内存,以实现特定代理的专属记忆。
每个内存操作都接受可选的身份参数:
在实践中,您可以通过 AiAgent.run() 选项传递身份信息,它会自动流向所有内存操作:
无需针对每个用户创建 Agent 工厂,无需线程局部变量(Thread-local)黑科技,也无需担心共享状态的并发 Bug。一个实例,服务多个租户。
📚 文档加载器
文档加载器是 RAG 流水线的摄入层。它们将 30 多种源类型的内容标准化为向量内存能理解的 Document 格式。
内置加载器:
🔗 构建完整的 RAG 流水线
以下是完整蓝图——将文档摄入向量内存,然后使用配置了该内存的 Agent,根据您的内容回答问题。
第一步:摄入
toMemory() 方法通过 aiChunk() 处理分块,通过配置的提供程序处理嵌入、去重和存储——所有操作都在一次流畅的调用中完成,并返回详细报告。
第二步:查询
当 Agent 运行时,向量内存会为查询检索最相关的文档分块,并在 LLM 调用前将其注入为上下文。LLM 将基于您的真实内容(而非幻觉)进行回答。
第三步:生产环境中的混合模式
对于大多数生产 RAG 场景,hybrid 内存优于纯向量内存:
前 8 条消息保持对话连贯性,语义层确保始终呈现相关的文档信息。两者结合,完美处理“我刚才问了什么?”和“关于 X 政策是怎么说的?”这两类需求。
🔧 Token 管理
两个 BIF 可帮助您评估上下文窗口的使用情况:
aiChunk() 在 toMemory() 内部被使用,但您在构建自定义摄入流水线时也可以直接调用它。
🏗️ 每个 Agent 配置多个内存
Agent 可以同时拥有多个内存实例——当您希望针对不同类型的信息应用不同的保留策略时,这非常有用:
所有内存都会被并行读取和写入。在每次 LLM 调用前,从所有内存检索到的消息都会合并。## 📦 aiPopulate() BIF —— 无需实时调用的结构化内存
一个常被忽视的功能是:aiPopulate() 可以在不进行任何 LLM 调用(大模型调用)的情况下,将 JSON 数据填充到类型化的 BoxLang 类中。这对于缓存和测试至关重要:
此功能非常适合:预填充测试数据、缓存 AI 提取结果,以及将现有的 JSON 数据转换为类型化对象。
下期预告
在第七部分(本系列的最后一篇)中,我们将深入探讨 MCP:如何使用来自任何 MCP 服务器的工具、MCPTool 代理的工作原理,以及如何将你自己的 BoxLang 函数发布为企业级 MCP 服务器,并实现完整的安全性、CORS、API 密钥验证和速率限制。
📖 完整文档 🌐 BoxLang AI 官网 📦 立即安装:install-bx-module bx-ai 🫶 专业支持
文章 BoxLang AI 深度解析 —— 第 6 部分(共 7 部分):内存系统与 RAG —— 构建具备记忆力的 AI 最早出现在 foojay 上。