OpenViking:为AI智能体打造的开源上下文数据库

在人工智能快速发展的今天,我们正迎来智能体(Agent)应用的爆发。然而,随着智能体承担越来越复杂的任务,一个根本性的挑战逐渐浮现:如何高效地管理、检索和利用海量的上下文信息?无论是个人助手、代码生成工具还是自动化决策系统,它们都需要在运行时访问大量的记忆、资源和技能。传统的解决方案往往导致上下文碎片化、检索效果不佳、成本高昂且难以调试。今天,我们介绍一个专为AI智能体设计的开源项目——OpenViking,它通过创新的“文件系统范式”重新定义了上下文管理,让开发者能够像管理本地文件一样构建智能体的大脑。

OpenViking Banner

智能体开发:被忽视的“上下文危机”

当你构建一个AI智能体时,你可能会遇到以下棘手问题:

  • 上下文碎片化:记忆片段散落在代码中,知识文档存储在向量数据库里,工具函数写在不同的模块中。智能体需要同时处理这些异构信息,导致逻辑复杂且难以维护。
  • 上下文需求激增:一个智能体可能需要运行数小时甚至数天,每次交互都会产生新的上下文。简单的截断或压缩会导致重要信息丢失,影响任务连贯性。
  • 检索效果不佳:传统RAG(检索增强生成)系统采用扁平化的向量存储,只关注语义相似性,却忽略了信息之间的结构关联。这就像从一本书中随机抽取句子,而不知道它们属于哪个章节。
  • 上下文不可观察:检索过程是一个黑盒。当智能体给出错误答案时,你很难判断是模型理解问题,还是检索到的上下文不准确。
  • 记忆迭代有限:大多数系统将记忆简单地定义为用户对话历史,缺乏对任务执行过程的提炼和长期学习能力。

这些问题的根源在于:我们缺乏一个专门为智能体设计的、结构化的上下文管理基础设施。这正是OpenViking试图填补的空白。

OpenViking:重新定义上下文数据库

OpenViking是一个开源的上下文数据库,专门为AI智能体设计。它的核心思想是:将智能体所需的所有上下文——无论是长期记忆、外部知识库还是可调用的技能——统一组织成一个虚拟的文件系统。开发者可以通过标准的文件操作命令(如lsfindgrep)来访问和管理这些上下文,让智能体拥有结构化、可观察、可迭代的“大脑”。

主要设计目标

  • 统一管理:用一致的抽象(虚拟文件系统)替代碎片化的存储。
  • 成本优化:通过分层存储和按需加载,大幅降低大语言模型(LLM)调用的token消耗。
  • 精准检索:结合目录结构和语义搜索,实现“先定位目录,再深入内容”的递归检索策略。
  • 完全可观察:记录每一次检索的路径,让开发者可以追溯智能体的决策依据。
  • 自我进化:自动从会话中提取长期记忆,让智能体越用越聪明。

核心概念:文件系统范式如何解决智能体难题

OpenViking的设计围绕五个核心概念展开,它们一一对应我们在前面提到的挑战。

1. 文件系统管理范式 → 解决碎片化

OpenViking将所有上下文映射到viking://协议下的虚拟目录中。每个上下文条目都有一个唯一的URI,就像文件路径一样。例如:

viking://
├── resources/              # 外部资源:文档、代码库、网页等
│   ├── my_project/
│   │   ├── docs/
│   │   └── src/
├── user/                   # 用户相关的记忆
│   └── memories/
│       ├── preferences/
│       └── habits/
└── agent/                  # 智能体自身的技能和经验
    ├── skills/
    ├── memories/
    └── instructions/

这种结构让智能体能够以确定性的方式定位信息:想要查找项目文档,就去viking://resources/my_project/docs/;想要回忆用户的编程偏好,就去viking://user/memories/preferences/coding_style。开发者也可以通过熟悉的命令来操作这些上下文:

ov ls viking://resources/                 # 列出所有资源
ov tree viking://resources/my_project -L 2 # 以树形结构查看目录
ov cat viking://user/memories/preferences  # 查看某个文件内容

这解决了碎片化问题:记忆、资源和技能不再是孤立的,而是统一在一个可导航的文件系统中。

2. 分层上下文加载 → 降低 Token 消耗

为了在检索时避免一次性加载大量冗余信息,OpenViking在写入上下文时自动生成三个层次的内容:

  • L0(摘要):一句话摘要,用于快速筛选和相关性判断。例如一个文档的L0可能是“OpenViking安装指南”。
  • L1(概览):包含核心信息和使用场景,约2K token左右。智能体在规划阶段读取L1来决定是否需要深入。
  • L2(详情):完整的原始数据,包括全部文本、代码或图像。只有在智能体明确需要执行具体操作时才会加载L2。

这种分层结构存储在同一个虚拟目录中,通过特殊的隐藏文件(如.abstract.overview)表示。智能体可以根据任务需求逐层深入,避免为每一次查询都支付加载全文的token成本。

3. 目录递归检索 → 提升检索效果

传统的向量检索擅长找到语义相似的片段,但往往忽略了这些片段所在的上下文结构。OpenViking设计了一种目录递归检索策略,模拟人类查找信息的过程:先确定哪个目录可能包含所需信息,再深入目录内部探索。

检索流程如下:

  1. 意图分析:解析用户查询,生成多个检索条件(如关键词、实体)。
  2. 初始定位:使用向量检索快速找到最相关的几个“切片”(chunks),并定位它们所属的高分目录。
  3. 精细探索:在这些目录内进行二次检索,并将高分结果加入候选集。
  4. 递归深入:如果目录包含子目录,则对子目录重复二次检索,逐层深入。
  5. 结果聚合:最终汇总最相关的上下文返回给智能体。

这种方法不仅找到语义匹配的内容,还确保了信息在整体结构中的完整性。例如,当智能体询问“如何配置OpenViking的Embedding模型”时,系统可能会先定位到viking://resources/openviking/docs/configuration/目录,然后在该目录内检索“embedding”相关的内容,最终返回整个配置章节,而不是零散的句子。

4. 可视化检索轨迹 → 可观察上下文

由于检索过程是基于目录递归的,每一次检索的路径(例如:从viking://resources/viking://resources/openviking/docs/再到具体文件)都会被记录下来。开发者可以通过API或CLI查看这次检索的“轨迹”,了解智能体是如何一步步定位信息的。当智能体给出错误答案时,可以清晰地区分是检索路径错了,还是模型理解错了。这种可观察性极大地简化了调试过程。

5. 自动会话管理 → 上下文自迭代

OpenViking内置了记忆自迭代循环。在每个会话结束时,开发者可以触发记忆提取机制。系统会异步分析本次会话中的用户反馈、任务执行结果、工具调用等信息,并自动更新到用户和智能体记忆目录中:

  • 用户记忆更新:例如提取用户偏好的写作风格、常用的代码库等,使智能体在后续交互中更贴合用户习惯。
  • 智能体经验积累:从成功或失败的任务中提取操作技巧,形成技能记忆,辅助未来决策。

这意味着智能体不再是一次性的,它可以通过与世界的交互持续学习和进化。

快速开始:十分钟搭建你的第一个上下文数据库

现在让我们实际操作一下,感受OpenViking的核心功能。我们将从安装、配置到运行一个完整的示例。

前置条件

  • Python 3.10+
  • Go 1.22+(如果需要从源码构建AGFS组件)
  • C++17兼容的编译器(GCC 9+或Clang 11+)
  • 操作系统:Linux、macOS或Windows
  • 稳定的网络连接(用于下载依赖和访问模型服务)

1. 安装OpenViking

最简单的安装方式是通过pip:

pip install openviking --upgrade

如果你还想安装命令行工具ov(可选),可以使用Rust包管理器cargo安装:

cargo install --git https://github.com/volcengine/OpenViking ov_cli

或者通过一键安装脚本:

curl -fsSL https://raw.githubusercontent.com/volcengine/OpenViking/main/crates/ov_cli/install.sh | bash

2. 模型准备

OpenViking需要两类模型能力:

  • VLM模型:用于理解图像和文本内容(如视觉问答、文档解析)。
  • Embedding模型:用于生成向量表示,实现语义检索。

支持的VLM提供商

OpenViking支持三种VLM提供商,你可以根据需求选择:

提供商 描述 典型模型
volcengine 火山引擎豆包模型 doubao-seed-2-0-pro-260215
openai OpenAI官方API gpt-4-vision-preview, gpt-4o
litellm 统一调用多种第三方模型(Anthropic, DeepSeek, Gemini, vLLM, Ollama等) claude-3-5-sonnet-20240620, deepseek-chat, gemini-pro, ollama/llama3.1

注意:litellm 支持通过统一接口调用多种模型,model字段需遵循LiteLLM格式规范。系统会自动检测常见模型(如claude-*deepseek-*等),其他模型需按LiteLLM格式填写完整前缀。

支持的Embedding提供商

提供商 典型模型 维度
volcengine doubao-embedding-vision-250615 1024
openai text-embedding-3-large 3072
jina 待定 待定

3. 环境配置

创建服务器配置文件 ~/.openviking/ov.conf

下面是一个使用火山引擎豆包模型的完整配置示例(请根据实际情况替换API Key和端点):

{
  "storage": {
    "workspace": "/home/your-name/openviking_workspace"
  },
  "log": {
    "level": "INFO",
    "output": "stdout"
  },
  "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"
    },
    "max_concurrent": 10
  },
  "vlm": {
    "api_base": "https://ark.cn-beijing.volces.com/api/v3",
    "api_key": "your-volcengine-api-key",
    "provider": "volcengine",
    "model": "doubao-seed-2-0-pro-260215",
    "max_concurrent": 100
  }
}

如果你想使用OpenAI,配置文件类似:

{
  "embedding": {
    "dense": {
      "api_base": "https://api.openai.com/v1",
      "api_key": "your-openai-api-key",
      "provider": "openai",
      "dimension": 3072,
      "model": "text-embedding-3-large"
    }
  },
  "vlm": {
    "api_base": "https://api.openai.com/v1",
    "api_key": "your-openai-api-key",
    "provider": "openai",
    "model": "gpt-4-vision-preview"
  }
}

设置环境变量

在Linux/macOS上:

export OPENVIKING_CONFIG_FILE=~/.openviking/ov.conf

在Windows PowerShell上:

$env:OPENVIKING_CONFIG_FILE = "$HOME/.openviking/ov.conf"

4. 运行你的第一个示例

首先启动OpenViking服务器:

openviking-server

服务器会在默认端口1933上监听。如果你想在后台运行:

nohup openviking-server > /data/log/openviking.log 2>&1 &

接着,打开另一个终端,配置CLI客户端。创建~/.openviking/ovcli.conf

{
  "url": "http://localhost:1933",
  "timeout": 60.0,
  "output": "table"
}

并设置环境变量(可选,默认会读取该路径):

export OPENVIKING_CLI_CONFIG_FILE=~/.openviking/ovcli.conf

现在你可以执行一些基本操作了:

# 查看服务器状态
ov status

# 添加一个外部资源(例如OpenViking的GitHub仓库)
ov add-resource https://github.com/volcengine/OpenViking --wait

# 列出已添加的资源
ov ls viking://resources/

# 查看某个资源的目录树(最多两层)
ov tree viking://resources/volcengine -L 2

# 等待片刻让语义处理完成,然后搜索相关内容
ov find "what is openviking"

# 在特定目录下全文搜索
ov grep "openviking" --uri viking://resources/volcengine/OpenViking/docs/zh

恭喜!你已经成功使用OpenViking管理了一个外部GitHub仓库的上下文。

5. 尝试VikingBot(可选)

VikingBot是一个构建在OpenViking之上的轻量级智能体框架,可以快速开启交互式对话。安装方式:

pip install "openviking[bot]"

启动服务器并同时启动Bot:

openviking-server --with-bot

然后在另一个终端启动交互式聊天:

ov chat

现在你可以与智能体对话,它会自动利用OpenViking中存储的上下文来回答问题。

深入配置:模型提供商详解

OpenViking的灵活性在于支持多种模型提供商。下面我们详细说明每种提供商的配置要点。

Volcengine(豆包)

火山引擎的豆包模型在中文场景下表现出色。配置时,你可以使用模型名称或端点ID:

{
  "vlm": {
    "provider": "volcengine",
    "model": "doubao-seed-2-0-pro-260215",
    "api_key": "your-api-key",
    "api_base": "https://ark.cn-beijing.volces.com/api/v3"
  }
}

如果你在火山引擎ARK控制台创建了推理端点,也可以使用端点ID作为model:

{
  "vlm": {
    "provider": "volcengine",
    "model": "ep-20241220174930-xxxxx",
    "api_key": "your-api-key",
    "api_base": "https://ark.cn-beijing.volces.com/api/v3"
  }
}

OpenAI

使用OpenAI官方API,支持gpt-4ogpt-4-vision-preview等模型:

{
  "vlm": {
    "provider": "openai",
    "model": "gpt-4o",
    "api_key": "your-api-key",
    "api_base": "https://api.openai.com/v1"
  }
}

你也可以使用自定义的OpenAI兼容端点(例如通过代理或本地部署的vLLM)。

LiteLLM

LiteLLM是一个强大的统一客户端,支持数十种模型提供商。以下是几个典型配置:

Anthropic Claude

{
  "vlm": {
    "provider": "litellm",
    "model": "claude-3-5-sonnet-20240620",
    "api_key": "your-anthropic-api-key"
  }
}

DeepSeek

{
  "vlm": {
    "provider": "litellm",
    "model": "deepseek-chat",
    "api_key": "your-deepseek-api-key"
  }
}

Qwen(通义千问)

{
  "vlm": {
    "provider": "litellm",
    "model": "dashscope/qwen-turbo",
    "api_key": "your-dashscope-api-key",
    "api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1"
  }
}

对于国内区域,使用api_basehttps://dashscope.aliyuncs.com/compatible-mode/v1;国际区域使用https://dashscope-intl.aliyuncs.com/compatible-mode/v1

本地模型(Ollama)

{
  "vlm": {
    "provider": "litellm",
    "model": "ollama/llama3.1",
    "api_base": "http://localhost:11434"
  }
}

本地模型(vLLM)

{
  "vlm": {
    "provider": "litellm",
    "model": "hosted_vllm/llama-3.1-8b",
    "api_base": "http://your-vllm-server:8000"
  }
}

生产环境部署建议

对于生产环境,建议将OpenViking作为独立的HTTP服务运行,以确保稳定性和性能。推荐在火山引擎弹性计算服务(ECS)上使用veLinux操作系统进行部署。你可以参考官方文档中的服务器部署与ECS设置指南进行详细操作。

性能与评测:OpenClaw记忆插件

OpenViking不仅是一个理论框架,其实用性已经通过实际插件验证。团队在OpenClaw项目中集成了OpenViking作为记忆插件,并在LoCoMo长程对话数据集上进行了评测。以下是关键数据(使用seed-2.0-code模型):

实验组 任务完成率 输入token总计
OpenClaw(memory-core) 35.65% 24,611,530
OpenClaw + LanceDB (-memory-core) 44.55% 51,574,530
OpenClaw + OpenViking Plugin (-memory-core) 52.08% 4,264,396
OpenClaw + OpenViking Plugin (+memory-core) 51.23% 2,099,622

结论:结合OpenViking后,若关闭原生记忆,任务完成率从35.65%提升至52.08%(提升46%),输入token成本降低83%;即使开启原生记忆,token成本也降低了91%,同时完成率提升43%。这充分证明了OpenViking在提升智能体性能的同时显著降低成本的潜力。

常见问题解答

OpenViking与传统RAG有何不同?

传统RAG通常将文档切分为扁平化的向量片段,检索时只考虑语义相似度,忽略文档结构。OpenViking采用文件系统范式,将上下文组织成目录树,检索时先定位目录再深入内容,同时保留检索路径的可观察性。这种结构化的方法更符合人类信息查找的习惯,也更容易调试和优化。

OpenViking支持哪些语言模型?

OpenViking本身不提供语言模型,而是通过适配器支持多种第三方模型。目前支持Volcengine、OpenAI和LiteLLM(后者可调用Anthropic、DeepSeek、Gemini、Qwen、本地模型等)。未来会持续增加更多提供商。

如何为OpenViking贡献代码?

我们欢迎任何形式的贡献!你可以访问GitHub仓库(https://github.com/volcengine/OpenViking),提交Issue或Pull Request。详细的贡献指南请参阅文档中的贡献者指南

OpenViking适合个人开发者还是企业?

两者皆可。个人开发者可以用它来管理个人知识库或构建个人助手;企业可以用它作为智能体应用的基础设施,统一管理组织内部的知识资产和技能库。其开源特性使得定制和集成非常灵活。

是否需要GPU才能运行?

OpenViking服务器本身不需要GPU,它主要负责上下文的管理和检索。但VLM和Embedding模型通常需要GPU或云服务支持。你可以选择使用云端的模型API(如火山引擎、OpenAI),这样本地不需要GPU。如果你想在本地运行模型(通过LiteLLM调用Ollama或vLLM),则需要一定的GPU资源。

社区与参与

OpenViking仍处于早期阶段,我们真诚邀请每一位对AI智能体技术感兴趣的开发者加入我们:

如果你喜欢这个项目,不妨给我们一个Star,这是对我们最大的鼓励!

许可证

OpenViking采用Apache License 2.0许可证,你可以自由使用、修改和分发,但需保留版权声明和许可证副本。详细条款请见LICENSE文件。


Star History Chart

OpenViking的旅程已经开始,期待你的参与,一起定义AI智能体上下文管理的未来。