数据处理
BGE 误拦截数据处理
803 BGE 误拦数据项目:完整处理过程说明
1. 项目要解决的问题与原始数据
原始数据
两个主要文件:
00原始数据/bad_case_false_block_20260801.xlsx(658 行)00原始数据/bad_case_false_block_20260801_bge_combined_attribution_threshold_0_99999.json(333 条归因记录)
Excel 数据的特点:
- 每条包含配置、记录 ID、日期、完整文本、文本长度。
- 很多行内容重复——同一条文本在 Q3G 开/关配置下各出现一次。
- 文本通常很长,内部是多段推理、分析、复现、风险判断、修复建议等逐步累积的内容,全文之间存在大量重叠。
要解决的问题
项目目标不是简单保留这些长文本,而是定位:
一条合规长文本中,究竟是哪一小段内容最可能触发 BGE 的错误拦截。
定位出这些片段后,再把它们整理成可用于评测、规则分析和后续模型优化的数据。
2. BGE 归因:从长文本中定位触发片段
整体流程
读取 Excel → SHA1 去重 → 切分片段 → BGE 打分 → 计算归因分数 → 筛选候选 → 每条最多保留 top 10
数量变化:
658 条 Excel 原始行
→ 334 条唯一完整文本(去重)
→ 333 条有候选触发片段的归因结果(1 条因无候选片段被排除)
BGE 阈值:0.99999,耗时约 836 秒。
六种归因分数
对每个片段 Pi,系统计算了以下分数:
| 分数 | 含义 |
|---|---|
single_score |
片段单独送入 BGE 的 unsafe 分数,说明这段话本身像不像风险内容 |
prefix_score |
从开头累计到当前片段后的分数 |
incremental_delta |
加入当前片段后分数上涨了多少,观察是否加到这一段后分数突然升高 |
global_trigger_score |
从完整文本中移除当前片段后整体分数下降多少,下降越多说明贡献越大 |
window_trigger_score |
在当前片段附近的局部窗口里做消融,适合长文本(BGE max_length = 128 下全文经常被截断) |
combined_trigger_score |
整合以上所有证据的综合排序分数,top_triggers 主要按此排序 |
片段的保留条件
满足以下条件的段落进入候选集:
single_score是否高incremental_delta是否为正global_trigger_score是否明显为正window_trigger_score是否明显为正- 是否在当前片段首次过阈值
每条完整文本最多输出综合分最高的 10 个候选片段。
最终输出与数量关系
JSON 包含 333 条 records,每条对应一条唯一完整文本,通过 source_rows 可回到 Excel 定位原文(JSON 中不保存完整原文)。
333 条归因记录
→ 每条长文本被切分成多个小片段
→ 25,037 个原始片段
→ 根据 BGE 分数变化筛选
→ 3,172 个候选触发片段(top_triggers)
333 是“长文本记录”的数量,3,172 是这些长文本中筛选出来的“候选小片段”总数,一条记录可以贡献多个候选片段。
3. 制定 3,172 个候选片段的处理计划
核心原则:
- 3,172 个片段只是 BGE 归因算法挑出的“高可能触发片段”,不能直接等同于真实违规内容。
- 片段中存在大量完全重复和高度相似内容,需要先去重和聚类。
- 需要使用 Minimax 判断片段本身是否安全,以及它是否适合作为误拦样本。
- 按要求取消人工抽检,改用自动化多轮一致性判断。
- 对争议结果进行第二轮、第三轮 Minimax 复判。
4. 展开候选片段并完成去重
展开
将 JSON 中每条记录的 top_triggers 展开为片段级数据,一行对应一个候选片段,保留以下属性:
- 来源长文本和记录编号
- 片段内容及位置
- 单片段 BGE 分数
- 前缀累计分数
- 移除片段后的全局和局部变化
- 综合归因分数
- 上下文窗口
- 长文本是否达到模型长度上限
完全去重与近似聚类
3,172 个原始候选片段
↓ 完全文本去重(按标准化文本)
354 个唯一片段
↓ 保守近似聚类(仅合并高度相似、包含关系明确或仅有格式差异的片段)
324 个代表簇
代表簇的结构:
一个代表簇
├── 一个代表片段
├── 一个或多个完全去重片段
└── 对应一个或多个原始候选片段
324 个代表簇是对 3,172 个原始候选片段进行压缩后的核心分析单位。
5. Minimax 三轮判断与最终分级
第一轮判断
将 324 个代表簇逐一交给 Minimax,判断以下维度:
- 片段单独看是否安全
- 放回上下文后是否安全
- 是否可能是 BGE 误拦
- 风险类别
- 最小触发内容
- 判断置信度
- 是否需要再次复核
第二、三轮自动复判
以下情况不直接采用第一轮结果,自动进入复判:
- 模型主动标记
needs_recheck - 判断置信度偏低
- 片段单独判断和结合上下文判断冲突
- 是否属于误拦的结论存在明显不确定性
最终五级分级
| 等级 | 代表簇数 | 对应原始片段数 | 含义 |
|---|---|---|---|
| A | 204 | 2,225 | 高置信合规误拦核心集 |
| B | 27 | 713 | 可使用的误拦扩展集 |
| C | 5 | 7 | 自动判断仍不确定 |
| D | 32 | 57 | 真实不安全内容,可作为对照集 |
| E | 56 | 170 | 归因或数据质量不可靠 |
| 合计 | 324 | 3,172 | — |
核心结论:
324 个代表簇并不全部是最有价值的数据。真正最适合直接使用的是其中 204 个 A 级代表簇;27 个 B 级可以作为扩展数据;D、E 级不应混入合规误拦核心集。
6. A 级代表簇的使用方式与扩展
作为固定基准集
204 个 A 级代表簇的 representative_text 应作为固定误拦基准集,不建议被后续生成数据替代。用途包括:
- BGE 回归测试:每次修改模型、阈值或规则后重新运行。
- 误拦率统计:观察这些合规文本中还有多少被拦截。
- 风险类别分析:查看代码安全描述、敏感内容引用等类型是否更容易误拦。
- 阈值比较:比较不同阈值下误拦数量的变化。
- 规则优化:定位模型是否只因某些词语或表达形式产生高风险判断。
扩展生成
使用 Minimax 对每个父代表簇生成 5 种变体:
| 变体类型 | 说明 |
|---|---|
paraphrase |
同义改写 |
contextualized |
补充明确的合规上下文 |
format_shift |
改变表达或排版格式 |
concise |
更精简的表达 |
detailed |
更详细的表达 |
204 个 A 级父代表簇 × 5 种变体 = 1,020 条候选扩展数据
7. 扩展数据清洗与独立验证
本地清洗
检查以下问题并剔除或合并:
- 文本过短或过长
- 文本为空
- 与原文或其他扩展文本过度重复
- 缺少必要信息
- 标准化后形成重复
1,020 条生成候选
↓ 长度和确定性规则检查
984 条通过,36 条剔除
↓ 保守近似去重
976 条保留(8 条近似重复被合并)
独立验证
为避免“同一个模型生成后直接认为合格”,使用独立提示词让 Minimax 重新判断每条扩展文本:
- 扩展文本是否安全
- 是否保留父代表簇原意
- 是否引入原文没有的新事实或危险细节
- 作为误拦测试数据的价值(高 / 中 / 低)
- 判断置信度
验证结果:
- 待复核:976 条
- 已完成:976 条
- 覆盖父代表簇:204 个
- 过程中出现过 3 条临时失败记录,均已重新处理成功
最终过滤与结果
严格通过条件:
verification_label == safe
preserves_parent_intent == true
introduces_unsupported_details == false
verification_confidence >= 0.80
| 数据类型 | 数量 | 父代表簇覆盖 |
|---|---|---|
| 全部验证通过扩展数据 | 968 | 204 |
| 高/中测试价值数据 | 854 | 200 |
| 低测试价值数据 | 114 | — |
| 全流程剔除数据 | 52 | — |
通过数据置信度:
- 最低:0.80
- 中位数:0.95
- 最高:0.98
每个父代表簇最终保留的扩展数量:
- 156 个父簇保留 5 条
- 44 个父簇保留 4 条
- 4 个父簇保留 3 条
8. 最终数据集 final_verified_expansions.csv
CSV 中一行代表一条已通过本地规则和 Minimax 独立复核的扩展数据。
关键字段
| 字段 | 用途 |
|---|---|
candidate_id |
扩展数据唯一编号 |
parent_cluster_id |
来源于哪个 A 级代表簇 |
parent_text |
原始父代表簇文本 |
expanded_text |
实际用于后续测试的新文本 |
variation_type |
采用了哪种扩展方式 |
verification_label |
Minimax 独立复核的安全标签 |
preserves_parent_intent |
是否保留父文本原意 |
introduces_unsupported_details |
是否引入无依据的新内容 |
false_block_test_value |
作为误拦测试数据的价值 |
verification_confidence |
复核置信度 |
bge_retest_status |
是否已经重新送入 BGE 测试 |
使用建议
- 实际送测时,主要使用
expanded_text字段。 - 推荐优先使用
false_block_test_value = high和medium的数据,共 854 条。