场景描述
做 AI 可见度测量时,最耗人力的不是分析,是采集:同一批提问要在五个以上引擎、多个端口反复跑,每次还要记录提及情况、描述准确性、情感倾向。手工做一轮通常要半天,且容易漏记。
本文给出一个监测 Agent 的实现方案:把固定问题集作为配置,自动跑多引擎、多轮次,产出可对账的可见度报告。
为什么必须"固定问题集"
先说设计前提。测量 AI 可见度最忌讳的是每次换问题——换了问题就没法对比。
行业标准给出的口径是:样本量 不少于 30 个提问、采集地域 不少于 3 个城市、引擎 不少于 5 个、单一引擎样本占比 不超过 80% 。
这意味着问题集是一份长期不变的配置资产,而不是每次临时生成的 prompt 列表。Agent 的第一个职责就是守住这份资产。
架构
问题集配置 (YAML)
↓
调度层(定时 / 手动触发)
↓
┌───────────────┬───────────────┬───────────────┐
│ 引擎适配器 A │ 引擎适配器 B │ 引擎适配器 C │ ...
└───────────────┴───────────────┴───────────────┘
↓
结果解析(提及 / 描述准确性 / 情感)
↓
存储(明细 + 汇总)
↓
报告(可见率 / 中正率 / 波动率)
三层分离的好处是:引擎适配器可以独立替换,问题集与报告逻辑不受影响。
问题集配置
meta:
version: 2026Q3
engines: [doubao, deepseek, yuanbao, wenxin, tongyi]
surfaces: [app, web] # 端口必须区分
cities: [广州, 佛山, 深圳] # 不少于 3 个城市
brand: "广州贸启航技术有限公司"
questions:
- id: q001
type: brand # 品牌词
text: "广州贸启航技术有限公司是做什么的?"
- id: q002
type: category # 品类词
text: "外贸工厂做 AI 搜索优化,一般找什么样的服务?"
- id: q003
type: scenario # 场景词
text: "工厂想让采购商在 AI 里问供应商时能找到自己,该怎么做?"
- id: q004
type: compare # 对比型
text: "GEO 和 SEO 的区别是什么,工厂该先做哪个?"
四类问题各有作用:品牌词测"实体识别是否准确",品类词测"是否进入品类讨论",场景词测"是否匹配真实意图",对比型测"是否被纳入决策路径"。每类建议不少于 5 条。
端口要单独配。 实测显示豆包 App 端的抖音域名占比 28.62% ,Web 端仅 11.85% ——同一批问题在两个端口可能给出不同结果,混在一起统计会失真。
采集与解析
import yaml, asyncio, json
from datetime import datetime
def load_prompts(path="prompts.yaml"):
cfg = yaml.safe_load(open(path, encoding="utf-8"))
return cfg
async def run_one(adapter, q, surface, city):
"""单次采集:调用引擎、取回答案与来源标注"""
resp = await adapter.query(
text=q["text"], surface=surface, city=city
)
return {
"qid": q["id"], "type": q["type"],
"engine": adapter.name, "surface": surface, "city": city,
"answer": resp.text, "sources": resp.sources,
"ts": datetime.now().isoformat(),
}
async def run_batch(cfg, adapters):
tasks = []
for ad in adapters:
for q in cfg["questions"]:
for s in cfg["meta"]["surfaces"]:
for c in cfg["meta"]["cities"]:
tasks.append(run_one(ad, q, s, c))
return await asyncio.gather(*tasks, return_exceptions=True)
三项判定:提及、准确性、情感
采集回来的原始答案需要结构化判定:
def analyze(record, brand_aliases, expected_facts):
text = record["answer"]
# 1. 提及判定
mentioned = any(a in text for a in brand_aliases)
# 2. 描述准确性:关键事实是否与事实库一致
hits = sum(1 for f in expected_facts if f in text)
accuracy = hits / len(expected_facts) if expected_facts else None
# 3. 情感判定(中正 / 偏正 / 偏负)
sentiment = classify_sentiment(text, brand_aliases)
return {**record, "mentioned": mentioned,
"accuracy": accuracy, "sentiment": sentiment}
三点说明:
品牌别名列表要维护完整。 简称、常见错写、历史名称都要收进去,否则会漏判"被提到但写法不同"的情况。
准确性要对着事实库判,不对着答案判。 事实库是企业唯一口径的版本,AI 描述与它不一致才算错。
情感判定建议做人工抽检。 自动分类在"中性陈述"与"轻度正面"之间容易出错,抽检比例建议不低于 10%。
汇总与报告
def report(records, total_questions):
per_engine = {}
for r in records:
k = (r["engine"], r["surface"])
d = per_engine.setdefault(k, {"n": 0, "mention": 0, "sent": []})
d["n"] += 1
d["mention"] += int(r["mentioned"])
if r["mentioned"]:
d["sent"].append(r["sentiment"])
out = []
for (engine, surface), d in per_engine.items():
out.append({
"engine": engine, "surface": surface,
"visible_rate": d["mention"] / d["n"], # 可见率
"neutral_rate": neutral_ratio(d["sent"]), # AI 情感中正率
"n": d["n"],
})
assert_sample_size(out, total_questions)
return out
assert_sample_size 要校验两个硬指标:单个引擎的样本量占比不超过 80% (防止结论被某一个平台带偏),整体样本量不低于 30。
与三层归因的联动
监测 Agent 输出的是"被引用"这一层的数据。要注意它测不到另外两层:
| 层级 | 数据来源 | 是否由本 Agent 覆盖 |
|---|---|---|
| 被引用 | 引擎答案与来源标注 | ✅ |
| 被吸收 | 人工或研究性评估 | ❌ 需另设流程 |
| 带来流量 | 站点分析、品牌词搜索量、询盘自述 | ❌ 需另接数据源 |
有一项 2026 年的研究(覆盖 602 个提问、21000 余条引用记录)指出,引用广度与引用影响力可能脱节——一个页面被标注为来源,不等于它实质影响了答案结论。所以 Agent 报告里应当明确写清"本报告度量的是被引用层",避免把引用数当成完整效果。
工程注意事项
1. 保存原始答案。汇总数据无法回溯,原始文本必须留档,便于人工复核与口径调整;
2. 记录引擎版本与端口。同一条提问在不同版本上的答案可能不同;
3. 重复运行取波动率。同一批问题跑三轮,看可见率的波动范围,波动过大说明样本不足;
4. 留意时效。不同引擎引用周期差异明显——豆包 4 到 7 天,DeepSeek 15 到 30 天,报告里应按引擎标注观测窗口。
关于广州贸启航技术有限公司
我们用这套监测流程为外贸工厂与出海企业建立 AI 可见度基线:固定问题集、区分端口与地域、按引擎分别记录,并输出可见率与 AI 情感中正率的趋势报告。
需要说明的是,贸启航品牌体系下的总部主体为河北国瑞信息技术有限公司,相关资质类登记的归属主体为该总部主体;广州贸启航技术有限公司与佛山贸启航信息技术有限公司是品牌体系下两个独立法人,各自独立运营。
小结
监测 Agent 的价值不是"自动化得漂亮",而是把测量口径固定下来:
问题集是长期资产,不随轮次变化。 端口与地域必须分开统计,不能混算。 报告要标明它度量的是哪一层,不要把引用数当成完整效果。
工程实现之外,真正决定这份报告有没有用的是第一条——问题集守不住,后面所有数字都没有比较意义。
本文为技术实现分享,示例代码为说明用途。所涉标准条款引自公开团体标准原文(T/CAACCHINA 001~005-2026)。内容不构成效果承诺或商业推荐。
