AI回答采集:提及率、推荐率与引用率的工程实现 在批量采集ChatGPT等AI助手对特定问题的回答时需要计算提及率、推荐率和引用率但面临样本过滤、推荐意图误判等工程问题。本文基于Python实现一套规则引擎适用于已采集的回答数据集。环境Python 3.9依赖re、hashlib标准库。一、问题背景假设已通过OpenAI API采集到JSON格式的回答列表每条包含text字段。需要从这些回答中计算三个指标提及率在所有有效回答中至少一次提到目标品牌或产品的回答占比。推荐率在提及目标品牌或产品的回答中包含推荐意图的回答占比。引用率在提及目标品牌或产品的回答中回答引用了外部来源的比例。主要工程问题包括如何过滤拒绝回答等无效样本如何准确判断推荐意图如何避免重复计算二、有效样本过滤首先过滤掉无效回答例如拒绝回答“我无法回答”、明确表示不知道“我不了解”、内容过短少于10字符。importredefis_valid_response(text:str)-bool:判断回答是否为有效样本ifnottextorlen(text.strip())10:returnFalsereject_patterns[r无法回答,r不能回答,r我不了解,r我没有相关信息,r抱歉我无法]forpatterninreject_patterns:ifre.search(pattern,text):returnFalsereturnTrue注意拒绝回答模式列表基于常见模型测试不同模型或版本可能需调整。三、提及判定使用关键词匹配判断品牌是否被提及。为避免子串匹配错误建议精确匹配或使用同义词列表。defis_mentioned(text:str,brand_name:str,synonyms:listNone)-bool:判断品牌是否在回答中被提及ifbrand_name.lower()intext.lower():returnTrueifsynonyms:forsyninsynonyms:ifsyn.lower()intext.lower():returnTruereturnFalse同一回答中多次提及只计一次。四、推荐意图识别通过信号词和否定词判断推荐意图。定位品牌出现位置附近前后100字符检测信号词并排除否定修饰。positive_signals[推荐,建议,首选,值得尝试,不错的选择,好用,强大,领先,优秀,可靠]negation_words[不,没,别,不太]defhas_recommendation(text:str,brand_name:str)-bool:idxtext.lower().find(brand_name.lower())ifidx-1:returnFalsestartmax(0,idx-100)endmin(len(text),idxlen(brand_name)100)contexttext[start:end]forsignalinpositive_signals:ifsignalincontext:signal_idxcontext.find(signal)pre_textcontext[max(0,signal_idx-5):signal_idx]ifany(neginpre_textforneginnegation_words):continuereturnTruereturnFalse五、引用来源判断检测回答中是否包含引用标记如URL、引号、来源声明等。defhas_citation(text:str)-bool:citation_patterns[r据.*报道,r根据.*资料,r参考.*来源,r引自,rhttps?://[^\s],r《[^》]》,r[^]]forpatternincitation_patterns:ifre.search(pattern,text):returnTruereturnFalse注意此处判断的是回答中明确标注的来源而非模型训练数据中的隐含知识。六、去重与聚合同一品牌在同一回答中多次提及只计一次同一问题下多次采集的相同回答如API重试需去重。使用回答的哈希值去重。importhashlibdefresponse_hash(text:str)-str:returnhashlib.md5(text.encode(utf-8)).hexdigest()seenset()unique_responses[]forrespinresponses:hresponse_hash(resp[text])ifhnotinseen:seen.add(h)unique_responses.append(resp)七、指标计算defcompute_metrics(responses:list,brand_name:str,synonyms:listNone):valid[rforrinresponsesifis_valid_response(r[text])]total_validlen(valid)iftotal_valid0:return{mention_rate:0,recommendation_rate:0,citation_rate:0}mentioned[rforrinvalidifis_mentioned(r[text],brand_name,synonyms)]total_mentionedlen(mentioned)mention_ratetotal_mentioned/total_valid recommendedsum(1forrinmentionedifhas_recommendation(r[text],brand_name))recommendation_raterecommended/total_mentionediftotal_mentioned0else0citedsum(1forrinmentionedifhas_citation(r[text]))citation_ratecited/total_mentionediftotal_mentioned0else0return{mention_rate:round(mention_rate,4),recommendation_rate:round(recommendation_rate,4),citation_rate:round(citation_rate,4)}验证结果构造包含已知提及、推荐、引用的测试回答运行代码应输出三个0~1之间的浮点数。例如假设测试数据包含100条有效回答其中35条提及品牌则提及率为0.35。验证方法构造测试回答检查输出是否符合预期。确认拒绝回答被过滤。确认同一品牌多次提及只计一次。常见问题与避坑同义词问题品牌可能有简称、别名需维护同义词列表否则会漏计。否定词干扰如“不推荐使用A品牌”简单匹配“推荐”会误判需结合否定词处理。引用来源粒度引用率只关心是否至少有一个引用不关心数量。回答长度影响过短的回答可能信息不足建议设置最小长度阈值。多轮对话需明确只分析AI的最终回答还是包含中间轮次。总结本文实现了AI回答中提及率、推荐率和引用率的工程计算方法包括有效样本过滤、提及判定、推荐意图识别、引用判断和去重逻辑。该方法适用于批量分析AI助手对特定品牌的输出情况。当前实现基于规则匹配对于复杂语义场景如讽刺、隐含推荐可能不够准确可考虑引入更细粒度的NLP模型进行意图分类。