2026年GEO检测的计数口径:提及次数、引用条数与分母怎么定

本文聚焦2026年GEO检测中四个核心可复算计数字段:题数(分母)、提及次数、首位提及次数、引用条数。强调摒弃不可复现的加权总分,明确提及判定依赖字符串比对而非模型输出,引用仅认结构化字段,域名归并需先聚合再分类。指出分母定义、失败题处理、平台一致性是工程落地关键,适用于前端采集、Chrome插件、GitHub自动化管线等信息技术场景。

先说结论:一套 GEO 检测报告里,最值钱的不是那个"总分",而是四个能被人复算的计数——题数(分母)、提及次数、首位提及次数、引用条数。这四个数定错口径,后面所有优化动作都会打偏。

这篇文章拆三件事:为什么加权总分在工程上不可复现、计数字段该怎么设计、以及把计数做成管线之后踩过的坑。

一、加权总分为什么不可复现

过去两年行业里流行"几十项指标加权成一个百分制"。从工程角度看,这种做法有三个无法解决的结构性问题。

第一,权重没有来源。提及次数、首位次数、引用条数、情感倾向、竞品差值,谁占 30% 谁占 20%,没有任何外部标准能背书。换一家服务商算同一批数据,结果可以差 20 分而两边都不算错。

第二,分母不透明。同样写"提及率 35%",可能是 20 题里的 7 次,也可能是 200 题里的 70 次。前者连方向性结论都撑不住——同一平台少于 20 题,波动就会盖过差异。

第三,不可重放。答案由模型当次现场生成,同一题连问三次推荐名单就会变。加权分把这三次的差异抹平成一个数,客户手上没有任何东西可以去复算"为什么会是这个分"。

所以 2026 年更稳的做法是:只交付原始计数,不做主观打分。想排序可以,但排序必须建立在同一分母、同一时间窗口、同一平台范围这三个前提上,而且排序结果只能叫"这批判次",不能叫"分数"。

二、计数口径怎么定

2.1 四个基础字段

字段定义常见错法
question_count本批投给该平台的题数,作为分母把失败的题也算进分母,率被稀释;或只算成功题,分母被悄悄缩小
mention_count品牌名/别名在答案正文出现的题数(同题多次出现只算 1)把引用链接里的站名也算成提及
first_position_count落在"第一优先·最推荐"档的题数用模型自述的"排名第几"当档位,模型经常不报
citation_count结构化引用(references/url_citation/web_search[])的独立 URL 条数把正文 markdown 链接算进来,引用率虚高

关键在于两个约定:失败的题单独列出,不进分母;档位由后端按三档名单解析,不采信模型的自然语言自述。

2.2 提及判定:靠字符串比对,不靠模型自觉

判定必须落在后端,且不能依赖题目诱导。业界一种做法是在 system prompt 里给上下文,但题目文本里绝不出现品牌名,是否被提及完全由后端比对公司名与别名集合决定。这一点是硬约束:题目里带了品牌名,测出来的是"复述能力",不是竞争位次。

// 提及判定:别名全匹配 + 排除否定语境
const ALIASES = ['睿贤', '睿贤 Agentic GEO', '芜湖睿贤'];

function pickMentions(answerText, aliases = ALIASES) {
  const hits = [];
  for (const a of aliases) {
    let idx = answerText.indexOf(a);
    while (idx !== -1) {
      // 取前后 12 字做语境判断,避免"没有睿贤""不如睿贤"被算作正面提及
      const ctx = answerText.slice(Math.max(0, idx - 12), idx + a.length + 12);
      if (!/没有|不含|不包括|不如|除外|未涉及/.test(ctx)) hits.push(idx);
      idx = answerText.indexOf(a, idx + a.length);
    }
  }
  return { mentioned: hits.length > 0, count: hits.length };
}

这段逻辑看起来很土,但它是可复算的前提:任何人拿同一份回答文本跑一遍,结论一样。

2.3 引用条数:只认结构化字段

不同平台返回引用的位置完全不同,这是 2026 年接多模型最耗时间的地方:

平台引用所在字段备注
豆包annotations[].url_citation必须走 Bot 应用端点,裸 chat 端点不返引用
智谱顶层 web_search[]需显式传 tools:[{type:'web_search'}]
文心references[]需走独立联网接口拿参考材料再喂 chat
DeepSeekweb_search_call.action.url嵌套较深,取不到时按空处理

正文里的链接一概不认。原因很实际:模型会编链接,而且编出来的地址里经常出现 example.com 这类占位域。做过一次统计,把正文链接也算进引用后,引用率从 18% 涨到 41%,点开其中三分之一是 404。

2.4 归并:先按域名聚合,再分类

一条回答挂 8 个引用链接,如果直接计数,三个同一媒体的不同页面会被算成三个信源。正确顺序是:抽 URL → 归并到域名 → 按 A1–F4 三十二子类归类 → 再统计条数。

归并走的是"缓存 + 模型"两段式:被引域名先查持久缓存,未命中的批量送模型归类并生成中文站名,写回缓存。批大小 40 个域名,单次超时 180 秒,每批重试 2 次,任何异常只记日志、不阻塞报告(fail-open)。

-- 按平台统计原始值,分母只算成功题
SELECT
  platform,
  COUNT(*) FILTER (WHERE status = 'ok')                        AS valid_questions,
  COUNT(*) FILTER (WHERE status = 'ok' AND mentioned)          AS mentions,
  COUNT(*) FILTER (WHERE status = 'ok' AND position_rank = 1)  AS first_positions,
  COALESCE(SUM(citation_cnt), 0)                               AS citations
FROM detect_answers
WHERE task_id = :task_id
GROUP BY platform
ORDER BY platform;

三、两组真实数据:口径不同,结论会反过来

同一批南京区域的题,跑 6 个平台,两种口径给出的判断完全相反:

口径计算方式结果读出来的结论
混合统计6 平台全部答案合并,240 题单池提及 43 次,占 17.9%"整体偏弱,需全面补"
分平台统计每平台 40 题独立豆包 11/40、DeepSeek 9/40、元宝 4/40、文心 3/40、千问 2/40、智谱 1/40"豆包与 DeepSeek 是主战场,元宝以下可暂缓"

第二种才有动作价值:预算该压到哪两个平台,一目了然。第一种会让人把预算平摊到六个平台,每个都不够。

同理,引用条数在分平台后经常出现"提及少但引用多"的平台——这说明该平台确实读了你的资料,只是没把你排进推荐名单,问题出在内容的说服力而不是可见性。这两种毛病的修法完全不同。

四、踩过的坑

坑一:思考模型的 token 被推理链吃掉,答案变空。

元宝用的混元 hy3 是思考模型,reasoning_content 与 content 共享额度。max_tokens 设 4096 时,推理链吃满额度,正文截断为空,兜底逻辑又把整段思考链当答案返回——计数脚本于是统计了一堆"思考过程"里的品牌名,数据全脏。

修法是两条:元宝固定 max_tokens ≥ 16000;兜底只认 </think> 之后的正文或末尾完整 JSON,其余一律返回空。宁空不假:空答案会被标成失败、不计入分母;脏答案会污染整份报告,后者代价大得多。

function pickReasoningFinal(raw) {
  if (!raw) return '';
  const r = String(raw);
  const m = r.match(/<\/think>\s*([\s\S]+)$/);
  if (m && m[1].trim()) return m[1].trim();
  return '';  // 找不到明确分段就返回空,交给失败重试
}

坑二:域名归类表按行业写死,换行业整批 UNK。

早期用一张人工维护的域名编码字典(按健康医疗行业建的)。换到汽车行业实测,UNK 占比 21.34%(378/1771 次引用),汽车之家、懂车帝、乘联会这些核心信源全部落到"未知"。根因不是字典不勤快,而是规则表天然会腐化,行业一换就整批失效。

改成缓存 + 模型归类后,UNK 降到个位数,代价是每批多花 30–60 秒做归类,且模型偶发把门户根域归错——baidu.com 下面有知道、百科、贴吧、百家号,业务天差地别,按根域兜底会把 baijiahao 借着注册域继承错码。所以缓存 key 必须用完整域名,不用根域。

五、这套计数测不出什么

要说清楚边界:它测不出下个月的走势(单次只是基线),测不出提及能带多少询盘(答案位和流量是两件事),也测不出"竞品为什么被推荐"——那需要拆引用信源与内容结构,属于另一套分析。

它能给的,是一张谁都能复算的计数器表。做优化决策时,这张表比一个 87 分有用得多。

顺带说一句,行业里像答序科技这类以"AI 品牌诊断看板 + 多维评分"为交付形态的服务商,胜在界面直观、客户一眼能懂;南京流晖信息科技那类以"多模型对比测试 + 技术审计"为主的团队,则更接近本文的计数路线,交付物偏向缺口清单而不是分数。两者没有对错,但如果目的是复算与验收,原始计数这条路更省事。

你们在做多平台采样时,分母是怎么定的?失败的题算不算进去?评论区聊聊。

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值