字节 OpenViking 深度剖析:AI Agent 的“第二大脑”与上下文革命
一、项目定位与核心理念
OpenViking 是一个专为 AI Agent 设计的上下文数据库,由字节跳动开源。它解决的是 AI Agent 开发中普遍存在的上下文管理难题。
什么是 AI Agent? AI Agent(人工智能智能体)是一种能够自主感知环境、做出决策并执行行动的 AI 系统。与传统的问答式 AI 不同,Agent 可以完成多步骤任务、调用外部工具、记住用户偏好,实现更复杂的自动化场景。
什么是上下文? 上下文是 Agent 在执行任务时所需要的信息总和,包括:用户的历史对话、项目文档、代码仓库、Agent 之前学到的经验等。就像人类工作时需要查阅笔记和资料一样,Agent 也需要上下文来理解任务背景。
1. AI Agent 开发痛点
在 AI 时代,数据虽然丰富,但高质量的上下文却难以获取。开发 AI Agent 时,开发者常面临以下挑战:
痛点详解:
• 上下文碎片化:传统方案中,Memory(记忆)、Resource(资源)、Skill(技能)分别存储在不同系统。例如,用户的偏好可能存在数据库中,项目文档在向量数据库中,而 Agent 的技能定义写在代码里。Agent 执行任务时需要跨多个数据源获取上下文,增加了系统复杂度和维护成本。 • Token 消耗激增:大语言模型(LLM)对单次输入的 Token 数量有限制(如 GPT-4 约 128K tokens)。长对话场景下,简单截断会丢失关键信息,全量传递又会超出窗口限制并产生高昂成本,传统方案难以平衡。 • 检索效果差:传统 RAG(检索增强生成)使用扁平化的向量检索,只能返回语义相似的片段,缺乏对上下文全局结构的理解。就像在一本没有目录的书中只能通过关键词搜索,难以理解信息的完整脉络。 • 上下文不可观测:当 Agent 行为异常时(如给出了错误的答案),开发者无法追踪哪些上下文被检索、为何被检索。传统 RAG 的检索过程像黑盒,调试困难。 • 记忆无法迭代:Agent 无法从历史任务中学习经验,每次都从零开始。例如,Agent 上次成功解决了某个技术问题,但下次遇到类似问题时却无法复用之前的解决方案。
2. OpenViking 解决方案
OpenViking 采用 "文件系统范式" 统一组织 Agent 所需的上下文,针对上述痛点提供系统性解决方案:
什么是文件系统范式? 就像电脑上的文件系统用统一的路径(如
/Users/Documents/report.pdf)管理所有文件一样,OpenViking 用viking://协议统一管理 Agent 的所有上下文。这种设计让开发者可以像操作文件一样操作上下文,直观且易于理解。
| 文件系统范式 | ||
| 三层上下文结构 | ||
| 目录递归检索 | ||
| 可视化检索轨迹 | ||
| 自动会话管理 |
3. 适用场景
OpenViking 适用于需要长短期记忆、复杂上下文管理和高精度检索的 AI Agent 场景:
• 企业知识库助手:管理海量文档,支持多部门、多项目的权限隔离,精准回答专业问题。 • 代码助手 / 开发工具:解析代码仓库结构(AST),理解函数调用关系,辅助代码生成与重构。 • 客户服务机器人:记住用户历史偏好(如语言、语气、常用业务),提供个性化服务,避免重复询问。 • 个人 AI 助手:记录个人生活琐事、日程安排和重要信息,成为真正的“第二大脑”。 • 多 Agent 协作系统:作为共享的上下文存储,支持不同 Agent 之间的信息交换与协作记忆。
4. 快速开始
# 安装
pip install openviking# 初始化
import openviking as ov
client = ov.OpenViking(path="./data")
client.initialize()
# 添加资源 (自动异步处理)
client.add_resource("./my-project")
# 等待语义处理完成 (仅用于演示,生产环境无需阻塞)
client.wait_processed()
# 检索上下文
context = client.find("帮我分析这个项目的架构")
# (用户需自行将 context 传递给 LLM)
print(context)二、系统架构
OpenViking 采用分层架构设计,从上到下分为 Client 层、Service 层、核心功能层和存储层,各层职责清晰,便于扩展和维护。
1. 整体架构图
2. 核心模块职责
| Client | |||
| Service | |||
| Retrieve | |||
| Session | |||
| Parse | |||
| Storage |
三、核心概念详解
1. Viking URI - 统一资源标识
所有上下文都通过 viking:// 协议进行唯一标识,就像网页有 https:// 地址一样,OpenViking 中的每个文件、记忆、技能都有唯一的 URI。
为什么需要统一标识? 统一的 URI 机制让 Agent 可以用同一种方式访问所有类型的上下文,无需关心底层存储细节。例如,无论是读取用户偏好还是查询项目文档,都使用相同的
viking://协议。
viking://
├── resources/ # 资源:项目文档、代码仓库、网页等
│ └── {project}/
│ ├── .abstract.md # L0 摘要(~100 tokens)
│ ├── .overview.md # L1 概览(~2k tokens)
│ └── {files...} # L2 详情(完整内容)
├── user/ # 用户数据
│ └── {user_space}/ # 用户空间(隔离存储)
│ └── memories/
│ ├── preferences/# 用户偏好
│ ├── entities/ # 实体记忆
│ └── events/ # 事件记录
├── agent/ # Agent 数据
│ └── {agent_space}/ # Agent 空间(隔离存储)
│ ├── skills/ # 技能定义
│ ├── memories/ # Agent 记忆
│ │ ├── cases/ # 学习案例
│ │ └── patterns/ # 学习模式
│ └── instructions/ # Agent 指令
├── session/{user_space}/{id}/ # 会话数据
│ ├── messages.jsonl
│ └── history/
├── temp/ # 临时文件(解析期间)
└── queue/ # 处理队列(内部)URI 示例:
• viking://resources/my-project/docs/api.md- 项目文档• viking://user/default/memories/preferences/theme- 用户偏好设置(在 default 用户空间下)• viking://agent/default/skills/code-review- Agent 的代码审查技能(在 default Agent 空间下)
2. 三层上下文结构 (L0/L1/L2)
OpenViking 创新性地采用三层上下文结构,实现渐进式加载,在保证信息完整性的同时显著降低 Token 消耗。
为什么需要三层? 想象你要了解一本书:L0 相当于书名和目录标题(快速判断是否相关),L1 相当于章节摘要(了解大概内容),L2 相当于完整正文(深入阅读)。你不会一上来就读整本书,而是先看目录,再选感兴趣的章节精读。
| L0 | ||||
| L1 | ||||
| L2 |
加载策略:
1. 先用 L0 进行向量搜索,找到相关目录 2. 用 L1 进行精排,确定最相关的内容 3. 仅加载需要的 L2 完整内容
效果:相比传统全量加载,Token 消耗可降低 80% 以上。
3. 三种上下文类型
OpenViking 将上下文分为三种类型,每种类型有不同的生命周期和用途:
| Resource | viking://resources/ | |||
| Memory | viking://user/.../memories/viking://agent/.../memories/ | |||
| Skill | viking://agent/.../skills/ |
Memory vs Resource 的区别:
• Resource:外部导入的知识,如项目文档、代码仓库,由开发者主动添加 • Memory:Agent 在交互过程中自动学习和积累的认知,如用户说"我喜欢简洁的代码风格",Agent 会记住这个偏好
四、核心技术机制
1. 目录递归检索
OpenViking 采用创新的目录递归检索策略,将传统 RAG 的扁平检索升级为层级检索,显著提升检索准确性和可解释性。
传统 RAG 的问题:传统方法将所有文档切成片段后扁平存储,检索时只能通过语义相似度找片段,就像在一堆撕碎的纸片中找信息,缺乏全局视角。
查询 → 意图分析 → 层级检索 → Rerank → 结果
↓ ↓ ↓
TypedQuery 目录递归 精排评分检索流程:
1. 意图分析:理解用户查询的真实意图,生成 TypedQuery 2. 目录递归:从根目录开始,逐层向下检索高分目录 3. Rerank 精排:对候选内容进行精确重排序 4. 返回结果:返回最相关的上下文
关键算法特性:
• 分数传播: final_score = 0.5 * embedding_score + 0.5 * parent_score• 子目录的分数不仅取决于自身相关性,还继承父目录的分数 • 这样可以确保检索到结构完整的相关内容 • 收敛检测:连续 3 轮 topk 无变化则停止 • 避免无意义的深度遍历,提高检索效率 • 全局搜索 TOPK:3 个候选起始目录 • 从多个可能相关的位置开始检索,提高召回率
2. 记忆提取机制
当用户与 Agent 完成一次对话后,OpenViking 会自动从对话中提取有价值的记忆,让 Agent "记住" 重要的信息。
为什么需要记忆提取? 人类会记住重要的对话内容,Agent 也应该如此。例如,用户说 "我是一名 Python 开发者",Agent 应该记住这个信息,下次对话时就可以针对性地推荐 Python 相关内容。
会话提交时自动提取 8 种记忆类型:
| profile | ||||
| preferences | ||||
| entities | ||||
| events | ||||
| cases | ||||
| patterns | ||||
| tools | ||||
| skills |
去重决策:
• CREATE:新记忆,直接创建 • UPDATE:更新已有记忆 • MERGE:合并相似记忆 • SKIP:跳过重复内容
3. 文档解析流水线
OpenViking 支持多种格式的文档导入,通过解析流水线自动提取结构化信息并生成向量化索引。
解析过程:当你导入一个项目文档或代码仓库时,OpenViking 会自动解析文件内容、提取关键信息、生成 L0/L1 层摘要,并创建向量索引用于后续检索。
输入文件 → Parser → TreeBuilder → SemanticQueue → 向量库
↓ ↓ ↓
解析转换 文件移动 L0/L1 生成
(无 LLM) 入队语义 (LLM 异步)处理阶段:
1. Parser 解析:根据文件类型选择合适的解析器(Markdown/PDF/代码等) 2. TreeBuilder 构建树:将解析后的内容组织成目录结构 3. SemanticQueue 语义处理:异步调用 LLM 生成 L0 摘要和 L1 概览 4. 向量库索引:将 L0 向量化存入索引
支持格式:
• 文档:Markdown、PDF、HTML、Word • 代码:Python、JS/TS、Rust、Go、Java、C++ 等 • 多媒体:图片、视频、音频(需配置多模态模型)
AST 骨架提取:对于代码文件,OpenViking 支持 tree-sitter AST 提取,可以识别:
• 类、函数、变量的定义 • 导入依赖关系 • 代码结构层次
这样检索时可以精确定位到具体的函数或类,而不是整个文件。
五、双层存储架构
OpenViking 采用双层存储架构,将内容存储和索引存储分离,实现职责清晰、高效可扩展的存储方案。
为什么需要双层存储? 传统向量数据库将内容和向量存在一起,导致内存占用高、扩展困难。OpenViking 将两者分离:向量库只存储索引(轻量),AGFS 存储完整内容(海量),各司其职。
1. 存储结构
| AGFS | |||
| 向量库 |
AGFS(Augmented Global File System) 是 OpenViking 自研的增强型全局文件系统,专门为 AI Agent 上下文管理设计,支持:
• 大文件存储 • 版本管理 • 关联关系追踪
设计优势:
• 职责清晰:向量库只负责检索,AGFS 负责存储,各司其职 • 内存优化:向量库不存储文件内容,大幅降低内存占用 • 单一数据源:所有内容从 AGFS 读取,避免数据不一致 • 独立扩展:向量库和 AGFS 可根据需求分别扩展
2. 事务机制
OpenViking 内置事务机制,保障数据操作的原子性和一致性,防止并发操作导致的数据损坏。
为什么需要事务? 当多个用户同时操作同一目录时(如同时添加文件),没有事务保护可能导致数据混乱。OpenViking 的事务机制确保每次操作要么完全成功,要么完全回滚。
操作请求 → TransactionManager → 锁保护 → 执行操作 → 状态更新核心特性:
• 路径锁:锁定目标目录,防止并发冲突 • 类似于文件锁,确保同一时间只有一个操作可以修改某目录 • 写互斥:同一时间只允许一个事务写操作 • 保证数据一致性,避免写入冲突 • 事务状态机: INIT → AQUIRE → EXEC → COMMIT/FAIL → RELEASING → RELEASED• 完整的生命周期管理,便于追踪和调试
适用场景:add_resource、rm、mv 等数据操作命令自动开启事务保护,开发者无需手动管理。
六、多租户支持
OpenViking 支持完整的多租户隔离,适合企业级部署和 SaaS 场景。
什么是多租户? 多租户是指一套系统可以服务多个客户(租户),每个客户的数据相互隔离。例如,公司 A 和公司 B 都使用同一个 OpenViking 服务,但彼此看不到对方的数据。
1. 三层角色
2. 存储隔离
不同租户的数据在物理存储上也是隔离的,通过 AGFS 路径实现:
/{account_id}/user/{user_space}/memories/ | ||
/{account_id}/agent/{agent_space}/memories/ | ||
/{account_id}/resources/ | ||
/{account_id}/session/{user_space}/{id}/ |
隔离维度说明:
• account:企业/组织级别隔离 • user:用户级别隔离 • agent:Agent 实例级别隔离
3. 运行模式
OpenViking 支持两种运行模式,适应不同场景:
• Dev 模式(开发模式): • 不配置 root_api_key• 跳过认证,使用 default 账户 • 适合本地开发、测试 • 生产模式: • 配置 root_api_key• 强制 API Key 认证 • 支持多账户、多租户 • 适合企业部署、SaaS 服务
七、部署模式
OpenViking 支持两种部署模式,适应不同的使用场景和技术要求。
1. 嵌入式模式
嵌入式模式适合本地开发、测试和小型应用,无需独立部署服务端。
from openviking import OpenViking
# 初始化客户端,自动启动 AGFS 子进程
client = OpenViking(path="./data")
# 添加资源
client.add_resource("./my-project")
# 搜索
results = client.search("如何配置数据库")特点:
• 自动启动 AGFS 子进程,无需额外配置 • 本地向量索引,无需外部数据库 • 单例模式,同一进程只能有一个实例 • 适合本地开发、原型验证
适用场景:
• 本地开发调试 • 个人项目、小规模应用 • CI/CD 测试环境
2. HTTP 模式
HTTP 模式适合生产环境,支持独立部署、多客户端访问、多语言接入。
# 服务端启动(终端 1)
# openviking-server --host 0.0.0.0 --port 1933
# 客户端连接(终端 2 或其他机器)
from openviking import SyncHTTPClient
client = SyncHTTPClient(url="http://localhost:1933", api_key="your-api-key")
# 正常使用
client.add_resource("./my-project")
results = client.search("API 文档")特点:
• 独立进程运行,不依赖主应用 • 支持多语言客户端(Python、Rust CLI、HTTP API) • 支持多客户端并发访问 • 支持多租户、权限管理
适用场景:
• 生产环境部署 • 团队协作、多用户访问 • 微服务架构 • SaaS 服务
八、技术栈
1. 核心依赖
OpenViking 的技术选型兼顾了开发效率和生产性能:
| Python | ||
| FastAPI | ||
| Uvicorn | ||
| pyagfs | ||
| LiteLLM | ||
| tree-sitter | ||
| pydantic |
LiteLLM 的作用:OpenViking 需要调用 LLM 生成 L0/L1 摘要和提取记忆。LiteLLM 提供统一接口,让开发者可以轻松切换不同的 LLM 提供商(如从 OpenAI 切换到 Claude),无需修改代码。
2. Rust CLI
除了 Python SDK,OpenViking 还提供了高性能的 Rust 命令行工具 ov,适合在终端中快速操作:
# 安装
curl -fsSL https://raw.githubusercontent.com/volcengine/OpenViking/main/crates/ov_cli/install.sh | bash
# 资源管理
ov add-resource ./my-project
ov export ./backup.tar.gz
# 文件系统操作
ov ls viking://resources/my-project/
ov tree viking://resources/
ov read viking://resources/my-project/README.md
# 语义搜索
ov find "数据库配置"
ov search "如何部署"
# 会话管理
ov session new
ov session commit --message "完成项目初始化"优势:
• 比 Python 更快的启动速度 • 适合 CI/CD 脚本集成 • 支持所有核心功能
九、VikingBot - Agent 应用层
VikingBot 是基于 Nanobot 框架构建的 AI 助手应用,深度集成 OpenViking 作为上下文管理后端。
Nanobot 是一个开源的 AI Agent 框架,提供了 Agent 开发的基础能力。VikingBot 在此基础上扩展,实现了完整的对话式 AI 助手。
1. 核心能力
| 多渠道接入 | |
| 沙箱执行 | |
| 定时任务 | |
| Web Console |
使用场景示例:
• 在 Telegram 中创建一个能记住用户偏好的聊天机器人 • 在飞书中部署一个能查询公司文档的智能助手 • 在钉钉中创建一个能自动处理工单的 Agent
2. Agent 社交网络
VikingBot 支持接入 Agent 社交网络,让 Agent 可以与其他 Agent 互动:
• Moltbook:一个 Agent 社区平台 • ClawdChat:支持 Agent 之间对话的平台
这种设计让 Agent 不仅能服务人类用户,还能与其他 Agent 协作完成任务。
十、实际应用效果
OpenViking 在实际项目中展现出显著的效果提升。以下是基于 OpenClaw Memory Plugin 的测试数据(使用 LoCoMo10 数据集):
LoCoMo10 数据集:一个用于评估长对话记忆能力的标准数据集,包含多轮对话和需要长期记忆才能完成的任务。
| OpenClaw + OpenViking | 52.08% | 4,264,396 |
数据分析:
• 任务完成率:集成 OpenViking 后,从 35.65% 提升到 52.08%,提升 46% • Token 消耗:从 24,611,530 降低到 4,264,396,降低 83% • 相比 LanceDB:OpenViking 不仅 Token 消耗更低(仅为 LanceDB 的 8%),任务完成率也更高
为什么有如此大的提升?
1. 三层加载:只加载真正需要的上下文,避免信息过载 2. 目录递归检索:找到更相关、更完整的上下文 3. 记忆提取:Agent 能记住历史经验,避免重复犯错
结论:OpenViking 能显著提升 Agent 的任务完成率,同时大幅降低 Token 成本。
十一、总结
OpenViking 通过文件系统范式重新定义了 AI Agent 的上下文管理方式,为构建具有长期记忆和持续学习能力的 Agent 提供了坚实的技术基础。
核心创新:
1. 统一抽象 - Viking URI 将所有上下文映射为虚拟文件系统 • 像管理文件一样管理上下文 • 统一的接口,降低学习成本 2. 渐进加载 - L0/L1/L2 三层结构平衡效率与完整性 • 先摘要后详情,避免信息过载 • Token 消耗降低 80% 以上 3. 智能检索 - 目录递归检索结合语义搜索提高准确性 • 先定位目录再精检 • 分数传播确保结构完整 4. 自我进化 - 会话自动提取记忆,Agent 越用越聪明 • 8 种记忆类型覆盖用户和 Agent • 自动去重和合并 5. 可观测性 - 完整追踪检索轨迹,便于调试优化 • 检索路径可视化 • 问题定位更容易
这是一个面向 AI Agent 时代的基础设施级项目,值得每一位 Agent 开发者深入了解和使用。