使用 OceanBase seekdb 为 AI Agent 实现持久化记忆:从"全量上下文"到"精准召回"

0 阅读3分钟

摘要:

本文介绍如何使用 seekdb-js SDK + Qwen3 Max (via OpenRouter) 为 Node.js AI Agent 实现高效的向量记忆系统。系统支持固定数量、阈值及混合召回策略,显著降低token消耗与响应延迟,并提供完整代码实现。

 

完整代码仓库: github.com/kejun/seekd…

 

问题背景:为什么传统记忆方案效率低下?

 

在使用 LangGraph 或自定义 AI Agent 时,持久化记忆是一个核心需求。然而,传统的记忆方案存在一个明显的效率问题:它总是将全部历史消息作为上下文传递给 LLM,即使这些消息与当前问题毫不相关。

 

举个例子:当你只是向 Agent 问候一句"你好"时,系统却会把过去 50 轮对话的所有内容都塞进 Prompt。这些冗余信息不仅浪费Token,还可能干扰模型的回答质量。

 

实际后果:

 

Token 成本飙升(实测可达实际需求的 10-20 倍)

响应延迟增加

模型注意力分散,回答质量下降

 

seekdb 的解决方案:将消息存储为向量嵌入(Embedding Vectors),通过向量相似度搜索,只召回与当前问题最相关的历史消息。

 

核心概念解析

 

1. 什么是嵌入向量(Embedding Vectors)?

 

计算机无法理解人类语言,它只能处理数字。嵌入向量将文字转换为数值列表,捕捉语义信息。

 

例如:"我喜欢看 AI 教程" → [0.12, -0.45, 0.88, ...]

Qwen3 Embedding 8B 生成 4096 维向量(注意:不是 1024 维)

语义相似的句子,其向量在多维空间中距离更近

 

2. 向量相似度搜索

 

直接问计算机 "我喜欢看 AI 教程" 和 "我爱看 YouTube AI 视频" 是否相似,它无法回答。但如果比较它们的嵌入向量,计算机就能计算出确定的相似度分数。

 

seekdb 的优势:

 

基于 OceanBase,支持大规模向量数据

原生支持向量存储和相似度搜索

比 PostgreSQL + PGVector 更易部署

 

3. 距离函数与余弦相似度

 

seekdb 支持多种距离计算方式:

 

余弦相似度(Cosine Similarity):最常用,范围 [-1, 1]

欧几里得距离(L2 Distance):向量空间直线距离

 

关键公式:

1.png

 

余弦相似度取值含义:

1.0:完全相似(0°夹角)

0.0:无关(90°夹角)

实践中,> 0.7 通常表示高相关

 

技术选型

 

Qwen3 Max + Qwen3 Embedding

 

2.png

 

两种召回策略对比

 

策略一:固定数量召回(Limit-based)

 

始终返回最相似的 N 条历史消息。

适用场景:成本敏感型应用,需要可预测的 Token 成本。

 

策略二:阈值召回(Threshold-based)

 

只返回相似度超过阈值的消息(如 ≥ 0.75)。

适用场景:追求回答质量,愿意接受动态上下文长度。

 

策略三:混合召回(推荐)

 

先阈值筛选,再限制数量。兼顾质量和可控性。

 

完整实现代码

 

以下代码来自实际仓库:github.com/kejun/seekd…

 

1. 安装依赖

 

3.png

 

2. 环境变量配置(.env)

 

4.png

 

3. 数据库连接配置

 

5.png

 

4. 核心记忆管理类

 

6.png

 

5. 智能 Agent 示例

 

7.png

 

关键特性:角色过滤

 

在实际应用中,我们通常只关心用户自己说过的话,而不是 Agent 的回复。通过 role 参数可以实现这一点:

 

8.png

 

这在处理个人信息查询时特别有用,可以避免召回 Agent 的礼貌回复等无关内容。

 

效果对比

 

9.png

 

总结

 

核心洞察:

 

1.     记忆的关键不在"存多少",而在"召回准不准"

2.     向量相似度搜索是语义记忆的终极方案

3.     根据查询类型动态选择召回策略效果更佳

 

技术栈组合:

 

Vector DB: seekdb (OceanBase)

LLM: Qwen3 Max via OpenRouter

Embedding: Qwen3 Embedding 8B (4096维)

 

完整代码: github.com/kejun/seekd…