前阵子我刚完成一套品牌级 GEO 系统的核心链路落地。先说清楚,这里的 GEO 不是地理信息那个 Geo,而是 Generative Engine Optimization,生成式引擎优化。客户的需求一句话就能讲明白:当用户在各种 AI 搜索、AI 问答里问“某品牌怎么样”“某产品值不值得买”时,系统给出的回答里,不能出现品牌信息滞后、张冠李戴甚至凭空编造的内容。这件事真正做起来,就是从一条 RAG 链路出发,最后把一个品牌知识图谱立起来的过程。这篇复盘我不打算报流水账,我会把从架构选型、RAG 参数调试、图谱构建到线上问题排查的完整思路写清楚,适合正在做 RAG 应用、品牌数字化系统或者想了解知识图谱工程落地的朋友参考。项目本身按脱敏要求处理,内部代号我统一叫 MCS-GEO。
1. 从 RAG 链路到品牌知识图谱:这套系统到底要解决什么问题
1.1 生成式引擎里的“品牌失联”
传统 SEO 的思路是让品牌官网在搜索结果的链接列表里排到前面。但用户使用 AI 搜索时,通常不会去点链接,而是直接看模型生成的总结。如果这个大模型从互联网上抓到的素材过时了、来源不权威,那品牌在它嘴里的形象就完全失控。
我们前期做了一轮摸底测试,问题非常具体:问某个品牌的旗舰产品线有哪些,AI 回答里混入了该品牌已经停产的旧型号;问品牌总部地址,回答里写的是五年前的信息;甚至还出现把品牌创始人和另一个同行业人物搞混的情况。这些问题的根源不在于大模型本身笨,而是品牌领域的信息在训练数据里是稀疏且杂乱的,模型只能凭概率猜测。传统 SEO 手段在这里几乎不起作用,因为你没法通过改 robots 或者做外链来影响模型内部的参数。
MCS-GEO 的核心目标,就是把品牌相关的非结构化信息(官网、新闻稿、社交内容、产品文档)和结构化信息(产品参数、人物关系、荣誉资质)统一收编,构建一个“品牌知识图谱”。当 AI 在回答品牌相关问题的时候,我们不是去修改模型,而是把高质量的品牌图谱信息通过 RAG 链路注入上下文,让生成结果有据可依、可见可控。
1.2 单纯做 RAG 为什么不够?
很多人会觉得,这问题不就是一个典型的 RAG 场景吗?把文档切块、向量化、检索、拼进 prompt,让大模型回答就行了。我在一开始也是这么想的,但很快发现纯 RAG 有三个解决不了的问题。
第一个问题是“信息碎片化”。品牌信息是网状结构,比如“某品牌在 2023 年发布了一款智能手表,这款手表搭载了某芯片,芯片供应商是谁”,如果文档被切成独立的 chunk,向量检索可能找到“发布智能手表”这段,也可能找到“某芯片的性能很强”这段,但模型很难自行把两段串成一个有逻辑关系的答案。哪怕串起来了,也无法保证时间、主体、事件之间的对应关系是正确的。
第二个问题是“多跳查询”。用户会问“某品牌在获得某认证之后,推出的第一款产品是什么”。这需要先查认证时间,再找产品列表,再按时间排序。纯向量检索对这种多跳约束的查询基本无能为力,因为答案分散在多个文档的多个句子里,而且没有任何一个 chunk 能单独覆盖完整的推理链条。
第三个问题是“冲突消解”。网上关于品牌的信息充满矛盾,有的说产品 A 是第一代,有的说产品 B 才是。纯 RAG 会把两种说法都检索出来,然后模型可能选择错的那个,或者直接编一个和稀泥的答案。但知识图谱可以在写入阶段就设定好可信来源和冲突处理策略,生成答案前用图谱里的“权威关系”压住噪声。
所以我当时的判断很明确:RAG 链路不能丢,它是连接大模型和最新信息的通道;但必须有知识图谱在上层做实体对齐、关系校准和证据约束。MCS-GEO 的架构,正是在这两者之间搭建了一座工程桥梁。
2. 系统整体架构与数据链路设计
2.1 四层架构概览
MCS-GEO 在架构设计上分了四层:数据接入层、知识图谱层、检索增强层、生成服务层。每一层的职责边界从一开始就划清楚,后续开发和排障会省很多事。
| 层级 | 核心职责 | 关键组件 | 我踩过的主要教训 |
|---|---|---|---|
| 数据接入层 | 多源采集、清洗、格式化 | 爬虫、解析器、去重模块 | 不同来源的字段命名千奇百怪,不做统一 schema 后面全乱 |
| 知识图谱层 | 实体识别、关系抽取、对齐、存储 | NER 模块、图数据库、版本管理 | 早期忽略实体对齐,导致同一产品在图谱里出现两个节点 |
| 检索增强层 | 查询理解、混合检索、重排 | 向量索引、倒排索引、重排模型 | 向量召回率高但精度低,必须加粗排和精排两轮 |
| 生成服务层 | 答案合成、引用溯源、缓存 | 大模型 API、prompt 编排、缓存中间件 | 不约束 prompt 则模型经常自由发挥,引用源头形同虚设 |
每一层都要能做独立的单元测试。数据接入层挂了不能影响线上问答,图谱更新延迟了也要能走兜底检索。这个设计原则在后续维护中帮了大忙。
2.2 数据接入与清洗:多源异构数据怎么收
品牌相关的数据源比想象中杂。官网产品页是结构化程度比较高的,但新闻稿、微信公众号文章、小红书笔记、知乎回答、电商详情页,格式完全不同,有的带 HTML 标签,有的是 PDF 导出,有的图文混排。接入层要做的事情,不是简单“爬下来存起来”,而是把数据清洗成图谱层能够消费的格式。
我当时的处理顺序是:先做一次 URL 去重和内容去重,同一篇新闻被多个站点转载的,只保留最原始的来源站,因为转载站经常会改标题、截断正文,对图谱事实抽取是污染。然后做正文提取,把导航、广告、版权声明等噪声去掉。再之后是结构还原,这一点特别关键——很多表格类内容(产品参数表、认证列表)在 HTML 里是规整的数字矩阵,如果转成纯文本,表格的结构就完全丢了。我们专门写了一个表格还原模块,把二维表转成“表头-单元格”的键值对,再映射到图谱的属性上去。
清洗过程中要保留的元数据包括:来源 URL、发布时间、语言、内容类型、可信度评分。这些字段在图谱冲突消解、版本管理和答案引用溯源阶段都会反复用到。尤其是可信度评分,我建议在一开始就设计好,不要等到数据量大了再补,否则历史数据全部要返工。
2.3 品牌本体建模:实体、关系、属性怎么定义
知识图谱的底层是本体(Ontology)。品牌领域不需要像通用知识图谱那样定义几百种关系,做重了反而是负担。MCS-GEO 只定义了六类核心实体和八类关系,但每类实体的属性都尽量压实。
实体类型包括:品牌、产品、人物、事件、荣誉资质、组织。关系类型包括:品牌发布产品、品牌任命人物、人物归属于组织、产品获得荣誉、事件发生于时间、事件涉及人物、产品隶属于产品线、品牌属于行业。
举个例子,用三元组表示就是:
:BrandA :releasedProduct :ProductX . :ProductX :belongsToProductLine :ProductLineA . :ProductX :wonHonor :HonorY . :ProductX :releaseTime "2024-03-15"^^xsd:date .这个图谱的构造逻辑来自 RAG 链路里的真实需求:当用户问“某品牌的某个产品有没有拿过某认证”,如果只做向量检索,需要跨三个文档拼接答案;但如果图谱里有上述三元组,一次查询就能拿到认证名称和产品 ID,再通过产品 ID 去检索对应文档生成详细描述,整个过程又快又准。
属性设计上遵循一个原则:可查询的字段建索引,不可查询的字段存原文。比如产品名称、发布时间、荣誉名称都建索引,因为它们是高频查询条件;而产品的详细卖点描述不建索引,交给 RAG 检索去处理。这个取舍避免了图谱层过度膨胀。
3. RAG 链路中的关键参数与工程化选择
3.1 文档切分策略:从固定窗口到语义块
RAG 链路里最容易被低估的是切分策略。早期我用最简单的固定长度切分,每 512 个字符一刀切,结果文档语义被腰斩,检索到的 chunk 经常答非所问。后来我把切分策略改成“标题层级 + 段落边界 + 语义重叠”三层组合。
具体做法是:按文档的标题结构先切出章节,比如“产品概述”“技术参数”“品牌历史”各自成为独立块;在章节内部按段落切分,同时保留单元格表格作为独立块;相邻块之间设置 150 字左右的重叠,防止 cutoff 切断关键上下文。块大小我控制在 800 到 1200 个中文字符,这个区间对大多数商用大模型 API 的上下文管理比较友好,既不会因为块太小导致信息缺失,也不会因为块太大导致检索噪声上升。
表格内容不走文本块,而是单独走上面提到的“表格还原模块”,转成图谱属性或者结构化摘要。这个过程的目标是保证检索阶段拿到的不是“每一列错位的骷髅文本”,而是有明确键值对的干净信息。
3.2 向量化与向量检索的参数细节
向量模型的选型,我直接采用开源的双语向量模型(具体型号不点名,因为你迁移到其他同类型模型时参数逻辑是一样的),输出维度 1024。选双语模型是因为品牌内容大量混用中文和英文,比如“CEO 在 CES 上发布了新产品”,单语模型在这类句子上的向量质量会明显下降。
向量索引我用了 HNSW 算法,核心参数我调了两组:构建时的 M 值设为 16,查询时的 efSearch 设为 64。M 值决定了图连接密度,太大索引体积膨胀,太小召回率下降;efSearch 决定查询时的探索范围,设太小容易漏掉相近邻居。召回数量 TopK 我取 20,但最后只把 5 个结果送进大模型。多出的 15 个是给重排模型做候选池用的,宁可多召回不能少召回,重排阶段会做精度修正。
还有一个容易忽略的细节:向量检索不能只对正文做 embedding。我给每个 chunk 生成的向量是一个“拼接向量”,由标题向量、实体标签向量、正文摘要向量三段拼成。这样检索“某品牌第二代智能手表”时,即使正文里没出现完整关键词,只要标题或实体标签匹配,也能被召回。
向量存储上,索引需要常驻内存,否则在线查询延迟会飙升到不可接受。数据量在百万级时内存开销还好;如果品牌库扩充到千万级,建议对向量做乘积量化压缩,但压缩后召回精度会略降,需要在测试集上验证。
3.3 混合检索与查询理解:向量、关键词和图谱怎么配合
线上系统实际跑的不只是向量检索。用户 question 进入系统后,先过一个轻量级查询理解模块,做三件事:意图分类(是问事实、问对比、还是问口碑)、实体抽取(识别出品牌名、产品名、人物名)、时间识别(识别“去年”“2023 年”这类时间约束)。
然后根据抽取结果并发执行三条检索路径:
- 向量检索:用 question 的 embedding 查 top20 文档块;
- 关键词检索:用实体名和名词短语走倒排索引,查 top10;
- 图谱查询:把识别出的实体映射到图谱节点,沿着关系边查关联三元组。
三条路径的结果最后做一次 融合排序(RFF,即对每个候选按排名倒数加权求和排序,不是简单按分数相加),把实体匹配命中、关键词命中和向量相似度都折算成统一的排序信号。图谱查询的结果不直接作为“文档”参与拼接,而是先转成一条“证据三元组”文本,比如:
[图谱证据] 品牌A 于 2024-03-15 发布 产品X,产品X 隶属于 产品线B。这样生成的答案里,模型既能拿到文档的详细描述,又能拿到图谱的精确关系锚点,两者互补。实测下来,加了图谱查询之后,多跳问题的准确率从 64% 提到了 87%,提升非常明显。
3.4 重排与答案生成:把幻觉压到最低
重排是 RAG 链路里容易被省略的一环。很多快速原型只做 TopK 截断,但 TopK 截断保住的只是向量相似度高的块,不一定是与问题最相关的块。我用交叉编码器模型做第二遍精排,模型会给每个候选块直接打“相关性分数”,这一步比向量余弦相似度准不少,但速度慢,所以只对 Top20 的候选过一遍,取分数最高的 5 个送进生成模型。
生成侧的 prompt 设计,有一条铁律:要求模型只能基于提供的资料回答,不允许调用内部记忆补充。系统提示词里会写清楚:如果资料无法回答问题,必须回答“根据现有信息无法确认”,并提供已经检索到的相关线索。另外要求模型在列举事实时,把来源标记为 [1][2],对应输入里的证据块序号,这样前端可以把答案链接回原始页面。
我还在 prompt 里额外注入图谱三元组作为“高优先证据”,并提示模型:当文本资料和图谱结论冲突时,以图谱为准。这一招听起来简单,但对压住矛盾信息非常有效,因为模型在回答时有了明确的优先级,不会再左右摇摆。
4. 工程落地过程与真实调试记录
4.1 从零搭建图谱流水线
图谱的构建不能靠人工录入,必须走自动化流水线,但也不能完全脱离人工审核。MCS-GEO 的图谱流水线分为五步:命名实体识别、关系抽取、实体对齐、冲突消解、图数据库写入。
命名实体识别和关系抽取是用专门的抽取模型做的,但这里踩了一个很大的坑:通用的抽取模型虽然对“人、地、组织”识别得不错,但对品牌专名的识别率非常差。比如“某系列智能手表”会被拆成“某系列”和“智能手表”两个词,甚至干脆漏掉。后来我改用“种子词典 + 远程监督”的方式:先从官网产品列表抽出一批种子实体,再回到文档里标注这些实体出现位置,用这些自动标注数据微调抽取模型。两轮迭代后,品牌专名的识别率从 60% 提到了 92%,这个水平才勉强能用。
实体对齐同样是重灾区。同一款产品在官网叫“二代智能手表”,在新闻稿里叫“Watch 2”,在评测文章里叫“新款手表二代”。如果没有对齐,图谱里会出现三个节点,查询时只能命中其中一个。我的做法是引入属性相似度计算:产品名称归一化、发布时间比对、发布主体比对,三者同时匹配才合并节点。宁可漏合并,不能错合并,因为错误合并会把两条不同产品的信息污染到一起,比漏合并更致命。
4.2 增量更新与版本化策略
品牌信息是动态的,半年不更新,图谱就会开始提供“过期答案”。但每天都全量重建图谱是不现实的,成本太高,而且容易造成线上服务抖动。我采用“增量 + 版本化”方案:新数据采集进来后,先进入待处理队列,抽取实体和关系,然后与图谱现有节点做对齐;如果是对已有节点的新增信息,则创建新版本,保留旧版本但标记为过期。
这里的关键设计是“有效期”。新闻类数据天然带时间戳,我设定:距离发布时间超过一年的新闻,在图谱查询中权重降低;超过三年的,除非是历史事件类信息,否则默认不参与回答。这个策略让系统不会拿三年前的旧新闻回答用户“最近怎么样”这类问题。
冲突消解也要在这个阶段一起做。比如来源 A 说产品 X 在 3 月发布,来源 B 说在 4 月发布,两条数据会同时出现在图谱里。我的处理规则是:官网和官方新闻稿的权重最高,社交媒体的权重最低;同一事实两个来源权重相近时,取发布时间更近的那条,并把另一条作为“争议信息”记录下来供人工抽检。每次人工审核确认一条冲突解决规则,就去更新规则库,系统会越来越准。
4.3 性能优化与成本控制实录
上线初期我测过链路时延,平均在 4 到 5 秒之间,对问答系统来说太慢了。逐段分析后发现,耗时大头在大模型 API 的生成时间,其次是向量检索和重排。优化方向很明确:减少喂给大模型的 token 量,减少不必要的 API 调用。
第一刀切在答案缓存上。同一问题 48 小时内重复出现,直接返回缓存答案。品牌问答的重复率其实很高,尤其“XX品牌怎么样”“XX产品参数”这类高频问题。加了缓存之后,整体 API 调用量下降了约 40%,响应时间直接从 4 秒降到 1 秒内。
第二刀切在 prompt 塞入内容量上。之前为了“全覆盖”,每轮都尽量塞满上下文窗口,但后来发现塞入太多无关片段反而影响模型对重点的把握。改成只塞 5 个精排后的文档块 + 图谱三元组证据,token 减少一半,答案效果没有下降,反而更稳定了。
第三刀切在重排模型的推理上。精排虽然只跑 Top20,但单个请求仍然耗时 200 到 400 毫秒。我把重排模型的 batch size 加大到一次处理 20 个候选,同时做了动态 batch 聚合,吞吐量提升了近一倍。向量索引的内存优化则比较常规,主要把 HNSW 图的连接参数稍微收紧,减少了在内存中的索引体积。
5. 评估体系建设、避坑清单与实用技巧
5.1 怎么证明这套系统真的有用
评估体系建设是这类项目最容易拖到最后才做的事,但评估应该从第一天就开始。MCS-GEO 的评测集差不多攒了 300 条真实用户问法,覆盖产品参数、品牌历史、人物关系、行业对比、荣誉资质等高频类型。评测指标我分四个维度:
忠实度:答案是否严格基于检索到的资料和图谱证据,有没有模型自行编造的内容。 相关性:答案是否真正回答了用户问题,而不是答了一堆相关内容但回避要点。 品牌一致性:品牌名称、产品线、时间线是否与官方口径一致,有没有历史信息错误。 引用准确率:答案中标注的来源是否真实存在于检索结果中,能否链回原文。
实测数据方面,没有知识图谱的纯 RAG 基线,忠实度约为 71%,加入图谱三元组证据后提升到 89%;品牌一致性从 63% 提升到 91%,这个指标对品牌方来说是最敏感的,也是他们愿意为系统持续付费的核心原因。因为模型自己生成的“听起来像那么回事但其实是错的”品牌信息,对公关和法务部门来说是不可接受的。
评测集需要持续维护,每个月往里面补充新的问题类型。特别是真实用户日志里出现但评测集没有覆盖的 query,要人工打标后加入回归集里。我踩过这个坑,前期评测集没有对比类问题,结果上线后用户大量问“A 和 B 哪个好”,系统回答逻辑一塌糊涂。
5.2 复盘中的三个典型坑
坑一:PDF 表格直接切块导致参数错乱。最初处理产品白皮书 PDF 时,我图省事直接转文本后进 RAG 链路,结果智能手表充电功率被回答成 40W,而真实值是 4W。排查后发现表格在转文本过程中丢失了表头列名,数值和列名错位。后面我专门写了一个“基于坐标解析 PDF 表格”的模块,按页面坐标还原单元格,然后校验表头完整性,数值型字段做范围和单位校验。这个坑最大的教训是:结构化信息(表格、参数、时效数据)绝不能走纯文本 RAG,必须走结构化抽取通道。
坑二:同名实体在不同语境下的冲突。某品牌旗下有一个产品系列名称,和另一个行业公益项目的名字撞了,早期图谱把两个实体直接合并,导致问答时乱入。解决办法是给实体对齐增加“语境特征”:产品系列后面经常跟着“型号”“发布”“售价”这类词,公益项目后面经常跟着“发起”“志愿者”“年份”。对齐条件必须同时满足名称相似和语境特征相似,才能合并。
坑三:重排模型分数阈值没校准。重排模型输出的分数分布不是均匀的,早期我没设置阈值,导致低频问题的 Top5 里塞满了低分噪声块,噪声块进入 prompt 后把模型带偏,回答效果反而比不做重排更差。后来我在评测集上统计不同查询类别下的分数分布,分别设置阈值,低于阈值的宁可只送 2 个证据块,也绝不硬凑 5 个。少而精的证据块,在生成阶段的效果明显更好。
5.3 几个能直接落地的优化技巧
冷启动阶段先跑小规模人工标注。别等数据全部就绪再启动系统,先用 100 条精选问答对 + 50 篇种子文档把链路跑通,让团队在线下看到强反馈,再扩大到全量数据。
Prompt 里带上图谱路径说明。每次问答给模型的 prompt 里,除了证据块原文,再加一行“图谱路径:品牌A -> 产品X -> 荣誉Y”。这行字帮助模型理解实体间的连接关系,对回答“有没有”类问题很有帮助。实测对多跳问答的准确率提升明显。
持续用真实日志回流。每周导出线上问答日志,筛出“用户换了一种问法重新提问”或“用户对答案点了不满意”的记录,人工分析后把新问题补进评测集,同时辨别是不是检索链路漏召回导致的。这个循环做得越勤,系统迭代越快。
监控要覆盖图谱数据时效。我上线了一个简单告警任务:每天统计图谱中距上次更新时间超过 90 天的活跃节点数量,超过阈值就报警。品牌行业很容易出现“某个人已经离职但图谱仍然写他是现任 CEO”这种问题,没有时效监控,线上用户会先发现。
6. 落地经验总结与后续扩展方向
6.1 给有同样需求的团队一点建议
如果团队准备做类似的品牌级 RAG 或知识图谱系统,我最大的建议是:千万不要一上来就追求“大而全”。知识图谱的构建成本主要不在技术,而在数据治理。你至少要投入三分之一的人力做实体对齐和冲突规则梳理。该项目采用的方式是先锁定一个高频业务场景(品牌问答),从三类数据源出发,先把一条链路跑通、跑稳,再横向扩展。系统早期切了 5 万个节点,现在跑得很稳;如果当时想覆盖全网品牌信息,恐怕到现在还在打磨数据,系统根本没法上线。
另外要理性看待大模型 API 和自研小模型的边界。生成环节用成熟的商用 API 是最稳妥的,因为品牌问答对语言组织能力要求较高,小模型会明显吃亏。重排和命名实体识别则用自建的小模型,成本低、可控性强、方便迭代。这种“大模型做生成、小模型做理解”的分工,工程上性价比最高。
6.2 知识图谱在品牌场景里的更多玩法
MCS-GEO 目前支撑的是品牌问答和品牌信息可视化。但图谱铺好后,很多衍生应用几乎是顺水推舟的事。比如品牌竞争分析,在同一张图谱里放两个竞争品牌,就能做多维对比问答:“A 和 B 在智能穿戴领域的专利数量对比”“A 最近一年发布的新品方向和 B 的差异”。再比如合规审查场景,把广告文案里的产品描述和图谱里的官方参数做交叉验证,就能自动识别“夸大宣传”的问题,这对品牌方的市场部门非常实用。
再往远处说,当图谱数据积累到百万级三元组,它本身就成了品牌资产的一部分。品牌方可以做舆情分析、KOL 关系判断、行业趋势洞察,每一个方向都是图谱能力的延伸。但本质上,所有延伸都建立在稳定、干净、可持续更新的图谱底座之上。所以工程基座的价值,会随着时间推移越来越明显。
我个人做完这套系统的体会是,RAG 和知识图谱不是替代关系,而是互补关系。RAG 擅长兜住长篇大段的非结构化内容,知识图谱精确锚定实体关系。把两者有机结合起来,才是品牌类 AI 应用真正能稳定落地的姿势。最后再分享一个小技巧:图谱三元组just as important as the文档本身,上线前一定要抽一批用户真实问题,专门验证图谱证据有没有把答案带偏,这一步别省。