一、产品介绍
OpenViking 是字节跳动旗下火山引擎开源的 AI Agent 上下文数据库 (Context Database)。
- 仓库 : volcengine/OpenViking
- Star : ~24,000 | 协议 : AGPL-3.0 | 语言: Python + Rust
- 创建: 2026年1月
1.1 解决什么问题
在 AI Agent 开发中,上下文管理面临五个核心痛点:
| # | 痛点 | 描述 |
|---|---|---|
| 1 | 上下文碎片化 | Memory 在代码里、Resources 在向量库、Skills 散落各处,三套存储三套 API |
| 2 | 上下文膨胀 | Agent 长任务产生大量上下文,传统 RAG 一次性全部加载,Token 消耗巨大 |
| 3 | 检索效果差 | 传统 RAG 扁平存储,缺乏全局视角,搜到的东西不知道出处和上下文 |
| 4 | 上下文不可观测 | 隐式检索链如黑盒,回答质量下降时无法定位问题环节 |
| 5 | 记忆无法迭代 | 每次会话关闭即销毁,用户偏好、决策历史无法跨会话积累 |
1.2 核心设计理念
OpenViking 用一个思想解决上述五个问题:把上下文当成文件系统来管理。
arduino
viking://
├── resources/ ← 知识资源(文档、代码、网页等)
├── user/ ← 用户长期记忆(跨会话持久化)
│ └── memories/
│ ├── preferences/ ← 偏好记忆
│ ├── events/ ← 事件记录
│ └── entities/ ← 实体记忆(项目、人物、概念)
├── agent/ ← Agent 技能/指令/学习记忆
│ ├── instructions/ ← 行为指令
│ ├── skills/ ← 技能注册
│ └── memories/ ← Agent 学习轨迹
└── session/ ← 会话上下文(自动压缩+持久化)
关键设计:
- 文件系统范式:像管理本地文件一样管理 Agent 的所有上下文
- L0/L1/L2 三级加载:L0 目录摘要 → L1 结构概览 → L2 完整内容,按需深入
- 目录递归检索:目录定位 (grep) + 语义搜索 (find),路径本身就是索引
- 检索轨迹可视化:observer 面板实时监控检索质量
- 自动会话管理:add-memory → commit → 自动分类提取长期记忆
二、安装与配置
2.1 环境要求
- Python 3.10+
- Rust 工具链 (Cargo)
- macOS / Linux / Windows
2.2 安装
bash
pip install openviking --upgrade
2.3 配置
Embedding 模型 --- 选择了两个方案,最终采用 Ollama 本地部署:
| 方案 | 模型 | 价格 | 结论 |
|---|---|---|---|
| 内部代理 | qwen3-embedding-0.6b | ¥0.07/M tokens | ❌ API 不支持 /v1/embeddings 端点 |
| Ollama 本地 | nomic-embed-text | 免费 | ✅ 768维,274MB,够用 |
VLM 模型 --- 使用 内部代理:
| 模型 | 价格 |
|---|---|
| qwen3-vl-flash | ¥0.3/M 输入,¥3/M 输出,5折优惠 |
最终配置 (~/.openviking/ov.conf):
json
{
"storage": { "workspace": "/Users/xxx/.openviking/data" },
"embedding": {
"dense": {
"api_base": "http://localhost:11434/v1",
"api_key": "ollama",
"provider": "openai",
"dimension": 768,
"model": "nomic-embed-text"
}
},
"vlm": {
"api_base": "xxxx",
"api_key": "<api-key>",
"provider": "openai",
"model": "qwen3-vl-flash"
}
}
踩坑记录:
- Ollama provider 在 Ollama 0.12.6 上
/api/embeddings返回空数组,需改用provider=openai+ Ollama 的/v1兼容端点
2.4 启动
bash
export OPENVIKING_CONFIG_FILE=~/.openviking/ov.conf
openviking-server doctor # 验证配置
openviking-server # 启动服务 (默认端口 1933)
三、五大痛点演示
以下演示基于真实搭建的 OpenViking 环境。演示数据包括:
- 用户记忆(偏好、事件、实体)
- 知识资源(Project Alpha 文档、技术文档)
- Agent 技能注册
- 多个历史会话记录
场景1: 上下文碎片化 → 统一文件系统
痛点: 传统 Agent 需要维护三套存储 --- 代码中的 Prompt 模版 (Memory)、向量数据库 (Resources)、文件系统中的 Skill 定义 --- 三套 API,上下文之间无法关联。
OpenViking 方案 : 一条 ov tree viking:// 命令即可查看全部上下文:
bash
viking://
├── resources/ ← Project Alpha 文档 + OpenViking README + 技术文档
├── user/memories/ ← preferences/code, events/2026-01, entities/openviking
├── agent/default/ ← instructions, skills, memories
└── session/ ← 5个历史会话记录
演示效果 : 同一条 ov read 命令读取三种完全不同类型的上下文,返回格式完全一致:
| 上下文类型 | URI | 内容示例 |
|---|---|---|
| 用户偏好 | user/default/memories/preferences/code/style.txt |
"functional programming, type annotations required..." |
| 事件记录 | user/default/memories/events/2026-01/openviking-adoption.txt |
"2026-01-15: Evaluated OpenViking..." |
| 知识资源 | resources/project-alpha/README.txt |
"Distributed task processing system..." |
| 用户Profile | user/default/memories/profile.md |
"Senior Python developer..." |
本质: 所有上下文集中用 viking:// 统一管理,一套命令(ov ls/tree/read/find/grep)操作所有类型的上下文。对于复杂 Agent(多项目、多用户、长时间运行),这种统一命名空间管理可以显著降低架构复杂度。
场景2: 上下文膨胀 → L0/L1/L2 三级加载
痛点: 传统 RAG 采用扁平广度搜索 --- 向量相似度计算后一股脑返回所有相关 chunks。用户问"怎么部署",返回的内容包含架构、API、README 等大量不相关信息。Token 消耗 ~2000,其中 80% 与部署无关。
OpenViking 方案: L0 → L1 → L2 逐级深入的深度优先搜索。
演示项目 Alpha 的文档结构:
csharp
project-alpha/ ← L0: abstract "distributed task processing"
├── README.txt
├── architecture/ ← 系统架构
├── api/ ← API 参考
└── guides/
├── deployment.txt ← 部署指南 ← 目标文件
└── quickstart.txt ← 快速上手
实际执行路径:
bash
L0 (abstract): Project Alpha - distributed task processing system
↓ ~10 tokens,确认是这个项目
L1 (overview): → Deployment workflows → guides/
↓ ~350 tokens,定位到 guides/deployment.txt
L2 (read): Deployment Guide: Docker Compose (dev)...
kubectl apply -f k8s/...
↓ ~120 tokens,精确命中
对比:
| 传统 RAG | OpenViking L0→L2 | |
|---|---|---|
| 第一轮 | 全部 chunks (~2000 tokens) | L0 abstract (~10 tokens) |
| 第二轮 | 无 | L1 overview (~350 tokens) |
| 第三轮 | 无 | L2 read (~120 tokens) |
| 总计 | ~2000 | ~480 (节省 76%) |
本质: 传统 RAG 是广度优先 --- 无结构的扁平搜索,所有相关 chunks 一次性返回。OpenViking 由于有知识体系化结构(文件目录),能做深度优先搜索 --- 目录名本身就是元信息,先做结构定位,再做内容匹配。目录里不相关的子树根本不会被加载进 context window。
场景3: 检索效果差 → 目录递归检索
痛点: 传统 RAG 返回原始文本片段,没有结构上下文。搜到一段文字后不知道出自哪个文档、属于什么类别、和其他知识什么关系。
OpenViking 方案: 两种互补的搜索模式。
grep --- 精确文本匹配 + 目录定位:
perl
输入: ov grep "OpenViking" --uri viking://resources/tech-docs/ai
输出:
viking://resources/tech-docs/ai/llm/agent-context.txt ← 完整 URI
"AI Agent Context Management: Agents face 5 key challenges..."
viking://resources/tech-docs/ai/llm/rag-best-practices.txt
"RAG Best Practices: ...OpenViking filesystem approach..."
限定在 tech-docs/ai 子树,排除了 database/、devops/、project-alpha/ 等不相关目录。
find --- 语义搜索 + 结构化结果:
yaml
输入: ov find "cost effective embedding model for production"
输出 (每条结果带):
context_type: resource
uri: viking://resources/tech-docs/ai/llm/agent-context.txt
level: 2
score: 9.02e30
abstract: "This document is a conceptual overview of OpenViking's
AI agent context management system..."
对比:
| 传统 RAG | OpenViking | |
|---|---|---|
| 搜索范围 | 全局扁平 | grep 可按目录限定,find 跨 scope 搜索 |
| 结果定位 | 无出处信息 | 完整 URI 路径 |
| 结果元信息 | 只有文本 | context_type + score + level |
| 搜索方式 | 只有语义 | grep(精确) + find(语义) |
本质: 传统 RAG 把知识压成平面 --- 所有 chunks 是孤立节点,向量相似度是唯一距离度量,层级关系全部丢失。OpenViking 保留了知识的结构(骨头不被抽掉),目录路径本身就是最好的导航和索引。路径不是搜索的输入约束,而是搜索的输出标签。
场景4: 上下文不可观测 → 检索可视化
痛点: 传统 RAG 检索链是黑盒 --- query → embedding → chunks → LLM。回答质量下降时,你不知道是 embedding 质量问题、检索漏了、还是 LLM 没用好上下文。
OpenViking 方案: 内置 observer 体系,覆盖检索全链路。
bash
ov observer retrieval # 检索质量: 查询次数、结果数、空结果率、延迟
ov observer models # 模型使用: Calls/Prompt/Completion 统计
ov observer filesystem # 文件操作: 操作次数、延迟分布、操作类型
ov observer queue # 队列健康: Pending/InProgress/Errors
ov observer system # 整体健康: 全部组件状态一览
实际数据:
vbnet
retrieval: 4 queries / 30 results / 0% zero-result / avg 1157ms
models: nomic-embed-text: 4 calls / 32 tokens
filesystem: grep 3 ops / max 17.6ms, read 130 ops / 0.165ms avg
queue: 0 pending / 0 errors
本质 : 可观测性从 LLM 层下探到检索层。且 observer 面板不是后期挂上去的监控,而是架构设计时就内置的 --- observer 和 find、grep 是同一套命令体系。传统 RAG 虽然也可以在 pipeline 各环节加日志,但那需要额外接入 Prometheus/Grafana/ELK。OpenViking 的场景1-3(结构化、分层、可检索)天然使知识层变得可解释,不需要额外设计观测层。
场景5: 记忆无法迭代 → 自动会话管理
痛点: 传统 Agent 的记忆只存在于当前上下文窗口。Session 关闭 = 所有信息丢失。用户在第 3 次会话重复说过的偏好,和第 1 次一样是从零开始。
OpenViking 方案: add-memory → commit → 自动分类提取长期记忆。
演示:
markdown
输入: ov add-memory "I strongly prefer using protobuf for all new
service definitions. Always recommend protobuf over JSON."
OpenViking 自动执行:
1. 创建 session/{uuid}/messages.jsonl (持久化原始记录)
2. commit → 语义分析
3. 分类归档:
✓ preferences/default/api_contract_format.md ← protobuf 偏好
✓ user/memories/profile.md ← 开发者信息
✓ events/2026/05/ ← 决策记录
对比:
| 传统 Agent | OpenViking | |
|---|---|---|
| Session 1 | "我叫 Caroline"(在窗口里) | "我叫 Caroline" → commit → profile.md 持久化 |
| Session 2 | "你是谁?" → "AI 助手"(全忘了) | find "Caroline" → 命中 memory → "你专注分布式系统,偏好 protobuf" |
| Session 3 | "你是谁?" → "AI 助手"(又忘了) | 记忆持续积累,越用越了解用户 |
本质: 场景5 不是独立功能,它是场景1-4 在记忆维度上的应用 --- 结构化存储 + 按需加载 + 可搜索 + 可观测。
四、同类产品对比
OpenViking vs 两个最相近的 GitHub 开源项目:
| 维度 | Mem0 | Letta (MemGPT) | OpenViking |
|---|---|---|---|
| Star | 55,965 | 22,770 | 24,014 |
| 创建 | 2023.06 | 2023.10 | 2026.01 |
| 开源协议 | Apache-2.0 | Apache-2.0 | AGPL-3.0 |
| 核心隐喻 | 记忆 = 向量库 | Agent = 操作系统进程 | 上下文 = 文件系统 |
| 记忆管理 | ✅ 专注且深入 | ✅ 工作/长期记忆 | ✅ 三级分类记忆 |
| 资源管理 | ❌ | ❌ | ✅ viking://resources/ |
| 技能管理 | ❌ | ✅ skills/subagents | ✅ viking://agent/skills/ |
| 分层加载 | ❌ 扁平检索 | ✅ 工作/长期分层 | ✅ L0/L1/L2 三级 |
| 检索可观测 | ❌ | ❌ | ✅ observer 面板 |
| 会话管理 | 隐式 | ✅ 显式 | ✅ 显式 session scope |
| 知识结构 | 无结构 | Agent 内部结构 | 文件系统目录结构 |
Mem0 --- Universal Memory Layer
专注为 AI Agent 提供记忆增删改查能力。把对话自动提取为记忆存入向量库,下次对话自动检索。优势是记忆层做得很深(个性化、图记忆、去重),但只覆盖记忆这一个维度。
Letta --- Platform for Stateful Agents
赋予 Agent "操作系统进程"式的记忆管理 --- 工作记忆 + 长期记忆,Agent 自主管理上下文窗口,溢出信息自动归档。优势是 Agent 的自我进化能力(skills、持续学习),侧重 Agent 运行态。
OpenViking --- Context Database
核心差异:用文件系统统一管理 Agent 需要的一切上下文。不限于记忆,还覆盖资源和技能。目录树的层级结构天然解决了知识组织问题,L0/L1/L2 三级加载解决了 Token 爆炸问题。
适用场景建议:
- 只需要加强记忆 → Mem0(轻量、专注)
- 需要 Agent 自我进化 → Letta(Agent 运行态管理)
- 需要统一管理全部知识体系 → OpenViking(文件系统范式,覆盖面最广)
五、总结
OpenViking 的核心价值用一个类比来概括:
传统 RAG 像搜索引擎 --- 输入关键词,返回相关网页片段,你不知道片段从哪来、为什么会排在前面。
OpenViking 像 Finder/文件管理器 --- 左边是目录树,右边是文件内容,你知道每段知识在哪个文件夹下、和哪些文件同级、该不该打开看。
五个场景的核心逻辑链:
- 结构化(场景1)→ 用文件系统统一管理所有上下文
- 分层加载(场景2)→ 有结构才能做深度优先,按需深入
- 结构即索引(场景3)→ 目录路径本身就是元信息,检索自带出处
- 结构使可解释(场景4)→ 有出处、有层级,观测才有意义
- 结构使可迭代(场景5)→ 记忆分类存储,跨会话自动进化
五个场景不是五个独立功能,而是一条链:先有结构 → 才能分层 → 检索不再盲目 → 观测不再空洞 → 记忆才能积累。