AI回答采集:基于模板与变量池的问题集自动生成方案

发布时间:2026/7/30 16:49:54
AI回答采集:基于模板与变量池的问题集自动生成方案 问题在构建AI问答评测或品牌信息采集系统时需要大量覆盖不同场景的问题来触发模型回答。手动编写问题效率低、易遗漏且难以保证覆盖度和一致性。本文介绍一种自动化生成问题集的方法并说明如何控制质量。环境Python 3.10依赖json, itertools, hashlib, re无需外部服务本地可运行整体思路设计问题模板含变量占位符定义变量池行业、场景、产品类型等组合生成候选问题去重与归一化覆盖度检查规则过滤一、问题模板设计模板是生成的基础。每个模板包含固定文本和变量占位符例如templates[{industry}行业有哪些知名的{product_type}品牌,推荐几个适合{scene}的{product_type},{product_type}品牌{name}的主要竞争对手是谁,如何评价{product_type}品牌{name},{industry}行业{scene}场景下{product_type}选型有哪些注意事项]变量占位符用花括号标识后续替换为具体值。二、变量池定义变量池按维度组织每个维度包含若干值。以下示例变量值来源于公开行业分类和常见软件品类variable_pool{industry:[金融,医疗,教育,电商,制造,零售],product_type:[CRM,ERP,数据分析工具,客服系统,营销自动化],scene:[客户管理,库存管理,销售预测,售后服务,市场分析],name:[Salesforce,SAP,用友,金蝶,HubSpot]}注意变量值应来源于真实业务场景避免虚构。三、组合生成使用笛卡尔积生成所有组合但需避免无意义组合如“医疗行业的ERP品牌”可能合理但“教育行业的库存管理”可能不常见。可引入白名单规则过滤。importitertoolsdefgenerate_questions(templates,variable_pool):questions[]fortmplintemplates:# 提取模板中使用的变量名vars_in_tmplre.findall(r\{(\w)\},tmpl)# 获取这些变量对应的值列表var_values[variable_pool[var]forvarinvars_in_tmpl]forcombinationinitertools.product(*var_values):# 替换占位符questiontmpl.format(**dict(zip(vars_in_tmpl,combination)))questions.append(question)returnquestions raw_questionsgenerate_questions(templates,variable_pool)print(f生成候选问题数{len(raw_questions)})四、去重与归一化生成的问题可能存在重复不同模板产生相同文本或语义重复。先做文本去重再考虑语义去重可选。文本去重defnormalize(text):# 统一标点、空格、大小写texttext.strip().lower()textre.sub(r[。、],,,text)textre.sub(r\s, ,text)returntextdefdeduplicate(questions):seenset()unique[]forqinquestions:normnormalize(q)ifnormnotinseen:seen.add(norm)unique.append(q)returnunique unique_questionsdeduplicate(raw_questions)print(f去重后问题数{len(unique_questions)})语义去重可选若问题量级大可计算句子嵌入相似度阈值设为0.85以上视为重复。以下是一个使用sentence-transformers的示例fromsentence_transformersimportSentenceTransformer,util modelSentenceTransformer(all-MiniLM-L6-v2)embeddingsmodel.encode(unique_questions,convert_to_tensorTrue)similaritiesutil.pytorch_cos_sim(embeddings,embeddings)# 根据相似度矩阵去除重复略注意语义去重会增加计算成本建议仅在问题数量超过1000时使用。五、覆盖度检查覆盖度指问题集对变量维度的覆盖情况。应确保每个变量值至少出现一次。defcoverage_check(questions,variable_pool):coverage{var:set()forvarinvariable_pool}forqinquestions:forvarinvariable_pool:forvalinvariable_pool[var]:ifvalinq:coverage[var].add(val)forvar,valsincoverage.items():missingset(variable_pool[var])-valsifmissing:print(f变量{var}缺失值{missing})else:print(f变量{var}覆盖完整)returncoverage coveragecoverage_check(unique_questions,variable_pool)若发现缺失可补充模板或变量值。六、规则过滤长度过滤问题长度应在10-100字之间。敏感词过滤排除包含政治、色情等敏感词的问题。无效模式如“的的”重复、标点异常等。defquality_filter(questions):valid[]forqinquestions:iflen(q)10orlen(q)100:continueifre.search(r[的]{2,},q):continue# 敏感词列表略valid.append(q)returnvalid filtered_questionsquality_filter(unique_questions)验证结果执行上述流程后输出最终问题集。验证方法统计最终问题数量确保覆盖所有变量值。人工抽检50个问题记录合格率。使用问题集对同一AI模型进行一轮回答采集观察回答是否合理无空答、无拒绝回答。正常情况下应看到问题集数量约200-500个取决于变量池大小覆盖度100%人工抽检合格率 95%常见问题与避坑1. 生成问题过多导致冗余变量组合过多时问题集可能膨胀到数万。建议限制每个模板最多使用3个变量。对变量值进行抽样每个维度取5-10个典型值。2. 模板设计不当导致语义偏差模板中的固定文本可能引入倾向性例如“推荐几个好的”隐含正面预设。建议使用中性表述如“有哪些”。3. 变量值不均衡某些变量值如品牌名可能在不同模板中重复出现导致问题集偏向该值。可通过加权采样平衡。总结本文实现了一种基于模板和变量池的自动化问题集生成方法包含去重、覆盖度检查和规则过滤。该方法适用于AI回答采集、评测数据集构建等场景。当前方案依赖人工设计的模板和变量后续可引入大模型辅助生成模板但仍需人工审核。方案的主要局限在于模板设计成本较高且变量值需要定期更新以保持时效性。