字节开源 OpenViking:用文件系统范式管理 Agent 上下文,终结 token 焦虑
现在的 AI Agent 开发,真的是越来越卷了。
前有 OpenClaw 2天狂揽10万Star,后有港大开源的 ClawWork 让 AI 自己赚钱养活自己。
看起来 AI Agent 的赛道已经足够热闹,但有一个核心问题,却始终没有得到很好的解决:
上下文管理。
这不是什么新问题,但绝对是个让人头疼的大问题。当你的 Agent 需要长期运行,需要记住用户偏好、调用历史、处理复杂任务时,上下文就会像滚雪球一样越滚越大。
塞进去吧,token费用吓死人;截断吧,重要信息说丢就丢。
怎么办?传统RAG表示:我尽力了。
就在最近,字节跳动火山引擎(Volcengine) 低调开源了一个名为OpenViking的重磅项目。
一个专为 AI Agent 设计的上下文数据库,它把这个问题用了很好的处理思路给解决了。
这个项目没有走传统RAG的老路,而是用了一个非常巧妙的思路:文件系统范式。
目前已在 GitHub 收获2.9K收藏量!
一、项目背景
在说 OpenViking 之前,得先搞清楚传统方案到底哪里出了问题。
•碎片化:记忆写在代码里,资源存在向量数据库中,技能分散在各个模块。
•成本高:Agent运行久了,上下文越来越多。简单粗暴地截断或压缩?不好意思,重要信息全丢了。全部塞进去?抱歉,token费用了解一下。
•检索差:传统RAG用扁平存储,没有全局视图,想精准找到需要的上下文,比登天还难。
•黑盒子:整个检索链路完全不可观测,出了Bug你都不知道去哪找问题。
•不迭代:现有记忆只记录用户对话,根本没有Agent任务相关的记忆沉淀,用过就忘。
这些问题叠加在一起,AI Agent 的上下文管理简直就是一个"地狱级"副本。
而OpenViking的出现,就是为了打破这个困局。
二、项目简介
OpenViking是字节火山引擎开源的一款专为 AI Agent 设计的上下文数据库。
它的核心思路非常巧妙:用文件系统范式来管理上下文。
简单来说,就是让开发者像管理本地文件一样来管理Agent的:
•记忆(Memory)
•资源(Resources)
•技能(Skills)
不用再学习复杂的向量数据库操作,不用再去理解各种抽象概念。建文件夹、拖文件、搜索——一切都是那么熟悉,它有层级、有路径、有语义组织。
这就是OpenViking定义的"极简上下文交互范式"。
三、五大核心亮点
1、文件系统管理范式 → 终结碎片化
把记忆、资源、技能全部统一到一个虚拟文件系统里。
• 记忆可以存在不同的文件夹
• 资源文件就像你的Word、Excel
• 技能就是可执行的程序模块
• 同时支持目录层级结构,想怎么组织就怎么组织
2、分层上下文按需加载 → 大幅降低Token消耗
L0/L1/L2三层结构设计:
L0:最核心、最常用的信息,常驻内存。
L1:次重要的信息,按需加载。
L2:大量历史信息,用时再读取。
这种设计太重要了——以前不管有用没用,所有上下文都得塞进Prompt里,token成本蹭蹭涨。现在好了,真正需要的才加载,大幅节省了成本。
3、目录递归检索 → 精准定位上下文
传统RAG只会简单的语义匹配,OpenViking直接玩起了"目录定位+语义搜索"的组合拳:
• 目录路径定位
• 递归查找
• 语义融合
• 精准召回
这种方式既有文件系统的精准定位,又有语义搜索的灵活性,检索效果直接提升了好几个档次!
4、可视化检索轨迹 → 彻底告别黑盒子
这一点是很多 RAG 系统没有的。
OpenViking 支持可视化目录检索轨迹。
你可以看到:
• Agent 从哪个目录开始
• 递归进入了哪些子路径
• 为什么加载某个资源
• 检索链路如何展开
5、会话自动管理 → Agent越用越聪明
OpenViking 还做了一件更高级的事:自动压缩会话历史。
包括:对话内容、工具调用、资源引用、冗余信息。
并会提取长期记忆。
用过的知识、解决过的问题,自动沉淀下来。下次遇到类似场景,直接调取沉淀经验!
四、快速上手
第一步:OpenViking 安装
OpenViking 有两种安装方式,推荐用Python包安装:
pip install openviking
如果你想试试Rust CLI(可选),也可以这样装:
curl -fsSL https://raw.githubusercontent.com/volcengine/OpenViking/main/crates/ov_cli/install.sh | bash
第二步:模型准备
OpenViking需要两种模型能力:
•VLM模型:用于图像和内容理解
•Embedding模型:用于向量化和语义检索
好消息是,OpenViking支持超多模型提供商,你想用哪个就用哪个:
| 提供商 | 模型 | 获取API Key的地方 |
|---|---|---|
| 火山引擎 | doubao | Volcengine Console |
| OpenAI | gpt | OpenAI Platform |
| Anthropic | claude | Anthropic Console |
| DeepSeek | deepseek | DeepSeek Platform |
| gemini | Google AI Studio | |
| 月之暗面 | kimi | Moonshot Platform |
| 智谱AI | glm | BigModel |
| 通义千问 | qwen | DashScope Console |
| MiniMax | minimax | MiniMax Platform |
| OpenRouter | 任意模型 | OpenRouter |
| vLLM | 本地模型 | — |
| 最贴心的是,OpenViking用了Provider Registry来统一管理模型访问,系统会根据模型名字自动检测提供商,切换起来超级丝滑! |
第三步:配置模型
不同的提供商有不同的配置方式,需要创建配置文件 ~/.openviking/ov.conf。
{
"embedding": {
"dense": {
"api_base" : "<api-endpoint>", // API 服务端点地址
"api_key" : "<your-api-key>", // 模型服务的 API 密钥
"provider" : "<provider-type>", // 提供商类型(volcengine 或 openai)
"dimension": 1024, // 向量维度
"model" : "<model-name>" // Embedding 模型名称(如 doubao-embedding-vision-250615 或 text-embedding-3-large)
}
},
"vlm": {
"api_base" : "<api-endpoint>", // API 服务端点地址
"api_key" : "<your-api-key>", // 模型服务的 API 密钥
"provider" : "<provider-type>", // 提供商类型(volcengine 或 openai)
"model" : "<model-name>" // VLM 模型名称(如 doubao-seed-1-8-251228 或 gpt-4-vision-preview)
}
}
给大家举几个常用的例子:
火山引擎(豆包)配置:
{
"embedding": {
"dense": {
"api_base" : "https://ark.cn-beijing.volces.com/api/v3",
"api_key" : "your-volcengine-api-key",
"provider" : "volcengine",
"dimension": 1024,
"model" : "doubao-embedding-vision-250615"
}
},
"vlm": {
"api_base" : "https://ark.cn-beijing.volces.com/api/v3",
"api_key" : "your-volcengine-api-key",
"provider" : "volcengine",
"model" : "doubao-seed-1-8-251228"
}
}
如果你想用本地模型也没问题,通过vLLM就能跑:
# 启动vLLM服务器
vllm serve meta-llama/Llama-3.1-8B-Instruct --port 8000
然后这样配置:
{
"vlm": {
"provider": "vllm",
"model": "meta-llama/Llama-3.1-8B-Instruct",
"api_base": "http://localhost:8000/v1"
}
}
第四步:开始使用
创建示例脚本example.py:
import openviking as ov
# Initialize OpenViking client with data directory
client = ov.SyncOpenViking(path="./data")
try:
# Initialize the client
client.initialize()
# Add resource (supports URL, file, or directory)
add_result = client.add_resource(
path="https://raw.githubusercontent.com/volcengine/OpenViking/refs/heads/main/README.md"
)
root_uri = add_result['root_uri']
# Explore the resource tree structure
ls_result = client.ls(root_uri)
print(f"Directory structure:\n{ls_result}\n")
# Use glob to find markdown files
glob_result = client.glob(pattern="**/*.md", uri=root_uri)
if glob_result['matches']:
content = client.read(glob_result['matches'][0])
print(f"Content preview: {content[:200]}...\n")
# Wait for semantic processing to complete
print("Wait for semantic processing...")
client.wait_processed()
# Get abstract and overview of the resource
abstract = client.abstract(root_uri)
overview = client.overview(root_uri)
print(f"Abstract:\n{abstract}\n\nOverview:\n{overview}\n")
# Perform semantic search
results = client.find("what is openviking", target_uri=root_uri)
print("Search results:")
for r in results.resources:
print(f" {r.uri} (score: {r.score:.4f})")
# Close the client
client.close()
except Exception as e:
print(f"Error: {e}")
然后运行脚本:
python example.py
看到如下输出,就说明运行成功了!
Directory structure:
...
Content preview: ...
Wait for semantic processing...
Abstract:
...
Overview:
...
Search results:
viking://resources/... (score: 0.8523)
...
当然如果嫌本地麻烦,火山引擎也提供了云端部署方式,将 OpenViking 作为独立 HTTP 服务运行,以便为你的 AI Agent 提供持久化、高性能的上下文支持。
详细部署方式可参考这个文档:https://github.com/volcengine/OpenViking/blob/main/docs/zh/getting-started/03-quickstart-server.md
五、写在最后
OpenViking这个项目真的很有创意,它用一个大家最熟悉的文件系统范式,就把AI Agent上下文管理的所有痛点都解决了。
就像当年 Linux 用一切皆文件的理念改变了操作系统一样,OpenViking 用一切皆文件的理念重新定义了 AI Agent 的上下文管理。
如果你正在做 AI Agent 开发,或者被上下文管理的问题搞得头疼,OpenViking 非常值得体验!
GitHub: