字节 OpenViking 深度剖析:AI Agent 的“第二大脑”与上下文革命

1. 项目定位与核心理念

OpenViking [1] 是一个专为 AI Agent 设计的上下文数据库,由字节跳动开源。它解决的是 AI Agent 开发中普遍存在的上下文管理难题。

什么是 AI Agent? AI Agent(人工智能智能体)是一种能够自主感知环境、做出决策并执行行动的 AI 系统。与传统的问答式 AI 不同,Agent 可以完成多步骤任务、调用外部工具、记住用户偏好,实现更复杂的自动化场景。 什么是上下文? 上下文是 Agent 在执行任务时所需要的信息总和,包括:用户的历史对话、项目文档、代码仓库、Agent 之前学到的经验等。就像人类工作时需要查阅笔记和资料一样,Agent 也需要上下文来理解任务背景。

1.1 AI Agent 开发痛点

在 AI 时代,数据虽然丰富,但高质量的上下文却难以获取。开发 AI Agent 时,开发者常面临以下挑战:

痛点 问题描述
上下文碎片化 记忆在代码里、资源在向量库、技能散落各处,难以统一管理
Token 消耗激增 Agent 长任务运行每次执行都产生上下文,简单截断会导致信息丢失
检索效果差 传统 RAG 使用扁平存储,缺乏全局视角,难以理解信息全貌
上下文不可观测 传统 RAG 的隐式检索链像黑盒,出错时难以调试
记忆无法迭代 当前记忆只是用户交互记录,缺乏 Agent 任务记忆

痛点详解

  • 上下文碎片化:传统方案中,Memory(记忆)、Resource(资源)、Skill(技能)分别存储在不同系统。例如,用户的偏好可能存在数据库中,项目文档在向量数据库中,而 Agent 的技能定义写在代码里。Agent 执行任务时需要跨多个数据源获取上下文,增加了系统复杂度和维护成本。

  • Token 消耗激增:大语言模型(LLM)对单次输入的 Token 数量有限制(如 GPT-4 约 128K tokens)。长对话场景下,简单截断会丢失关键信息,全量传递又会超出窗口限制并产生高昂成本,传统方案难以平衡。

  • 检索效果差:传统 RAG(检索增强生成)使用扁平化的向量检索,只能返回语义相似的片段,缺乏对上下文全局结构的理解。就像在一本没有目录的书中只能通过关键词搜索,难以理解信息的完整脉络。

  • 上下文不可观测:当 Agent 行为异常时(如给出了错误的答案),开发者无法追踪哪些上下文被检索、为何被检索。传统 RAG 的检索过程像黑盒,调试困难。

  • 记忆无法迭代:Agent 无法从历史任务中学习经验,每次都从零开始。例如,Agent 上次成功解决了某个技术问题,但下次遇到类似问题时却无法复用之前的解决方案。

1.2 OpenViking 解决方案

OpenViking 采用 “文件系统范式” 统一组织 Agent 所需的上下文,针对上述痛点提供系统性解决方案:

什么是文件系统范式? 就像电脑上的文件系统用统一的路径(如 /Users/Documents/report.pdf)管理所有文件一样,OpenViking 用 viking:// 协议统一管理 Agent 的所有上下文。这种设计让开发者可以像操作文件一样操作上下文,直观且易于理解。

痛点 解决方案 核心价值
上下文碎片化 文件系统范式 - 统一管理 Memory、Resource、Skill 告别碎片化,统一上下文管理
Token 消耗激增 三层上下文结构 - L0/L1/L2 按需加载 渐进式加载,显著降低 Token 消耗
检索效果差 目录递归检索 - 结合语义搜索与目录定位 先定位目录再精检,提高检索准确性
上下文不可观测 可视化检索轨迹 - 完整追踪检索链路 检索路径可追踪,便于调试优化
记忆无法迭代 自动会话管理 - 从交互中提取长期记忆 Agent 越用越聪明,实现自我进化

1.3 适用场景

OpenViking 适用于需要长短期记忆、复杂上下文管理和高精度检索的 AI Agent 场景:

  • 企业知识库助手:管理海量文档,支持多部门、多项目的权限隔离,精准回答专业问题。
  • 代码助手 / 开发工具:解析代码仓库结构(AST),理解函数调用关系,辅助代码生成与重构。
  • 客户服务机器人:记住用户历史偏好(如语言、语气、常用业务),提供个性化服务,避免重复询问。
  • 个人 AI 助手:记录个人生活琐事、日程安排和重要信息,成为真正的“第二大脑”。
  • 多 Agent 协作系统:作为共享的上下文存储,支持不同 Agent 之间的信息交换与协作记忆。

1.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)

2. 系统架构

OpenViking 采用分层架构设计,从上到下分为 Client 层、Service 层、核心功能层和存储层,各层职责清晰,便于扩展和维护。

2.1 整体架构图

┌─────────────────────────────────────────────────────────────┐
│                    OpenViking 系统架构                       │
├─────────────────────────────────────────────────────────────┤
│                         Client 层                           │
│     Python SDK (Sync/Async)  │  Rust CLI  │  HTTP Client    │
├─────────────────────────────────────────────────────────────┤
│                        Service 层                           │
│FSService │ SearchService │ SessionService │ ResourceService │
├─────────────────────────────────────────────────────────────┤
│                        核心功能层                             │
│   Retrieve   │    Session    │    Parse    │   Compressor   │
│  (上下文检索) │   (会话管理)   │  (上下文提取) │   (记忆压缩)     │
├─────────────────────────────────────────────────────────────┤
│                        存储层                                │
│           AGFS (文件内容)  +  向量库 (索引)                    │
└─────────────────────────────────────────────────────────────┘

2.2 核心模块职责

模块 核心职责 关键组件 说明
Client 统一入口 SyncOpenViking、AsyncOpenViking、HTTPClient 提供同步/异步 Python SDK、HTTP 客户端,支持不同使用场景
Service 业务逻辑 FSService、SearchService、SessionService、RelationService、PackService、DebugService 封装核心业务逻辑,提供文件系统、搜索、会话、关系等高层服务
Retrieve 上下文检索 HierarchicalRetriever、IntentAnalyzer 实现目录递归检索,先通过意图分析定位相关目录,再进行语义精检
Session 会话管理 Session、Compressor、MemoryExtractor 管理对话会话,自动压缩历史内容,提取用户偏好和 Agent 经验作为长期记忆
Parse 上下文提取 Parser Registry、TreeBuilder、SemanticQueue 解析各种格式文档(Markdown/PDF/代码等),提取结构化信息并生成向量化索引
Storage 存储层 VikingFS、VectorIndex、AGFS、TransactionManager 双层存储架构,AGFS 存内容,向量库存索引,事务机制保证数据一致性

3. 核心概念详解

本章将详细解析 OpenViking 的三大核心概念:统一资源标识、三层上下文结构以及上下文类型划分,帮助大家理解其底层设计思想。

3.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 空间下)

3.2 三层上下文结构 (L0/L1/L2)

OpenViking 创新性地采用三层上下文结构,实现渐进式加载,在保证信息完整性的同时显著降低 Token 消耗。

为什么需要三层? 想象我们需要了解一本书:L0 相当于书名和目录标题(快速判断是否相关),L1 相当于章节摘要(了解大概内容),L2 相当于完整正文(深入阅读)。大家不会一上来就读整本书,而是先看目录,再选感兴趣的章节精读。

层级 名称 Token 限制 用途 生成方式
L0 摘要 ~100 tokens 向量搜索、快速过滤 LLM 自动生成
L1 概览 ~2k tokens Rerank 精排、内容导航 LLM 自动生成
L2 详情 无限制 完整内容、按需加载 原始文件内容

加载策略

  1. 先用 L0 进行向量搜索,找到相关目录
  2. 用 L1 进行精排,确定最相关的内容
  3. 仅加载需要的 L2 完整内容

效果:相比传统全量加载,Token 消耗可降低 80% 以上。

3.3 三种上下文类型

OpenViking 将上下文分为三种类型,每种类型有不同的生命周期和用途:

类型 用途 生命周期 存储位置 示例
Resource 外部知识(文档、代码) 长期静态 viking://resources/ 项目文档、代码仓库、网页
Memory Agent 认知(用户偏好、学习经验) 长期动态 viking://user/.../memories/, viking://agent/.../memories/ 用户偏好、成功案例
Skill 可调用能力 长期静态 viking://agent/.../skills/ 代码审查、文档生成

Memory vs Resource 的区别

  • Resource:外部导入的知识,如项目文档、代码仓库,由开发者主动添加
  • Memory:Agent 在交互过程中自动学习和积累的认知,如用户说”我喜欢简洁的代码风格”,Agent 会记住这个偏好

4. 核心技术机制

本章将深入探讨 OpenViking 的关键技术机制,包括创新的检索策略、智能记忆提取以及高效的文档解析流水线。

4.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 个候选起始目录
    • 从多个可能相关的位置开始检索,提高召回率

4.2 记忆提取机制

当用户与 Agent 完成一次对话后,OpenViking 会自动从对话中提取有价值的记忆,让 Agent “记住” 重要的信息。

为什么需要记忆提取? 人类会记住重要的对话内容,Agent 也应该如此。例如,用户说 “我是一名 Python 开发者”,Agent 应该记住这个信息,下次对话时就可以针对性地推荐 Python 相关内容。

会话提交时自动提取 8 种记忆类型:

分类 归属 说明 可合并 示例
profile user 用户身份/属性 “我是一名后端工程师”
preferences user 用户偏好 “我喜欢使用 VS Code”
entities user 实体(人/项目) “张三是我的同事”
events user 事件/决策 “上周我决定使用 Redis 做缓存”
cases agent 问题+解决方案 “如何解决数据库连接超时”
patterns agent 可复用流程 “代码审查的标准流程”
tools agent 工具使用记录 “DuckDuckGo 搜索耗时统计”
skills agent 技能执行记录 “GitHub PR 技能执行日志”

去重决策

  • CREATE:新记忆,直接创建
  • UPDATE:更新已有记忆
  • MERGE:合并相似记忆
  • SKIP:跳过重复内容

4.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 提取,可以识别:

  • 类、函数、变量的定义
  • 导入依赖关系
  • 代码结构层次

这样检索时可以精确定位到具体的函数或类,而不是整个文件。


5. 双层存储架构

OpenViking 采用双层存储架构,将内容存储和索引存储分离,实现职责清晰、高效可扩展的存储方案。

为什么需要双层存储? 传统向量数据库将内容和向量存在一起,导致内存占用高、扩展困难。OpenViking 将两者分离:向量库只存储索引(轻量),AGFS 存储完整内容(海量),各司其职。

5.1 存储结构

存储层 职责 内容 特点
AGFS 内容存储 L0/L1/L2 完整内容、多媒体文件、关联关系 持久化存储,支持大文件
向量库 索引存储 URI、向量、元数据(不存文件内容) 内存索引,快速检索

AGFS(Augmented Global File System) 是 OpenViking 自研的增强型全局文件系统,专门为 AI Agent 上下文管理设计,支持:

  • 大文件存储
  • 版本管理
  • 关联关系追踪

设计优势

  • 职责清晰:向量库只负责检索,AGFS 负责存储,各司其职
  • 内存优化:向量库不存储文件内容,大幅降低内存占用
  • 单一数据源:所有内容从 AGFS 读取,避免数据不一致
  • 独立扩展:向量库和 AGFS 可根据需求分别扩展

5.2 事务机制

OpenViking 内置事务机制,保障数据操作的原子性和一致性,防止并发操作导致的数据损坏。

为什么需要事务? 当多个用户同时操作同一目录时(如同时添加文件),没有事务保护可能导致数据混乱。OpenViking 的事务机制确保每次操作要么完全成功,要么完全回滚。

操作请求 → TransactionManager → 锁保护 → 执行操作 → 状态更新

核心特性

  • 路径锁:锁定目标目录,防止并发冲突
    • 类似于文件锁,确保同一时间只有一个操作可以修改某目录
  • 写互斥:同一时间只允许一个事务写操作
    • 保证数据一致性,避免写入冲突
  • 事务状态机INIT → AQUIRE → EXEC → COMMIT/FAIL → RELEASING → RELEASED
    • 完整的生命周期管理,便于追踪和调试

适用场景add_resourcermmv 等数据操作命令自动开启事务保护,开发者无需手动管理。


6. 多租户支持

OpenViking 支持完整的多租户隔离,适合企业级部署和 SaaS 场景。

什么是多租户? 多租户是指一套系统可以服务多个客户(租户),每个客户的数据相互隔离。例如,公司 A 和公司 B 都使用同一个 OpenViking 服务,但彼此看不到对方的数据。

6.1 三层角色

角色 权限范围 典型场景
ROOT 全局管理:创建/删除工作区、跨租户访问 系统管理员、运维人员
ADMIN 工作区管理:管理本 account 用户、全量数据访问 企业管理员、团队负责人
USER 访问自己的 user/agent/session scope 普通用户、开发者

6.2 存储隔离

不同租户的数据在物理存储上也是隔离的,通过 AGFS 路径实现:

Scope AGFS 路径 隔离维度
user/memories /{account_id}/user/{user_space}/memories/ account + user
agent/memories /{account_id}/agent/{agent_space}/memories/ account + user + agent
resources /{account_id}/resources/ account
session /{account_id}/session/{user_space}/{id}/ account + user

隔离维度说明

  • account:企业/组织级别隔离
  • user:用户级别隔离
  • agent:Agent 实例级别隔离

6.3 运行模式

OpenViking 支持两种运行模式,适应不同场景:

  • Dev 模式(开发模式)
    • 不配置 root_api_key
    • 跳过认证,使用 default 账户
    • 适合本地开发、测试
  • 生产模式
    • 配置 root_api_key
    • 强制 API Key 认证
    • 支持多账户、多租户
    • 适合企业部署、SaaS 服务

7. 部署模式

OpenViking 支持两种部署模式,适应不同的使用场景和技术要求。

7.1 嵌入式模式

嵌入式模式适合本地开发、测试和小型应用,无需独立部署服务端。

from openviking import OpenViking

# 初始化客户端,自动启动 AGFS 子进程
client = OpenViking(path="./data")

# 添加资源
client.add_resource("./my-project")

# 搜索
results = client.search("如何配置数据库")

特点

  • 自动启动 AGFS 子进程,无需额外配置
  • 本地向量索引,无需外部数据库
  • 单例模式,同一进程只能有一个实例
  • 适合本地开发、原型验证

适用场景

  • 本地开发调试
  • 个人项目、小规模应用
  • CI/CD 测试环境

7.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 服务

8. 技术栈

本章将介绍 OpenViking 的核心技术选型以及配套的工具链支持,兼顾开发效率与生产性能。

8.1 核心依赖

OpenViking 的技术选型兼顾了开发效率和生产性能:

依赖 用途 说明
Python ≥ 3.10 运行环境 现代 Python 特性支持(类型提示、异步等)
FastAPI HTTP 服务框架 高性能异步框架,自动生成 API 文档
Uvicorn ASGI 服务器 生产级 ASGI 服务器,支持高并发
pyagfs AGFS 文件系统 OpenViking 自研的增强型文件系统
LiteLLM 多模型统一调用 统一接口调用 OpenAI、Claude、Gemini 等模型
tree-sitter 代码 AST 解析 高性能代码语法分析,支持多语言
pydantic 数据验证 类型安全的数据模型定义和验证

LiteLLM 的作用:OpenViking 需要调用 LLM 生成 L0/L1 摘要和提取记忆。LiteLLM 提供统一接口,让开发者可以轻松切换不同的 LLM 提供商(如从 OpenAI 切换到 Claude),无需修改代码。

8.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 脚本集成
  • 支持所有核心功能

9. VikingBot - Agent 应用层

VikingBot 是基于 Nanobot 框架构建的 AI 助手应用,深度集成 OpenViking 作为上下文管理后端。

Nanobot 是一个开源的 AI Agent 框架,提供了 Agent 开发的基础能力。VikingBot 在此基础上扩展,实现了完整的对话式 AI 助手。

9.1 核心能力

能力 说明
多渠道接入 支持 Telegram、Discord、WhatsApp、飞书、钉钉、Slack、Email、QQ 等主流平台
沙箱执行 支持 SRT/Docker 后端的安全沙箱,隔离执行风险代码
定时任务 内置 Cron 调度器,支持定时执行任务
Web Console 提供可视化管理界面,方便监控和配置

使用场景示例

  • 在 Telegram 中创建一个能记住用户偏好的聊天机器人
  • 在飞书中部署一个能查询公司文档的智能助手
  • 在钉钉中创建一个能自动处理工单的 Agent

9.2 Agent 社交网络

VikingBot 支持接入 Agent 社交网络,让 Agent 可以与其他 Agent 互动:

  • Moltbook:一个 Agent 社区平台
  • ClawdChat:支持 Agent 之间对话的平台

这种设计让 Agent 不仅能服务人类用户,还能与其他 Agent 协作完成任务。


10. 实际应用效果

OpenViking 在实际项目中展现出显著的效果提升。以下是基于 OpenClaw Memory Plugin 的测试数据(使用 LoCoMo10 数据集):

LoCoMo10 数据集:一个用于评估长对话记忆能力的标准数据集,包含多轮对话和需要长期记忆才能完成的任务。

实验组 任务完成率 输入 Token 消耗 相比基准
OpenClaw (memory-core) 35.65% 24,611,530 基准
OpenClaw + LanceDB 44.55% 51,574,530 完成率+25%
OpenClaw + OpenViking 52.08% 4,264,396 完成率+46%,Token-83%

数据分析

  • 任务完成率:集成 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 成本。


11. 总结

OpenViking 通过文件系统范式重新定义了 AI Agent 的上下文管理方式,为构建具有长期记忆和持续学习能力的 Agent 提供了坚实的技术基础。

核心创新

  1. 统一抽象 - Viking URI 将所有上下文映射为虚拟文件系统
    • 像管理文件一样管理上下文
    • 统一的接口,降低学习成本
  2. 渐进加载 - L0/L1/L2 三层结构平衡效率与完整性
    • 先摘要后详情,避免信息过载
    • Token 消耗降低 80% 以上
  3. 智能检索 - 目录递归检索结合语义搜索提高准确性
    • 先定位目录再精检
    • 分数传播确保结构完整
  4. 自我进化 - 会话自动提取记忆,Agent 越用越聪明
    • 8 种记忆类型覆盖用户和 Agent
    • 自动去重和合并
  5. 可观测性 - 完整追踪检索轨迹,便于调试优化
    • 检索路径可视化
    • 问题定位更容易

这是一个面向 AI Agent 时代的基础设施级项目,值得每一位 Agent 开发者深入了解和使用。


12. 参考文献

[1] Volcengine, “OpenViking,” GitHub, 2025. [Online]. Available: https://github.com/volcengine/OpenViking