基础概念扫盲 · 一次讲清楚

Server / Client
& Embedding / VLM

这是构建 Agent 系统绕不开的四个基础词。一次性把它们的区别、各自干什么、为什么 OpenViking 都需要——讲透。

01Server 和 Client 的区别

这是计算机软件最古老的两个角色。一句话:Server 是干活的,Client 是发号施令的。

★ 类比

百度网盘:你硬盘里所有文件其实都在百度的服务器机房里——那是 Server。你电脑/手机上装的"百度网盘 App"只是一个能上传下载的小工具——那是 Client。App 卸了文件还在,机房断电了 App 就啥也干不了。

MySQL 数据库 也一样:数据库本体(MySQL Server)在某台机器上跑着,你打开 Navicat 连过去查数据——Navicat 就是 Client。

SERVER · 服务端

openviking-server

真正"干活"的那个进程。所有数据、索引、计算都在它这里。

  • 常驻进程,开机后一直跑着监听请求
  • 存数据:向量索引、L0/L1/L2 文件、会话记录都在它的磁盘上
  • 吃资源:内存常占 1-2GB,CPU/磁盘开销也来自它
  • 暴露 HTTP API:默认监听 127.0.0.1:1933
  • 一份足够:整个团队/项目通常只跑一份 Server
CLIENT · 客户端

ov CLI / Python SDK

"用"那个服务的工具。它本身什么都不存,只负责把你的请求发给 Server。

  • 无状态:关掉再开没影响
  • 极轻量:内存几十 MB,CPU 几乎不占
  • 跨网络:通过 HTTP 跟 Server 通信,可以在任何地方运行
  • 多种形式:命令行 ov、Python import openviking、HTTP curl 都算
  • 多份没关系:你电脑、同事电脑、CI 流水线都可以装

它们之间长这样:

ov CLI · SDK 你的 Windows 笔记本 Client · 轻量 Linux 服务器(云上或内网) openviking-server 数据 + 向量索引 + 摘要 监听 :1933 火山引擎 Ark Embedding API VLM API HTTP API 调用

这张图里有三个东西在不同地方:你 Windows 上跑的 Client 很轻,远程 Linux 服务器上跑的 Server 是重头,而 Server 自己还要去调火山引擎的 API(下半部分要讲的 Embedding 和 VLM)。

02所以"Windows 跑 Client"和"Windows 跑 Server"是啥意思?

直接对应到你的具体场景。

推荐场景 A · Windows 只做 Client

Server 在某台 Linux 服务器上跑,你在 Windows 上用 CLI/SDK 连过去

你在 Windows 上只装一个轻量的 ov 命令行工具,或者写 Python 代码 import openviking。它们通过 HTTP 连到远程 Server(比如你 PuTTY 连的那台 Linux)。Windows 这边几乎没负担,BOM 那些边角问题也完全碰不上——因为重活都在 Linux 那边干。

不推荐场景 B · Windows 直接跑 Server

在 Windows 上跑 openviking-server 这个进程

把整个服务装在 Windows 上,监听端口、存数据、处理请求都在 Windows 上完成。这就是 v0.2.6 之前坑多的地方——UTF-8 BOM、路径分隔符、Go 二进制兼容、文件锁等一堆 Windows 特有问题。能跑通,但折腾。要在 Windows 上跑 Server,请走 WSL2(Windows 里的 Linux 子系统)或 Docker Desktop,那样实际上还是 Linux 在跑。

★ 一句话总结

Client 只是个"遥控器",跨平台没压力;Server 是"主机",原生跑在 Windows 上历来都比 Linux 麻烦。 这不是 OpenViking 独有的问题,是所有 Linux 系开源服务的通病。

03Embedding 是什么 · 语义指纹

RAG / 向量数据库 / 语义搜索的底层基础设施。

EMBEDDING · 嵌入模型

把文字变成一串数字a.k.a. 向量化

"狗" 和 "犬" 对人类来说意思相近——怎么让计算机也"知道"它们相近?

Embedding 模型就是干这件事的:你喂给它一句话,它输出一串数字(通常 1024 维或 1536 维),意思相近的内容,输出的数字也接近。这串数字叫"向量"或"嵌入",可以理解为这段文字的"语义指纹"。

# 喂给 embedding 模型 ↓ "我家的狗叫小白" ─▶ [0.23, -0.45, 0.91, ..., 0.17] # 1024 个数字 "我养的犬名叫小白" ─▶ [0.22, -0.46, 0.93, ..., 0.18] # 几乎一样 "今天天气真不错" ─▶ [-0.81, 0.67, 0.04, ..., -0.55] # 差很远

检索的时候:你问"我的宠物叫什么?",把问题也变成向量,然后跟数据库里所有存好的向量比对——找数字最接近的那条——它就把"我家的狗叫小白"返回给你。这就是"语义搜索",比关键词搜索强在它不要求字面匹配。

在 OpenViking 中的角色 OpenViking 把你存进去的每一段内容都偷偷喂给 embedding 模型变成向量,存在向量数据库里。后续你或你的 Agent 搜索时,查询也被转成向量去做相似度匹配。没有 embedding 模型,OpenViking 的 "find" 命令就废了。

04VLM 是什么 · 看图说话的 AI

Vision-Language Model 的缩写。是个能"看"又能"说"的多模态模型。

VLM · 视觉语言模型

同时能理解图像 + 文字的 AIVision-Language Model

普通 LLM 只懂文字;VLM 还能"看"图。GPT-4V、豆包·视觉版、Gemini 都是 VLM。

VLM 跟你平时用的 ChatGPT/Claude 是同类,只是多了一只"眼睛"——你可以扔一张截图、PDF、产品照、流程图给它,它能描述、提取信息、回答关于图片的问题。

在 OpenViking 里,VLM 实际上承担两个职责——很多人以为它只用来处理图片,其实更重要的是第二个用途

# 用途 ① 处理图像资源 [一张系统架构图.png] ─▶ VLM ─▶ "这是一个三层架构图,从上到下分别是…" # 用途 ② 自动生成 L0/L1 摘要(关键!) [一篇 5000 字的技术文档] ─▶ VLM ─▶ L0: "该文档介绍了 X 系统的认证模块设计" L1: "包含三个核心组件:…,主要应用于…"
在 OpenViking 中的角色 还记得 L0/L1/L2 那个三层模型吗?L0 和 L1 不是凭空出现的,都是 VLM 从原文里"读"出来再"总结"出来的。这就是为什么 OpenViking 离不开 VLM——没有它,三层加载机制就建不起来。也是为什么"摘要质量决定一切"——VLM 写得烂,整套系统就崩。

05为什么 OpenViking 两个都要?

两件事各干各的,缺一不可。

▸ 场景 ① 新增一份资料 (fan-out)

新增资料 add_resource() VLM API 读懂内容 + 写摘要 Embedding API 把文字变成向量 L0 / L1 摘要 .abstract / .overview 写入 workspace/ vectordb 向量 + 原文段 让"找"能找到

▸ 场景 ② 搜索一份资料 (linear)

查询字符串 find("auth") Embedding API 查询转成向量 vectordb 比对 相似度排序 返回相关段 带 viking:// URI

没有 VLM → 没有 L0/L1 摘要 → 三层加载机制失效
没有 Embedding → 没法做语义搜索 → find 命令直接报废

所以"OpenViking 必须连外部 embedding+VLM API"的真正含义是:OpenViking 自己没有大脑,它本质上是个聪明的"上下文管理器",但具体的"理解能力"——读懂、总结、向量化——必须借给外部模型完成。

所谓"外部 API",就是火山引擎的 Ark 平台、OpenAI 的 API、Gemini 的 API 这种云端模型服务。你的 OpenViking Server 在处理数据时,会用 HTTP 调用它们,把 embedding 和 VLM 的工作"外包"出去,然后把结果拿回来存。

⌘ 串起来看

你那个多 Agent 平台的完整数据链路

用一句话把这次学的东西全部串起来:你 Windows 工作机上的代码(Client)通过 HTTP 调用部署在某台 Linux 服务器上的 openviking-serverServer),Server 在存数据时调用火山引擎的 Embedding API 把内容向量化,调用 VLM API 生成 L0/L1 摘要;你搜索时 Server 又用 Embedding API 把你的问题转成向量去比对——整个链路里 OpenViking 自己不做任何 AI 推理,它只负责"组织"和"调度"。

这种设计的好处是解耦:embedding/VLM 模型随时可以换(豆包换 OpenAI、再换 Gemini,改个配置文件的事),但你那套上下文文件系统不动。