2026 年 1 月,字节跳动旗下火山引擎 Viking 团队在 GitHub 上开源了一个项目——OpenViking。它不是又一个向量数据库,也不是 RAG 框架的改良版。它给自己的定位是:专为 AI Agent 设计的上下文数据库(Context Database)。
这个定位本身就值得拆解。上下文数据库是什么?它解决了什么 RAG 没有解决的问题?凭什么用"文件系统"来管理 Agent 的大脑?

这篇文章试图回答这些问题。
背景:Agent 的"金鱼记忆"困境
做过 Agent 开发的人都知道一个尴尬的事实:模型越来越强,上下文窗口从 4K 涨到 128K 甚至更长,但 Agent 的记忆管理依然是个烂摊子。
具体来说,痛点集中在五个方面。
碎片化。 用户偏好写在代码里,项目文档切片后塞进向量库,Agent 的技能指令散落在各种配置文件中。这些上下文之间没有统一的组织方式,关联查询几乎不可能。你有一个装满文件的房间,但没有文件柜——找任何东西都需要翻遍整间房子。
Token 成本失控。 Agent 处理长程任务时,对话历史、工具调用记录、中间结果持续累积。把所有上下文塞进 Prompt,费用惊人;截断或压缩,关键信息可能恰好在被丢弃的那一段里。这种两难没有好的出路。
检索效果差。 传统 RAG 把文档切片后存入向量数据库,靠语义相似度召回。这种扁平式的存储方式在面对简单查询时还行,但遇到复杂意图——比如"API 认证模块的实现架构是怎样的"——就力不从心了。它缺乏全局视野,不理解信息片段在完整文档结构中的位置。
黑箱问题。 Agent 给了一个不靠谱的回答,问题出在哪?检索没找到正确文档?找到了但排序不对?上下文组装出错?传统 RAG 的检索链路几乎不透明,排查问题像大海捞针。
记忆不会成长。 Agent 的"记忆"只是用户对话的被动记录。执行任务中积累的经验、踩过的坑、摸索出的技巧,没有被有效沉淀。每次遇到类似问题,Agent 都从零开始。
这五个痛点叠加在一起,构成了 Agent 开发中最顽固的工程瓶颈。OpenViking 的出发点就是系统性地解决它们。

OpenViking 的核心思路:一切上下文皆文件
如果你用过 Linux,一定熟悉"一切皆文件"这个经典哲学——硬盘是文件,网卡是文件,进程信息也是文件。这个看似简单的抽象,统一了 Unix 世界的资源管理方式。
OpenViking 把同样的思路搬到了 Agent 的上下文管理领域。
它摒弃了传统 RAG 的碎片化向量存储,采用文件系统范式:所有上下文——记忆、资源、技能——被统一组织在一个虚拟文件系统中,每个条目通过 viking:// 协议拥有唯一的 URI。
看一下它的目录结构就能直观理解:
viking://
├── resources/ # 资源:项目文档、代码库、网页等
│ ├── my_project/
│ │ ├── docs/
│ │ │ ├── api/
│ │ │ └── tutorials/
│ │ └── src/
│ └── ...
├── user/ # 用户:个人偏好、习惯等
│ └── memories/
│ ├── preferences/
│ │ ├── 写作风格
│ │ └── 编程习惯
│ └── ...
└── agent/ # Agent:技能、指令、任务记忆等
├── skills/
│ ├── search_code
│ ├── analyze_data
│ └── ...
├── memories/
└── instructions/
三个顶层目录——resources/(外部资源)、user/(用户记忆)、agent/(Agent 自身的技能和经验)——覆盖了 Agent 运行所需的全部上下文类型。
选择文件系统范式不是偶然的。它有几个天然优势:
- 开发者零学习成本。
ls、find、read是每个程序员每天都在用的操作。不需要学向量数据库的查询语法。 - 天然的层级结构。 文件系统本身就是树形的,信息的层次关系可以直接映射。
- 操作语义明确可追溯。 每个操作的含义没有歧义,整个检索链路天然透明。
- LLM 天然理解。 大语言模型的训练数据中有海量的文件系统操作相关内容。Agent 用
ls和find来管理自己的上下文,非常自然。
更深层的好处是:文件系统天然适配"渐进式"信息获取。你可以先看文件夹名字,再打开看里面有什么,再选择性地打开某个文件——从粗到细,逐步深入。这恰好和大语言模型的最佳使用方式一致。

五大核心机制:逐一拆解
OpenViking 围绕五个核心机制来解决前面提到的五大痛点。
机制一:虚拟文件系统——解决碎片化
所有类型的上下文被统一抽象到一个虚拟文件系统中。不再是记忆放一处、资源放一处、技能放一处的散乱状态。每个条目对应唯一 URI,Agent 可以像开发者一样通过标准文件操作指令来定位和操作信息。
这个设计对 Agent 本身非常友好。Agent 可以执行"列出用户偏好记忆目录"来获取用户画像,或者"在技能目录下搜索数据分析相关的技能"来为当前任务选择工具。人和 Agent 用同一套操作语义,系统设计复杂度大幅下降。
从工程角度看,虚拟文件系统还天然支持权限控制和作用域隔离。不同用户各自有独立的 memories/ 目录,不同 Agent 实例有独立的技能目录,同时可以共享 resources/ 下的公共资源。多租户和多 Agent 协作场景下,这一点非常关键。
机制二:L0/L1/L2 三层上下文——降低 Token 消耗
这是 OpenViking 在成本控制方面最精妙的设计。
传统做法是把所有可能相关的上下文一股脑塞进 Prompt。OpenViking 借鉴了计算机图形学中 LOD(Level of Detail)的思想和 CPU 缓存层次的设计,在资源写入时就自动处理为三个层级:
- L0(摘要 / Abstract):约 100 个 Token。一句话概括内容,用于快速筛选相关性。相当于书名加一句话简介。
- L1(概述 / Overview):约 2000 个 Token。包含核心信息、结构要点和使用场景,供 Agent 在规划阶段决策。相当于书的目录和内容提要。
- L2(详情 / Details):完整原始数据,只在 Agent 确认需要深入阅读时才加载。就是完整正文。
在虚拟文件系统中,每个目录都有自己的 .abstract 和 .overview 文件:
viking://resources/my_project/
├── .abstract # L0 层(~100 tokens)
├── .overview # L1 层(~2k tokens)
├── docs/
│ ├── .abstract
│ ├── .overview
│ ├── api/
│ │ ├── .abstract
│ │ ├── .overview
│ │ ├── auth.md # L2 层:完整内容
│ │ └── endpoints.md
│ └── ...
└── src/
└── ...
举个例子。用户问"API 的认证方式有哪些?"
传统方案:把整个项目文档加载进来(几万甚至十几万 Token),让模型从中找答案。
OpenViking 方案:
1. 读取项目根目录的 L0 摘要(~100 Token),确认包含 API 文档
2. 读取 docs/ 目录的 L1 概述(~2000 Token),发现有 api/ 子目录
3. 读取 api/ 目录的 L1 概述,发现 auth.md 与认证相关
4. 只加载 auth.md 的 L2 全文
整个过程消耗的 Token 可能是传统方案的十分之一甚至更少。对于"大资源库 + 精确查询"的场景,效果尤为突出。
一个容易被忽视的细节:L0 和 L1 是在资源写入时异步生成的,不是查询时实时计算。OpenViking 用 VLM 模型理解原始内容并生成分层摘要,这个过程在 add_resource 后自动完成。查询时直接享受分层加载的性能优势,没有额外延迟。

机制三:目录递归检索——提升检索效果
传统 RAG 依赖向量相似度做语义匹配。遇到复杂查询意图,一次检索很难命中。
OpenViking 设计了一套"目录递归检索策略",融合目录结构定位与语义搜索:
第一步,意图分析。 对查询进行意图解析,生成多个检索条件。比如"怎么用 OAuth 2.0 做 API 认证"会被拆解为"OAuth 2.0"、"API 认证"、"授权流程"等检索维度。
第二步,初始定位。 用向量检索在全局范围内快速锁定得分最高的目录——确定答案最可能存在于哪个区域。
第三步,精细探索。 在高分目录内做二次检索,更新候选集合。
第四步,递归下探。 如果目录下还有子目录,继续向下逐层递归,重复二次检索。
第五步,结果汇总。 从所有候选中筛选出最相关的上下文返回。
用伪代码描述:
def recursive_retrieve(query, directory):
# 在当前目录下做语义检索
local_results = semantic_search(query, directory)
candidates.update(local_results)
# 获取子目录并评分
subdirs = get_subdirectories(directory)
scored_dirs = score_directories(query, subdirs)
# 对高分子目录递归深入
for subdir in scored_dirs.top_k():
recursive_retrieve(query, subdir)
return candidates.get_top_results()
传统 RAG 像在图书馆里用关键词随机翻书。OpenViking 的目录递归检索像先找到正确的书架、再找到正确的书、最后翻到正确的章节——效率和准确度完全不在一个层面。
这种检索还有一个被低估的优势:上下文感知。传统向量检索返回的是孤立的文本片段——你不知道它来自哪篇文档的哪个章节。但在目录递归检索中,每个结果都带完整的路径信息。Agent 不仅知道"找到了什么",还知道"这个东西在哪个目录下、旁边还有哪些相关文件"。这对 Agent 做出更准确的判断至关重要。

机制四:可视化检索轨迹——让黑箱变白箱
这是现有 RAG 系统最缺失的能力。
由于 OpenViking 的所有上下文都以统一格式存储、每个条目对应唯一 URI,整个检索过程天然可追溯。你可以清楚看到:
- Agent 从哪个目录开始搜索
- 递归进入了哪些子路径
- 每个路径的相关性得分是多少
- 为什么最终选择加载了特定资源
- 整个检索链路如何一步步展开
传统 RAG 的调优最让人头疼的不是"怎么搭",而是"搭好之后怎么调"。你知道检索结果不好,但不知道问题在哪——切片策略不合理?Embedding 模型效果差?Top-K 设太小?这种"盲调"极其低效。
OpenViking 的可视化轨迹把检索过程完全"白箱化"了。你能看到系统的每一步决策逻辑:为什么认为这个目录得分高,进入后发现了什么,最终为什么返回了这些结果。就像一个图书管理员帮你找书时,会说"我先去了二楼的计算机科学区,在编程语言书架上找到了这三本可能相关的书"——你不只得到结果,还理解了寻找过程。
这对团队协作的价值也很大。某个成员优化了检索效果后,可以通过可视化轨迹清楚地向其他人解释做了什么改动、为什么这么改。比在黑箱里反复试错靠谱得多。
机制五:会话自动管理与记忆自迭代——Agent 越用越聪明
传统方案中,Agent 的记忆是对话历史的被动记录。OpenViking 在这基础上做了两件更高级的事。
会话内容的智能压缩。 长会话中大量对话、工具调用记录、资源引用不断累积。OpenViking 内置自动压缩机制,在保留核心信息的前提下减少冗余,避免上下文窗口被无关信息占满。
长期记忆的自动沉淀。 每次会话结束时,开发者可以调用 session.commit() 触发记忆提取。系统异步分析任务执行结果和用户反馈,自动更新到 user/ 和 agent/ 的记忆目录。
这个过程覆盖两个维度:
- 用户偏好记忆:用户多次表现出偏好简洁回答的风格,系统自动将偏好沉淀为记忆。后续回答自动贴合用户习惯。
- 任务经验记忆:Agent 执行任务中积累的操作技巧、工具经验、解决策略,自动提取存储。下次遇到类似场景,直接调取"实战经验"辅助决策。
技术上,这个机制是异步非侵入式的。session.commit() 后记忆提取在后台进行,不阻塞正常运行。提取出的记忆以标准文件形式存储,和其他上下文享有一致的管理方式——你可以查看、编辑、甚至删除自动生成的记忆。如果 Agent 学到了"错误经验",手动纠正就行。
值得注意的是"用户记忆"和"Agent 记忆"的分离设计。用户记忆侧重"这个用户是什么样的人",属于个性化基础;Agent 记忆侧重"执行任务应该怎么做更高效",属于能力进化基础。在多用户场景下,不同用户有各自的偏好记忆,Agent 的任务经验则可跨用户共享。
OpenViking vs 传统 RAG:一场范式级别的差异
OpenViking 和传统 RAG 的区别不是"改良",而是"范式转换"。把它们放在一起对比,差异非常直观。
存储模型:扁平 vs 层次
传统 RAG 的存储模型是扁平的。文档被切成固定大小的 chunk,每个 chunk 转成向量存入数据库。chunk 之间没有层级关系,也没有上下游联系。一篇文档的第三章第二节和第五章第一节,在向量空间里只是两个独立的点。
OpenViking 的存储是层次化的虚拟文件系统。文档的结构、章节之间的关系、不同资源类型之间的归属关系,都通过目录层级显式表达。信息有位置,有邻居,有上下文。
实际影响:当 Agent 需要回答"这个项目的 API 认证模块和错误处理模块是什么关系"时,传统 RAG 只能分别检索两个 chunk 然后拼凑。OpenViking 可以直接从目录结构看到它们在同一个 api/ 目录下,一目了然。
检索机制:单次匹配 vs 递归探索
传统 RAG 做一次向量相似度计算,取 Top-K 个最相似的 chunk。检索深度为一层。
OpenViking 用目录递归检索:先意图分析,再全局定位高分目录,然后层层下探精细搜索。检索深度是多层的,可以根据信息结构自适应。
实际影响:复杂查询的召回率差异巨大。一个多维度的查询(比如"项目中用了哪些认证方案,各自的安全性和性能特点是什么"),传统 RAG 很可能只召回部分相关内容。OpenViking 通过递归搜索,能覆盖更完整的相关上下文。
Token 效率:全量加载 vs 分层按需
传统 RAG 检索到的 chunk 直接塞进 Prompt。chunk 大小是预设的,不管这次查询需要的信息密度如何。
OpenViking 的 L0/L1/L2 三层结构让 Agent 先用最少的 Token(L0 摘要)快速判断相关性,确认后读取 L1 概述了解结构,最后只对必要部分加载 L2 全文。
实际影响:在"大资源库 + 精确查询"场景下,Token 消耗可以降到传统方案的十分之一。对于按 Token 计费的场景,这直接影响运营成本。
可观测性:黑箱 vs 白箱
传统 RAG 的检索过程是隐式的。你只看到最终返回的 chunk,不知道中间经历了什么。
OpenViking 的每一步检索都有完整轨迹:从哪个目录开始、进入了哪些路径、各自得分多少、为什么选择了最终结果。
实际影响:调试效率的天壤之别。传统 RAG 出了问题是"盲调"——反复调参看效果。OpenViking 可以精确定位问题环节:是初始定位偏了,还是递归过程中错过了关键子目录,还是排序逻辑有问题。
记忆进化:静态 vs 自迭代
传统 RAG 的知识库是静态的。文档入库后,除非人工更新,内容不会变化。Agent 本身没有"学习"能力。
OpenViking 内置记忆自迭代闭环。每次会话结束后,系统自动提取有价值的信息更新到记忆目录。Agent 的用户偏好理解越来越准,任务执行经验越来越丰富。
实际影响:随着使用时间增长,Agent 的表现会持续改善。传统 RAG 的 Agent 第一天和第一百天的表现基本一致。
对比总结
维度
传统 RAG
OpenViking
存储模型
扁平向量存储
层次化虚拟文件系统
检索机制
单次语义匹配
目录递归精细搜索
Token 效率
chunk 直接填充
L0/L1/L2 分层按需加载
可观测性
黑箱
完整检索轨迹可视化
记忆进化
静态知识库
自动沉淀 + 自迭代
上下文类型
仅资源/文档
记忆 + 资源 + 技能统一管理
开发者体验
需学向量查询语法
文件系统操作,零学习成本
公平地说,传统 RAG 在简单查询场景下依然够用。如果你的应用只需要对一批文档做简单的问答,标准 RAG 方案仍然是最轻量的选择。但一旦 Agent 需要处理复杂的长程任务、管理多种类型的上下文、具备持续学习能力,OpenViking 提供的体系化方案就有了明确的价值。
技术架构与实现细节
从项目源码结构可以看出 OpenViking 的工程化程度:
OpenViking/
├── openviking/ # 核心源代码
│ ├── core/ # 客户端、引擎、文件系统核心
│ ├── models/ # VLM 和 Embedding 模型封装
│ ├── parse/ # 资源解析、文件检测、OVPack 格式
│ ├── retrieve/ # 语义检索、目录递归检索
│ ├── storage/ # 向量数据库、文件系统队列
│ ├── session/ # 对话历史、记忆提取
│ ├── message/ # 消息格式化
│ ├── prompts/ # 提示词模板
│ ├── utils/ # 配置管理、工具函数
│ └── bin/ # 命令行工具
├── src/ # C++ 扩展模块(高性能索引和存储)
├── crates/ # Rust CLI
├── tests/ # 测试用例(含集成测试)
└── docs/ # 中英文文档
几个值得关注的实现细节:
模型灵活性。 OpenViking 设计了 Provider Registry 机制,统一管理不同模型服务商的访问。系统根据模型名称自动检测服务商,支持火山引擎(豆包)、OpenAI、Anthropic(Claude)、DeepSeek、Gemini、Moonshot(Kimi)、智谱(GLM)、通义千问、MiniMax、OpenRouter 等十余种,甚至支持通过 vLLM 使用本地模型。切换服务商只需改配置文件中的模型名称。
性能优化。 src/ 目录下有 C++ 编写的高性能索引和存储扩展模块。纯 Python 实现不够的地方用 C++ 补齐性能,这在开源项目中不常见,说明团队对生产环境的性能有认真考量。同时提供了 Rust 编写的 CLI 工具,适合对性能敏感的场景。
依赖精简。 核心只需要两种模型能力:VLM(用于内容理解和摘要生成)和 Embedding(用于向量化和语义检索)。安装 pip install openviking,配置好 API Key 就能跑。
部署灵活。 既可以作为 Python 库嵌入应用,也可以作为独立 HTTP 服务部署。生产环境推荐后者,能为多个 Agent 提供持久化、高性能的上下文支持。
快速上手体验
实际跑一遍 OpenViking 的代码,可以直观感受它的 API 设计:
import openviking as ov
# 初始化客户端
client = ov.SyncOpenViking(path="./data")
client.initialize()
# 添加资源(支持 URL、本地文件、目录)
add_result = client.add_resource(
path="https://raw.githubusercontent.com/volcengine/OpenViking/main/README.md"
)
root_uri = add_result['root_uri']
# 浏览目录结构
ls_result = client.ls(root_uri)
# 等待语义处理完成(L0/L1 摘要异步生成)
client.wait_processed()
# 获取摘要和概述
abstract = client.abstract(root_uri) # L0
overview = client.overview(root_uri) # L1
# 语义搜索(目录递归检索)
results = client.find("what is openviking", target_uri=root_uri)
for r in results.resources:
print(f" {r.uri} (score: {r.score:.4f})")
client.close()
API 风格非常文件系统:ls 列目录,find 搜索,read 读文件,abstract 和 overview 获取分层摘要。开发者不需要学习新概念。
Viking 团队的技术积累
OpenViking 不是从零冒出来的项目。火山引擎 Viking 团队在非结构化信息处理和智能检索领域有长期积累:
- 2019 年:VikingDB 向量数据库支撑字节内部全业务大规模使用
- 2023 年:VikingDB 在火山引擎公有云商业化
- 2024 年:推出 VikingDB 向量数据库、Viking 知识库、Viking 记忆库三大产品
- 2025 年:打造 AI 搜索、vaka 知识助手等上层应用;同年 10 月开源 MineContext(主动式 AI 上下文感知工具)
- 2026 年 1 月:开源 OpenViking,为 AI Agent 提供底层上下文数据库支撑
从 VikingDB 到 OpenViking,这个团队的技术路线很清晰:先把向量数据库做扎实,再基于多年实战经验向上构建更高层的上下文管理抽象。OpenViking 的设计不是学术论文里的概念验证,而是从大规模商业化实践中长出来的。
MineContext 和 OpenViking 的关系也值得一提。MineContext 聚焦于主动式上下文感知——捕获用户屏幕、操作行为等信息。OpenViking 则是底层的上下文存储和检索引擎。两者搭配使用,可以构成完整的 Agent 上下文基础设施:MineContext 负责"感知世界",OpenViking 负责"组织和记忆世界"。
上下文工程的行业趋势
OpenViking 的出现并非孤立事件。2025 年以来,"上下文工程(Context Engineering)"正在成为 AI 工程领域的热门话题。
Manus 团队提出"文件系统是上下文的终极形态"。Anthropic 的 Claude Code 产品验证了"文件系统 + Bash 命令"这种简洁方案在编码场景下甚至能超越复杂向量索引。Anthropic 的 Skills 系统也在用文件夹来组织能力模块。OpenClaw 等 Agent 框架通过 MEMORY.md、SOUL.md 等文件来管理 Agent 的记忆和人格。
这些实践指向同一个方向:文件系统是组织上下文的天然且高效的方式。
但行业缺一个关键角色——类似"数据库"的工具,能以文件系统的方式系统性地管理 Agent 所需的全部上下文。RAG 解决了"检索外部知识"的问题,但它的扁平向量存储模型无法承载复杂的上下文管理需求。
OpenViking 填补的正是这个空白。
从更大的视角看,AI Agent 的发展正在经历一个从"模型能力竞赛"到"工程基础设施竞赛"的转折点。模型越来越强,但 Agent 的实际表现越来越取决于上下文管理、工具编排、记忆系统等基础设施的成熟度。OpenViking 选择了一个正确的时间窗口切入。
冷静看几个问题
作为技术分析,有必要指出 OpenViking 目前面临的一些挑战和局限。
项目成熟度。 OpenViking 是 2026 年 1 月才开源的,目前仍处于早期阶段。API 可能存在变动,文档可能存在不完善的地方,生产环境的大规模验证案例还不多。对于想要在生产中使用的团队,建议从非核心场景开始试水。
VLM 依赖。 L0/L1 的分层摘要生成依赖 VLM 模型,这意味着资源写入时有额外的模型调用成本。对于需要频繁大量写入资源的场景,这个成本需要评估。好在这是一次性的——写入后的查询不再产生摘要成本。
与现有 RAG 生态的兼容。 很多团队已经投入了大量精力构建 RAG 管道。OpenViking 的范式转换意味着需要重新设计上下文管理架构。迁移成本是采用决策中需要考量的因素。
检索延迟。 目录递归检索比传统的单次向量检索在理论上有更高的延迟——毕竟要多次检索和递归。在对延迟敏感的实时场景中,需要关注实际性能表现。C++ 扩展和 Rust CLI 的存在说明团队在这方面有优化意识。
社区和生态。 开源项目的长期成功取决于社区活跃度。OpenViking 背靠字节跳动有资源保障,但能否吸引足够多的第三方开发者参与和贡献,还需要时间验证。
适用场景判断
根据 OpenViking 的特性,我对它的适用场景做一个判断:
非常适合的场景:
- 复杂的长程 Agent 任务(需要跨多轮对话管理大量上下文)
- 多类型上下文统一管理(同时需要处理文档、用户偏好、Agent 技能)
- 对可观测性有要求的生产环境(需要调试和优化检索效果)
- 需要 Agent 具备"学习"能力的产品(记忆自迭代)
- Token 成本敏感的场景(大资源库 + 精确查询)
可能不需要的场景:
- 简单的文档问答(标准 RAG 就够了)
- 上下文类型单一(只有文档检索,不涉及记忆和技能管理)
- 对延迟极其敏感的实时场景(递归检索可能带来额外延迟)
- 已有成熟 RAG 管道且运行良好的团队(迁移成本需要评估)
我的看法
OpenViking 做了一件有意义的事:它没有在 RAG 的框架内修修补补,而是提出了一个新的范式。文件系统管理范式、分层上下文加载、目录递归检索、可视化检索轨迹、记忆自迭代——这五个机制组合在一起,构成了一套完整的 Agent 上下文管理方案。
从我自己的 Agent 开发实践来看,上下文管理确实是最令人头疼的工程问题。模型能力飞速增长,但 Agent 的实际表现经常被上下文管理的短板拖后腿。OpenViking 提供的思路——用文件系统范式统一管理所有上下文——在逻辑上是自洽的,在工程上是务实的。
它是否会成为 Agent 上下文管理的标准答案?现在下结论太早。但它至少提出了一个值得认真对待的方向。
相关链接:
- GitHub 仓库
- 官方网站
- 文档
- Discord 社区
- 开源协议:Apache License 2.0