本文由 莫潇羽@复源AI社区(bbs.fuyuan7.com)撰写,转载请注明出处。
快速摘要
如果你只想要一个结论:AI监测的本质,不是"截图看AI有没有提到你",而是对一个概率系统做统计采样。 大模型回答同一个问题,今天提到你、明天不提,很多时候不是模型"变心",而是它底层的检索链路(RAG)、采样温度(temperature)、实时信源三者叠加出来的随机波动。所以任何靠"手动搜几遍、截个图"交付的监测,本质上是在拿噪声当信号。 真正能落地的GEO监测系统,必须做三件硬事:一是用分层提示词库把"用户可能怎么问"穷举出来;二是对每个问题做多次采样,用提及率、声量份额、推荐位序、情感倾向这些统计量替代单次观测;三是把AI回答里的品牌实体、引用信源、竞品位置结构化抽取出来,才能回答"为什么掉"而不只是"掉了多少"。
这篇文章我不聊"哪个工具好用",也不做产品测评。我想把AI搜索背后的检索原理、回答波动的成因、以及一套监测系统在工程上到底要拆成哪些模块,一层层讲清楚。搞懂了机制,你自然就知道一个监测工具该有什么、不该信什么了。
范围会覆盖:RAG检索的四段链路、回答波动的六个技术来源、多次抽样的统计学依据、监测系统的五大模块、指标体系的量化公式、国内外生态差异,以及国内环境下绕不开的合规边界。想看完整拆解,往下翻。
一、先把问题问对:AI监测到底在测什么
先说个我自己踩过的坑。刚开始研究这块的时候,我也是每天打开豆包、DeepSeek、元宝,把客户品牌名连着几个行业问题挨个问一遍,截图存档,第二天再来一遍。干了两周,我发现一个让人抓狂的现象:同一个问题、同一个模型、同一天,我上午问和下午问,答案里的品牌顺序能完全不一样,甚至上午还在推荐榜第一,下午直接消失。
那一刻我意识到,我一直在用一个错误的心智模型看AI搜索。
传统SEO时代,我们脑子里装的是"排名"这个概念——你在百度搜"项目管理工具",结果页第几位,是相对稳定的,今天第三明天大概率还是第三。这背后是一套确定性的排序算法:给定同样的输入,输出基本一致。可AI搜索不是这么回事。当你问大模型"推荐几款项目管理工具",它给你的不是一个排好序的链接列表,而是一段现场生成的文字。这段文字是模型从一个概率分布里,逐个词采样拼出来的。
这里有个关键区别,值得用一句话点透:SEO争夺的是"排第几",GEO争夺的是"被不被写进那段话里"。 前者是排名问题,后者是概率问题。你的品牌能不能出现在AI的回答里,本质上是"模型在生成这段文字时,把你的品牌token采样出来"的概率有多高。这个概率不是0就是1的开关,而是一个介于两者之间、还会随时间抖动的值。
想通这一层,"AI监测在测什么"这个问题的答案就变了。它测的不该是"这一次AI提没提到你"(这只是一次采样,是随机变量的一个取值),而应该是这几件事:
第一,在用户真实会问的一批问题上,你的品牌被提及的概率是多少。这是提及率(Mention Rate),是监测最底层的量化指标。
第二,当AI提到你的时候,你站在什么位置、被怎么评价。是首选推荐还是"也可以考虑一下",是正面还是中性,出现在回答开头还是结尾。位置和语气决定了曝光的质量,而不只是曝光的有无。
第三,AI这段回答的"事实依据"是从哪来的。它引用了哪些网页、哪些平台的内容作为信源。这一条最容易被忽略,却是"为什么掉"的答案所在——因为AI的回答很大程度上是被它检索到的信源喂出来的。
我把这三层关系画成一张图,方便你建立整体认知:
flowchart LR
A[用户真实提问] --> B[大模型概率生成回答]
B --> C{监测三层}
C --> D[提及概率<br/>提没提到你]
C --> E[曝光质量<br/>位置与情感]
C --> F[信源溯源<br/>依据从哪来]
D --> G[量化为提及率]
E --> G
F --> G
G --> H[可追踪的可见度趋势]
一旦把"AI提没提到你"从"一个事实"重新理解成"一个随机变量的采样结果",后面所有的工程设计——为什么要多次采样、为什么要建提示词库、为什么要做信源溯源——就都顺理成章了。这也是我这篇文章想帮你打通的第一个认知关卡:监测不是记录,是测量;测量的对象不是事实,是分布。
二、AI是怎么"想起"一个品牌的:RAG检索链路拆解
要理解回答为什么会变、监测该抓什么,绕不开一个词:RAG(检索增强生成,Retrieval-Augmented Generation)。这是目前几乎所有带联网/搜索能力的大模型产品——豆包、DeepSeek、元宝、Kimi、夸克、千问——在回答时事性、事实性问题时的通用架构。用一句大白话解释:模型不完全"凭记忆"回答,而是先去外部资料库"翻资料",再"看着资料"组织答案。
为什么必须这样?因为纯靠模型自身的参数记忆有两个硬伤:一是知识有截止日期,训练完之后发生的事它不知道;二是容易"一本正经地胡说八道"(也就是幻觉)。RAG就是给模型外挂一个实时的、可检索的资料库,让它回答有据可依。
对做GEO和监测的人来说,理解RAG的意义在于:你的品牌能不能进入AI的回答,取决于你的内容能不能在这条检索链路的每一段都"活下来"。 我把这条链路拆成四段来讲。
2.1 第一段:意图识别与查询改写
用户问的话往往是口语化、模糊的,比如"有没有便宜点又好用的团队协作软件"。模型不会直接拿这句话去检索,而是先做意图解析:拆出用户到底想要什么(协作软件 + 价格敏感 + 团队场景 + 易用性),然后把这个意图改写成一条或多条更适合检索的查询(query rewriting),比如"高性价比团队协作工具推荐""中小团队协作软件对比"等等。
这一段对监测的启示很直接:用户嘴上问的和系统实际检索的,不是同一句话。 所以你监测的时候,如果只盯着一个字面问题,会漏掉大量长尾。真实的用户意图是发散的,你得用一批语义相近、角度不同的问题去覆盖,才能逼近模型实际会触发的检索空间。这也是后面我讲"提示词库要分层"的技术根源。
2.2 第二段:召回——把可能相关的资料捞出来
改写完查询,系统要去海量文档里把"可能相关"的一批捞出来,这一步叫召回(Retrieval)。召回追求的是"宁可多捞、不能漏",也就是高召回率。主流有三条技术路线,我用一张表对比:
|
召回方式 |
技术原理 |
擅长 |
短板 |
|
BM25(稀疏检索) |
基于词频统计的关键词匹配 |
精确命中关键词、专有名词 |
不理解语义,换个说法就匹配不上 |
|
向量检索(稠密检索) |
把文本编码成向量,算语义相似度 |
理解同义、近义、语义相关 |
精确关键词有时反而不够准 |
|
混合检索(Hybrid) |
BM25 与向量检索结果融合 |
兼顾关键词与语义,鲁棒性好 |
工程复杂度高,要调融合权重 |
这里要给新手解释两个词。向量,你可以理解成把一段文字翻译成一串数字坐标,语义越接近的文字,坐标离得越近;机器就靠算坐标距离来判断"这两段话是不是在说相似的事"。Embedding(嵌入) 就是做这个"文字转坐标"翻译工作的模型。
生产环境里,成熟的系统基本都用混合检索。原因很朴素:BM25能精确匹配你的品牌名,但用户未必会带着你的品牌名提问;向量检索能理解"团队协作软件"和"团队协同工具"是一回事,但对特定型号、专有名词有时不够准。两者融合,才能既不漏关键词、又不丢语义。
对GEO的实战含义是:你的内容既要有清晰的关键词锚点(让BM25能命中),又要有充分的语义铺陈(让向量检索能关联)。 只堆关键词不行,只写"高级但不点题"的内容也不行。
这里还要补一个很多人不知道、但直接影响你能不能被检索到的环节——内容分块(chunking)。检索系统不是拿你整篇文章去建索引的,而是先把长文切成一小段一小段(chunk),每一段单独编码成向量、单独参与检索。切法直接决定检索效果:切得太碎,一段话的完整语义被拦腰截断,检索时匹配不上;切得太大,一段里塞了好几个主题,向量表示被"稀释",相关性也算不准。所以内容结构清晰、每一小节自成逻辑闭环的文章,天然比"一大段糊到底"的文章更容易被精准检索。这也是为什么我一直强调GEO内容要"小标题清晰、段落自洽"——这不是排版审美,而是在配合检索系统的分块逻辑。你写内容时多一层"这段单独拎出来,AI还看得懂吗"的意识,命中率就会不一样。
2.3 第三段:重排——从"大概相关"到"精准相关"
召回阶段为了不漏,通常会捞回几十条候选(TopK,比如50条)。但塞给模型的名额很少(TopN,往往只有3到5条)。谁能从50进3,靠的是重排(Rerank)。
召回和重排用的是两类不同的模型,这个区别很关键,我尽量讲直白:
- 召回阶段用的是双塔模型(Bi-Encoder):问题和文档分开编码成向量,再算距离。好处是快——文档向量可以提前算好存起来,查询时只算问题向量就行,毫秒级返回。坏处是问题和文档在编码时"互相看不见对方",只能算个"大概相关"。
- 重排阶段用的是交叉编码模型(Cross-Encoder):把问题和文档拼在一起送进模型,模型能同时看到双方内容,逐条精算相关性。好处是准,坏处是慢,所以只用来给召回后的少量候选做精排。
一句话概括这两段的分工:召回负责"不遗漏",重排负责"精准投喂"。 衡量它们好坏的指标你也可以记一下:命中率(Hit Rate,该找的有没有找回来)、NDCG 和 MRR(排序质量,对的东西有没有排在前面)。
我把召回加重排这段画成流程图:
flowchart TB
Q[改写后的查询] --> R1[召回 TopK≈50 条]
R1 --> R1a[BM25 关键词]
R1 --> R1b[向量语义]
R1a --> M[融合]
R1b --> M
M --> RR[Cross-Encoder 重排]
RR --> T[精排 TopN≈3 到 5 条]
T --> GEN[进入生成环节]
这一段对监测的意义在于:你的品牌"被提及",前提是你的内容能从几十条候选里挤进最终那三五条。 而重排的判断标准偏向"这段内容和这个问题到底有多贴、信息密度够不够高、够不够权威"。这解释了一个我反复验证过的现象:AI偏爱"事实密集型"内容——带具体数据、明确结论、清晰结构的内容,比空泛的品牌自夸更容易被重排选中。
2.4 第四段:生成——从检索结果到最终那段话
进了TopN,还没完。最后模型要把这几条资料"读一遍",再用自己的话组织成一段连贯回答。这一步决定了:你的品牌是被写成"首选推荐",还是被一句"此外还有XX"带过;是被正面描述,还是被拿来当反面对比。
而这一步,恰恰是随机性最大的地方——同样的检索结果,模型每次生成的措辞、顺序、详略都可能不同。这就直接引出了下一章要讲的核心问题:回答为什么会变。 只有把这条完整链路(意图改写 → 召回 → 重排 → 生成)在脑子里跑通,你才能理解波动到底出在哪一段,也才知道监测系统该在哪一段埋点。
我(莫潇羽@复源AI社区)自己的经验是,很多人做GEO效果忽好忽坏,问题根本不在"内容发得够不够多",而在于他们从来没想清楚:自己的内容到底卡在了这四段链路的哪一段。是关键词太弱、召回都进不去?还是信息密度不够、重排被刷下来?抑或是内容进了检索但表述太弱、生成时被一笔带过?这三种"掉",对应的优化动作完全不同——而要区分它们,靠的正是一套能做信源溯源的监测系统。
三、为什么昨天还推荐、今天就没了:波动的六个技术来源
这是每个做GEO交付的人都会被客户追问的问题:"为什么昨天AI还推荐我们,今天就不提了?"如果你的回答是"可能模型更新了吧",客户不会满意,因为这等于什么都没说。真正专业的回答,是能把波动拆到具体成因上。结合前面那条RAG链路,我把常见的波动来源归纳为六类,每一类都对应链路上一个具体的环节。
3.1 采样随机性:模型天生就"掷骰子"
大模型生成文字时,每一个词都是从概率分布里采样出来的,控制这个"放飞程度"的参数叫温度(temperature)。温度高,输出更多样、更发散;温度低,输出更保守、更确定。很多联网问答产品为了让回答显得自然、不呆板,温度不会设成0。
结果就是:哪怕问题、模型、信源全都一样,两次生成的措辞和品牌顺序也可能不同。 更反直觉的是,就算把温度设成0,回答也未必完全稳定——因为底层还有并发计算的浮点误差、以及自回归生成的累积效应(前面一个词的微小差异,会被后面的生成逐步放大)。
这一条是最基础、也最容易被误读的波动源。客户看到"今天没提到"就以为出事了,其实很可能只是一次正常的随机采样落到了"没提到"那一侧。如果你只观测一次,你根本没法区分"真的掉了"和"这次恰好没采到"。
3.2 模型版本更新:地基悄悄换了
国内大模型的迭代速度非常快。厂商可能在没有任何公告的情况下,更新底层模型、调整对齐策略、或者改动检索管线。地基一换,同样的问题,回答风格、信源偏好、品牌倾向都可能整体位移。这类波动的特征是"突变且持久"——不是抖动,而是换了一个新的基线。监测系统如果有足够长的历史数据,是能把这种"台阶式变化"和日常抖动区分开的。
3.3 信源实时变化:RAG检索到的资料变了
这是最值钱、也最能体现监测专业度的一类。RAG是实时检索的,AI这次回答依据的信源,和上次未必是同一批。可能是:某个高权重信源更新了内容、某篇被频繁引用的文章被删了、或者搜索侧的索引发生了变化。信源一变,喂给模型的"事实"就变了,回答自然跟着变。
所以当客户问"为什么掉了",一个能做信源溯源的监测系统可以给出这样的回答:过去七天,这个问题的AI回答引用信源里,新增了几个竞品占据的高权重页面,而你的官网有两条关键信息没有同步更新,导致在重排阶段被竞品内容挤下去了。这才是客户愿意付费的诊断。
3.4 查询改写漂移:问题被"翻译"成了另一句
前面讲过,模型会把用户的问题改写成检索查询。这个改写本身也有随机性。同一个口语问题,这次被改写成偏"价格"的查询,下次被改写成偏"功能"的查询,触发的检索结果就不同,命中的品牌也不同。这类波动藏在链路最前端,肉眼几乎不可见,只有靠大批量、多角度的提问覆盖,才能把它的影响摊平。
3.5 竞品信源挤占:不是你变差,是对手变强
AI回答的名额是有限的(TopN就那么几个)。你的可见度下降,未必是你自己出了问题,很可能是竞品在你没注意的时候,密集铺了一批高权重内容,把检索候选里原本属于你的位置抢走了。这种"此消彼长"必须靠竞品对标监测才能发现——只看自己的数据,你会误以为是自己的锅,方向就找错了。
3.6 幻觉:模型自己"记串了"
大模型的幻觉分几类:事实性幻觉(张冠李戴、编造不存在的信息)、推理性幻觉(逻辑链断裂)、上下文不一致(违背给定条件)。幻觉是概率生成机制的固有副产物,无法根治,只能缓解。表现在监测上,就是AI偶尔会把你的品牌描述错、把别家的特性安到你头上、或者凭空编个你根本没有的功能。这类问题往往是零星、不稳定出现的,但一旦被客户或用户看到,杀伤力很大,所以需要监测系统能捕捉到"负面/错误提及"这个信号。
我把这六类波动,连同对应的RAG环节和监测应对,整理成一张速查表:
|
波动来源 |
对应RAG环节 |
特征 |
监测应对 |
|
采样随机性 |
生成 |
高频抖动、无规律 |
多次采样求统计量 |
|
模型版本更新 |
全链路 |
突变且持久(台阶式) |
长周期基线对比 |
|
信源实时变化 |
召回、重排 |
与信源改动同步 |
信源溯源与快照 |
|
查询改写漂移 |
意图改写 |
隐蔽、难直接观测 |
多角度提问覆盖 |
|
竞品信源挤占 |
召回、重排 |
此消彼长 |
竞品对标监测 |
|
幻觉 |
生成 |
零星、随机、可能负面 |
情感与准确性识别 |
看懂这张表,你就掌握了回答"为什么掉"的方法论:先看是不是全链路突变(版本更新),再看信源和竞品有没有变(溯源),排除掉这些还在抖,那大概率就是采样随机性,得靠更大的采样量来判断趋势。 归因清楚了,优化动作才有的放矢。
四、监测的第一性原理:为什么必须"多次抽样"
前一章其实已经把结论逼出来了:既然AI回答是个带随机性的概率系统,那么任何单次观测都是噪声,不是信号。 这就是我认为整个GEO监测最重要的第一性原理——你测的不是一次结果,你测的是一个分布。
打个比方。你想知道一枚硬币是不是均匀的,抛一次看到正面,你能下结论吗?显然不能。你得抛很多次,数正面出现的比例,比例越接近某个稳定值,你对这枚硬币的判断才越可信。AI监测是一模一样的逻辑:问一次AI提到了你,说明不了什么;问它一百次,其中七十八次提到你,"提及率78%"这个数才是有意义的信号。
所以那个在业内被反复提到的核心指标——提及率(Mention Rate),它的严格定义是:在N次相同或语义等价的查询中,品牌被提及的次数占比。它本质上是对"品牌被采样出来的概率"这个真实参数的一个统计估计。N越大,估计越接近真值。
这里有个绕不开的工程权衡:采样次数不是越多越好,因为每次采样都要消耗算力、token和时间成本。到底采多少次够?这背后是统计学里的样本量问题。粗略地说,你想让估计的误差范围(置信区间)足够窄,样本量就得足够大;而误差范围随样本量的增加是边际递减的——从10次加到50次,精度提升明显;从500次加到1000次,提升就很有限了。实战中,单个问题几十次量级的采样,通常就能把大部分随机抖动摊平,得到一个相对稳定的提及率。
举个直观的例子来感受"样本量决定可信度"这件事。假设某个问题的真实提及率是50%,你只采样4次,结果可能是提到2次(50%),也可能一次都没提到(0%)或全都提到(100%)——4次太少,随机波动能把结论带偏到面目全非,你根本没法据此判断"到底行不行"。可如果你采样30次,命中次数落在12到18次之间(也就是40%到60%)的概率就相当高了,得到的"50%左右"这个结论就靠谱多了。再加到100次,估计会进一步向真值收窄。这就是为什么"采样次数不够,数据再漂亮也不能信"——一个基于个位数采样得出的"提及率100%",很可能只是运气好,换个时间再测就打脸。所以我给团队定过一条硬规矩:任何要写进客户报告的提及率,背后的采样次数必须达到设定的下限,达不到的数据宁可标注"样本不足、仅供参考",也不能拿去当结论交付。这条规矩帮我们避免过好几次"数据翻车"的尴尬。
我用一段伪代码把"多次采样求提及率"的逻辑写出来,方便你建立直观(这是示意逻辑,不是可直接运行的生产代码):
# 对单个问题做 N 次采样,估计品牌提及率
def estimate_mention_rate(question, brand_aliases, model, N=30):
hit = 0
positions = [] # 记录每次品牌出现的位序
sentiments = [] # 记录每次的情感倾向
for i in range(N):
answer = model.ask(question) # 每次独立采样一次回答
matched = brand_match(answer, brand_aliases) # 规则+NER 双重识别
if matched:
hit += 1
positions.append(matched.position) # 第几个被提及
sentiments.append(analyze_sentiment(matched.context))
mention_rate = hit / N # 提及率 = 命中次数 / 采样次数
return {
"mention_rate": mention_rate,
"avg_position": mean(positions) if positions else None,
"sentiment_dist": distribution(sentiments),
"samples": N,
}
注意这段伪代码里的几个细节,全是从前面的原理推导出来的:品牌识别要"规则加NER双重"(因为品牌有简称、别名、变体写法,纯关键词会漏,纯模型会误判);不光记"提没提到",还记"第几个提到"和"什么语气"(因为曝光质量和曝光有无一样重要);每次都是独立采样(因为我们要的是分布,不是一次结果)。
这一章的落点很硬核,但也很朴素:"截图交付"之所以不专业,不是因为截图这个动作low,而是因为它在方法论上就错了——它把一次采样当成了结论。 一个真正能打的监测体系,从底层设计上就必须是"批量提问 + 多次采样 + 统计汇总"的,这不是锦上添花的功能,而是它能不能提供可信数据的前提。想明白这点,你再去看市面上任何一个监测方案,第一个要问的问题就应该是:它是采样一次给你看,还是多次采样给你算? 这一个问题,就能筛掉一大半只是"帮你自动截图"的伪监测。
五、一套GEO监测系统到底该有哪些模块
前面把"为什么"讲透了,这一章讲"怎么搭"。我把一套能真正落地、能支撑多客户交付的GEO监测系统,拆成五个模块。这不是某个具体产品的结构,而是从前面的原理反推出来的、绕不开的功能骨架。先上整体架构图:
flowchart TB
subgraph 输入层
P[分层提示词库]
end
subgraph 采集层
S1[多平台调度器]
S2[限流与重试]
S3[返回格式归一化]
end
subgraph 解析层
N1[品牌实体识别]
N2[位序提取]
N3[情感分析]
N4[信源溯源]
end
subgraph 指标层
M1[提及率/位序/情感]
M2[声量份额/跨模型一致性]
M3[AIV综合评分]
end
subgraph 应用层
D1[时序存储]
D2[可视化看板]
D3[异常告警]
end
P --> S1 --> N1 --> M1 --> D1
S1 --> S2 --> S3
N1 --> N2 --> N3 --> N4
M1 --> M2 --> M3
D1 --> D2 --> D3
下面逐个模块拆。
5.1 输入层:分层提示词库,决定了你监测的"视野"
提示词库是整个系统的输入源,它的质量直接决定你能监测到什么。前面讲RAG时说过,用户的真实意图是发散的,而模型还会做查询改写,所以你不能只用一个字面问题去测。成熟的做法是把问题按"用户意图阶段"分层构建。我常用的分层结构大致是这样:
|
层级 |
类型 |
示例(以"项目管理工具"为例) |
监测目的 |
|
品类词 |
泛需求 |
"有哪些好用的项目管理工具" |
看你在整个品类里的基础存在感 |
|
对比词 |
择优 |
"A和B哪个更适合中小团队" |
看你在正面竞争里的胜率 |
|
场景词 |
用例 |
"远程团队怎么做任务协同" |
看你在具体场景下的覆盖 |
|
问题词 |
痛点 |
"项目老是延期怎么用工具管控" |
看你能不能切进真实痛点 |
|
品牌词 |
认知 |
"XX这个工具怎么样、靠谱吗" |
看AI对你品牌的直接描述与口碑 |
原文里那种"监控词 + 核心词 + 具体问题"的三层思路,本质上就是这个逻辑,只是我更倾向于按"用户意图漏斗"来分,因为这样每一层测出来的数据,能直接对应到不同的优化动作。比如品类词提及率低,说明你基础曝光不足,要补泛内容;对比词胜率低,说明你在正面PK里信源不够硬,要补对比类权威内容。
一个实操提醒:品牌词要把简称、别名、英文名、常见错写全都收进词典。我吃过亏——某个客户品牌有个通用简称,最早词典里没收,导致大量本该算"提及"的回答被漏判,提及率被严重低估。这是后面解析层实体识别的基础,务必在输入层就做扎实。
5.2 采集层:多平台、限流、归一化
采集层负责真正去"问"这些大模型。国内的现实是平台很多、彼此差异很大,工程上有三个绕不开的点。
一是多平台调度。 豆包、DeepSeek、元宝、Kimi、夸克、千问、百度AI、微博智搜等等,每家的接口形态、参数、返回结构都不一样。你需要一个统一的调度器,把"对哪个平台、用哪个问题、采样几次"这些任务编排好,并发地跑起来。
二是限流与重试。 每个平台都有自己的请求频率限制(rate limit),触发了就会被拒。所以调度器里必须有全局的请求节流机制,常用令牌桶或滑动窗口算法来平滑请求速率,配合失败重试和退避策略,避免把任务打挂。这里我给一段调度侧的示意伪代码:
# 令牌桶限流下的多平台采样调度(示意)
class RateLimitedScheduler:
def __init__(self, platforms, qps_per_platform):
self.buckets = {p: TokenBucket(qps_per_platform[p]) for p in platforms}
def run(self, tasks):
results = []
for task in tasks: # task = (platform, question, sample_times)
bucket = self.buckets[task.platform]
for _ in range(task.sample_times):
bucket.acquire() # 拿不到令牌就等待,平滑速率
resp = call_with_retry(task.platform, task.question,
max_retry=3, backoff="exponential")
results.append(normalize(resp)) # 关键:立刻做格式归一化
return results
三是返回格式归一化。 不同模型返回的结构千差万别,你不能让这种差异污染到后面的解析逻辑。正确做法是定义一个统一的中间数据结构,在采集层的适配器里就把各家返回"翻译"成同一套字段。核心字段至少包括:原始回答全文、命中的信源列表、响应时间、模型版本标识、采样时间戳。有了这层归一化,上层解析和指标计算就可以完全不关心底层是哪个平台。
5.3 解析层:把一段文字变成结构化数据
采集回来的是一堆自然语言回答,解析层的任