
各位代码界的卷王、AI圈的探险家们! 👋 今天咱们要聊聊 OpenViking 里那个让 AI Agent 终于能“记住你是谁”的神奇系统!
想象一下这个场景:
你:“你好!我是小明,一个 Python 程序员,喜欢简洁的代码!”
AI:“好的,小明!很高兴认识你!”
... 5 分钟后,新的会话开始 ...
你:“你好!你还记得我吗?”
AI:“…… 您是?”
是不是像极了养了一条金鱼?🐠 7秒记忆,重新开始!
让我给你看看 OpenViking 给 AI Agent 造的超级记忆大豪宅:
viking://
├── 🎬 session/alice-chat-001/ # 临时客厅,聊天用
├── 👤 user/alice/ # 小明的私人卧室
│ └── memories/ # 小明的储物柜
│ ├── profile.md # 个人档案(永远最新!)
│ ├── preferences/ # 喜好库
│ ├── entities/ # 重要的人和事
│ └── events/ # 重要事件
└── 🤖 agent/my-assistant/ # 助手的书房
└── memories/ # 助手的学习笔记
├── cases/ # 案例库
└── patterns/ # 经验库
Session 就像你家的临时聊天客厅:
你进来聊天 → 留下一地瓜子皮(消息)→ 客厅满了
↓
扫!地!
↓
两阶段处理大法!
session.commit()
# 内部在做什么?
# └─ 咔嚓!把这堆聊天记录塞到 history/archive_001/ 文件夹
# └─ 立刻告诉你:好的,记录上了!
后台小哥:让我慢慢看看... 哦!小明喜欢简洁代码!
↓
写进 user/alice/memories/preferences/coding.md
↓
向量索引更新!下次能搜索到!
OpenViking 给你的 Agent 做了超级规整的分类笔记!
记忆类型 | 放在哪里 | 用途比喻 |
|---|---|---|
Profile | user/memories/profile.md | 档案袋 |
Preferences | user/memories/preferences/ | 购物清单 |
Entities | user/memories/entities/ | 名片夹 |
Events | user/memories/events/ | 日记本 |
Cases | agent/memories/cases/ | 错题本 |
Patterns | agent/memories/patterns/ | 解题模板 |
Tools | agent/memories/tools/ | 工具使用手册 |
Skills | agent/memories/skills/ | 工作手册 |
看看你家这个客厅长啥样:
viking://session/my-chat-session/
│
├── .meta.json 📋 客厅登记表
│ ├── 创建者:小明
│ ├── 参与人:小明 + 小红
│ └── 累计谈话次数:100次!
│
├── messages.jsonl 📝 实时对话记录
│
└── history/ 🗃️ 聊天档案馆
├── archive_001/
│ ├── messages.jsonl
│ ├── .abstract.md 一句话总结
│ ├── .overview.md 详细概述
│ └── .done ✓ 已完成标记
└── archive_002/
.meta.json 长这样,简直像个统计神器:
{
"session_id": "聊天的ID",
"created_at": "什么时候开始的",
"updated_at": "最后一句话是什么时候",
"created_by_user_id": "谁开的这个房间",
"participant_user_ids": ["谁进来过"],
"participant_agent_ids": ["有什么助手进来过"],
"message_count": 10,
"commit_count": 5,
"memories_extracted": {
"profile": 1,
"preferences": 2,
"total": 10
},
"llm_token_usage": {
"total_tokens": 20000
}
}
用户说了一堆话 → 📥 进入 MemoryExtractor 工厂
↓
🤖 LLM 开始分析:哦!小明说他是Python专家!
↓
📦 打成候选记忆包
↓
🎯 MemoryDeduplicator 判断:和以前的记忆冲突吗?
↓
✍️ VikingFS 写入:写入对应的目录!
↓
📊 VectorDB 更新:向量索引加上!下次能搜索!
每个记忆文件都是个三层的宝藏!
# 偏好:简洁代码
## Summary (L0)
小明不喜欢过度设计,喜欢简洁代码
## Overview (L1)
- 每次写代码都强调简洁
- 讨厌装饰器滥用
- 喜欢函数式编程
## Content (L2)
小明说过 N次,他喜欢 Python的简洁,他的项目都是...
OpenViking 的权限系统非常严格:
def is_accessible(uri: str):
if 你是 Root 管理员:
return True # 随便看!
if uri 是 public 资源或 session:
return True # 共享的东西
if uri 是小明的 user/:
return False # 你敢进试试?
空间类型 | 谁能看? | 比喻 |
|---|---|---|
Session | 同一 Account 里的人 | 公司会议室 |
User/ | 只有用户自己 | 你卧室的抽屉 |
Agent/ | 用户 + Agent | 你俩的共同书房 |
Resources | 全公司可见 | 公司图书馆 |
让我们用代码来走一遍!
import openviking as ov
import time
# 1️⃣ 开门!
client = ov.SyncHTTPClient(url="http://localhost:1933")
client.initialize()
# 2️⃣ 小明进入客厅!开始聊天!
session = client.create_session()
session_id = session["session_id"]
print("👋 小明开了个新 session!", session_id)
# 3️⃣ 对话!说话!
dialogues = [
{"role": "user", "content": "你好!我是小明,Python 程序员!"},
{"role": "assistant", "content": "你好小明!"},
{"role": "user", "content": "我喜欢简洁的代码风格!"},
{"role": "assistant", "content": "没问题,记住了!"},
]
for message in dialogues:
client.add_session_message(session_id, message["role"], message["content"])
# 4️⃣ 打扫卫生!commit 一下!
print("\n🗄️ 小明说:存档!")
commit_result = client.commit_session(session_id)
task_id = commit_result["task_id"]
print(f"⏳ 后台任务:{task_id}")
# 5️⃣ 等后台慢慢消化...
whileTrue:
task_result = client.get_task(task_id)
print(f"⏱️ 任务状态:{task_result['status']}")
if task_result["status"] in ["completed", "failed"]:
break
time.sleep(1)
# 6️⃣ 看看记住了什么!
print("\n✅ 完成!来看看记住什么了!")
session_info = client.get_session(session_id)
print("记忆统计:", session_info["memories_extracted"])
# 7️⃣ 下次聊天...
print("\n🌅 第二天... 小明又来了!")
new_session = client.create_session()
print("新的会话已经自动检索并注入了小明的记忆!")
你想让记忆多细粒度?由你说了算!
配置 | 结果 | 比喻 |
|---|---|---|
默认 | user/alice/memories | 小明的一个大抽屉 |
isolate_user_scope_by_agent=true | user/alice/agent/my-assistant/memories | 小明给这个助手单独分个抽屉! |
总结一下 OpenViking 的核心特点:
所以,下次你的 AI Agent 对你说“我们之前讨论过什么吗?”,请记住,OpenViking 已经帮你安排得明明白白了! 🎉
快来试试吧!让你的 Agent 拥有真正的“记忆”,变得越来越懂你!
下一章,我们开始学习如何手写一个OpenViking的记忆功能,从0到1