pi-mono × OpenViking:给 AI Agent 装上持久记忆
pi-mono × OpenViking:给 AI Agent 装上持久记忆
原文作者: roger (@lbq110)
原文链接: https://x.com/i/status/2024402486639952220
项目地址: https://github.com/lbq110/pi-mono/tree/feat/pi-viking-memory
整理时间: 2026-02-19
引言:记忆是 Agent 的刚需
很多朋友抱怨 OpenViking 不知道怎么用。最近,开发者 roger 将其与 pi-mono 结合起来,提供了一个优雅的解决方案。
核心洞察: LLM 是大脑,pi-mono 是身体,OpenViking 是海马体。
一、三者关系定位
| 组件 | 角色 | 职责 |
|---|---|---|
| LLM | 大脑 | 推理和决策,但天生无记忆——每次对话都是失忆状态 |
| pi-mono | 身体 | AI Agent 框架,给 LLM 装上工具调用、任务执行等能力,让它能真正干活 |
| OpenViking | 海马体 | 专门解决记忆问题,负责跨 session 的持久化存储与语义检索 |
三者组合,才构成一个”用过就记住、下次还认识你”的完整 Agent。
二、核心设计思想:工具优先,记忆为辅
与主流 RAG 方案的区别
主流做法(被动注入):
每次对话开始前 → 系统自动检索历史记忆 → 塞进上下文 → LLM 被动接收
问题很明显:
- LLM 不知道这些记忆从哪来、是否可信
- 当前场景是否真的用得上
- 记忆变成了噪音,上下文窗口被无效信息占满
- 反而干扰推理
pi-mono 的选择(主动工具):
记忆以工具形式存在 → 召回这个动作交给 LLM 来决策
Agent 在推理过程中自己判断:
- “我现在需要回忆什么吗?”
- “这件事值得记下来吗?”
记忆从被动注入变成主动行为,和搜索网页、执行代码在逻辑上完全对等。
好处与代价
| 方面 | 说明 |
|---|---|
| 好处 | 召回有明确意图,保存有明确判断,记忆的质量和相关性都更高 |
| 代价 | Agent 需要足够”聪明”才能知道什么时候该用记忆工具——但这正是现代 LLM 擅长的事 |
三、架构设计:两层分离
架构概览
Pi-mono Agent
│
├── 主动工具(LLM 决定何时调用)
│ ├── recall_memory(query, scope?) → 语义搜索历史记忆
│ ├── save_memory(content) → 显式保存关键信息
│ ├── explore_memory(uri) → 浏览记忆文件系统
│ └── add_knowledge(path) → 索引本地文件/目录
│
└── 被动钩子(透明自动执行,LLM 无感知)
├── before_agent_start → 创建 OV session,注入记忆系统提示
├── session_compact → 同步消息 + 提交(提取记忆)
└── session_shutdown → 同步消息 + 提交(提取记忆)
│
OpenViking HTTP API (localhost:1933)
独立 Python 进程
主动工具(Active Tools)
Agent 自行决策调用,四个核心工具:
| 工具 | 功能 | 使用场景 |
|---|---|---|
recall_memory |
语义搜索历史记忆 | “我现在需要回忆什么吗?” |
save_memory |
显式保存关键信息 | “这件事值得记下来吗?” |
explore_memory |
浏览记忆文件系统 | 查看有哪些记忆 |
add_knowledge |
索引本地文件/目录 | 将项目文档纳入知识库 |
recall_memory 详解
recall_memory(query: string, scope?: "preferences"|"entities"|"cases"|"all", limit?: number)
Scopes 对应 Viking URI 前缀:
| scope | 搜索范围 |
|---|---|
preferences |
viking://user/memories/preferences/ |
entities |
viking://user/memories/entities/ |
cases |
viking://user/memories/cases/ |
all (默认) |
viking://user/memories/ |
被动钩子(Passive Hooks)
透明自动执行,LLM 无感知:
| 钩子 | 触发时机 | 功能 |
|---|---|---|
before_agent_start |
Agent 启动前 | 建立 OV session,注入记忆能力系统提示 |
session_compact |
会话压缩时 | 增量同步消息 + 触发记忆提取 |
session_shutdown |
会话关闭时 | 同步消息 + 提交会话(提取记忆) |
底层实现: 跑在 localhost:1933 的独立 Python 进程,通过 HTTP API 通信。
四、三层存储模型
| 层级 | 决策者 | 执行时机 | 说明 |
|---|---|---|---|
| 消息同步 | 自动钩子 | compact/shutdown 时静默追加对话 | 对话内容自动同步到 OV session |
| 记忆提取 | OV 内部 LLM pipeline | commit 时自动执行 | 提取 preferences / entities / cases |
| 主动召回/保存 | Agent LLM | 调用工具时 | Agent 自己决定何时使用记忆 |
五、实际效果演示
Session 1:保存记忆
用户: "我喜欢用 anyhow 做 Rust 错误处理"
Agent: 调用 save_memory 保存
关闭 pi → OV 自动提取 → 写入 viking://user/memories/preferences/
Session 2:全新进程,零上下文
用户: "帮我写个 Rust 工具"
Agent: 调用 recall_memory("Rust preferences")
→ 搜到上次的偏好,自动用 anyhow,不过度抽象
关键: 即使全新进程、零上下文,Agent 也能记住用户的偏好。
六、容错设计:记忆是增强,不是依赖
设计原则: OV 挂了,pi 照跑。
| 场景 | 处理方式 |
|---|---|
health() 检测失败 |
静默跳过,不注入系统提示 |
| 工具调用失败 | 返回描述性文本,不抛异常 |
| 所有钩子 | try/catch 吞错误,主流程不受影响 |
核心思想: 记忆是增强功能,不是系统依赖。即使记忆服务不可用,Agent 依然能正常工作。
七、快速开始
1. 安装并启动 OpenViking
git clone https://github.com/lbq110/OpenViking
cd openviking
uv venv .venv
uv pip install setuptools pybind11 cmake
uv pip install -e "."
创建配置文件 ~/.openviking/ov.conf(示例使用 Gemini):
{
"storage": {
"vectordb": { "backend": "local", "path": "~/.openviking/data" },
"agfs": { "backend": "local", "path": "~/.openviking/data", "port": 1833 }
},
"embedding": {
"dense": {
"provider": "openai",
"model": "models/gemini-embedding-001",
"api_key": "<your-gemini-api-key>",
"api_base": "https://generativelanguage.googleapis.com/v1beta/openai/",
"dimension": 3072
}
},
"vlm": {
"model": "gemini-2.0-flash",
"provider": "gemini",
"providers": {
"gemini": { "api_key": "<your-gemini-api-key>" }
}
}
}
启动服务:
.venv/bin/openviking serve --config ~/.openviking/ov.conf &
2. 配置扩展
mkdir -p ~/.pi
cp packages/pi-viking-memory/config-templates/viking-memory.json ~/.pi/viking-memory.json
3. 安装扩展
mkdir -p ~/.pi/agent/extensions
ln -sfn /path/to/pi-mono/packages/pi-viking-memory \
~/.pi/agent/extensions/viking-memory
验证安装:
pi --print "list all available tools"
# 应该显示: recall_memory, save_memory, explore_memory, add_knowledge
八、技术亮点
1. 完全测试覆盖
- 42 个单元测试
- 覆盖 OVClient、SessionManager 和所有四个工具
- 使用 vitest + mocked fetch
2. 技术栈
| 组件 | 技术 |
|---|---|
| 构建 | Go + CMake |
| Vector DB | 本地存储 |
| Embedding | Gemini (models/gemini-embedding-001, 3072-dim) |
| VLM | Gemini 2.0 Flash |
| 测试 | Vitest |
3. 优雅的降级
所有工具在 OpenViking 不可用时都能优雅降级,不影响主流程。
九、总结:一种新的记忆范式
pi-mono × OpenViking 的整合展示了一种新的 AI Agent 记忆范式:
不是把记忆塞进上下文让 LLM 被动接受,
而是把记忆变成工具让 LLM 主动决策。
这种”工具优先,记忆为辅”的设计:
- 更符合 LLM 的能力模型
- 记忆质量更高(有明确意图)
- 系统更健壮(优雅降级)
- 用户体验更好(跨 session 持久)
参考链接
- Twitter 原文: https://x.com/i/status/2024402486639952220
- GitHub 仓库: https://github.com/lbq110/pi-mono/tree/feat/pi-viking-memory
- OpenViking: https://github.com/lbq110/OpenViking
- pi-mono: https://github.com/badlogic/pi-mono
📝 作者注: 本文基于 roger 的 Twitter 分享和开源仓库整理。pi-viking-memory 是一个快速迭代的实验性项目,部分细节可能随版本更新而变化。