fix(rag): BM25 分歧救援 source 一致性校验 + 意图分析 max_tokens 修复

1. _rescue_bm25_divergence 情况 B 注入前校验 source 与 contexts 多数 source 一致,
   防止跨文档注入无关切片(如 2.docx 吸烟场所切片混入 1.docx 投放查询)
2. INTENT_MAX_TOKENS 从 2048 提升至 4096,修复 mimo-v2.5 思维链截断导致意图分析偶发失败

评测 R2+ 结果:overall 4.35(基线 4.20),忠实度 +0.24,幻觉率不变
This commit is contained in:
lacerate551
2026-06-19 14:39:16 +08:00
parent 17ce177d1a
commit 95f3b99064
2 changed files with 21 additions and 2 deletions

View File

@@ -534,6 +534,15 @@ def _rescue_bm25_divergence(contexts: List[Dict], search_result: dict,
if chunk_id:
existing_ids[chunk_id] = i
# 计算 contexts 中的多数 source用于情况 B 注入校验)
# 防止跨文档注入无关切片(如 q013 场景2.docx 的吸烟场所切片被注入到 1.docx 的查询中)
source_counter: Dict[str, int] = {}
for ctx in contexts:
src = ctx.get('meta', {}).get('source', '')
if src:
source_counter[src] = source_counter.get(src, 0) + 1
majority_source = max(source_counter, key=source_counter.get) if source_counter else None
rescued_count = 0
for bm25_item in bm25_top3:
@@ -560,8 +569,18 @@ def _rescue_bm25_divergence(contexts: List[Dict], search_result: dict,
continue
# 情况 B切片不在 contexts 中(被 rerank 截断或已被过滤)
# 从 _bm25_top3 备份中注入
# 从 _bm25_top3 备份中注入,但需校验 source 一致性
if bm25_doc and bm25_meta:
bm25_source = bm25_meta.get('source', '')
# source 一致性校验:只注入与 contexts 多数 source 一致的切片
# 避免跨文档注入无关内容(如 2.docx 的吸烟场所切片混入 1.docx 的投放查询)
if majority_source and bm25_source and bm25_source != majority_source:
logger.debug(
f"BM25 分歧救援 (情况B-跳过): rank={rank}, "
f"source={bm25_source} != majority={majority_source}, "
f"section={bm25_meta.get('section', '')}"
)
continue
injected_ctx = {
'doc': bm25_doc,
'meta': bm25_meta,