记忆系统
记忆系统是 Snail AI 平台为智能体提供对话上下文延续能力的核心模块。通过记忆系统,智能体可以在多轮对话中记住用户的偏好、已做出的决策、正在进行的任务等关键信息,从而提供更加个性化和连贯的对话体验。
核心概念
什么是记忆?
在 Snail AI 中,"记忆"是从对话中自动提取出的结构化信息片段。每条记忆包含标题、内容、类型、置信度等属性,并以向量形式存储在向量数据库中,以便后续通过语义相似度进行高效召回。
与传统的"完整对话历史"不同,记忆系统通过智能提取和压缩,将冗长的对话历史浓缩为关键信息点,既节省了 Token 开销,又保留了对话的核心上下文。
记忆类型
Snail AI 将记忆按语义分为以下五种类型:
| 类型 | 标识 | 说明 | 示例 |
|---|---|---|---|
| 事实 | FACT | 用户或对话中出现的客观事实信息 | "用户的公司使用 Java 17 和 Spring Boot" |
| 决策 | DECISION | 对话中做出的决定或达成的共识 | "决定使用 PostgreSQL 作为主数据库" |
| 偏好 | PREFERENCE | 用户表达的个人偏好和习惯 | "用户偏好使用函数式编程风格" |
| 任务进度 | TASK_PROGRESS | 正在进行的任务的进度信息 | "数据迁移任务已完成 70%,还剩 3 个表" |
| 参考资料 | REFERENCE | 对话中提及的有价值的参考信息 | "项目架构图在 Confluence 的 /arch/overview 页面" |
记忆状态
每条记忆有三种状态,用于管理记忆的生命周期:
| 状态 | 标识 | 说明 |
|---|---|---|
| 激活 | ACTIVE | 记忆处于活跃状态,可被检索和注入到对话上下文中 |
| 已归档 | ARCHIVED | 记忆被归档,不会被自动检索,但仍保留在系统中 |
| 已压制 | SUPPRESSED | 记忆被压制/屏蔽,不参与任何检索,通常用于标记错误或不再需要的记忆 |
状态转换关系如下:
ACTIVE ←→ ARCHIVED
ACTIVE ←→ SUPPRESSED
ARCHIVED → ACTIVE(重新激活)
SUPPRESSED → ACTIVE(重新激活)记忆架构
Snail AI 的记忆系统采用短期记忆 + 长期记忆的双层架构,模拟人类记忆的工作模式:
短期记忆(滑动窗口)
短期记忆通过滑动窗口机制实现,保留最近 N 条对话消息作为即时上下文。
| 参数 | 说明 | 默认值 |
|---|---|---|
| 窗口大小 | 保留的最近消息条数 | 20 条 |
| 配置位置 | 智能体配置中的 shortTermMemorySize 字段 | 可在智能体配置页面修改 |
工作原理:当对话消息数超过窗口大小时,最早的消息会被移出窗口。滑动窗口中的消息会完整地作为上下文发送给大语言模型,确保智能体能理解当前对话的即时语境。
长期记忆(向量召回)
长期记忆通过向量化存储和语义检索实现,适用于跨对话、跨时间的信息持久化。
工作流程:
- 记忆提取:系统按配置的间隔(默认每 4 轮对话),使用 LLM 从对话内容中自动提取关键信息,生成结构化的记忆条目。
- 向量化存储:提取的记忆通过 Embedding 模型转化为向量,存储在向量数据库中。
- 语义检索:当新的对话开始时,系统根据当前对话内容进行语义相似度搜索,召回相关的历史记忆。
- 上下文注入:召回的记忆被注入到对话上下文中,帮助智能体理解用户的历史背景。
存储后端
长期记忆支持两种存储后端,适用于不同的部署场景:
| 存储后端 | 适用场景 | 说明 |
|---|---|---|
| 内存存储 | 单节点开发/测试 | 记忆存储在 JVM 内存中,应用重启后数据丢失 |
| 数据库存储 | 生产环境/分布式部署 | 记忆持久化到向量数据库(PgVector/Milvus/Elasticsearch),支持多节点共享 |
记忆与智能体的关系
记忆系统通过**记忆库(Memory Config)**与智能体关联:
- 管理员在「记忆系统」中创建和配置记忆库,包括选择 Embedding 模型、向量存储实例、配置提取参数等。
- 在智能体的配置页面中,启用「记忆」开关,并选择要绑定的记忆库。
- 同一个记忆库可以被多个智能体共享,也可以为每个智能体创建独立的记忆库。
设计理念
记忆库与智能体解耦设计,使得记忆配置可以独立管理和复用。一个通用的记忆库配置可以同时服务于多个业务场景的智能体。
记忆数据模型
每条记忆包含以下核心字段:
| 字段 | 类型 | 说明 |
|---|---|---|
id | number | 记忆唯一标识 |
agentId | number | 所属智能体 ID |
userId | number | 所属用户 ID |
conversationId | string | 来源对话 ID |
memoryType | enum | 记忆类型(FACT/DECISION/PREFERENCE/TASK_PROGRESS/REFERENCE) |
title | string | 记忆标题 |
content | string | 记忆内容 |
tags | string[] | 标签列表 |
relevanceScore | number | 相关性评分(0-1) |
confidenceScore | number | 置信度评分(0-1) |
status | enum | 记忆状态(ACTIVE/ARCHIVED/SUPPRESSED) |
accessCount | number | 被检索访问的次数 |
vectorId | string | 在向量数据库中的向量 ID |
createDt | string | 创建时间 |
updateDt | string | 最后更新时间 |
功能概览
记忆库管理
在「记忆系统」管理页面,以卡片网格形式展示所有已创建的记忆库。每张卡片显示:
- 记忆库名称
- 绑定的 Embedding 模型 ID
- 向量维度
- 最大召回数和相似度阈值
- 状态(启用/禁用)
- 关联的向量存储实例
卡片支持以下操作:
- 点击卡片:进入记忆检索与调试界面。
- 编辑:修改记忆库的配置参数。
- 删除:删除记忆库。
搜索与过滤
- 支持按记忆库名称关键词搜索。
- 列表顶部显示记忆库总数。
启用记忆的步骤
- 创建记忆库:在「记忆系统」页面创建新的记忆库,配置 Embedding 模型和存储参数。详见 记忆库配置。
- 绑定智能体:在智能体配置页面,启用「记忆」开关,选择刚创建的记忆库。
- 开始对话:与智能体对话时,系统会自动进行记忆提取和检索。
- 监控调试:通过记忆检索与调试界面查看记忆的提取和召回效果。详见 记忆检索与调试。