编程 字节开源 OpenViking:用文件系统范式管理 Agent 上下文,终结 token 焦虑

2026-09-12 09:48:42

字节开源 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的地方
火山引擎doubaoVolcengine Console
OpenAIgptOpenAI Platform
AnthropicclaudeAnthropic Console
DeepSeekdeepseekDeepSeek Platform
GooglegeminiGoogle AI Studio
月之暗面kimiMoonshot Platform
智谱AIglmBigModel
通义千问qwenDashScope Console
MiniMaxminimaxMiniMax 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:

https://github.com/volcengine/OpenViking

推荐文章

程序员茄子在线接单