在多平台 AI 回答监测场景中,最具分析价值的部分往往不是“是否被提及”这种二值判断,而是 AI 如何解释一个品牌——它的描述准确吗?是否存在关键信息遗漏?有没有把品牌和竞品搞混?本文聚焦回答采集之后的关键环节:从大段 AI 回答中精准抽取品牌解释文本,完成结构化入库,并对异常样本进行标记。我们将围绕抽取策略、存储设计和异常识别三个维度展开。
常见的 AI 回答监测逻辑是:发一个问题,看品牌有没有被提到。但这只能回答“在不在”,无法回答“说对了没”。
以下三种情况在实测中经常出现:
如果只记录 is_mentioned=1,这三种情况会被等同看待。只有把 AI 回答中围绕品牌的解释段落单独抽取出来,才能进一步判断 AI 的解释是否准确、完整、稳定。这也是“解释能力”这一指标的数据基础。
从原始回答到解释文本入库,经过四个处理节点
每个节点的设计逻辑在下文逐一展开。
抽取的第一步是确定品牌在回答中“出现在哪里”。这一步依赖预先维护的品牌词表(全称、简称、英文名、常见别名),对回答文本做多模式匹配。
BRAND_PATTERNS = {
"brand_a": ["品牌A", "BrandA", "A牌", "A品牌"],
"brand_b": ["品牌B", "BrandB", "B牌"],
}
def locate_mentions(text: str, patterns: dict) -> list[dict]:
"""返回每个品牌在文本中的提及位置列表"""
mentions = []
for brand_key, aliases in patterns.items():
for alias in aliases:
start = 0
while True:
pos = text.find(alias, start)
if pos == -1:
break
mentions.append({
"brand": brand_key,
"alias": alias,
"position": pos,
})
start = pos + len(alias)
return sorted(mentions, key=lambda x: x["position"])定位完成后,我们能得到品牌在全文中出现的所有位置。但仅仅定位还不够——品牌可能出现在一句无关的举例中,也可能出现在一段详细介绍中。
品牌被提及,不等于 AI 在“解释”它。需要进一步判断该提及是否处于解释性语境中。
识别逻辑基于以下规则组合:
识别维度 | 判断方法 |
|---|---|
上下文窗口 | 取提及位置前后各 300 字符作为候选段落 |
段落边界 | 向上取最近的双换行或 Markdown 标题作为起点 |
解释特征词 | 检查是否包含“是”“成立于”“主打”“定位”“优势”“特点”等描述性词汇 |
列表归属 | 如果品牌出现在编号或无序列表中,将整条列表项纳入 |
def extract_explanation_segment(text: str, position: int, window_size: int = 300) -> str:
"""从提及位置向上下扩展,截取解释段落"""
# 向上寻找段落边界
para_start = max(0, position - window_size)
prev_break = text.rfind("\n\n", 0, position)
if prev_break != -1 and prev_break > para_start:
para_start = prev_break + 2
# 向下寻找段落边界
para_end = min(len(text), position + window_size)
next_break = text.find("\n\n", position)
if next_break != -1 and next_break < para_end:
para_end = next_break
return text[para_start:para_end].strip()切出来的解释段落还需要做一次清洗,主要处理:
**、## 等保留,但做标准化)。mention_only,不纳入解释能力分析。清洗后的解释文本写入数据库,同时附带从该段落中提取的元信息。
解释文本的存储需要与“提及/推荐”二值指标表区分开。一条原始回答可能涉及多个品牌,每个品牌的解释段落应独立存储。
CREATE TABLE brand_explanation (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
task_id VARCHAR(64) NOT NULL,
platform VARCHAR(30) NOT NULL,
scene_type VARCHAR(30) NOT NULL COMMENT '场景分类',
brand_name VARCHAR(100) NOT NULL COMMENT '被解释品牌',
explanation_text TEXT COMMENT '抽取的解释段落原文',
char_count INT DEFAULT 0 COMMENT '解释文本字符数',
has_substantive_desc TINYINT(1) DEFAULT 0 COMMENT '是否包含实质描述',
is_accurate TINYINT(1) DEFAULT NULL COMMENT '人工复核: 描述是否准确',
is_complete TINYINT(1) DEFAULT NULL COMMENT '人工复核: 是否遗漏关键信息',
risk_label VARCHAR(50) COMMENT '异常标记: 混淆/错误/遗漏/正常',
raw_data_url VARCHAR(512) COMMENT 'COS原始回答链接',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_brand_task (brand_name, task_id),
INDEX idx_risk (risk_label)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;关键字段说明:
explanation_text:从原始回答中截取的完整解释段落,保留原文格式。has_substantive_desc:自动判断字段。如果解释段落仅出现品牌名而无任何描述性内容(如“另外还有品牌A”),置为 0。此字段用于过滤无效解释样本。is_accurate / is_complete:预留给人工复核的二值字段,初始为 NULL,复核后更新。risk_label:异常标记字段,枚举值包括 混淆(与其他品牌搞混)、错误(事实性错误)、遗漏(缺失核心信息)、正常。解释文本入库后,系统会对每条记录做一轮自动风险扫描,扫描维度包括:
(1)品牌混淆检测
检查解释段落中是否同时出现了竞品名称。如果 AI 在解释品牌 A 的段落中大量提及品牌 B 的特征词,则标记为 混淆。
SELECT id, explanation_text
FROM brand_explanation
WHERE brand_name = '品牌A'
AND (explanation_text LIKE '%品牌B%' OR explanation_text LIKE '%BrandB%')
AND risk_label IS NULL;(2)事实一致性检查
将解释段落与企业预先维护的“标准品牌简介”做关键信息比对。如果核心要素(成立时间、主营业务、总部所在地)出现不一致,标记为 错误。
(3)信息缺失判断
对比标准简介的信息点数量与实际解释覆盖的数量。如果解释段落字符数过少(如 < 50 字),或关键维度(产品、定位、差异化)缺失超过 2 项,标记为 遗漏。
自动标记完成后,高风险样本进入人工复核队列:
def classify_risk(explanation: dict) -> str:
risk_score = 0
risk_tags = []
if explanation["has_competitor_mention"]:
risk_score += 2
risk_tags.append("混淆")
if explanation["fact_mismatch_count"] > 0:
risk_score += 3
risk_tags.append("错误")
if explanation["missing_key_info_count"] >= 2:
risk_score += 1
risk_tags.append("遗漏")
if risk_score >= 3:
return "high_risk:" + ",".join(risk_tags)
elif risk_score >= 1:
return "low_risk:" + ",".join(risk_tags)
return "正常"结构化入库后,品牌在 AI 回答中的“解释能力”可以从多个维度量化:
SELECT
brand_name,
platform,
COUNT(*) AS total_explanations,
SUM(has_substantive_desc) AS substantive_count,
SUM(CASE WHEN risk_label = '正常' THEN 1 ELSE 0 END) AS accurate_count,
AVG(char_count) AS avg_explanation_length,
ROUND(SUM(CASE WHEN risk_label = '错误' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 1) AS error_rate
FROM brand_explanation
WHERE created_at >= '2026-06-01'
GROUP BY brand_name, platform
ORDER BY error_rate ASC;通过这张表,品牌方可以回答几个过去只能凭感觉判断的问题:
accurate_count / total_explanations)platform 分组的混淆率)avg_explanation_length + is_complete 复核结果)1. 词表维护是持续工作
品牌别名、简称会随市场变化而更新。建议将词表设计为可配置的云数据库表而非代码硬编码,支持运营人员动态维护,避免遗漏新出现的品牌指代词。
2. 解释段落边界识别不能追求 100% 准确
自然语言段落切分没有绝对标准。建议在抽取阶段保留稍大的上下文窗口(前后各 300-500 字符),宁可多截一点,也不要切断关键信息。冗余部分在后续分析中可以通过摘要模型二次压缩。
3. 异常标记要保留人工入口
自动风险扫描的准确率受限于词表和规则覆盖度。对于 high_risk 样本,务必保留人工复核界面。复核结果一方面修正本次数据,另一方面反哺规则迭代。
解释文本抽取,是 AI 回答监测从“有没有”进阶到“对不对”的关键一步。相比于提及率和推荐率这些二值指标,解释能力评估需要面对更复杂的非结构化文本处理:段落边界识别、描述实质判断、事实一致性校验、异常分类标记。每一步都涉及规则设计与人工复核的协同。
本文介绍的抽取链路和存储结构,已在多品牌、多平台的消费品牌 AI 回答监测场景中实际使用。开发者可在此基础上,结合自身业务对解释准确度的定义,扩展规则维度或引入小模型辅助评分。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。