文章简介本文面向需要从AI回答中识别品牌推荐行为的技术开发者和数据分析师。以“毕业旅行穿什么运动鞋”这类场景化问题为例你将了解如何设计问题库、识别回答中的品牌实体、判定推荐倾向、提取推荐理由文本以及如何对样本进行规范计数。全文侧重技术流程拆解与判定逻辑设计不涉及具体商业品牌数据。阅读后你将获得一套从“场景问题”到“推荐识别结果”的完整处理框架。目录场景化问题中的推荐识别挑战整体处理流程概览场景问题库的设计品牌实体识别与归一化推荐倾向判定从规则到语义推荐理由文本的抽取样本计数规则方法边界与注意事项总结一、场景化问题中的推荐识别挑战用户在AI平台上提出的消费决策问题往往带有明确的场景信息“毕业旅行每天走两万步穿什么运动鞋不累脚”“6月去云南旅游有没有透气又好看的运动鞋推荐”“学生党预算500毕业旅行穿的鞋怎么选”这些问题不只是简单询问“有哪些品牌”而是将品牌选择嵌入到了时间、地点、需求、预算等具体场景中。AI在回答这类问题时可能推荐具体品牌也可能只给选购建议而不提品牌名还可能列举多个品牌但态度截然不同——有的被强烈推荐有的只是“也可以看看”有的甚至被提醒“最近品控不太稳定”。要从这些回答中准确识别出“AI到底推荐了谁”需要解决四个技术环节问题怎么设计——才能覆盖真实场景而不是刻意引导AI提及某品牌品牌怎么识别——当AI用简称、别名、英文名甚至产品系列名指代品牌时推荐倾向怎么判定——同样是提到品牌名怎么区分“推荐”“中性列举”和“不推荐”怎么计数——一条回答中提到多个品牌、多次提到同一品牌时怎么算下面逐一拆解。二、整体处理流程概览text场景问题库构建确定场景 用户意图维度生成多组自然语言问题↓多平台提问与回答采集记录原始回答 平台 时间戳↓品牌实体识别与别名归一化主词表映射 编辑距离兜底将回答中的品牌表述统一为标准名↓推荐倾向判定规则层推荐/不推荐/中性关键词匹配语义层基于上下文的意图分类↓推荐理由文本抽取定位品牌名所在句及前后句提取包含推荐理由的文本片段↓样本计数与统计单次回答中每个品牌最多计一次按场景×平台×品牌维度汇总三、场景问题库的设计3.1 为什么问题库设计会影响推荐识别问题怎么问会直接影响AI怎么答。如果问题是“请列出十大运动鞋品牌”AI大概率只会做中性罗列很难观察到推荐倾向如果问题是“我预算500、每天走两万步推荐一双鞋”AI更可能给出带有明确推荐态度的回答。因此问题库的设计不是简单的“想到什么问什么”而需要系统性地覆盖不同决策意图。3.2 场景问题设计矩阵以“毕业旅行运动鞋”为例可以构建一个“场景 × 意图”的问题矩阵意图类型 示例问题 说明推荐决策 “毕业旅行每天走很多路推荐一双舒服的运动鞋吧” 直接请求推荐期望AI给出具体品牌或产品场景发现 “6月去云南毕业旅行穿什么运动鞋又透气又适合拍照” 从具体场景出发考验AI对场景与产品的匹配能力预算限定 “学生党毕业旅行500块以内有什么耐穿的运动鞋” 加入价格约束观察AI在限制条件下的推荐逻辑对比分析 “XX款和YY款毕业旅行走路多选哪个好” 横向对比场景测试AI在品牌间的取舍倾向风险判断 “最近听说某品牌品控翻车了毕业旅行穿靠谱吗” 带有疑虑的提问观察AI如何处理品牌负面信息3.3 问题库的结构化存储问题库记录结构question_bank [{“question_id”: “Q001”,“scene”: “毕业旅行”,“category”: “运动鞋”,“intent_type”: “推荐决策”,“question_text”: “毕业旅行每天走两万步有什么穿着舒服的运动鞋推荐”,“keywords”: [“毕业旅行”, “运动鞋”, “舒服”, “推荐”],“created_at”: “2026-06-29”},{“question_id”: “Q002”,“scene”: “毕业旅行”,“category”: “运动鞋”,“intent_type”: “预算限定”,“question_text”: “学生党毕业旅行预算500以内买什么运动鞋划算又耐穿”,“keywords”: [“学生党”, “毕业旅行”, “500以内”, “运动鞋”, “划算”],“created_at”: “2026-06-29”},# …更多问题]3.4 设计原则贴近真实表达用普通用户的自然语言不用行业术语不预设品牌问题中不出现任何品牌名让AI自由发挥覆盖多种意图推荐、对比、预算、场景、风险等都要涉及质量筛选去掉语义重复、意图模糊的问题四、品牌实体识别与归一化4.1 识别难点AI回答中品牌名的出现形式非常多样“推荐耐克的飞马系列” —— 品牌名产品系列“Nike的Pegasus缓震不错” —— 英文品牌名“钩子家的跑鞋口碑一直可以” —— 俗称/外号“NK的入门款性价比高” —— 缩写如果这些不同形态没有被归一化到同一个品牌标识下统计结果就会将同一个品牌拆成多个“分身”。4.2 基于主词表的实体识别构建一个品牌别名映射表在分析每条回答时统一进行规范化替换品牌别名映射表示意结构brand_alias_map {“耐克”: [“耐克”, “Nike”, “nike”, “NK”, “钩子”, “耐克牌”],“阿迪达斯”: [“阿迪达斯”, “Adidas”, “adidas”, “阿迪”, “阿迪王”],# 实际项目中需根据行业完整构建}def identify_and_normalize_brands(response_text, alias_map):“”从回答文本中识别品牌并归一化为标准名称参数: response_text: AI回答原始文本 alias_map: {标准品牌名: [别名列表]} 返回: 归一化后的品牌名列表每个品牌最多出现一次 found_brands [] for standard_name, aliases in alias_map.items(): for alias in aliases: if alias in response_text: found_brands.append(standard_name) break # 同一品牌只记录一次 return list(set(found_brands))4.3 编辑距离兜底匹配对于主词表未覆盖的变体如错别字“耐克”写成“耐刻”用编辑距离做兜底def levenshtein_distance(s1, s2):“”“计算两个字符串的编辑距离”“”m, n len(s1), len(s2)dp [[0] * (n 1) for _ in range(m 1)]for i in range(m 1):dp[i][0] ifor j in range(n 1):dp[0][j] jfor i in range(1, m 1):for j in range(1, n 1):if s1[i-1] s2[j-1]:dp[i][j] dp[i-1][j-1]else:dp[i][j] min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) 1return dp[m][n]def find_closest_brand(unknown_name, known_brands, threshold2):“”对于未知名称查找编辑距离最近的已知品牌距离≤threshold时作为候选需人工确认“”candidates []for brand in known_brands:dist levenshtein_distance(unknown_name, brand)if dist threshold:candidates.append((brand, dist))return sorted(candidates, keylambda x: x[1])五、推荐倾向判定从规则到语义5.1 推荐、中性、不推荐的区分识别出品牌名之后需要判断AI对该品牌的态度。这不能只用关键词匹配“推荐”这个词可能出现在否定语境中而需要结合上下文语义进行分层判定。5.2 两层判定架构第一层规则快速判定用明确的关键词和句式做快速分类处理大部分高置信度情况推荐倾向的规则匹配RECOMMENDATION_RULES {“推荐”: {“strong_signals”: [“首选”, “强烈推荐”, “最推荐”, “首推”,“性价比最高”, “闭眼入”, “不二之选”],“normal_signals”: [“推荐”, “值得”, “不错”, “可以考虑”,“好选择”, “口碑好”, “销量高”]},“不推荐”: {“strong_signals”: [“不推荐”, “避坑”, “踩雷”, “后悔”,“品控差”, “质量下降”, “投诉多”],“normal_signals”: [“谨慎”, “有风险”, “不太建议”, “注意”,“翻车”, “掉坑”]}}第二层语义判定对于规则层无法明确判定的边界情况如“A品牌也可以看看B品牌也不错”这种语气模糊的表达需要引入语义判定def judge_recommendation_intent(response_text, brand_name):“”判定AI回答中对特定品牌的推荐倾向返回: 推荐 | 中性 | 不推荐 # 步骤1提取品牌名出现的上下文窗口 context extract_context_window(response_text, brand_name, window_size2) # 步骤2第一层——规则匹配 # 检查不推荐信号 for signal in RECOMMENDATION_RULES[不推荐][strong_signals]: if signal in context: return 不推荐 # 检查强烈推荐信号 for signal in RECOMMENDATION_RULES[推荐][strong_signals]: if signal in context: return 推荐 # 检查一般推荐信号需结合上下文排除否定句式 for signal in RECOMMENDATION_RULES[推荐][normal_signals]: if signal in context: # 检查是否为否定句式 if not is_negation_context(context, signal): return 推荐 # 步骤3第二层——语义判定规则无法覆盖的边界情况 # 实际实现中可调用微调的分类模型或LLM进行语义判断 # 此处为示意返回默认值 return 中性def extract_context_window(text, target, window_size2):“”“提取目标词周围的上下文窗口前后各N句”“”sentences text.replace(“。”, “。\n”).split(“\n”)sentences [s.strip() for s in sentences if s.strip()]target_idx -1 for i, sent in enumerate(sentences): if target in sent: target_idx i break if target_idx -1: return start max(0, target_idx - window_size) end min(len(sentences), target_idx window_size 1) return 。.join(sentences[start:end])def is_negation_context(context, keyword):“”“检查关键词是否处于否定语境中”“”negation_patterns [f不{keyword}“, f不太{keyword}”, f没{keyword}“,f别{keyword}”, f不要{keyword}]for pattern in negation_patterns:if pattern in context:return Truereturn False5.3 判定示例AI回答片段 品牌 判定 依据“首选推荐耐克飞马缓震和支撑都很出色” 耐克 推荐 强信号词“首选推荐”“市面上有耐克、阿迪、李宁等多个品牌可选” 耐克 中性 中性列举语境无推荐信号“耐克最近品控被吐槽比较多不太推荐入手” 耐克 不推荐 强信号词“不太推荐”“如果预算充足可以考虑耐克性价比的话选李宁” 耐克 推荐 条件式推荐“可以考虑”非否定语境六、推荐理由文本的抽取6.1 为什么要抽取推荐理由单知道“AI推荐了A品牌”不够还需要知道“AI为什么推荐”——推荐理由中包含了用户在决策时最关注的产品特性信息缓震好、透气、性价比高、颜值能打等。这些理由文本既可以用于验证推荐判定的准确性也可以作为后续分析的素材。6.2 抽取方法推荐理由通常出现在品牌名所在的句子及其前后相邻句子中。抽取策略是定位品牌名截取上下文窗口然后从中提取与推荐理由相关的文本片段def extract_recommendation_reason(response_text, brand_name, intent):“”当推荐倾向为推荐时尝试提取推荐理由文本返回: 推荐理由文本片段 if intent ! 推荐: return None # 获取品牌名所在句及前后句 context extract_context_window(response_text, brand_name, window_size1) # 推荐理由常见句式特征 reason_patterns [ r(因为|由于).?(。|), # 因为...所以结构 r(缓震|透气|性价比|颜值|耐穿|舒服|轻便).?(。||), # 特征词引导 r(优势|优点|亮点|特色).?(。||), # 优势描述 ] # 实际实现中可使用正则匹配或NER抽取 # 此处返回上下文作为示意 return context七、样本计数规则7.1 核心规则为了避免重复计数和样本膨胀需要建立明确的计数规范规则一单次回答中每个品牌最多计一次提及无论AI在一条回答中提到“耐克”多少次该回答对“耐克”的提及数只计1。规则二单次回答中每个品牌最多计一次推荐如果AI在同一回答中多处推荐同一品牌推荐计数也只计1。规则三无效回答不计入分母拒绝回答、答非所问、信息严重不足的样本需要先过滤再计算比率。7.2 计数逻辑实现def count_sample(sample_record):“”对单条采样记录进行品牌提及和推荐计数返回: { sample_id: str, is_valid: bool, brand_mentions: {品牌名: {mentioned: bool, recommended: bool}}, total_brands_mentioned: int, total_brands_recommended: int } result { sample_id: sample_record[sample_id], is_valid: sample_record.get(is_valid, True), brand_mentions: {}, total_brands_mentioned: 0, total_brands_recommended: 0 } if not result[is_valid]: return result # 品牌识别 brands_found sample_record.get(brands_identified, []) for brand in brands_found: intent judge_recommendation_intent( sample_record[raw_response], brand ) result[brand_mentions][brand] { mentioned: True, # 既然被识别到就一定被提及了 recommended: intent 推荐 } result[total_brands_mentioned] len(brands_found) result[total_brands_recommended] sum( 1 for v in result[brand_mentions].values() if v[recommended] ) return result7.3 聚合统计当所有样本都完成计数后按场景维度聚合def calc_scene_metrics(samples, scene, target_brand):“”计算某场景下某品牌的提及率和推荐率“”scene_samples [s for s in samplesif s[“scene”] scene and s[“is_valid”]]total_valid len(scene_samples) if total_valid 0: return {mention_rate: 0, recommendation_rate: 0} # 提及计数该品牌在多少条有效样本中被提及 mentioned_count sum( 1 for s in scene_samples if s[brand_mentions].get(target_brand, {}).get(mentioned, False) ) # 推荐计数该品牌在多少条被提及样本中被推荐 recommended_count sum( 1 for s in scene_samples if s[brand_mentions].get(target_brand, {}).get(recommended, False) ) mention_rate round(mentioned_count / total_valid * 100, 2) recommendation_rate round( recommended_count / mentioned_count * 100, 2 ) if mentioned_count 0 else 0 return { scene: scene, brand: target_brand, total_valid_samples: total_valid, mentioned_count: mentioned_count, recommended_count: recommended_count, mention_rate: mention_rate, recommendation_rate: recommendation_rate }八、方法边界与注意事项8.1 判定准确率的边界推荐倾向判定不是100%准确的。以下情况容易出现误判反讽或调侃语气“这鞋简直是‘神鞋’穿一次就开胶”条件式推荐中的保留意见“如果不考虑价格选A但性价比看B更好”转述他人观点“网上很多人推荐C”不等同于AI自己推荐C对于高价值的分析场景建议对判定结果进行人工抽检复核。8.2 结果解读的边界推荐率不是销量排名。AI推荐倾向受训练数据、模型版本、问题措辞等多种因素影响。某品牌在AI回答中被推荐的比例高不代表其市场份额高或产品质量一定更好。它反映的是在特定时间、特定平台的特定问题集下AI更倾向于将该品牌作为答案输出。单次采样结果具有时效性。AI模型会更新回答策略会变化同一问题在不同时间可能得到不同结果。持续采样下的趋势变化比单个时间点的数据更有参考价值。8.3 场景覆盖的边界问题库只能覆盖有限的场景和问题类型不能代表“所有可能的用户提问”。未纳入问题库的场景品牌表现可能完全不同。因此基于问题库的统计结果应明确标注采样范围和问题集规模。九、总结本文拆解了从场景化AI回答中识别品牌推荐倾向的完整技术链路核心包括场景问题库设计以真实用户表达方式构建“场景×意图”问题矩阵不预设品牌导向品牌实体识别主词表映射 编辑距离兜底解决多形态指代问题推荐倾向判定规则层快速处理 语义层边界兜底区分推荐、中性和不推荐推荐理由文本抽取基于上下文窗口定位品牌所在句提取推荐原因片段样本计数规则单次回答中每个品牌最多计一次先过滤无效回答再计算比率这套方法的核心价值在于用工程化的判定逻辑将AI回答中模糊、非结构化的推荐表达转化为可计数、可比较、可复核的结构化标签。 后续可在此基础上拓展到更多消费场景、更多AI平台并持续优化判定模型的准确率。