From 9643ae3c54f5e2fb3fe0bde2bf24518bc3eb2f12 Mon Sep 17 00:00:00 2001 From: Justin Date: Thu, 27 Aug 2026 12:45:26 +0800 Subject: [PATCH] Enhance Analyzer multi-bench bucket allocation --- examples/scripts/run_analyzer_standalone.py | 7 + loopai/skills/Analyzer/analyzer_agent.py | 6 + loopai/skills/Analyzer/bench_inputs.py | 81 ++ loopai/skills/Analyzer/bucket_strategy.py | 763 ++++++++++++++++++ loopai/skills/Analyzer/cli.py | 2 + .../nodes/analyze_metric_report_node.py | 82 +- .../skills/Analyzer/nodes/analyze_result.py | 62 +- .../skills/Analyzer/nodes/draw_conclusion.py | 159 +++- loopai/skills/Analyzer/nodes/eval_model.py | 105 ++- loopai/skills/Analyzer/pipeline_runner.py | 71 +- loopai/skills/Analyzer/runtime_config.py | 10 + .../Analyzer/utils/openai_compat_llm.py | 3 +- skills/Analyzer/BUCKET_STRATEGY.md | 85 ++ skills/Analyzer/BUCKET_STRATEGY.pdf | Bin 0 -> 205525 bytes skills/Analyzer/SKILL.md | 79 +- 15 files changed, 1454 insertions(+), 61 deletions(-) create mode 100644 loopai/skills/Analyzer/bench_inputs.py create mode 100644 loopai/skills/Analyzer/bucket_strategy.py create mode 100644 skills/Analyzer/BUCKET_STRATEGY.md create mode 100644 skills/Analyzer/BUCKET_STRATEGY.pdf diff --git a/examples/scripts/run_analyzer_standalone.py b/examples/scripts/run_analyzer_standalone.py index f93efed..6d98ad8 100644 --- a/examples/scripts/run_analyzer_standalone.py +++ b/examples/scripts/run_analyzer_standalone.py @@ -93,6 +93,12 @@ def _parse_args() -> argparse.Namespace: default=None, help="Number of failed samples per Analyzer model batch. Default: 20.", ) + parser.add_argument( + "--request-timeout-seconds", + type=float, + default=None, + help="Analyzer model client timeout. Default: 300 seconds.", + ) parser.add_argument("--resume", action="store_true", help="Resume using Configer/external runtime state.") parser.add_argument("--from-node", default=None, help="Force Analyzer to resume from a specific step.") parser.add_argument("--list-nodes", action="store_true", help="List standalone Analyzer steps and exit.") @@ -135,6 +141,7 @@ def main() -> None: version_id=args.version_id, baseline_result_path=args.baseline_result_path, analyze_batch_size=args.analyze_batch_size, + analyze_request_timeout_seconds=args.request_timeout_seconds, force_new_version=args.new_version, stream_stdout=args.stream_stdout, emit_status=False, diff --git a/loopai/skills/Analyzer/analyzer_agent.py b/loopai/skills/Analyzer/analyzer_agent.py index cd8550e..6ef834c 100644 --- a/loopai/skills/Analyzer/analyzer_agent.py +++ b/loopai/skills/Analyzer/analyzer_agent.py @@ -71,6 +71,9 @@ def check_required_fields(state: LoopAIState, runtime: Runtime[RuntimeContext]): has_result_path = ( bool(judger_cfg.get("output_result_path")) + or bool(judger_cfg.get("bench_result")) + or bool(judger_cfg.get("extra_bench_result")) + or bool(analyzer_cfg.get("eval_result_paths")) or bool(analyzer_cfg.get("eval_result_path")) ) if not has_result_path: @@ -82,6 +85,9 @@ def check_required_fields(state: LoopAIState, runtime: Runtime[RuntimeContext]): bool(judger_cfg.get("output_result_path")) or bool(judger_cfg.get("out_result_path")) or bool(judger_cfg.get("eval_result_path")) + or bool(judger_cfg.get("bench_result")) + or bool(judger_cfg.get("extra_bench_result")) + or bool(analyzer_cfg.get("eval_result_paths")) or bool(analyzer_cfg.get("eval_result_path")) ) if (not has_bench) and (not has_result_path): diff --git a/loopai/skills/Analyzer/bench_inputs.py b/loopai/skills/Analyzer/bench_inputs.py new file mode 100644 index 0000000..9a128be --- /dev/null +++ b/loopai/skills/Analyzer/bench_inputs.py @@ -0,0 +1,81 @@ +from __future__ import annotations + +from pathlib import Path +from typing import Any, Dict, List + + +def _source(name: Any, path: Any, task_type: Any = None) -> Dict[str, str]: + value = str(path or "").strip() + fallback_name = Path(value).stem if value else "bench" + return { + "bench_name": str(name or fallback_name), + "path": value, + "task_type": str(task_type or ""), + } + + +def _from_value(value: Any) -> List[Dict[str, str]]: + if isinstance(value, (str, Path)): + return [_source(None, value)] if str(value).strip() else [] + if isinstance(value, dict): + if any(key in value for key in ("output_result_path", "eval_result_path", "path")): + return [_source( + value.get("bench_name") or value.get("name"), + value.get("output_result_path") or value.get("eval_result_path") or value.get("path"), + value.get("task_type"), + )] + return [_source(name, path) for name, path in value.items() if path] + if isinstance(value, (list, tuple)): + sources: List[Dict[str, str]] = [] + for item in value: + sources.extend(_from_value(item)) + return sources + return [] + + +def resolve_eval_result_sources(state: Dict[str, Any], task_type: str) -> List[Dict[str, str]]: + """Resolve one or more Judger result files without breaking string input.""" + judger = state.get("judger") if isinstance(state.get("judger"), dict) else {} + analyzer = state.get("analyzer") if isinstance(state.get("analyzer"), dict) else {} + + sources: List[Dict[str, str]] = [] + for key in ("bench_result", "extra_bench_result"): + sources.extend(_from_value(judger.get(key))) + + compatible = [ + item for item in sources + if not item.get("task_type") or item.get("task_type") == task_type + ] + if sources: + sources = compatible + else: + sources = _from_value( + judger.get("output_result_paths") + or judger.get("output_result_path") + or analyzer.get("eval_result_paths") + or analyzer.get("eval_result_path") + ) + + deduplicated: List[Dict[str, str]] = [] + seen = set() + used_names = CounterLike() + for item in sources: + path = item.get("path", "") + if not path or path in seen: + continue + seen.add(path) + base_name = item.get("bench_name") or Path(path).stem + suffix = used_names.next(base_name) + item = dict(item) + item["bench_name"] = base_name if suffix == 1 else f"{base_name}-{suffix}" + deduplicated.append(item) + return deduplicated + + +class CounterLike: + def __init__(self) -> None: + self._counts: Dict[str, int] = {} + + def next(self, key: str) -> int: + self._counts[key] = self._counts.get(key, 0) + 1 + return self._counts[key] diff --git a/loopai/skills/Analyzer/bucket_strategy.py b/loopai/skills/Analyzer/bucket_strategy.py new file mode 100644 index 0000000..fea8b12 --- /dev/null +++ b/loopai/skills/Analyzer/bucket_strategy.py @@ -0,0 +1,763 @@ +from __future__ import annotations + +import math +import re +from collections import Counter, defaultdict +from typing import Any, Dict, Iterable, List, Tuple + + +_CODE_BUCKET_META = { + "code_output_contract": { + "label": "代码补全输出契约", + "severity": 1.20, + "transfer": 1.25, + "learnability_prior": 1.30, + "cost": 0.90, + "sample_direction": "函数签名/Docstring -> 仅输出完整可执行代码,不输出解释或 Markdown 围栏", + }, + "code_syntax_completion": { + "label": "Python 语法与补全完整性", + "severity": 1.15, + "transfer": 1.15, + "learnability_prior": 1.15, + "cost": 0.90, + "sample_direction": "缩进、括号、字符串、return 与完整函数体的短小 Python 补全样本", + }, + "code_interface_scope": { + "label": "函数接口、作用域与依赖", + "severity": 1.10, + "transfer": 1.10, + "learnability_prior": 1.00, + "cost": 1.00, + "sample_direction": "保持函数名和签名,补齐局部变量、标准库导入与辅助函数", + }, + "code_semantic_logic": { + "label": "语义逻辑与断言正确性", + "severity": 1.20, + "transfer": 1.15, + "learnability_prior": 0.75, + "cost": 1.15, + "sample_direction": "可执行但答案错误的短算法题,配套正常样例与反例断言", + }, + "code_boundary_robustness": { + "label": "边界条件与鲁棒性", + "severity": 1.05, + "transfer": 1.10, + "learnability_prior": 0.75, + "cost": 1.10, + "sample_direction": "空输入、单元素、重复值、极值和特殊字符等对比样本", + }, + "code_runtime_efficiency": { + "label": "运行时与效率", + "severity": 0.95, + "transfer": 0.85, + "learnability_prior": 0.55, + "cost": 1.30, + "sample_direction": "超时、递归深度和复杂度退化的成对优化样本", + }, +} + +_SQL_BUCKET_META = { + "sql_output_contract": { + "label": "SQL 输出契约", + "severity": 1.15, + "transfer": 1.20, + "learnability_prior": 1.25, + "cost": 0.90, + "sample_direction": "问题与 Schema -> 仅输出可执行 SQL,不输出解释或 Markdown", + }, + "sql_syntax": { + "label": "SQL 语法与结构", + "severity": 1.15, + "transfer": 1.10, + "learnability_prior": 1.10, + "cost": 0.90, + "sample_direction": "SELECT、JOIN、GROUP BY、子查询和聚合函数的短 SQL 修复样本", + }, + "sql_schema_linking": { + "label": "Schema Linking", + "severity": 1.20, + "transfer": 1.20, + "learnability_prior": 0.85, + "cost": 1.15, + "sample_direction": "问题实体与表、列、外键的显式对齐及易混淆 Schema 对比样本", + }, + "sql_semantic_logic": { + "label": "SQL 语义与结果正确性", + "severity": 1.20, + "transfer": 1.10, + "learnability_prior": 0.70, + "cost": 1.20, + "sample_direction": "可执行但结果错误的查询,覆盖过滤、聚合、排序与去重语义", + }, + "sql_type_value": { + "label": "类型、值与条件表达", + "severity": 1.00, + "transfer": 1.00, + "learnability_prior": 0.90, + "cost": 1.00, + "sample_direction": "日期、数值、NULL、字符串匹配和类型转换的边界样本", + }, + "sql_runtime_efficiency": { + "label": "SQL 运行时与效率", + "severity": 0.90, + "transfer": 0.80, + "learnability_prior": 0.50, + "cost": 1.30, + "sample_direction": "超时查询与等价高效查询的成对样本", + }, +} + +_GENERAL_BUCKET_META = { + "general_instruction_following": { + "label": "指令与输出格式遵循", + "severity": 1.20, + "transfer": 1.25, + "learnability_prior": 1.25, + "cost": 0.85, + "sample_direction": "覆盖格式、长度、结构和约束组合的指令遵循样本,答案需严格满足可验证要求", + }, + "general_relevance_intent": { + "label": "相关性与意图理解", + "severity": 1.10, + "transfer": 1.15, + "learnability_prior": 1.05, + "cost": 0.95, + "sample_direction": "相似意图辨析、答非所问纠正和用户目标对齐的对比样本", + }, + "general_factuality_grounding": { + "label": "事实性与知识依据", + "severity": 1.25, + "transfer": 1.15, + "learnability_prior": 0.75, + "cost": 1.20, + "sample_direction": "带可信来源或给定上下文的知识问答、幻觉纠正和事实核验样本", + }, + "general_reasoning_consistency": { + "label": "推理与一致性", + "severity": 1.20, + "transfer": 1.15, + "learnability_prior": 0.65, + "cost": 1.30, + "sample_direction": "多步推理、因果判断、前后一致性检查和反例验证样本", + }, + "general_completeness_coverage": { + "label": "完整性与要点覆盖", + "severity": 1.05, + "transfer": 1.10, + "learnability_prior": 1.00, + "cost": 0.95, + "sample_direction": "按评分要点覆盖关键信息、补全遗漏内容和避免回答截断的样本", + }, + "general_language_quality": { + "label": "表达与语言质量", + "severity": 0.90, + "transfer": 1.00, + "learnability_prior": 1.15, + "cost": 0.85, + "sample_direction": "流畅性、连贯性、简洁性、语法和结构化表达的改写对比样本", + }, + "general_safety_refusal": { + "label": "安全与拒答边界", + "severity": 1.30, + "transfer": 1.10, + "learnability_prior": 0.75, + "cost": 1.20, + "sample_direction": "合理拒答、不必要拒答和安全替代回答的边界对比样本", + }, +} + +_GENERAL_METHOD_REFERENCES = [ + { + "paper": "Holistic Evaluation of Language Models (HELM)", + "venue": "TMLR 2023", + "applied_to": "将通用文本质量拆成正确性、鲁棒性、安全性等可区分维度", + "url": "https://arxiv.org/abs/2211.09110", + }, + { + "paper": "Training Language Models to Follow Instructions with Human Feedback", + "venue": "NeurIPS 2022", + "applied_to": "把用户意图与指令遵循作为独立能力,而非普通内容错误", + "url": "https://proceedings.neurips.cc/paper_files/paper/2022/hash/b1efde53be364a73914f58805a001731-Abstract.html", + }, + { + "paper": "TruthfulQA: Measuring How Models Mimic Human Falsehoods", + "venue": "ACL 2022", + "applied_to": "把事实性和信息充分性从表面文本相似度中分离", + "url": "https://aclanthology.org/2022.acl-long.229/", + }, + { + "paper": "Skill-It! A Data-Driven Skills Framework for Understanding and Training Language Models", + "venue": "NeurIPS 2023", + "applied_to": "处理能力先后依赖,并为被前置失败遮蔽的能力保留探索预算", + "url": "https://proceedings.neurips.cc/paper_files/paper/2023/hash/70b8505ac79e3e131756f793cd80eb8d-Abstract-Conference.html", + }, + { + "paper": "DoReMi: Optimizing Data Mixtures Speeds Up Language Model Pretraining", + "venue": "NeurIPS 2023", + "applied_to": "不把观察频率直接等同于固定数据混合比例", + "url": "https://proceedings.neurips.cc/paper_files/paper/2023/hash/dcba6be91359358c2355cd920da3fcbd-Abstract-Conference.html", + }, + { + "paper": "LESS: Selecting Influential Data for Targeted Instruction Tuning", + "venue": "ICML 2024", + "applied_to": "后续以小规模试训的目标能力收益替代静态学习效率先验", + "url": "https://proceedings.mlr.press/v235/xia24c.html", + }, +] + +_UNKNOWN_BUCKET = "diagnostic_unknown" +_UNKNOWN_META = { + "label": "待诊断样本", + "severity": 0.0, + "transfer": 0.0, + "learnability_prior": 0.0, + "cost": 1.0, + "sample_direction": "补充执行日志或人工复核,不直接进入训练分桶", +} + +_PROSE_PREFIX_RE = re.compile( + r"^(?:to solve|let(?:'s| us)|here(?:'s| is| are)|the function|this function|" + r"we need|in this|first[, ]|sure[, ]|certainly[, ]|below is|based on|" + r"the provided|the task|the problem|an? (?:simple )?approach)", + re.IGNORECASE, +) + + +def _text(value: Any) -> str: + if value is None: + return "" + if isinstance(value, (dict, list, tuple)): + return str(value) + return str(value) + + +def _record_text(record: Dict[str, Any]) -> Tuple[str, str, str, str]: + judge = record.get("judge") if isinstance(record.get("judge"), dict) else {} + completion = _text( + record.get("completion") + or record.get("prediction") + or record.get("pred") + or record.get("generated_text") + or record.get("generated_ans") + or record.get("response") + or record.get("output") + or record.get("model_output") + ).strip() + result = " ".join( + _text(record.get(key)) + for key in ("result", "stdout", "stderr", "execution_result", "error") + if record.get(key) is not None + ).strip() + tags = " ".join(_text(tag) for tag in (judge.get("tags") or [])) + judge_text = " ".join( + _text(judge.get(key)) + for key in ("stage", "reason", "exception_type", "advice") + if judge.get(key) is not None + ) + return completion, result, tags, judge_text + + +def _normalize_task_type(task_type: Any) -> str: + normalized = str(task_type or "code").strip().lower().replace("-", "_") + if normalized in {"text2sql", "text_to_sql", "sql"}: + return "text2sql" + if normalized in {"code", "coding", "programming", "python"}: + return "code" + return "general" + + +def _first_text(record: Dict[str, Any], keys: Tuple[str, ...]) -> str: + for key in keys: + value = record.get(key) + if value not in (None, "", [], {}): + return _text(value).strip() + return "" + + +def _general_evidence(record: Dict[str, Any]) -> Tuple[str, str, str, str]: + judge = record.get("judge") if isinstance(record.get("judge"), dict) else {} + detail = record.get("metric_detail") if isinstance(record.get("metric_detail"), dict) else {} + question = _first_text(record, ("question", "prompt", "input", "query", "instruction")) + reference = _first_text(record, ( + "target", "reference", "ground_truth", "answer", "correct_answer", "gold", "solution", + )) + completion, result, tags, judge_text = _record_text(record) + top_level = " ".join( + _text(record.get(key)) + for key in ( + "error_type", "errors", "reason", "feedback", "critique", "category", + "match_type", "primary_metric", "failure_type", + ) + if record.get(key) not in (None, "", [], {}) + ) + detail_text = " ".join( + _text(detail.get(key)) + for key in ("match_type", "error_type", "reason", "feedback", "label", "category", "analysis") + if detail.get(key) not in (None, "", [], {}) + ) + judge_extra = " ".join( + _text(judge.get(key)) + for key in ( + "error_type", "primary_error", "secondary_error", "errors", "labels", + "dimensions", "feedback", "critique", + ) + if judge.get(key) not in (None, "", [], {}) + ) + evidence = " ".join((result, tags, judge_text, judge_extra, top_level, detail_text)).strip().lower() + return question, reference, completion, evidence + + +def _contains_any(text: str, tokens: Tuple[str, ...]) -> bool: + return any(token in text for token in tokens) + + +def _looks_like_refusal(completion: str) -> bool: + return bool(re.match( + r"^(?:i(?:'m| am) sorry|sorry|i cannot|i can't|i am unable|as an ai|" + r"抱歉|对不起|我不能|我无法|无法帮助|不能协助)", + completion.lstrip(), + re.IGNORECASE, + )) + + +def _violates_general_output_contract(question: str, reference: str, completion: str) -> bool: + prompt = question.lower() + stripped = completion.strip() + reference_stripped = reference.strip() + expects_json = ( + "json" in prompt + or "json 对象" in question + or reference_stripped.startswith(("{", "[")) + ) + if expects_json and stripped: + candidate = stripped + if candidate.startswith("```"): + candidate = re.sub(r"^```(?:json)?\s*|\s*```$", "", candidate, flags=re.IGNORECASE) + try: + import json + + json.loads(candidate) + except (TypeError, ValueError): + return True + if _contains_any(prompt, ("only answer", "answer only", "only output", "respond only")): + if "\n" in stripped or stripped.startswith(("Here", "Sure", "The answer")): + return True + if _contains_any(question, ("只回答", "仅回答", "只输出", "仅输出")): + if "\n" in stripped or stripped.startswith(("答案是", "下面", "当然")): + return True + if _contains_any(prompt, ("no markdown", "without markdown")) and "```" in stripped: + return True + if _contains_any(question, ("不要使用 Markdown", "不使用 Markdown")) and "```" in stripped: + return True + return False + + +def _looks_like_prose_or_wrapped_code(completion: str, *, sql: bool = False) -> bool: + stripped = completion.lstrip() + if not stripped: + return False + lowered = stripped.lower() + if lowered.startswith("```") or _PROSE_PREFIX_RE.search(stripped): + return True + if any(marker in stripped[:240] for marker in ("### ", "**", "---")): + return True + if sql: + return not re.match(r"^(?:select|with|insert|update|delete)\b", lowered) + return not re.match(r"^(?:async\s+def|def|class|from|import|@|#|[A-Za-z_]\w*\s*=|return)\b", stripped) + + +def classify_failure_bucket( + record: Dict[str, Any], + task_type: str = "code", +) -> Dict[str, Any]: + """Map one failed record to an actionable capability bucket. + + Runtime/parser evidence is intentionally preferred over the model's + fallback ``other`` label. The original label remains in the result for + auditability. + """ + judge = record.get("judge") if isinstance(record.get("judge"), dict) else {} + metric_detail = record.get("metric_detail") if isinstance(record.get("metric_detail"), dict) else {} + original_stage = _text( + judge.get("stage") + or record.get("error_type") + or record.get("match_type") + or metric_detail.get("match_type") + or "other" + ).lower() + completion, result, tags, judge_text = _record_text(record) + evidence = f"{result} {tags} {judge_text}".lower() + failed = not bool(record.get("passed", False)) + task_route = _normalize_task_type(task_type) + + if task_route == "general": + question, reference, completion, evidence = _general_evidence(record) + if failed and not completion.strip(): + return _classification( + "general_completeness_coverage", original_stage, 0.98, "回答为空,无法覆盖任务要求" + ) + if _contains_any(evidence, ( + "over-refusal", "overrefusal", "unnecessary refusal", "should not refuse", + "unsafe", "safety", "harmful", "toxicity", "toxic", "jailbreak", "bias", + "过度拒答", "不应拒答", "安全", "有害", "毒性", "偏见", + )): + return _classification( + "general_safety_refusal", original_stage, 0.92, "结构化评测证据指向安全或拒答边界问题" + ) + if _contains_any(evidence, ( + "instruction_following", "instruction following", "instruction", "format_error", "format error", "format", + "output format", "constraint violation", "did not follow", "length constraint", + "schema violation", "指令遵循", "未遵循", "格式错误", "输出格式", "违反约束", + )) or _violates_general_output_contract(question, reference, completion): + return _classification( + "general_instruction_following", original_stage, 0.92, "输出违反明确指令、格式或结构约束" + ) + if _contains_any(evidence, ( + "irrelevant", "off-topic", "off topic", "intent mismatch", "answer relevance", "relevance", "intent", + "does not answer", "wrong task", "答非所问", "无关", "偏题", "意图错误", "相关性", + )): + return _classification( + "general_relevance_intent", original_stage, 0.88, "评测证据指向答复相关性或意图理解错误" + ) + if _contains_any(evidence, ( + "hallucination", "factual", "factually incorrect", "unsupported", "fabricated", + "misinformation", "faithfulness", "groundedness", "unverified claim", + "事实错误", "幻觉", "虚构", "无依据", "知识错误", "事实性", "忠实度", + )): + return _classification( + "general_factuality_grounding", original_stage, 0.90, "评测证据指向事实性、幻觉或依据不足" + ) + if _contains_any(evidence, ( + "reasoning", "logical error", "invalid inference", "inconsistent", "contradiction", + "causal error", "calculation error", "推理错误", "逻辑错误", "前后矛盾", "因果错误", "计算错误", + )): + return _classification( + "general_reasoning_consistency", original_stage, 0.86, "评测证据指向推理链或前后一致性错误" + ) + if _contains_any(evidence, ( + "incomplete", "completeness", "missing key", "omission", "coverage", "insufficient", "partial answer", + "truncated", "not comprehensive", "不完整", "遗漏", "缺少要点", "覆盖不足", "回答截断", + )): + return _classification( + "general_completeness_coverage", original_stage, 0.88, "评测证据指向回答不完整或要点遗漏" + ) + if _contains_any(evidence, ( + "language_quality", "language quality", "fluency", "grammar", "style", "coherence", "readability", "verbosity", "verbose", + "repetition", "ambiguous", "语言质量", "语法问题", "表达", "不流畅", "啰嗦", "重复", "歧义", "连贯性", + )): + return _classification( + "general_language_quality", original_stage, 0.84, "评测证据指向语言、风格或表达质量问题" + ) + if failed and completion and _looks_like_refusal(completion): + return _classification( + "general_safety_refusal", original_stage, 0.76, "失败回答表现为拒答,需要复核是否属于过度拒答" + ) + if failed and reference and len(reference) >= 160 and len(completion) < max(24, int(len(reference) * 0.15)): + return _classification( + "general_completeness_coverage", original_stage, 0.62, "回答显著短于参考内容,疑似关键要点覆盖不足" + ) + return _classification(_UNKNOWN_BUCKET, original_stage, 0.30, "通用文本缺少可靠的结构化归因证据,进入诊断池") + + if task_route == "text2sql": + if failed and completion and _looks_like_prose_or_wrapped_code(completion, sql=True): + return _classification("sql_output_contract", original_stage, 0.96, "输出不是可直接执行的 SQL") + if any(token in evidence for token in ("no such table", "no such column", "unknown column", "schema", "foreign key", "sql_schema")): + return _classification("sql_schema_linking", original_stage, 0.94, "执行证据指向表、列或 Schema 对齐错误") + if any(token in evidence for token in ("syntax error", "parse error", "sql_syntax", "near \"")): + return _classification("sql_syntax", original_stage, 0.94, "SQL 解析或语法错误") + if any(token in evidence for token in ("timeout", "timed out", "too many", "sql_perf", "sql_timeout")): + return _classification("sql_runtime_efficiency", original_stage, 0.90, "查询超时或效率问题") + if any(token in evidence for token in ("datatype", "type mismatch", "null", "conversion", "sql_type")): + return _classification("sql_type_value", original_stage, 0.86, "类型、NULL 或值条件错误") + if any(token in evidence for token in ("wrong answer", "assert", "mismatch", "value", "sql_result")): + return _classification("sql_semantic_logic", original_stage, 0.84, "SQL 可执行但结果或语义不正确") + if original_stage in {"sql_schema"}: + return _classification("sql_schema_linking", original_stage, 0.78, "沿用细粒度 SQL stage") + if original_stage in {"sql_syntax", "syntax"}: + return _classification("sql_syntax", original_stage, 0.78, "沿用 SQL 语法 stage") + if original_stage in {"sql_type"}: + return _classification("sql_type_value", original_stage, 0.76, "沿用 SQL 类型 stage") + if original_stage in {"sql_timeout", "sql_perf", "timeout", "perf"}: + return _classification("sql_runtime_efficiency", original_stage, 0.76, "沿用 SQL 运行时 stage") + return _classification(_UNKNOWN_BUCKET, original_stage, 0.30, "现有证据不足,进入诊断池") + + if failed and completion and _looks_like_prose_or_wrapped_code(completion): + return _classification("code_output_contract", original_stage, 0.97, "代码任务输出了说明文字或 Markdown 包装") + if any(token in evidence for token in ( + "syntaxerror", "syntax error", "invalid syntax", "unterminated", "unexpected eof", + "indentationerror", "indentation error", "was never closed", "truncated", + )): + return _classification("code_syntax_completion", original_stage, 0.95, "执行器报告语法错误或补全不完整") + if any(token in evidence for token in ( + "nameerror", "not defined", "importerror", "modulenotfound", "missing function", + "entry point", "wrong signature", "argument", "scope", + )): + return _classification("code_interface_scope", original_stage, 0.92, "函数接口、名称、作用域或依赖不完整") + if any(token in evidence for token in ( + "timeout", "timed out", "memoryerror", "recursionerror", "recursion", "performance", "perf", + )): + return _classification("code_runtime_efficiency", original_stage, 0.90, "运行超时、内存或递归问题") + if any(token in evidence for token in ("edge case", "boundary", "empty input", "corner case")): + return _classification("code_boundary_robustness", original_stage, 0.82, "证据明确指向边界条件") + if any(token in evidence for token in ( + "assertionerror", "assert", "wrong answer", "expected", "actual", "valueerror", "value", + )): + return _classification("code_semantic_logic", original_stage, 0.84, "代码进入执行但结果或断言不正确") + if original_stage in {"syntax", "import", "compile"}: + return _classification("code_syntax_completion", original_stage, 0.76, "沿用代码语法 stage") + if original_stage in {"assert", "value", "logic", "type"}: + return _classification("code_semantic_logic", original_stage, 0.72, "沿用代码语义 stage") + if original_stage in {"timeout", "perf", "recursion"}: + return _classification("code_runtime_efficiency", original_stage, 0.76, "沿用代码运行时 stage") + return _classification(_UNKNOWN_BUCKET, original_stage, 0.30, "现有证据不足,进入诊断池") + + +def _classification(bucket: str, original_stage: str, confidence: float, reason: str) -> Dict[str, Any]: + meta = ( + _CODE_BUCKET_META.get(bucket) + or _SQL_BUCKET_META.get(bucket) + or _GENERAL_BUCKET_META.get(bucket) + or _UNKNOWN_META + ) + return { + "bucket": bucket, + "label": meta["label"], + "confidence": round(float(confidence), 4), + "reason": reason, + "original_stage": original_stage, + "reclassified_from_other": original_stage == "other" and bucket != _UNKNOWN_BUCKET, + } + + +def _project_with_floor_and_cap( + weights: Dict[str, float], + floor: float, + cap: float, +) -> Dict[str, float]: + keys = [key for key, value in weights.items() if value > 0] + if not keys: + return {} + floor = max(0.0, min(float(floor), 1.0 / len(keys))) + cap = max(1.0 / len(keys), min(1.0, float(cap))) + fixed: Dict[str, float] = {} + free = set(keys) + + for _ in range(len(keys) * 2 + 2): + remaining = max(0.0, 1.0 - sum(fixed.values())) + denominator = sum(weights[key] for key in free) + proposed = { + key: (remaining * weights[key] / denominator if denominator else remaining / max(len(free), 1)) + for key in free + } + violations = { + key: floor if value < floor else cap + for key, value in proposed.items() + if value < floor or value > cap + } + if not violations: + fixed.update(proposed) + break + key = max(violations, key=lambda item: abs(proposed[item] - violations[item])) + fixed[key] = violations[key] + free.remove(key) + if not free: + break + + total = sum(fixed.values()) + if total and not math.isclose(total, 1.0): + adjustable = max(fixed, key=fixed.get) + fixed[adjustable] += 1.0 - total + return {key: max(0.0, round(value, 6)) for key, value in fixed.items()} + + +def build_training_bucket_strategy( + records: Iterable[Dict[str, Any]], + task_type: str = "code", + *, + alpha: float = 1.0, + min_share: float = 0.05, + max_share: float = 0.50, +) -> Dict[str, Any]: + """Build an actionable, confidence-aware data allocation plan. + + ``learnability_prior`` is deliberately marked as a prior. A later + training round should replace it with measured metric gain per sample. + """ + task_route = _normalize_task_type(task_type) + failed = [record for record in records if isinstance(record, dict) and not record.get("passed", False)] + classifications = [classify_failure_bucket(record, task_route) for record in failed] + counts = Counter(item["bucket"] for item in classifications) + confidence_sum: Dict[str, float] = defaultdict(float) + examples: Dict[str, List[Dict[str, Any]]] = defaultdict(list) + domains: Dict[str, Counter] = defaultdict(Counter) + original_other = 0 + + for record, item in zip(failed, classifications): + confidence_sum[item["bucket"]] += item["confidence"] + if item["original_stage"] == "other": + original_other += 1 + domain = _first_text(record, ("domain", "subset", "source", "subject", "category")) + if not domain: + judge = record.get("judge") if isinstance(record.get("judge"), dict) else {} + domain = _text(judge.get("domain") or "unknown") + domains[item["bucket"]][domain] += 1 + if len(examples[item["bucket"]]) < 3: + completion, result, _, _ = _record_text(record) + examples[item["bucket"]].append({ + "task_id": record.get("task_id") or record.get("id") or record.get("sample_id"), + "original_stage": item["original_stage"], + "reason": item["reason"], + "result_head": result[:180], + "completion_head": completion.replace("\n", " ")[:180], + }) + + total_failed = len(failed) + if task_route == "text2sql": + meta_map = _SQL_BUCKET_META + elif task_route == "general": + meta_map = _GENERAL_BUCKET_META + else: + meta_map = _CODE_BUCKET_META + actionable_counts = {key: count for key, count in counts.items() if key != _UNKNOWN_BUCKET} + candidate_counts = dict(actionable_counts) + exploration_priors: Dict[str, float] = {} + # When almost every sample fails before executable code/SQL is produced, + # downstream semantic ability is censored rather than proven healthy. + # Reserve a small first-round exploration budget instead of allocating + # 100% to the visible prerequisite failure. + if total_failed: + if task_route == "text2sql" and counts.get("sql_output_contract", 0) / total_failed >= 0.50: + exploration_priors = { + "sql_syntax": 0.25, + "sql_schema_linking": 0.15, + "sql_semantic_logic": 0.15, + } + elif task_route == "code" and counts.get("code_output_contract", 0) / total_failed >= 0.50: + exploration_priors = { + "code_syntax_completion": 0.25, + "code_interface_scope": 0.15, + "code_semantic_logic": 0.15, + } + elif task_route == "general": + prerequisite_count = max( + counts.get("general_instruction_following", 0), + counts.get("general_completeness_coverage", 0), + counts.get("general_safety_refusal", 0), + ) + if prerequisite_count / total_failed >= 0.50: + exploration_priors = { + "general_relevance_intent": 0.15, + "general_factuality_grounding": 0.12, + "general_reasoning_consistency": 0.08, + } + for key in exploration_priors: + candidate_counts.setdefault(key, 0) + + power_denominator = sum(float(count) ** float(alpha) for count in actionable_counts.values()) + utility_weights: Dict[str, float] = {} + bucket_rows = [] + + for key, count in sorted(candidate_counts.items(), key=lambda item: (-item[1], item[0])): + meta = meta_map.get(key, _UNKNOWN_META) + observed_share = count / max(total_failed, 1) + confidence = confidence_sum[key] / count if count else 0.55 + if count: + need_signal = (observed_share + 1e-9) ** float(alpha) + allocation_basis = "observed_failure_and_priors" + else: + need_signal = exploration_priors.get(key, 0.0) + allocation_basis = "censored_capability_exploration" + utility = ( + need_signal + * confidence + * meta["severity"] + * meta["transfer"] + * meta["learnability_prior"] + / max(meta["cost"], 1e-6) + ) + utility_weights[key] = utility + bucket_rows.append({ + "bucket": key, + "label": meta["label"], + "count": count, + "observed_share": round(observed_share, 4), + "power_adjusted_share": round((count ** float(alpha)) / power_denominator, 4) + if power_denominator else 0.0, + "classification_confidence": round(confidence, 4), + "severity": meta["severity"], + "transfer_value": meta["transfer"], + "learnability_prior": meta["learnability_prior"], + "data_cost": meta["cost"], + "allocation_basis": allocation_basis, + "censored_by_upstream_failure": count == 0 and key in exploration_priors, + "sample_direction": meta["sample_direction"], + "examples": examples[key], + "domain_breakdown": [ + { + "domain": domain, + "count": domain_count, + "share_within_bucket": round(domain_count / max(count, 1), 4), + } + for domain, domain_count in domains[key].most_common(10) + ], + }) + + allocation = _project_with_floor_and_cap(utility_weights, min_share, max_share) + for row in bucket_rows: + row["recommended_share"] = allocation.get(row["bucket"], 0.0) + row["recommended_percent"] = round(row["recommended_share"] * 100, 2) + + unresolved = counts.get(_UNKNOWN_BUCKET, 0) + naive_alpha = 2.0 + original_stage_counts = Counter(item["original_stage"] for item in classifications) + naive_denominator = sum(float(count) ** naive_alpha for count in original_stage_counts.values()) + naive_other_share = ( + (float(original_stage_counts.get("other", 0)) ** naive_alpha) / naive_denominator + if naive_denominator else 0.0 + ) + unresolved_share = unresolved / max(total_failed, 1) + warnings = [] + if unresolved_share > 0.10: + warnings.append("待诊断样本超过失败样本的 10%,分桶预算置信度不足,应先补充执行证据或人工复核。") + if original_other: + warnings.append("原始 other 不参与训练预算;先用执行证据重分类,仍无法归因的样本进入诊断池。") + + return { + "strategy": "confidence_and_marginal_gain_aware", + "task_type": task_route, + "requested_task_type": str(task_type), + "failed_total": total_failed, + "parameters": { + "power_alpha": float(alpha), + "min_bucket_share": float(min_share), + "max_bucket_share": float(max_share), + "learnability": "prior_until_pilot_gain_is_available", + }, + "other_impact": { + "original_other_count": original_other, + "original_other_share": round(original_other / max(total_failed, 1), 4), + "naive_alpha_2_other_share": round(naive_other_share, 4), + "reclassified_from_other_count": sum( + 1 for item in classifications if item["reclassified_from_other"] + ), + "unresolved_count": unresolved, + "unresolved_share": round(unresolved_share, 4), + "training_allocation_share": 0.0, + }, + "buckets": bucket_rows, + "diagnostic_bucket": { + "bucket": _UNKNOWN_BUCKET, + "label": _UNKNOWN_META["label"], + "count": unresolved, + "recommended_share": 0.0, + "sample_direction": _UNKNOWN_META["sample_direction"], + "examples": examples[_UNKNOWN_BUCKET], + }, + "pilot_update_rule": ( + "每轮小规模补数后,以该桶目标指标增量/新增样本数更新 learnability," + "下一轮按边际收益重新分配;不把当前错误占比永久固化为训练占比。" + ), + "methodology_references": _GENERAL_METHOD_REFERENCES if task_route == "general" else [], + "warnings": warnings, + } diff --git a/loopai/skills/Analyzer/cli.py b/loopai/skills/Analyzer/cli.py index 566b1fe..d98327e 100644 --- a/loopai/skills/Analyzer/cli.py +++ b/loopai/skills/Analyzer/cli.py @@ -50,6 +50,7 @@ def _parser() -> argparse.ArgumentParser: parser.add_argument("--checkpoint-path", default=None) parser.add_argument("--baseline-result-path", default=None) parser.add_argument("--analyze-batch-size", type=int, default=None) + parser.add_argument("--request-timeout-seconds", type=float, default=None) parser.add_argument("--resume", action="store_true") parser.add_argument("--new-version", action="store_true") parser.add_argument("--from-node", default=None) @@ -78,6 +79,7 @@ def main(argv: Optional[Sequence[str]] = None) -> int: checkpoint_path=args.checkpoint_path, baseline_result_path=args.baseline_result_path, analyze_batch_size=args.analyze_batch_size, + analyze_request_timeout_seconds=args.request_timeout_seconds, version_id=args.version_id, force_new_version=args.new_version, emit_status=False, diff --git a/loopai/skills/Analyzer/nodes/analyze_metric_report_node.py b/loopai/skills/Analyzer/nodes/analyze_metric_report_node.py index d84443c..7b101e1 100644 --- a/loopai/skills/Analyzer/nodes/analyze_metric_report_node.py +++ b/loopai/skills/Analyzer/nodes/analyze_metric_report_node.py @@ -8,6 +8,7 @@ from loopai.common.event_tool import StreamEvent from loopai.skills.Analyzer.utils.stream import get_safe_stream_writer from loopai.common.prompts.prompt_loader import PromptLoader +from loopai.skills.Analyzer.bucket_strategy import build_training_bucket_strategy from langchain_openai import ChatOpenAI from loopai.schema.states import LoopAIState from loopai.logger import get_logger @@ -74,6 +75,7 @@ def init_model(state: LoopAIState) -> ChatOpenAI: base_url=cfg.get("analyze_base_url"), temperature=cfg.get("analyze_temperature", 0.0), top_p=cfg.get("analyze_top_p", 0.95), + timeout=float(cfg.get("analyze_request_timeout_seconds", 300)), ) return model @@ -365,6 +367,7 @@ def _build_obtainer_stats( match_type_pass_counter = {} domain_counter = {} field_presence_counter = {} + bucket_records = [] for idx, detail in enumerate(details): score = _normalize_detail_score(detail) @@ -384,6 +387,14 @@ def _build_obtainer_stats( "generated_ans": rec.get("generated_ans") or rec.get("completion") or rec.get("prediction"), } + bucket_record = dict(rec) + bucket_record["passed"] = score != 0.0 + bucket_record["metric_detail"] = detail + bucket_record["primary_metric"] = primary_metric_name + bucket_record.setdefault("generated_ans", sample["generated_ans"]) + bucket_record.setdefault("domain", domain) + bucket_records.append(bucket_record) + if isinstance(detail, dict): sample["match_type"] = detail.get("match_type") sample["extracted"] = detail.get("extracted") @@ -433,6 +444,14 @@ def _build_obtainer_stats( top_fields = sorted(field_presence_counter.items(), key=lambda x: x[1], reverse=True)[:20] top_domains = sorted(domain_counter.items(), key=lambda x: x[1], reverse=True)[:20] + analyzer_cfg = _analyzer(state) + allocation_plan = build_training_bucket_strategy( + bucket_records, + task_type="general", + alpha=float(analyzer_cfg.get("bucket_power_alpha", 1.0)), + min_share=float(analyzer_cfg.get("bucket_min_share", 0.05)), + max_share=float(analyzer_cfg.get("bucket_max_share", 0.50)), + ) return { "primary_metric": primary_metric_name, @@ -443,6 +462,11 @@ def _build_obtainer_stats( "field_presence_top": top_fields, "fail_bias_match_type": fail_bias_match_type[:15], "representative_failure_samples": representative_failure_samples, + "actionable_bucket_top": [ + [row["label"], row["count"]] + for row in allocation_plan.get("buckets", []) + ], + "allocation_plan": allocation_plan, } @@ -479,7 +503,7 @@ def build_prompt_for_data_plan(summary: Dict[str, Any]) -> str: loader = PromptLoader() template = loader("analyze_metric_report", "data_plan_user") - return template.format( + prompt = template.format( bench_name=summary["bench_name"], eval_type=summary["eval_type"], task_domain=summary["task_domain"], @@ -493,6 +517,16 @@ def build_prompt_for_data_plan(summary: Dict[str, Any]) -> str: quick_samples_json=json.dumps(summary["quick_samples"], ensure_ascii=False), summary_json=json.dumps(summary["summary_json"], ensure_ascii=False), ) + allocation_json = json.dumps(summary.get("allocation_plan") or {}, ensure_ascii=False) + return prompt + f""" + +【General Text 分桶约束】 +1. 必须优先使用 summary 中的 allocation_plan,不得直接按 primary metric 失败比例分配训练数据。 +2. 指令遵循、相关性、事实性、推理、完整性、语言质量和安全拒答是相互独立的能力桶。 +3. other/待诊断样本不进入训练预算,只能建议补充评测证据或人工复核。 +4. recommended_percent 仅表示第一轮先验预算;小规模试训后应按单位样本指标收益更新。 +allocation_plan={allocation_json} +""" def build_prompt_for_obtainer(summary: Dict[str, Any], obtainer_stats: Dict[str, Any]) -> str: """ @@ -502,7 +536,7 @@ def build_prompt_for_obtainer(summary: Dict[str, Any], obtainer_stats: Dict[str, loader = PromptLoader() template = loader("data_obtainer", "suggest_obtainer") - return template.format( + prompt = template.format( dataset_json=json.dumps({ "bench_name": summary["bench_name"], "eval_type": summary["eval_type"], @@ -514,6 +548,42 @@ def build_prompt_for_obtainer(summary: Dict[str, Any], obtainer_stats: Dict[str, summary_json=json.dumps(summary["summary_json"], ensure_ascii=False), obtainer_stats_json=json.dumps(obtainer_stats, ensure_ascii=False), ) + return prompt + """ + +【General Text 数据获取约束】 +1. 使用 allocation_plan.recommended_percent 生成能力级数据预算,再参考 domain_breakdown 选择内容领域。 +2. 不得把 primary_metric_failure、unknown 或 other 直接当作可采集的数据类型。 +3. 每个能力桶的数据建议必须对应 sample_direction,并说明验证该能力提升的指标。 +""" + + +def _render_allocation_plan(allocation_plan: Dict[str, Any]) -> str: + rows = allocation_plan.get("buckets") or [] + if not rows: + return "" + lines = [ + "【General Text 训练数据分桶建议】", + "错误出现频率只作为需求信号;以下比例同时考虑归因置信度、严重性、迁移价值、学习效率和数据成本。", + ] + for row in sorted(rows, key=lambda item: -item.get("recommended_share", 0.0)): + lines.append( + f"- {row.get('label')}:{row.get('recommended_percent', 0):.2f}% " + f"(观察 {row.get('count', 0)} 条,置信度 {row.get('classification_confidence', 0):.2f})" + ) + lines.append(f" 样本方向:{row.get('sample_direction', '')}") + domains = row.get("domain_breakdown") or [] + if domains: + domain_text = "、".join( + f"{item.get('domain')} {item.get('count')} 条" for item in domains[:5] + ) + lines.append(f" 领域分布:{domain_text}") + other_impact = allocation_plan.get("other_impact") or {} + lines.append( + "- 待诊断样本:0.00% 训练预算" + f"(重分类后仍未解决 {other_impact.get('unresolved_count', 0)} 条)" + ) + lines.append(f"- 动态更新:{allocation_plan.get('pilot_update_rule', '')}") + return "\n".join(lines) def _invoke_prompt(llm, prompt): """ @@ -567,6 +637,9 @@ def _emit(message, *, progress=None, data=None): records = _load_records_from_alignment(metric_result) summary = _build_summary(state, metric_result, records) obtainer_stats = _build_obtainer_stats(state, metric_result, records, summary) + allocation_plan = obtainer_stats.get("allocation_plan") or {} + summary["allocation_plan"] = allocation_plan + _analyzer(state)["allocation_plan"] = allocation_plan _emit( "已构建 metric 摘要", @@ -606,6 +679,11 @@ def _emit(message, *, progress=None, data=None): data={"prompt_chars": len(obtainer_prompt or "")}, ) obtainer_text = _invoke_prompt(llm, obtainer_prompt) + allocation_text = _render_allocation_plan(allocation_plan) + if allocation_text: + report_text = f"{report_text.rstrip()}\n\n{allocation_text}\n" + data_plan_text = f"{data_plan_text.rstrip()}\n\n{allocation_text}\n" + obtainer_text = f"{obtainer_text.rstrip()}\n\n{allocation_text}\n" ts = time.strftime("%Y%m%d_%H%M%S") outdir = _ensure_analyzer_outdir(state) diff --git a/loopai/skills/Analyzer/nodes/analyze_result.py b/loopai/skills/Analyzer/nodes/analyze_result.py index 3567cec..6fb3270 100644 --- a/loopai/skills/Analyzer/nodes/analyze_result.py +++ b/loopai/skills/Analyzer/nodes/analyze_result.py @@ -58,6 +58,8 @@ def init_model(state: LoopAIState) -> ChatOpenAI: base_url=cfg['analyze_base_url'], temperature=cfg.get('analyze_temperature', 0.0), top_p=cfg.get('analyze_top_p', 0.95), + timeout=float(cfg.get('analyze_request_timeout_seconds', 300)), + max_retries=int(cfg.get('analyze_request_max_retries', 0)), ) return model @@ -80,15 +82,28 @@ def _is_timeout(exc: Exception) -> bool: ) def _compact_prompt(value: str) -> str: - max_chars = 12000 + max_chars = int((data or {}).get("retry_prompt_max_chars") or 12000) if len(value) <= max_chars: return value + "\n\nPlease answer concisely and keep the required output format." head = max_chars * 2 // 3 tail = max_chars - head return value[:head] + "\n...[Analyzer compact retry: middle evidence omitted]...\n" + value[-tail:] + def _chunk_text(chunk: Any) -> str: + content = getattr(chunk, "content", chunk) + if isinstance(content, str): + return content + if isinstance(content, list): + return "".join( + str(item.get("text", "")) if isinstance(item, dict) else str(item) + for item in content + ) + return str(content or "") + def _run_once(request_prompt: str) -> str: stop_event = threading.Event() + started_at = time.monotonic() + first_chunk_seconds = None resume_progress = get_analyzer_resume_progress() request_start = max(start_progress, min(resume_progress, end_progress)) if resume_progress else start_progress @@ -105,7 +120,33 @@ def _heartbeat() -> None: heartbeat_thread = threading.Thread(target=_heartbeat, daemon=True) heartbeat_thread.start() try: - return llm.batch([request_prompt])[0].content + chunks = [] + for chunk in llm.stream(request_prompt): + if first_chunk_seconds is None: + first_chunk_seconds = round(time.monotonic() - started_at, 3) + chunks.append(_chunk_text(chunk)) + response = "".join(chunks) + emit("模型响应接收完成", progress=end_progress, data={ + **(data or {}), + "prompt_chars": len(request_prompt), + "response_chars": len(response), + "elapsed_seconds": round(time.monotonic() - started_at, 3), + "first_chunk_seconds": first_chunk_seconds, + "streaming": True, + }) + return response + except Exception as exc: + text = f"{type(exc).__name__}: {exc}".lower() + emit("模型请求失败", progress=start_progress, data={ + **(data or {}), + "prompt_chars": len(request_prompt), + "elapsed_seconds": round(time.monotonic() - started_at, 3), + "first_chunk_seconds": first_chunk_seconds, + "error_type": type(exc).__name__, + "timeout_scope": "upstream_gateway" if "524" in text else "client_or_provider", + "streaming": True, + }) + raise finally: stop_event.set() heartbeat_thread.join(timeout=0.2) @@ -115,9 +156,20 @@ def _heartbeat() -> None: except Exception as exc: if not _is_timeout(exc): raise - emit("模型请求超时,压缩输入后重试", progress=start_progress, data={ - **(data or {}), "retry": True, "input_compacted": True, - }) + error_text = f"{type(exc).__name__}: {exc}".lower() + emit( + "上游代理 524 超时,压缩输入后重试" + if "524" in error_text + else "模型请求超时,压缩输入后重试", + progress=start_progress, + data={ + **(data or {}), + "retry": True, + "input_compacted": True, + "original_prompt_chars": len(prompt), + "timeout_scope": "upstream_gateway" if "524" in error_text else "client_or_provider", + }, + ) return _run_once(_compact_prompt(prompt)) diff --git a/loopai/skills/Analyzer/nodes/draw_conclusion.py b/loopai/skills/Analyzer/nodes/draw_conclusion.py index d4bda8e..f009511 100644 --- a/loopai/skills/Analyzer/nodes/draw_conclusion.py +++ b/loopai/skills/Analyzer/nodes/draw_conclusion.py @@ -22,6 +22,7 @@ build_historical_comparison, render_historical_comparison_text, ) +from loopai.skills.Analyzer.bucket_strategy import build_training_bucket_strategy logger = get_logger() from collections import defaultdict from typing import List, Dict, Any @@ -131,6 +132,10 @@ def init_model(state: LoopAIState) -> ChatOpenAI: base_url=cfg['analyze_base_url'], temperature=cfg.get('analyze_temperature', 0.0), top_p=cfg.get('analyze_top_p', 0.95), + timeout=float(cfg.get('analyze_request_timeout_seconds', 300)), + # The adaptive retry below owns the retry policy so the same long + # prompt is not silently retried several times by the SDK first. + max_retries=int(cfg.get('analyze_request_max_retries', 0)), ) return model @@ -145,7 +150,7 @@ def _batch_one_with_heartbeat( end_progress: float, data: Dict[str, Any] | None = None, ) -> str: - """Run normally, then retry once with a compact prompt after timeout.""" + """Stream one normal request, then compact and retry once on timeout.""" def _is_timeout(exc: Exception) -> bool: text = f"{type(exc).__name__}: {exc}".lower() return isinstance(exc, TimeoutError) or any( @@ -153,15 +158,28 @@ def _is_timeout(exc: Exception) -> bool: ) def _compact_prompt(value: str) -> str: - max_chars = 12000 + max_chars = int((data or {}).get("retry_prompt_max_chars") or 12000) if len(value) <= max_chars: return value + "\n\nPlease answer concisely and keep the required output format." head = max_chars * 2 // 3 tail = max_chars - head return value[:head] + "\n...[Analyzer compact retry: middle evidence omitted]...\n" + value[-tail:] + def _chunk_text(chunk: Any) -> str: + content = getattr(chunk, "content", chunk) + if isinstance(content, str): + return content + if isinstance(content, list): + return "".join( + str(item.get("text", "")) if isinstance(item, dict) else str(item) + for item in content + ) + return str(content or "") + def _run_once(request_prompt: str) -> str: stop_event = threading.Event() + started_at = time.monotonic() + first_chunk_seconds = None def heartbeat() -> None: tick = 0 @@ -175,7 +193,33 @@ def heartbeat() -> None: thread = threading.Thread(target=heartbeat, daemon=True) thread.start() try: - return llm.batch([request_prompt])[0].content + chunks = [] + for chunk in llm.stream(request_prompt): + if first_chunk_seconds is None: + first_chunk_seconds = round(time.monotonic() - started_at, 3) + chunks.append(_chunk_text(chunk)) + response = "".join(chunks) + emit("模型响应接收完成", progress=end_progress, data={ + **(data or {}), + "prompt_chars": len(request_prompt), + "response_chars": len(response), + "elapsed_seconds": round(time.monotonic() - started_at, 3), + "first_chunk_seconds": first_chunk_seconds, + "streaming": True, + }) + return response + except Exception as exc: + text = f"{type(exc).__name__}: {exc}".lower() + emit("模型请求失败", progress=start_progress, data={ + **(data or {}), + "prompt_chars": len(request_prompt), + "elapsed_seconds": round(time.monotonic() - started_at, 3), + "first_chunk_seconds": first_chunk_seconds, + "error_type": type(exc).__name__, + "timeout_scope": "upstream_gateway" if "524" in text else "client_or_provider", + "streaming": True, + }) + raise finally: stop_event.set() thread.join(timeout=0.2) @@ -185,8 +229,16 @@ def heartbeat() -> None: except Exception as exc: if not _is_timeout(exc): raise - emit("模型请求超时,压缩输入后重试", progress=start_progress, data={ + error_text = f"{type(exc).__name__}: {exc}".lower() + emit( + "上游代理 524 超时,压缩输入后重试" + if "524" in error_text + else "模型请求超时,压缩输入后重试", + progress=start_progress, + data={ **(data or {}), "retry": True, "input_compacted": True, + "original_prompt_chars": len(prompt), + "timeout_scope": "upstream_gateway" if "524" in error_text else "client_or_provider", }) return _run_once(_compact_prompt(prompt)) @@ -300,7 +352,12 @@ def enhance_stats_with_oj(records): return extras -def build_obtainer_stats(summary: dict, oj_records: list, final_json: dict) -> dict: +def build_obtainer_stats( + summary: dict, + oj_records: list, + final_json: dict, + strategy_config: dict | None = None, +) -> dict: """ 为 obtainer 提供更细粒度的数据缺口统计 """ @@ -328,7 +385,8 @@ def build_obtainer_stats(summary: dict, oj_records: list, final_json: dict) -> d fail_tags.update([str(t) for t in tags if t]) domain = ( - rec.get("domain") + rec.get("bench_name") + or rec.get("domain") or judge.get("domain") or rec.get("subset") or rec.get("source") @@ -374,6 +432,20 @@ def build_obtainer_stats(summary: dict, oj_records: list, final_json: dict) -> d "actual": ap.get("actual"), }) + strategy_config = strategy_config or {} + task_type = str( + strategy_config.get("analyze_task_type") + or summary.get("task_type") + or "code" + ) + allocation_plan = build_training_bucket_strategy( + oj_records or [], + task_type=task_type, + alpha=float(strategy_config.get("bucket_power_alpha", 1.0)), + min_share=float(strategy_config.get("bucket_min_share", 0.05)), + max_share=float(strategy_config.get("bucket_max_share", 0.50)), + ) + return { "failed_total": len(failed), "passed_total": len(passed), @@ -382,6 +454,11 @@ def build_obtainer_stats(summary: dict, oj_records: list, final_json: dict) -> d "domain_top": domain_counter.most_common(20), "fail_bias_tags": fail_bias_tags[:15], "representative_failure_samples": sample_briefs, + "actionable_bucket_top": [ + [row["label"], row["count"]] + for row in allocation_plan.get("buckets", []) + ], + "allocation_plan": allocation_plan, } @@ -490,11 +567,19 @@ def build_obtainer_prompt(final_json: dict, obtainer_stats: dict) -> str: summary_json = json.dumps(final_json.get("summary", {}), ensure_ascii=False, indent=2) obtainer_stats_json = json.dumps(obtainer_stats, ensure_ascii=False, indent=2) - return tpl.format( + prompt = tpl.format( dataset_json=dataset_json, summary_json=summary_json, obtainer_stats_json=obtainer_stats_json, ) + return prompt + """ + +【分桶预算约束】 +1. 优先使用细粒度统计中的 allocation_plan,而不是直接按 failure_stage_top 等比例分桶。 +2. other/待诊断样本不进入训练预算;只能建议补日志、重分类或人工复核。 +3. recommended_percent 是第一轮先验预算,不是永久比例;需说明小规模试训后按单位样本收益更新。 +4. 不得因为某类错误出现得多,就默认它需要同比例训练数据。 +""" def build_background_prompt(final_json: dict) -> str: """ 构建背景介绍的提示文本:只介绍数据集本身 @@ -549,7 +634,10 @@ def pct(x, y, digits=2): lines.append(f"本次评测共 {t} 个样本,其中通过 {p} 个,样本正确率 {pass_rate_str}。") if top_cnt > 0: - lines.append(f"最主要的失败类型是 “{top_name}”,共有 {top_cnt} 次。") + if top_name == "other" and (final_json.get("obtainer_stats") or {}).get("allocation_plan"): + lines.append(f"原始聚合中 “other” 共有 {top_cnt} 次;该标签仅表示尚未归因,不能直接作为训练分桶。") + else: + lines.append(f"最主要的失败类型是 “{top_name}”,共有 {top_cnt} 次。") task_type = final_json.get("dataset", {}).get("task_type", "code") if task_type == "text2sql": @@ -566,7 +654,25 @@ def pct(x, y, digits=2): tags_str = ", ".join([f"{k}:{v}" for k, v in list(tags.items())[:8]]) lines.append(f"常见标签 Top:{tags_str}。") - lines.append("整体来看,建议优先修复最常见错误并优化边界测试。") + allocation_plan = (final_json.get("obtainer_stats") or {}).get("allocation_plan") or {} + bucket_rows = allocation_plan.get("buckets") or [] + if bucket_rows: + lines.append("") + lines.append("【训练数据分桶建议】") + lines.append("错误占比仅作为需求信号,以下比例同时考虑归因置信度、迁移价值和学习效率先验:") + for row in sorted(bucket_rows, key=lambda item: -item.get("recommended_share", 0)): + lines.append( + f"- {row.get('label')}:{row.get('recommended_percent', 0):.2f}% " + f"(观察到 {row.get('count', 0)} 条)" + ) + other_impact = allocation_plan.get("other_impact") or {} + lines.append( + f"- 待诊断/other:0.00%(原始 {other_impact.get('original_other_count', 0)} 条," + f"重分类后仍未解决 {other_impact.get('unresolved_count', 0)} 条)" + ) + lines.append(f"- 更新规则:{allocation_plan.get('pilot_update_rule', '')}") + + lines.append("整体来看,应先修复阻断后续评测的前置能力,再通过小规模试训的单位样本收益动态调整分桶,而不是直接照搬错误占比。") comparison = final_json.get("historical_comparison") if comparison: lines.append(render_historical_comparison_text(comparison)) @@ -606,6 +712,30 @@ def make_obtainer_human_text(obtainer_stats: dict, llm_text: str = "") -> str: ) lines.append("") + allocation_plan = obtainer_stats.get("allocation_plan") or {} + bucket_rows = allocation_plan.get("buckets") or [] + if bucket_rows: + lines.append("建议训练数据分桶(第一轮先验):") + for row in sorted(bucket_rows, key=lambda item: -item.get("recommended_share", 0)): + basis = ( + "观察证据" + if row.get("allocation_basis") == "observed_failure_and_priors" + else "下游能力被前置失败遮蔽,预留探索预算" + ) + lines.append( + f"- {row.get('label')}:{row.get('recommended_percent', 0):.2f}% " + f"(观察 {row.get('count', 0)} 条,置信度 {row.get('classification_confidence', 0):.2f},{basis})" + ) + lines.append(f" 样本方向:{row.get('sample_direction')}") + other_impact = allocation_plan.get("other_impact") or {} + lines.append( + "- 待诊断样本:0.00% 训练预算" + f"(原始 other {other_impact.get('original_other_count', 0)} 条," + f"重分类后未解决 {other_impact.get('unresolved_count', 0)} 条)" + ) + lines.append(f"动态更新:{allocation_plan.get('pilot_update_rule', '')}") + lines.append("") + if llm_text: lines.append("【模型生成的 Obtainer 建议】") lines.append(llm_text.strip()) @@ -744,6 +874,7 @@ def _emit(message, *, progress=None, data=None): "field_schema": field_schema, "example": example, "total_samples": final_json["totals"]["total_samples"], + "benches": summary.get("bench_summaries") or {}, } final_json["samples"] = samples @@ -766,8 +897,14 @@ def _emit(message, *, progress=None, data=None): final_json["background"] = background_text _emit("背景介绍生成完成", progress=0.38) - obtainer_stats = build_obtainer_stats(summary, oj_records, final_json) + obtainer_stats = build_obtainer_stats( + summary, + oj_records, + final_json, + strategy_config=_analyzer(state), + ) final_json["obtainer_stats"] = obtainer_stats + state.setdefault("analyzer", {})["allocation_plan"] = obtainer_stats.get("allocation_plan", {}) baseline_result_path = _analyzer(state).get("baseline_result_path") if baseline_result_path: @@ -778,6 +915,7 @@ def _emit(message, *, progress=None, data=None): # ===== 写入 JSON 报告 ===== final_json_path = os.path.join(outdir, f"final_report_{run_ts}.json") + state["analyzer"]["analyze_output_final_report_json_path"] = final_json_path _emit("写入最终 JSON 报告", progress=0.4 , data={"path": final_json_path}) with open(final_json_path, "w", encoding="utf-8") as f: f.write(json.dumps(final_json, ensure_ascii=False, indent=2)) @@ -788,6 +926,7 @@ def _emit(message, *, progress=None, data=None): # ===== 写入文本报告(包含背景介绍)===== final_txt_path = os.path.join(outdir, f"final_report_{run_ts}.txt") + state["analyzer"]["analyze_output_final_report_text_path"] = final_txt_path _emit("写入文本报告", progress=0.5 , data={"path": final_txt_path}) with open(final_txt_path, "w", encoding="utf-8") as f: f.write(make_human_text(final_json, background=background_text)) diff --git a/loopai/skills/Analyzer/nodes/eval_model.py b/loopai/skills/Analyzer/nodes/eval_model.py index 0d22655..4dda113 100644 --- a/loopai/skills/Analyzer/nodes/eval_model.py +++ b/loopai/skills/Analyzer/nodes/eval_model.py @@ -22,6 +22,7 @@ get_analyzer_resume_progress, get_safe_stream_writer, ) +from loopai.skills.Analyzer.bench_inputs import resolve_eval_result_sources # ===== PromptLoader 单例 & 模板缓存 ===== _PROMPT_LOADER: PromptLoader | None = None _TEMPLATE_CACHE: dict[tuple[str, str], str] = {} @@ -276,6 +277,7 @@ def init_model(state: LoopAIState) -> BaseChatModel: max_tokens=cfg.get("analyze_max_tokens", 512), temperature=cfg.get("analyze_temperature", 0.0), top_p=cfg.get("analyze_top_p", 0.95), + request_timeout=float(cfg.get("analyze_request_timeout_seconds", 300)), ) def build_judge_prompt_generic(task: str, evidence: Dict[str, Any]) -> str: @@ -514,7 +516,13 @@ def build_evidence_for_record(rec: Dict[str, Any], task_type: str) -> Dict[str, return build_evidence_for_record_sql(rec) return build_evidence_for_record_code(rec) -def _build_and_write_summary(rows: List[Dict[str, Any]], outdir: Path, run_ts: str, task_type: str = "code"): +def _build_and_write_summary( + rows: List[Dict[str, Any]], + outdir: Path, + run_ts: str, + task_type: str = "code", + eval_result_sources: Optional[List[Dict[str, str]]] = None, +): """ 根据 rows 生成 summary 的函数 Args: @@ -539,6 +547,9 @@ def _build_and_write_summary(rows: List[Dict[str, Any]], outdir: Path, run_ts: s task_pass_map = defaultdict(bool) task_ids = set() + bench_stats: Dict[str, Dict[str, Any]] = defaultdict( + lambda: {"total_samples": 0, "passed_samples": 0, "failure_stage_distribution": Counter()} + ) def bin_loc(n: int) -> str: """ @@ -564,11 +575,15 @@ def bin_kw(n: int) -> str: for rec in rows: total_samples += 1 + bench_name = str(rec.get("bench_name") or "default") + bench_stats[bench_name]["total_samples"] += 1 if rec.get("passed"): passed_samples += 1 + bench_stats[bench_name]["passed_samples"] += 1 else: stg = (rec.get("judge") or {}).get("stage", "other") stage_counter[stg] += 1 + bench_stats[bench_name]["failure_stage_distribution"][stg] += 1 tags = (rec.get("judge") or {}).get("tags") or [] for t in tags: tag_counter[t] += 1 @@ -608,6 +623,7 @@ def bin_kw(n: int) -> str: tid = rec.get("task_id") if tid is not None: + tid = f"{bench_name}::{tid}" task_ids.add(tid) if rec.get("passed"): task_pass_map[tid] = True @@ -621,8 +637,20 @@ def bin_kw(n: int) -> str: else: pass_at_k_task = {} + bench_summaries = {} + for bench_name, values in sorted(bench_stats.items()): + bench_total = int(values["total_samples"]) + bench_passed = int(values["passed_samples"]) + bench_summaries[bench_name] = { + "total_samples": bench_total, + "passed_samples": bench_passed, + "pass_rate_samples": round(bench_passed / max(bench_total, 1), 4), + "failure_stage_distribution": dict(values["failure_stage_distribution"]), + } + summary = { "run_ts": run_ts, + "task_type": task_type, "results_file": None, "total_samples": total_samples, "passed_samples": passed_samples, @@ -638,6 +666,8 @@ def bin_kw(n: int) -> str: "expected_top10": expected_top.most_common(10), }, "tag_top10": tag_counter.most_common(10), + "bench_summaries": bench_summaries, + "eval_result_sources": eval_result_sources or [], } os.makedirs(outdir, exist_ok=True) @@ -649,6 +679,13 @@ def bin_kw(n: int) -> str: lines = [] lines.append(f"评测时间:{run_ts}") lines.append(f"样本正确率:{passed_samples}/{total_samples}({summary['pass_rate_samples'] * 100:.2f}%)") + if len(bench_summaries) > 1: + lines.append("分 Bench 结果:") + for bench_name, values in bench_summaries.items(): + lines.append( + f" - {bench_name}: {values['passed_samples']}/{values['total_samples']} " + f"({values['pass_rate_samples'] * 100:.2f}%)" + ) if pass_at_k_task: lines.append("Pass@k(任务口径): " + ", ".join([f"Pass@{k}={v * 100:.2f}%" for k, v in pass_at_k_task.items()])) lines.append("主要错因(stage)分布:") @@ -834,29 +871,47 @@ def eval_model_node(state: LoopAIState): judge = LLMJudge(task=task_type) - # 读取评测结果(JSONL) - judger_cfg = state.get("judger") or {} + # 读取一个或多个同类型 Bench 结果。单个字符串路径保持兼容。 analyzer_cfg = state.get("analyzer") or {} - eval_result_path = judger_cfg.get("output_result_path") - if not eval_result_path: - eval_result_path = analyzer_cfg.get("eval_result_path") - - if not eval_result_path: + eval_result_sources = resolve_eval_result_sources(state, task_type) + if not eval_result_sources: raise ValueError( - "Missing analyzer.eval_result_path. " - "Please provide analyzer.eval_result_path " - "or run judger to generate output_result_path." + f"No Analyzer-compatible result file found for task_type={task_type}. " + "Please provide analyzer.eval_result_path(s) or run Judger with at least " + "one bench of the same task_type." ) state.setdefault("analyzer", {}) - state["analyzer"]["eval_result_path"] = eval_result_path - - with open(eval_result_path, 'r', encoding='utf-8') as f: - lines = [ln for ln in f if ln.strip()] - result_content = [json.loads(ln) for ln in lines] + state["analyzer"]["eval_result_path"] = eval_result_sources[0]["path"] + state["analyzer"]["eval_result_paths"] = [item["path"] for item in eval_result_sources] + state["analyzer"]["eval_result_sources"] = eval_result_sources + + result_content = [] + for source in eval_result_sources: + source_path = source["path"] + with open(source_path, "r", encoding="utf-8") as f: + for line in f: + if not line.strip(): + continue + record = json.loads(line) + if isinstance(record, dict): + record.setdefault("bench_name", source["bench_name"]) + result_content.append(record) + if writer: + writer(StreamEvent( + current="analyzer.eval_model", + progress=0.03, + message=f"已读取 {len(eval_result_sources)} 个 Bench", + data={ + "bench_count": len(eval_result_sources), + "bench_names": [item["bench_name"] for item in eval_result_sources], + "total_samples": len(result_content), + }, + ).json()) # 仅失败样本做判因 - failed_results = [r for r in result_content if not r.get("passed")] + failed_positions = [index for index, record in enumerate(result_content) if not record.get("passed")] + failed_results = [result_content[index] for index in failed_positions] total_failed = len(failed_results) batch_checkpoint_path = _batch_checkpoint_path(state) # 初始化 LLM @@ -1104,13 +1159,19 @@ def _stable_key(i: int): data=None ).json()) - logger.info(f" 判因完成:共 {len(failed_results)} 条") + for index, position in enumerate(failed_positions): + result_content[position] = failed_results[index] + + logger.info( + f" 判因完成:失败样本 {len(failed_results)} 条,完整样本 {len(result_content)} 条," + f"Bench {len(eval_result_sources)} 个" + ) ts = time.strftime("%Y%m%d_%H%M%S") out_dir = _ensure_analyzer_outdir(state) out_jsonl_path = out_dir / f"oj_records_enriched_{ts}.jsonl" with open(out_jsonl_path, "w", encoding="utf-8") as f: - for r in failed_results: + for r in result_content: f.write(json.dumps(r, ensure_ascii=False) + "\n") state.setdefault("analyzer", {}) state["analyzer"]["analyze_output_result_path"] = str(out_jsonl_path.resolve()) @@ -1125,7 +1186,11 @@ def _stable_key(i: int): ).json()) try: summary_json_path, summary_txt_path = _build_and_write_summary( - failed_results, _ensure_analyzer_outdir(state), ts, task_type=task_type + result_content, + _ensure_analyzer_outdir(state), + ts, + task_type=task_type, + eval_result_sources=eval_result_sources, ) with open(summary_json_path, "r", encoding="utf-8") as f: sdata = json.load(f) diff --git a/loopai/skills/Analyzer/pipeline_runner.py b/loopai/skills/Analyzer/pipeline_runner.py index d6fb2b3..35a7426 100644 --- a/loopai/skills/Analyzer/pipeline_runner.py +++ b/loopai/skills/Analyzer/pipeline_runner.py @@ -18,10 +18,24 @@ "finish", ) +GENERAL_ANALYZER_PIPELINE_STEPS = ( + "metric_recommend", + "metric_score", + "analyze_metric_report", + "finish", +) + +_ALL_ANALYZER_PIPELINE_STEPS = tuple(dict.fromkeys( + ANALYZER_PIPELINE_STEPS + GENERAL_ANALYZER_PIPELINE_STEPS +)) + _STEP_PROGRESS_RANGES = { "eval_model": (0.00, 0.45), "analyze_result": (0.45, 0.75), "draw_conclusion": (0.75, 0.95), + "metric_recommend": (0.00, 0.15), + "metric_score": (0.15, 0.55), + "analyze_metric_report": (0.55, 0.95), "finish": (0.95, 1.00), } @@ -33,6 +47,12 @@ "AnalyzerAgent.analyze_result_node": "analyze_result", "draw_conclusion_node": "draw_conclusion", "AnalyzerAgent.draw_conclusion_node": "draw_conclusion", + "metric_recommend_node": "metric_recommend", + "AnalyzerAgent.metric_recommend_node": "metric_recommend", + "metric_score_node": "metric_score", + "AnalyzerAgent.metric_score_node": "metric_score", + "analyze_metric_report_node": "analyze_metric_report", + "AnalyzerAgent.analyze_metric_report_node": "analyze_metric_report", "finish_node": "finish", "AnalyzerAgent.finish_node": "finish", } @@ -42,14 +62,14 @@ def normalize_analyzer_step(step_name: Optional[str]) -> Optional[str]: if not step_name: return None step_name = str(step_name) - if step_name in ANALYZER_PIPELINE_STEPS: + if step_name in _ALL_ANALYZER_PIPELINE_STEPS: return step_name if step_name in _STEP_ALIASES: return _STEP_ALIASES[step_name] for alias, step in _STEP_ALIASES.items(): if alias in step_name: return step - for step in ANALYZER_PIPELINE_STEPS: + for step in _ALL_ANALYZER_PIPELINE_STEPS: if step in step_name: return step return step_name @@ -365,25 +385,33 @@ def load_analyzer_checkpoint( return load_analyzer_state_from_configer(task_id=thread_id) -def _start_index(step_name: str) -> int: +def _pipeline_steps_for_state(state: Dict[str, Any]) -> tuple[str, ...]: + task_type = str((state.get("analyzer") or {}).get("analyze_task_type") or "code").lower() + if task_type in {"code", "coding", "programming", "python", "text2sql", "text_to_sql", "sql"}: + return ANALYZER_PIPELINE_STEPS + return GENERAL_ANALYZER_PIPELINE_STEPS + + +def _start_index(step_name: str, pipeline_steps: tuple[str, ...] = ANALYZER_PIPELINE_STEPS) -> int: step_name = normalize_analyzer_step(step_name) - if step_name not in ANALYZER_PIPELINE_STEPS: - available = ", ".join(ANALYZER_PIPELINE_STEPS) + if step_name not in pipeline_steps: + available = ", ".join(pipeline_steps) raise ValueError(f"Unknown Analyzer step: {step_name}. Available steps: {available}") - return ANALYZER_PIPELINE_STEPS.index(step_name) + return pipeline_steps.index(step_name) def _resume_step_from_state(state: Dict[str, Any]) -> str: + pipeline_steps = _pipeline_steps_for_state(state) current = normalize_analyzer_step(state.get("current")) last_completed = normalize_analyzer_step(state.get("last_completed")) - if last_completed in ANALYZER_PIPELINE_STEPS: - if current == last_completed or current not in ANALYZER_PIPELINE_STEPS: - next_index = min(_start_index(last_completed) + 1, len(ANALYZER_PIPELINE_STEPS) - 1) - return ANALYZER_PIPELINE_STEPS[next_index] - if current in ANALYZER_PIPELINE_STEPS: + if last_completed in pipeline_steps: + if current == last_completed or current not in pipeline_steps: + next_index = min(_start_index(last_completed, pipeline_steps) + 1, len(pipeline_steps) - 1) + return pipeline_steps[next_index] + if current in pipeline_steps: return current - return ANALYZER_PIPELINE_STEPS[0] + return pipeline_steps[0] def _is_finished(state: Dict[str, Any]) -> bool: @@ -420,6 +448,15 @@ def _run_step( if step_name == "draw_conclusion": from loopai.skills.Analyzer.nodes.draw_conclusion import draw_conclusion_node return draw_conclusion_node(state) + if step_name == "metric_recommend": + from loopai.skills.Analyzer.nodes.metric_recommend_node import metric_recommend_node + return metric_recommend_node(state) + if step_name == "metric_score": + from loopai.skills.Analyzer.nodes.metric_score_node import metric_score_node + return metric_score_node(state) + if step_name == "analyze_metric_report": + from loopai.skills.Analyzer.nodes.analyze_metric_report_node import analyze_metric_report_node + return analyze_metric_report_node(state) raise ValueError(f"Unknown executable Analyzer step: {step_name}") finally: reset_analyzer_stream_writer(token) @@ -451,16 +488,18 @@ def run_analyzer_pipeline( if baseline_result_path: state.setdefault("analyzer", {})["baseline_result_path"] = baseline_result_path + pipeline_steps = _pipeline_steps_for_state(state) + if from_node is not None: start_step = normalize_analyzer_step(from_node) elif resume: start_step = _resume_step_from_state(state) else: - start_step = ANALYZER_PIPELINE_STEPS[0] + start_step = pipeline_steps[0] if start_step is None: - start_step = ANALYZER_PIPELINE_STEPS[0] - start_at = _start_index(start_step) + start_step = pipeline_steps[0] + start_at = _start_index(start_step, pipeline_steps) initial_resume_progress = ( resume_progress if resume and from_node is None else 0.0 ) @@ -512,7 +551,7 @@ def checkpoint_progress( ) return state - for step_name in ANALYZER_PIPELINE_STEPS[start_at:]: + for step_name in pipeline_steps[start_at:]: state["current"] = step_name step_resume_progress = ( resume_progress diff --git a/loopai/skills/Analyzer/runtime_config.py b/loopai/skills/Analyzer/runtime_config.py index e44d506..542459c 100644 --- a/loopai/skills/Analyzer/runtime_config.py +++ b/loopai/skills/Analyzer/runtime_config.py @@ -228,6 +228,14 @@ def resolve_analyzer_runtime_config( state.get("output_dir") if isinstance(state, dict) else None, "./outputs", ) + request_timeout_seconds = float(_first_non_empty( + kwargs.get("analyze_request_timeout_seconds"), + os.getenv("ANALYZER_REQUEST_TIMEOUT_SECONDS"), + analyzer.get("analyze_request_timeout_seconds"), + 300, + )) + if request_timeout_seconds <= 0: + raise ValueError("analyze_request_timeout_seconds must be greater than 0") require_api_key = kwargs.get("require_api_key") needs_llm = bool(require_api_key) if require_api_key is not None else bool(model or base_url) @@ -260,6 +268,7 @@ def resolve_analyzer_runtime_config( analyzer["db_path"] = db_path if output_dir: analyzer["output_dir"] = output_dir + analyzer["analyze_request_timeout_seconds"] = request_timeout_seconds if task_id and version_id and output_dir: analyzer["runtime_output_dir"] = str( Path(str(output_dir)) @@ -278,6 +287,7 @@ def resolve_analyzer_runtime_config( "db_path": db_path, "analyzer_model": model, "analyzer_base_url": base_url, + "analyze_request_timeout_seconds": request_timeout_seconds, "has_analyzer_api_key": bool(api_key), "api_key_source": ( "kwargs" diff --git a/loopai/skills/Analyzer/utils/openai_compat_llm.py b/loopai/skills/Analyzer/utils/openai_compat_llm.py index 7428cb1..d9a3d17 100644 --- a/loopai/skills/Analyzer/utils/openai_compat_llm.py +++ b/loopai/skills/Analyzer/utils/openai_compat_llm.py @@ -32,6 +32,7 @@ class OpenAICompatChat(BaseChatModel): max_tokens: int = 512 temperature: float = 0.0 top_p: float = 0.95 + request_timeout: float = 300.0 @property def _llm_type(self) -> str: @@ -92,7 +93,7 @@ def _generate( self.base_url.rstrip("/") + "/chat/completions", json=payload, headers=headers, - timeout=120, + timeout=self.request_timeout, ) resp.raise_for_status() data = resp.json() diff --git a/skills/Analyzer/BUCKET_STRATEGY.md b/skills/Analyzer/BUCKET_STRATEGY.md new file mode 100644 index 0000000..6b3cfa7 --- /dev/null +++ b/skills/Analyzer/BUCKET_STRATEGY.md @@ -0,0 +1,85 @@ +# Analyzer 三类任务分桶策略 + +本文档简要说明 Analyzer 当前对 Code、Text2SQL 和 General Text 三类任务的失败样本分桶与训练数据分配策略。 + +## 1. 共同原则 + +1. **三条路线独立分桶**:Code、Text2SQL 和 General Text 使用不同的能力桶,不把不同任务的错误混在一起统计。 +2. **错误占比不等于训练占比**:错误数量只表示缺陷被观察到的频率,训练投入还要考虑归因置信度、严重程度、迁移价值、学习效率和数据成本。 +3. **优先重分类 `other`**:先利用执行日志、评测标签和错误原因把 `other` 归入具体能力桶;仍无法归因的样本进入“待诊断样本”,训练预算为 0。 +4. **保留探索预算**:如果大量样本在前置环节失败,后续能力实际上没有被充分测试,系统会给被遮蔽的能力保留少量探索数据。 +5. **小规模试训后动态更新**:首轮使用学习效率先验;后续按“目标指标增量 / 新增样本数”更新学习效率,再调整下一轮比例。 + +每个桶的基础权重为: + +```text +weight_i = error_share_i^alpha + * confidence_i + * severity_i + * transfer_i + * learnability_i + / data_cost_i +``` + +权重归一化后得到建议训练比例。当前默认 `alpha=1.0`,单个有效桶的建议比例通常限制在 5% 至 50%,避免单一错误完全挤占训练数据。 + +## 2. Code 分桶 + +| 能力桶 | 典型问题 | 推荐数据方向 | +| --- | --- | --- | +| 代码补全输出契约 | 输出解释、Markdown 围栏、缺少完整函数 | 函数签名或 Docstring 到完整可执行代码的严格格式样本 | +| Python 语法与补全完整性 | 缩进、括号、字符串、`return` 或函数体不完整 | 短小 Python 语法修复与代码补全样本 | +| 函数接口、作用域与依赖 | 函数名或签名错误、变量未定义、缺少导入 | 接口保持、局部变量、标准库和辅助函数样本 | +| 语义逻辑与断言正确性 | 代码可执行但结果错误 | 带正常断言和反例断言的短算法样本 | +| 边界条件与鲁棒性 | 空输入、单元素、重复值、极值处理错误 | 边界条件与对比样本 | +| 运行时与效率 | 超时、递归过深、复杂度退化 | 低效与高效实现的成对优化样本 | + +当“代码补全输出契约”占失败样本 50% 以上时,系统仍会为语法、接口和语义能力保留探索预算,避免因为代码尚不可执行就误判这些能力没有问题。 + +## 3. Text2SQL 分桶 + +| 能力桶 | 典型问题 | 推荐数据方向 | +| --- | --- | --- | +| SQL 输出契约 | 输出解释、Markdown 或不可直接执行的 SQL | 问题与 Schema 到纯 SQL 的严格输出样本 | +| SQL 语法与结构 | `SELECT`、`JOIN`、聚合、子查询结构错误 | 短 SQL 修复与结构化组合样本 | +| Schema Linking | 表、列、实体或外键匹配错误 | 问题实体与 Schema 显式对齐、易混 Schema 对比样本 | +| SQL 语义与结果正确性 | SQL 可执行但过滤、聚合、排序或去重错误 | 可执行但结果错误的查询纠正样本 | +| 类型、值与条件表达 | 日期、数值、`NULL`、字符串和类型转换错误 | 值匹配、条件表达和类型边界样本 | +| SQL 运行时与效率 | 查询超时或不必要的高复杂度 | 等价 SQL 的低效与高效实现对比样本 | + +当“SQL 输出契约”占失败样本 50% 以上时,系统会额外探索 SQL 语法、Schema Linking 和语义正确性,避免前置格式错误遮蔽真实查询能力。 + +## 4. General Text 分桶 + +| 能力桶 | 典型问题 | 推荐数据方向 | +| --- | --- | --- | +| 指令与输出格式遵循 | 未满足格式、长度、结构或显式约束 | 多约束指令遵循和可验证格式样本 | +| 相关性与意图理解 | 答非所问、偏离用户目标、误解意图 | 相似意图辨析和目标对齐样本 | +| 事实性与知识依据 | 事实错误、幻觉、缺少给定依据 | 有可信来源或给定上下文的事实核验样本 | +| 推理与一致性 | 推理跳步、因果错误、前后矛盾 | 多步推理、一致性检查和反例验证样本 | +| 完整性与要点覆盖 | 漏答关键点、回答截断、信息不足 | 按评分要点补全和覆盖关键信息的样本 | +| 表达与语言质量 | 不流畅、不连贯、冗余或语法较差 | 流畅性、简洁性和结构化表达的改写样本 | +| 安全与拒答边界 | 应拒绝未拒绝,或对正常请求过度拒绝 | 合理拒答、不必要拒答和安全替代回答样本 | + +General Text 优先使用 Judger 提供的结构化标签和理由归因;仅在证据明确时使用空回答、格式违规或明显拒答等规则回退。普通 exact-match 失败不会被强行猜测为某个能力桶,而是进入待诊断样本。 + +General Text 采用两级统计:先确定上述能力桶的训练比例,再在每个能力桶内部统计领域分布,例如知识问答、摘要、写作或对话,避免把“领域”和“能力缺陷”混为一类。 + +## 5. 输出与使用 + +分桶结果写入: + +```text +state["analyzer"]["allocation_plan"] +``` + +报告中会同时给出:原始错误占比、重分类结果、建议训练比例、样本构造方向、代表性失败案例和待诊断样本告警。该比例适合作为下一轮数据补充的初始方案,不应被视为固定不变的长期数据配方。 + +## 6. 参考方法 + +- HELM(TMLR 2023):将通用能力拆为正确性、鲁棒性与安全性等维度。 +- InstructGPT(NeurIPS 2022):将指令遵循和用户意图对齐作为独立能力。 +- TruthfulQA(ACL 2022):区分事实性问题与表面文本相似度。 +- Skill-It!(NeurIPS 2023):考虑能力之间的先后依赖和被遮蔽能力的探索。 +- DoReMi(NeurIPS 2023):根据训练价值动态优化数据混合,而非固定按频率分配。 +- LESS(ICML 2024):使用目标任务收益选择更有影响力的训练数据。 diff --git a/skills/Analyzer/BUCKET_STRATEGY.pdf b/skills/Analyzer/BUCKET_STRATEGY.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c31441e6a644dea79be24089f0e03bd017f39192 GIT binary patch literal 205525 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

u^atEWH-F^io=@bcrrEA-FaiW!#M5DJ%0GC**{> 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 z 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�oenCO~fwyph40P$|qoe~J&xC&<0Z@Y0WKv&yP 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 R-8!av3gOblyJKoS9B15X$c|81(<4W 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 literal 0 HcmV?d00001 diff --git a/skills/Analyzer/SKILL.md b/skills/Analyzer/SKILL.md index fdeeb22..e54ec30 100644 --- a/skills/Analyzer/SKILL.md +++ b/skills/Analyzer/SKILL.md @@ -68,6 +68,7 @@ Supported options: - `--print-result` - `--list-nodes` - `--stream-stdout` +- `--request-timeout-seconds` (default: `300`) ## Environment Variables Runtime configuration should come from environment/system runtime where possible: @@ -79,6 +80,7 @@ Runtime configuration should come from environment/system runtime where possible - `DB_PATH` - `ANALYZER_CHECKPOINT_PATH` - `ANALYZER_VERSION_ID` / `VERSION_ID` +- `ANALYZER_REQUEST_TIMEOUT_SECONDS` Config JSON should not store API keys. Runtime API key/model/base URL should be placed under the task/system config when available: @@ -135,10 +137,14 @@ Analyzer output files and event files are version-scoped: //analyzer// ``` -Standalone function pipeline remains: +Standalone selects the pipeline from `analyzer.analyze_task_type`: `eval_model -> analyze_result -> draw_conclusion -> finish` +General text uses its existing metric pipeline: + +`metric_recommend -> metric_score -> analyze_metric_report -> finish` + The in-memory state still carries: - `state["current"]` @@ -151,6 +157,71 @@ Set `baseline_result_path` to enable Historical Comparison. Current results come Analyzer preserves the `historical_comparison` field and appends a `Historical Comparison` section to report/final_report outputs when available. Missing or unreadable baseline files produce a warning instead of failing the main flow. +## Multiple Benches + +Analyzer can consume two or more Judger results from `judger.bench_result` and +`judger.extra_bench_result`. Results with the same `task_type` are merged into +one analysis run while `summary["bench_summaries"]` preserves per-bench sample +counts, pass rates, and failure distributions. A single string +`analyzer.eval_result_path` remains supported. Standalone callers may also use: + +```json +{ + "analyzer": { + "analyze_task_type": "code", + "eval_result_path": ["humaneval.jsonl", "mbpp.jsonl"] + } +} +``` + +Do not combine `code`, `text2sql`, and general-text results in one Analyzer +route; each task type keeps its own analysis rules. + +## Data Bucket Strategy + +The final report includes `obtainer_stats.allocation_plan`. Analyzer first +reclassifies fallback `other` records with runtime/parser evidence, then +computes a first-round data budget from observed need, classification +confidence, severity, transfer value, learnability prior, and data cost. +`other`/unresolved records receive zero training allocation and enter a +diagnostic queue. Each actionable bucket is capped by default at 50%, and the +plan explicitly requires pilot-training gains to update later rounds. + +Analyzer keeps three independent bucket routes: + +- Code: output contract, syntax/completion, interface/scope, semantic logic, + boundary robustness, and runtime efficiency. +- Text2SQL: SQL output contract, syntax, schema linking, semantic correctness, + type/value handling, and runtime efficiency. +- General Text: instruction/format following, relevance/intent, factuality and + grounding, reasoning consistency, completeness/coverage, language quality, + and safety/refusal boundaries. + +General Text uses structured evaluator labels and reasons first. Empty answers, +verifiable format violations, and obvious refusal patterns provide deterministic +fallback evidence. Generic exact-match failures are not guessed into factuality +or reasoning; unresolved samples enter the zero-budget diagnostic queue. The +plan allocates by capability first and reports the observed domain distribution +inside each capability bucket. + +The General Text design follows these established ideas without claiming to +reimplement the full paper algorithms: + +- [HELM](https://arxiv.org/abs/2211.09110) (TMLR 2023): multi-dimensional model evaluation. +- [InstructGPT](https://proceedings.neurips.cc/paper_files/paper/2022/hash/b1efde53be364a73914f58805a001731-Abstract.html) (NeurIPS 2022): user intent and instruction following. +- [TruthfulQA](https://aclanthology.org/2022.acl-long.229/) (ACL 2022): truthfulness separated from informativeness. +- [Skill-It!](https://proceedings.neurips.cc/paper_files/paper/2023/hash/70b8505ac79e3e131756f793cd80eb8d-Abstract-Conference.html) (NeurIPS 2023): prerequisite and ordered skill acquisition. +- [DoReMi](https://proceedings.neurips.cc/paper_files/paper/2023/hash/dcba6be91359358c2355cd920da3fcbd-Abstract-Conference.html) (NeurIPS 2023): adaptive data mixtures instead of raw-frequency mixing. +- [LESS](https://proceedings.mlr.press/v235/xia24c.html) (ICML 2024): targeted data selection and empirical influence/utility. + +## Model Request Timeout + +Analyzer model requests use a 300-second client timeout by default. Conclusion +requests stream response chunks so long output does not need to wait for the +entire completion before the connection becomes active. A provider/proxy `524` +may still enforce its own shorter gateway limit; in that case Analyzer records +the elapsed time and prompt length, then retries once with compact evidence. + ## Stream Runtime Analyzer standalone follows the same base event writer style as Judger: @@ -158,12 +229,6 @@ Analyzer standalone follows the same base event writer style as Judger: from loopai.common.event_tool import StreamEvent, get_event_writer ``` -Analyzer-specific stdout/state-message/redaction helpers live in: - -```text -loopai/skills/Analyzer/event_tool.py -``` - Events are written to: ```text