JOTO
联系我们
← AI 智库
知识库

RAG 真被 Google OKF 终结了吗?别急,它更像是企业级 AI 的关键拼图

2026 年 7 月 29 日

Google 发布的 Open Knowledge Format(OKF)并非取代 RAG,而是一种静态知识打包规范,用于解决结构化文档碎片化问题。本文指出 OKF 与向量 RAG 各有适用边界:前者保障精确匹配与结构完整性,后者擅长语义理解;二者应通过双引擎 AI Router 协同工作,形成企业级上下文系统。

RAG 真被 Google OKF 终结了吗?别急,它更像是企业级 AI 的关键拼图

如果你最近一直在浏览技术社交媒体或论坛,很可能已经看到一些两极分化的标题,声称 Retrieval-Augmented Generation (RAG) 已经死了。引发这场恐慌的导火索,是 Google Cloud 发布了 Open Knowledge Format (OKF) 的 0.1 版本。几周之内,互联网上充斥着各种说法,认为这个标准将彻底取代向量数据库,并终结我们所熟知的 RAG。

但正如任何软件架构师都知道的那样,你不应该因为一篇热门帖子就重写整个技术栈。虽然一些影响者把 OKF 描述成 RAG 的彻底替代品,但现实要微妙得多。OKF 是一种静态存储和文件打包标准——而不是一个主动的、实时的检索引擎。

要理解为什么 OKF 不是“RAG 终结者”,而是一个强大的配套组件,我们需要越过炒作,看看实际的代码、实现方式和架构策略。

误解与现实

这种误解源于把知识如何表示与知识如何被主动检索混为一谈。

每一个主流 RAG 教程都会教授完全相同的流程:切分文档,生成高维稠密 embeddings,将它们写入向量数据库(如 Pinecone 或 Qdrant),然后通过余弦相似度进行搜索。

[Raw Data] ──> [Vector Embedding] ──> [Cosine Similarity Search] ──> [LLM Context]

这种传统的 Vector RAG 方法在捕捉语义含义方面非常出色。如果用户问“如何修复损坏的屏幕?”,即使措辞并不完全匹配,稠密向量也能很好地检索出通用的维修政策。

然而,当你的应用需要结构化精度或精确匹配时,纯向量 RAG 会灾难性地失效。

纯向量 RAG 的失效模式

  • 精度惩罚: 当用户搜索精确的产品 SKU、序列号或错误代码(例如 SKU-48291-B)时,embedding 模型会把相近字符串视为几乎相同的邻居。数据库无法将它们精确区分开来。
  • 结构破坏: 将一份 200 页的文档切分为任意的 512-token 片段,会撕裂表格,使脚注与对应编号分离,并彻底破坏文档内部的交叉引用。

Google 的 Open Knowledge Format (OKF) 登场

OKF 解决的是数据碎片化问题。它不是数据库、SDK 或云平台。它是一项开放规范,将“LLM-wiki”模式标准化为一个高度可移植的目录,其中包含纯 Markdown 文件,并配有 YAML frontmatter。

每个文件都代表一个独立的、单元级概念(一个表 schema、一个业务指标、一个 API runbook)。

├── index.md
├── log.md
├── tables/
│   └── orders.md

OKF 并不取代 RAG;它取代的是混乱、缺乏文档说明的数据结构,提供一种干净、机器可读的格式,让人类可以编写,AI agents 也可以开箱即用地直接遍历。

双引擎上下文系统

真正的创新并不是在 OKF 和 RAG 之间二选一,而是构建一个混合式的双引擎上下文系统。

通过将传统 RAG 的语义直觉与 OKF metadata parser 的高度结构化可预测性结合起来,你可以构建一个具备企业级召回能力的 AI 技术栈。在这种架构中,一个动态 AI Router 位于知识库之前,负责分析用户意图,并将请求并行路由到最合适的子系统。

                     ┌───> [Sparse / Dense Vector RAG] ───> (Dynamic Synonyms & Semantic Intent)
[User Query] ──> [AI Router]
                     └───> [OKF Metadata Parser] ───────> (Exact Structural Match & Metadata)

在 C# 中实现 AI Router

为了让该架构在 .NET 9 中达到生产可用状态,我们可以实现一个编排型 router,用于评估传入查询,触发并行异步执行路径,并合成最终上下文。

下面是一个完整实现,展示了 OKF 解析逻辑、路由结构以及上下文合成。

using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
using System.Threading.Tasks;
using YamlDotNet.Serialization; // Requires YamlDotNet NuGet package

namespace EnterpriseAi.KnowledgeArchitecture
{
    // 1. Definition of the OKF Concept structure 
    public class OkfConcept
    {
        public OkfFrontmatter Frontmatter { get; set; }
        public string MarkdownBody { get; set; }
    }

    public class OkfFrontmatter
    {
        [YamlMember(Alias = "type")]
        public string Type { get; set; }

        [YamlMember(Alias = "title")]
        public string Title { get; set; }

        [YamlMember(Alias = "description")]
        public string Description { get; set; }

        [YamlMember(Alias = "resource")]
        public string Resource { get; set; }

        [YamlMember(Alias = "tags")]
        public List<string> Tags { get; set; }
    }

    // 2. The Core Knowledge Router Engine
    public class DualEngineRouter
    {
        private readonly Dictionary<string, OkfConcept> _okfRegistry = new();

        // Simulates loading a local directory containing an OKF bundle
        public void LoadOkfBundle(string directoryPath)
        {
            var deserializer = new DeserializerBuilder().Build();

            // In OKF, every file path minus extension becomes its unique resource ID
            foreach (var filePath in Directory.GetFiles(directoryPath, "*.md", SearchOption.AllDirectories))
            {
                var content = File.ReadAllText(filePath);

                // OKF files are strictly split by YAML blocks delimited by triple dashes '---'
                var parts = content.Split(new[] { "---" }, StringSplitOptions.RemoveEmptyEntries);

                if (parts.Length >= 2)
                {
                    var yamlText = parts[0];
                    var markdownBody = parts[1].Trim();

                    var frontmatter = deserializer.Deserialize<OkfFrontmatter>(yamlText);

                    var relativeKey = Path.GetRelativePath(directoryPath, filePath).Replace(".md", "");
                    _okfRegistry[relativeKey.ToLower()] = new OkfConcept 
                    { 
                        Frontmatter = frontmatter, 
                        MarkdownBody = markdownBody 
                    };
                }
            }
        }

        public async Task<string> RouteAndSynthesizeAsync(string query)
        {
            // The router determines intent. If exact structured data (like a table definition or runbook) is targetted:
            if (IsStructuredOkfQuery(query, out string targetConcept))
            {
                var okfTask = Task.FromResult(RetrieveOkfContext(targetConcept));
                var ragTask = SimulateVectorRagLookupAsync(query);

                // Execute both engines in parallel to maintain sub-50ms latencies
                await Task.WhenAll(okfTask, ragTask);

                return SynthesizeContext(okfTask.Result, ragTask.Result);
            }
            else
            {
                // Fallback to pure semantic Vector RAG if it's an unmapped, dynamic query
                var ragContext = await SimulateVectorRagLookupAsync(query);
                return SynthesizeContext(null, ragContext);
            }
        }

        private bool IsStructuredOkfQuery(string query, out string targetConcept)
        {
            // Real world implementations would use a lightweight regex or LLM classifier
            targetConcept = "tables/orders"; 
            return query.Contains("schema") || query.Contains("table") || query.Contains("runbook");
        }

        private OkfConcept RetrieveOkfContext(string conceptKey)
        {
            _okfRegistry.TryGetValue(conceptKey.ToLower(), out var concept);
            return concept;
        }

        private async Task<List<string>> SimulateVectorRagLookupAsync(string query)
        {
            await Task.Delay(15); // Simulate network latency to a vector database like Qdrant
            return new List<string> { "Sample RAG chunk 1", "Sample RAG chunk 2" };
        }

        // 3. Synthesizing the final combined payload
        private string SynthesizeContext(OkfConcept okfContext, List<string> ragResults)
        {
            var aggregatedContext = "=== AI ROUTER ATTENTION: GROUNDING CONTEXT ===\n\n";

            if (okfContext != null)
            {
                aggregatedContext += $"[STRUCTURAL METADATA ENGINE]\n";
                aggregatedContext += $"Concept Type: {okfContext.Frontmatter.Type}\n";
                aggregatedContext += $"Resource Target: {okfContext.Frontmatter.Resource}\n";
                aggregatedContext += $"Core Reference:\n{okfContext.MarkdownBody}\n\n";
            }

            aggregatedContext += "[SEMANTIC RAG ENGINE]\n";
            foreach (var chunk in ragResults)
            {
                aggregatedContext += $"- {chunk}\n";
            }

            return aggregatedContext;
        }
    }
}

业务价值与可扩展性

采用双引擎架构不仅仅是一次技术升级;对于扩展一家现代 SaaS 公司而言,它是一项高度战略性的举措。

  • 大幅降低成本: 当处理数千维度时,向量搜索计算集群的成本会迅速上升。通过将数千个静态页面、API schemas 和文档层级结构卸载到纯文本 OKF bundles 中,你可以显著降低向量数据库索引成本。
  • 无缝水平扩展: 因为 OKF bundle “只是一个文件夹”,它可以轻松放入标准 Git repository,挂载到任何 file system,并在全球分布式实例之间无缝扩展,而无需复杂的同步管道。
  • 消除幻觉: 通过 OKF 让 LLM 访问数学上精确的数据结构,可以完全防止模型在技术 metadata、系统 schemas 或结构化代码依赖方面产生幻觉。

结论

Google 的 Open Knowledge Format 并没有杀死 RAG。相反,它修复了 RAG 最痛苦的缺陷之一:处理高度结构化、相互关联的技术文档。

通过将语义搜索与结构化查找解耦,你可以构建可扩展、可审计、经过生产强化的上下文引擎,并使其适配复杂的企业生态系统。不要丢弃你的向量数据库。相反,应当用一个多引擎路由系统将它们包裹起来,并让 OKF 管理你的结构化 ground truth。

JOTO 企业落地观察

  • 企业部署知识增强型 AI 时,OKF 提供了一种轻量、Git 友好的结构化知识交付方式,可绕过向量数据库的运维负担;但其静态特性决定了它无法替代 RAG 对动态语义意图的理解能力,团队需明确划分两类知识的治理边界。
  • 这类系统的取舍在于:是否接受将部分知识工程从运行时检索前移至构建时打包。OKF 要求知识以单元化、带元数据的 Markdown 形式组织,这对已有非结构化文档存量大、缺乏文档治理习惯的团队构成落地门槛。
  • 对 RAG 知识工程而言,OKF 并未简化知识建模,而是转移了建模焦点——从 embedding 策略转向概念粒度定义、frontmatter 字段设计与跨文件引用维护,这对知识架构师提出了更明确的领域建模要求。
  • AI 安全治理可借助 OKF 的可审计性提升:每个 OKF 文件作为不可变的知识单元,配合 Git 历史与 YAML 元数据,能清晰追溯结构化知识的来源、责任人与变更依据,弥补纯向量 RAG 中语义黑箱带来的合规盲区。

立即咨询 JOTO

JOTO 提供覆盖企业智能体规划与搭建、AI 平台私有化部署、RAG 知识工程、AI 安全治理、FDE 驻场共创及持续运营优化的全周期 AI 落地服务,帮助企业把验证中的 AI 能力转化为安全、可控、可持续迭代的生产力。 联系 JOTO 获取 AI 落地咨询

想把这些做法用到你的业务里?

留下你的场景和痛点,我们帮你判断从哪一步开始。

联系我们
联系我们

开启企业级 AI 落地

留下你的行业、部门和当前痛点,我们会在 1 个工作日内与你联系,帮你判断适合先做什么、需要准备哪些数据、适合什么平台。

微信咨询
扫码添加,一对一沟通
JOTO 微信咨询二维码
发送邮件
jotoai@jototech.cn

填写需求单

收到你的信息后,我们将在 1 个工作日内与你取得联系。