diff --git a/skills/ir_generation_skill/step1_semantic_index.py b/skills/ir_generation_skill/step1_semantic_index.py index 4e34b1a..15897a6 100644 --- a/skills/ir_generation_skill/step1_semantic_index.py +++ b/skills/ir_generation_skill/step1_semantic_index.py @@ -880,10 +880,14 @@ def run_ensemble_semantic_index(doc: dict) -> dict: if v: print(f" {k}: {len(v)} 个问题") - # Feedback retry: re-run with coverage feedback (one retry) - feedback = _build_coverage_feedback(gaps) - if feedback: - print(f"\n 覆盖反馈重试 (feedback长度={len(feedback)}字符)...", flush=True) + # Feedback retry: re-run with coverage feedback (up to 2 retries) + retry_count = 0 + while retry_count < 2: + feedback = _build_coverage_feedback(gaps) + if not feedback: + break + retry_count += 1 + print(f"\n 覆盖反馈重试 #{retry_count} (feedback长度={len(feedback)}字符)...", flush=True) try: retry_prompt = build_prompt(doc, feedback, all_paths) print(f" 重试 prompt 长度: {len(retry_prompt)} 字符", flush=True) @@ -892,17 +896,15 @@ def run_ensemble_semantic_index(doc: dict) -> dict: n_retry_concepts = len(retry_result.get("concepts", [])) print(f" 重试返回: {n_retry_concepts} 概念, {n_retry_units} 功能单元", flush=True) if n_retry_units > 0: - # Check which new sections were covered retry_sections = set() for fu in retry_result.get("function_units", []): for src in fu.get("sources", []): if src.get("section"): retry_sections.add(src["section"]) print(f" 重试新增 sections: {sorted(retry_sections)}", flush=True) - # Merge retry into results and re-validate semantic_indices.append(retry_result) merged = ensemble_merge(semantic_indices) - merged["ensemble_temperatures"] = list(temperatures) + ["feedback_retry"] + merged["ensemble_temperatures"] = list(temperatures) + [f"feedback_retry_{retry_count}"] passed, gaps = _quick_validate(merged, doc, all_paths) merged["validation_passed"] = passed merged["validation_gaps"] = { @@ -913,6 +915,7 @@ def run_ensemble_semantic_index(doc: dict) -> dict: print(f" 覆盖反馈重试失败: {e}", flush=True) import traceback traceback.print_exc() + break return merged