Skip to content

长期记忆与知识库

概述

长期记忆由 amrita_plugin_memory 插件提供(v0.3.1),是基于向量数据库(ChromaDB)与 Loop Engineering 的长期记忆与知识库插件。它采用双层架构:表层 Function Calling 记忆工具 + 底层事件驱动潜意识推理。

  • 表层 — LLM 在对话中按需调用记忆工具(读写删改列),ChromaDB 语义检索。
  • 底层 — 用户发消息时触发后台 Agent 整理记忆库,基于 Core Agent 框架复用 ChatObject 管线。

安装

bash
uv run ambot plugin add amrita_plugin_memory

前置依赖:Python 3.10+ / AmritaBot 实例 / Ollama 或 OpenAI 嵌入服务 / ChromaDB。

安装后插件会自动注册到 pyproject.toml[tool.amrita.plugins] 列表:

toml
[tool.amrita]
plugins = ["amrita.plugin.chat", "amrita_plugin_memory"]

快速开始

1. 配置环境变量(.env

env
VECTOR_DB_TYPE=local
EMBEDDING_MODEL_URL=http://127.0.0.1:11434
EMBEDDING_MODEL_NAME=auto
EMBEDDING_PROCTOL=ollama-embed
环境变量默认值说明
VECTOR_DB_TYPElocalChromaDB 类型:local / remote
VECTOR_DB_SERVER127.0.0.1远程 ChromaDB 地址(仅 remote 生效)
VECTOR_DB_PORT8000远程 ChromaDB 端口(仅 remote 生效)
VECTOR_DB_SERVER_SSLfalse远程 ChromaDB 是否使用 SSL(仅 remote 生效)
EMBEDDING_MODEL_URLhttp://127.0.0.1:11434Embedding 模型地址
EMBEDDING_MODEL_NAMEautoEmbedding 模型名称
EMBEDDING_PROCTOLollama-embedEmbedding 协议:openai / ollama-embed
EMBEDDING_MODEL_API_KEYEmbedding 模型 API 密钥(可选)

2. 开启表层记忆

表层记忆开箱即用,无需额外配置。LLM 会在需要时自动调用 write_memory / read_memory 等工具。

3. 开启潜意识推理(可选)

编辑 config/amrita_plugin_memory/config.toml

toml
[subconscious]
enabled = true
target_user_id = "你的QQ号"

设置 target_user_id 为目标用户的 QQ 号,重启 Bot 即可。用户每次发消息后,后台 Agent 会在 30 分钟后自动整理记忆库。

适用场景:潜意识推理专为个人助理场景设计——单个 Bot 服务单个用户。它会在后台持续调用 LLM 进行记忆整理,每轮推理可能消耗数万 tokens。如果 Bot 服务于大量用户或对 token 成本敏感,建议保持 enabled = false

如需允许 Agent 主动给用户发私聊消息,额外开启:

toml
allow_send_to_user = true

如需关闭全局知识库以节省 token:

toml
enable_knowledge = false

知识库依赖潜意识推理——当 enabled = false 时,知识库也会自动禁用。

4. 验证

观察日志中 [Subconscious] 前缀的输出:

text
[Subconscious] Starting for user=你的QQ号
[Subconscious] Idle — waiting for user chat to trigger first run

用户发消息后约 30 分钟,会看到 Cycle #1 开始执行。

双层架构

功能

表层:长期记忆

功能说明
语义检索ChromaDB 嵌入向量相似度搜索
分区隔离scope="user" 个人 / scope="group" 群共享
重要性low / medium / high 三级,支持过滤
标签分类自定义标签(preference、project、personal 等)
过期清理短期 7 天 / 长期 90 天
并发安全用户 ID 粒度 aiologic.Lock

底层:潜意识推理

功能说明
事件驱动用户发消息触发,无活动则永远空闲
惩罚退避连续触发时指数延长延迟(30min→45min→...→1440min)
自动整理LLM 后台去重、合并、标签补全、低质清理
记忆压缩Core MemoryLimiter 截断超限 + 自动摘要
去重辅助subconscious_duplicate_helper 返回待整理记忆 + 合并指导
统计概览subconscious_get_memory_stats 总量/重要性/标签分布
膨胀感知ChromaDB 超 memory_warn_threshold 时注入压缩提示
滑动窗口max_abstracts 轮摘要保留,跨轮传递进度
用户画像行级增量更新,Markdown 文件持久化
Session 摘要MemoryLimiter 全量摘要 + LRU 缓存
主动消息LLM 向用户发起主动问候(需 allow_send_to_user
Token 统计复用 Bot InsightsModel 全局统计

共享:全局知识库

知识库是表层和潜意识双层共享的资源。读取操作(list/read/search)通过双重 @on_tools 注册,对话 LLM 和后台 Agent 均可直接调用。写入操作create/update/delete)仅限潜意识 Agent——表层通过 knowledge_suggest 提交建议,由 Agent 在下一轮推理中审查后决定是否实际写入:

每条知识由三个组件共同管理:

文件格式:第一行 # 标题,然后摘要文本,--- 之后是正文。框架自动管理分割——LLM 只需传 title/summary/body 三个字段,无需手动处理 ---。摘要被向量化存入 ChromaDB 用于语义搜索,正文存在文件中支持按行分段读取。

启动自修复validate_on_startup):启动时计算三方 ID 集合的差集,自动修复四种不一致:

场景检测修复
孤文件文件在,JSON 索引无解析文件追加到索引 + 向量化
孤索引JSON 在,文件无从索引中删除 + 清理向量
缺向量JSON+文件都在,ChromaDB 缺失从摘要重新向量化写入
悬空向量向量在,JSON 索引无从 ChromaDB 删除

行级读取knowledge_read 支持 start_line/end_line 参数——LLM 可以用滑动窗口分段读取长知识,避免一次加载超长内容。knowledge_search 只匹配摘要向量,找到相关条目后再用 knowledge_read 按需拉取正文。

工具参考

表层工具

工具参数
write_memorycontent, tags, importance(enum), scope(enum)
read_memoryquery, top_k(5), importance?, scope(enum)
update_memoryid, scope, content?, tags?, importance?
delete_memoryid, scope
list_memorylimit, scope
knowledge_list
knowledge_readkid, start_line?, end_line?
knowledge_searchquery, top_k?
knowledge_suggestaction, title, summary, body, reason

scope 分区

  • scope="user":用户专属记忆,返回 user_{user_id} 分区(群聊私聊互通)
  • scope="group":群共享记忆,返回 group_{group_id} 分区(仅群聊可用)

潜意识工具(rethinking/tools.py

记忆和 session/画像工具注册在隔离的 _SUBCONSCIOUS_TOOLS 上。知识库中 list/read/search 通过双重注册同时暴露给表层和潜意识;create/update/delete 仅潜意识可用(表层通过 knowledge_suggest 提交建议):

工具用途
subconscious_read_memory语义检索
subconscious_write_memory写入新记忆
subconscious_update_memory更新指定 ID 记忆
subconscious_delete_memory删除指定 ID 记忆
subconscious_list_memory列出全部记忆
subconscious_iter_stop结束本轮推理
subconscious_send_to_user主动向用户发消息
subconscious_read_chat_context读取最近聊天记录
subconscious_duplicate_helper去重辅助(返回记忆 + 合并指导 prompt)
subconscious_get_memory_stats记忆统计(总量/重要性/标签分布)
subconscious_knowledge_create创建知识条目
subconscious_knowledge_update更新知识条目
subconscious_knowledge_delete删除知识条目
subconscious_knowledge_search语义搜索知识

配置参考

编辑 config/amrita_plugin_memory/config.toml

toml
short_term_expiry_days = 7
long_term_expiry_days = 90
per_session_memory_limit = 50

[subconscious]
enabled = false
target_user_id = ""
allowed_tools = []
max_iterations = 10
loop_detect_threshold = 3
rethink_base_delay_minutes = 30
rethink_penalty_multiplier = 1.5
rethink_max_delay_minutes = 1440
prompt_file = "prompt/subconscious_main.md.jinja2"
prompt_send_file = "prompt/subconscious_send.md.jinja2"
prompt_knowledge_file = "prompt/knowledge_guide.md.jinja2"
prompt_profile_file = "prompt/profile_guide.md.jinja2"
enable_memory_compress = true
allow_send_to_user = false
memory_warn_threshold = 100
max_abstracts = 5
knowledge_max_chars = 10000
knowledge_collection_name = "amrita_global_knowledge"
enable_knowledge = true
配置项默认值说明
short_term_expiry_days7短期记忆过期天数
long_term_expiry_days90长期记忆过期天数
per_session_memory_limit50每个会话的记忆数量限制
subconscious.enabledfalse是否启用潜意识推理循环
subconscious.target_user_id""目标用户 ID(MVP 仅支持单用户),为空则不启动
subconscious.max_iterations10单次推理最大 ReAct 循环步数(1-50)
subconscious.loop_detect_threshold3连续相同工具调用次数阈值(2-10),触发后注入提示
subconscious.rethink_base_delay_minutes30用户聊天后首次计划延迟(分钟)
subconscious.rethink_penalty_multiplier1.5取消惩罚指数倍率(1.0-10.0)
subconscious.rethink_max_delay_minutes1440惩罚延迟上限(分钟,默认 1 天)
subconscious.enable_memory_compresstrue每次运行后压缩持久化摘要
subconscious.allow_send_to_userfalse允许潜意识主动向用户发消息
subconscious.memory_warn_threshold100ChromaDB 超量时注入压缩提示的阈值
subconscious.max_abstracts5保留最近 N 轮摘要的滑动窗口大小(1-20)
subconscious.knowledge_max_chars10000全局知识库单条正文最大字符数
subconscious.enable_knowledgetrue是否启用全局知识库

注意事项

  • 潜意识推理每轮可能消耗数万 tokens,请根据成本预算决定是否开启
  • 表层记忆与潜意识共享同一个 ChromaDB(VECTOR_DB_PATH = data/amrita_plugin_memory/vector_db.chroma
  • 知识库写入(create/update/delete)仅限潜意识 Agent,表层 LLM 只能通过 knowledge_suggest 提交建议
  • 依赖 nonebot_plugin_apscheduler(定时调度)与 nonebot_plugin_localstore(本地数据目录)

MIT License 发布