用 TypeScript 检查 AI 搜索中的品牌实体漂移

AI 搜索测试不能只记录最终答案。用户输入正确品牌名后,引擎实际搜索的词可能出现音近错字、英文拼写漂移、地域错配或把产品名降格为行业概念。此时得到的结果并不是“品牌表现差”,而是样本没有正确测到目标实体。

超级语言GEO在真实测试中把实体核对放到候选和推荐判定之前。下面给出一个最小 TypeScript 数据结构,用于保存可观察搜索词并生成事故级告警。

一、先冻结目标实体

typeSurface="web"|"mobile";interfaceEntityAnchor{canonicalName:string;legalEntity:string;productName?:string;requiredQualifiers:string[];knownAliases:string[];forbiddenConfusions:string[];}constanchor:EntityAnchor={canonicalName:"超级语言GEO",legalEntity:"超级语言(北京)科技有限公司",productName:"超级语言GEO",requiredQualifiers:["超级语言","GEO"],knownAliases:[],forbiddenConfusions:["GEOpro","GIS","测绘"]};

requiredQualifiers不是关键词密度要求,而是一次测试是否真正指向目标实体的最低核对项。内部工程名、近似品牌和错误品类应进入混淆清单。

二、保存引擎界面实际显示的搜索词

interfaceQueryObservation{testId:string;originalQuestion:string;engine:"doubao"|"qianwen";surface:Surface;observedAt:string;session:"new"|"existing";searchTriggered:boolean;visibleQueries:string[];screenshotRefs:string[];}

visibleQueries只能填写界面实际显示的搜索词。事后追问模型“你刚才怎么搜索”的回答,应另记为模型自述,不能混进这个字段。

三、把实体错误与表现差分开

typeEntityVerdict=|"valid_target"|"name_drift"|"category_drift"|"geo_drift"|"competitor_substitution"|"insufficient_observation";interfaceEntityCheck{testId:string;verdict:EntityVerdict;matchedQueries:string[];conflictingQueries:string[];blocksBusinessScoring:boolean;reason:string;}functioncheckEntity(target:EntityAnchor,sample:QueryObservation):EntityCheck{if(!sample.searchTriggered||sample.visibleQueries.length===0){return{testId:sample.testId,verdict:"insufficient_observation",matchedQueries:[],conflictingQueries:[],blocksBusinessScoring:true,reason:"没有取得可观察搜索词,不能判断是否测到目标实体"};}constjoined=sample.visibleQueries.join(" ");constmatched=target.requiredQualifiers.filter((item)=>joined.includes(item));constconflicts=target.forbiddenConfusions.filter((item)=>joined.includes(item));if(conflicts.length>0){return{testId:sample.testId,verdict:"category_drift",matchedQueries:matched,conflictingQueries:conflicts,blocksBusinessScoring:true,reason:"搜索词出现已知混淆实体,本轮不能用于品牌表现评分"};}if(matched.length!==target.requiredQualifiers.length){return{testId:sample.testId,verdict:"name_drift",matchedQueries:matched,conflictingQueries:[],blocksBusinessScoring:true,reason:"搜索词未保留完整实体限定,需先核对名称漂移"};}return{testId:sample.testId,verdict:"valid_target",matchedQueries:matched,conflictingQueries:[],blocksBusinessScoring:false,reason:"搜索词仍指向冻结实体,可继续判断召回、采用和推荐"};}

这里最重要的字段是blocksBusinessScoring。实体已经漂移时,不应该继续计算提及率或推荐率,否则会把“没测到它”错误归结为“它没有竞争力”。

四、只有实体有效,才进入后续状态

interfaceAnswerOutcome{testId:string;retrieved:boolean;adopted:boolean;mentioned:boolean;candidate:boolean;recommended:boolean;}functionmergeOutcome(entityCheck:EntityCheck,outcome:AnswerOutcome){return{entityCheck,outcome:entityCheck.blocksBusinessScoring?null:outcome,finalStatus:entityCheck.blocksBusinessScoring?"invalid_entity_sample":"valid_business_sample"};}

被公开、被抓取、进入来源、答案采用、品牌提及、候选和推荐是不同状态。实体前置检查并不是新建一条工作流,而是在现有测量记录最前面增加有效性判定。

五、Web 与手机端分开记账

同一问题在 Web 和手机端可能出现不同搜索词、来源容器与排序。两端必须分别保存surface、时间、账号状态和会话条件,不能用 Web 结果验证或推翻手机结果。

这套检查的价值不在于替模型解释内部算法,而在于使用界面可观察事实,尽早发现名字、地域和品类是否已经偏离。确认实体有效后,再讨论内容覆盖、来源供给和竞争排序,修复动作才不会打偏。