











本教程介绍如何在 OpenClaw 环境中配置 OpenViking,使用 NVIDIA NIM API 作为 Embedding 和 VLM 后端。
OpenViking 是火山引擎开源的 AI Agent 上下文数据库。它用"虚拟文件系统"的方式管理 Agent 的记忆、资源和技能,提供:
GitHub: https://github.com/volcengine/OpenViking
pip install openviking
创建目录和配置文件:
mkdir -p ~/.openviking
编辑 ~/.openviking/ov.conf:
{
"embedding": {
"dense": {
"api_base": "https://integrate.api.nvidia.com/v1",
"api_key": "你的NVIDIA_API_KEY",
"provider": "openai",
"dimension": 4096,
"model": "nvidia/nv-embed-v1"
}
},
"vlm": {
"api_base": "https://integrate.api.nvidia.com/v1",
"api_key": "你的NVIDIA_API_KEY",
"provider": "openai",
"model": "meta/llama-3.3-70b-instruct"
}
}
| 参数 | 说明 |
|---|---|
api_base |
NVIDIA NIM API 端点 |
api_key |
从 NVIDIA Build 平台获取 |
dimension |
Embedding 维度,nv-embed-v1 固定为 4096 |
embedding.model |
推荐使用 nvidia/nv-embed-v1(对称模型,不需要 input_type 参数) |
vlm.model |
用于生成摘要的语言模型,推荐 meta/llama-3.3-70b-instruct |
NVIDIA 上的推理模型(如 kimi-k2.5)返回的 content 字段为空,内容在 reasoning 字段里。OpenViking 期望标准的 message.content 格式,所以要用非推理模型。
export OPENVIKING_CONFIG_FILE=~/.openviking/ov.conf
建议添加到 ~/.bashrc:
echo 'export OPENVIKING_CONFIG_FILE=~/.openviking/ov.conf' >> ~/.bashrc
source ~/.bashrc
创建测试脚本 test_openviking.py:
import openviking as ov
# 初始化客户端,数据存储在当前目录的 openviking_data 文件夹
client = ov.SyncOpenViking(path="./openviking_data")
try:
client.initialize()
print("✅ OpenViking 初始化成功!")
# 添加一个测试文件
result = client.add_resource(path="./your_file.md")
print(f"添加文件: {result}")
# 等待处理完成
print("等待处理...")
client.wait_processed()
print("✅ 处理完成!")
# 搜索测试
results = client.find("测试关键词", limit=3)
print(f"\n搜索结果:")
for r in results.resources:
print(f" {r.uri} (score: {r.score:.4f})")
client.close()
print("\n🎉 OpenViking 配置成功!")
except Exception as e:
print(f"错误: {e}")
import traceback
traceback.print_exc()
运行:
python test_openviking.py
# 添加单个文件
result = client.add_resource(path="./docs/readme.md")
# 添加 URL
result = client.add_resource(path="https://example.com/article.html")
# 列出根目录
ls_result = client.ls("viking://resources")
# 列出子目录
ls_result = client.ls("viking://resources/my_project")
# 搜索相关内容
results = client.find("如何配置 embedding", limit=5)
for r in results.resources:
print(f"URI: {r.uri}")
print(f"Score: {r.score}")
print(f"Content: {client.read(r.uri)[:200]}...")
# L0 层:一句话摘要
abstract = client.abstract("viking://resources/my_project")
# L1 层:详细概览
overview = client.overview("viking://resources/my_project")
# 读取完整内容(L2 层)
content = client.read("viking://resources/my_project/readme.md")
错误: Dense vector dimension mismatch: expected 2048, got 4096
解决: 在配置文件中明确指定 dimension: 4096,匹配 nvidia/nv-embed-v1 的输出维度。
错误: 'NoneType' object is not subscriptable
原因: 使用了推理模型(如 kimi-k2.5),其返回格式与 OpenViking 不兼容。
解决: 换用标准模型如 meta/llama-3.3-70b-instruct。
错误: 'input_type' parameter is required for asymmetric models
原因: 某些 Embedding 模型(如 nv-embedqa-e5-v5)是非对称模型,需要指定 query 或 document。
解决: 使用对称模型 nvidia/nv-embed-v1,不需要 input_type。
错误: directory already exists: /resources/第01章
原因: OpenViking 用文件名(不含路径)作为 URI,不同目录下的同名文件会冲突。
解决:
OpenClaw 默认使用 qmd 作为记忆后端,配合手动维护的 MEMORY.md 和 memory/*.md 文件。这套方案够用,但有几个痛点:
| 能力 | qmd | OpenViking |
|---|---|---|
| 语义搜索 | ✅ 基础 | ✅ 目录递归 + 语义融合 |
| 自动摘要 | ❌ | ✅ L0/L1/L2 三层 |
| 结构化浏览 | ❌ | ✅ 虚拟文件系统 |
| Token 节省 | ❌ | ✅ 按需加载 |
| 会话记忆自动提取 | ❌ | ✅ 自动提取长期记忆 |
保留 qmd 作为日常轻量记忆,用 OpenViking 管理大型文档库:
# 把 workspace 里的书籍、项目文档等大型资源导入 OpenViking
import glob, openviking as ov
client = ov.SyncOpenViking(path="./openviking_data")
client.initialize()
for f in glob.glob("./books/**/*.md", recursive=True):
client.add_resource(path=f)
for f in glob.glob("./docs/**/*.md", recursive=True):
client.add_resource(path=f)
client.wait_processed()
client.close()
Agent 工作流:
将 OpenClaw 的所有记忆文件也导入 OpenViking:
# 导入记忆文件
for f in glob.glob("./memory/*.md"):
client.add_resource(path=f)
# 导入 workspace 所有 markdown
for f in glob.glob("./**/*.md", recursive=True):
client.add_resource(path=f)
⚠️ 目前 OpenViking 还不能直接作为 OpenClaw 的
memory.backend配置项。需要通过 skill 的 CLI 工具间接调用。未来如果 OpenClaw 支持自定义记忆后端插件,可以更深度集成。
写书、做研究等任务时,sub-agent 可以先搜索 OpenViking 获取相关上下文,而不是把整本书塞进 prompt:
# Sub-agent 先搜索相关内容
python3 scripts/viking.py search "武松的性格分析" --limit 3
# 然后只读取最相关的段落
python3 scripts/viking.py read viking://resources/第01章/张三的叙事.md
这样一个 sub-agent 只需要加载几千 token 的相关内容,而不是整本书的 10 万+ token。
我们已经把 OpenViking 封装为 OpenClaw skill,安装后 Agent 可以直接使用:
# 安装 skill
git clone https://github.com/swizardlv/openclaw_openviking_skill.git
cp -r openclaw_openviking_skill/openviking ~/.openclaw/workspace/skills/
Skill 提供的命令:
| 命令 | 功能 |
|---|---|
viking.py add <file> |
索引文件 |
viking.py add-dir <dir> |
批量索引目录 |
viking.py search <query> |
语义搜索 |
viking.py ls [uri] |
浏览资源 |
viking.py abstract <uri> |
获取摘要 |
viking.py overview <uri> |
获取概览 |
viking.py read <uri> |
读取全文 |
viking.py info |
查看配置状态 |
| 模型 | 维度 | 类型 | 说明 |
|---|---|---|---|
nvidia/nv-embed-v1 |
4096 | 对称 | ✅ 推荐,无需 input_type |
nvidia/nv-embedqa-e5-v5 |
1024 | 非对称 | 需要 input_type 参数 |
nvidia/llama-3.2-nv-embedqa-1b-v2 |
2048 | 非对称 | 需要 input_type 参数 |
nvidia/nv-embedcode-7b-v1 |
4096 | 对称 | 适合代码 |
| 模型 | 说明 |
|---|---|
meta/llama-3.3-70b-instruct |
✅ 推荐,标准格式 |
meta/llama-3.1-70b-instruct |
稳定版本 |
meta/llama-3.1-8b-instruct |
轻量版 |
mistralai/mistral-large |
Mistral 系列 |
⚠️ 避免使用推理模型(如 kimi-k2.5、deepseek-r1),它们返回的格式与 OpenViking 不兼容。
本教程基于 OpenViking 0.1.17 和 NVIDIA NIM API 测试通过。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。