优化顾问模块 — 整体架构与数据流

新增 rag_eval/advisor/ 包,插入 run_scenario() 末尾,复用已有 llm 实例

执行链路(变更前 → 变更后)
run_scenario()
  → load_scenario()            # 读 YAML,解析 Scenario + optimization_advisor 字段
  → build_models()             # 已有:创建 llm, embeddings
  → build_metric_pipeline()    # 已有
  → Evaluator.evaluate()       # 已有:打分 → EvaluationResult
  → write_run_artifacts()      # 已有:scores.csv / summary.md / ...
  → run_advisor(result, scenario, llm)   # 新增 3 行
      → rules.diagnose(score_rows)         # 规则引擎:识别异常指标 + 方向
      → llm_analyzer.analyze(diag, samples) # LLM:结合低分样本生成中文建议
      → writer.write(advice, paths)        # 写 optimization_advice.md + 日志

新增文件一览

rag_eval/advisor/
  __init__.py     ← 暴露 run_advisor(),是外部唯一入口
  rules.py       ← 纯函数,无 LLM,可单独单测
  llm_analyzer.py ← 接收 llm 实例 + 诊断结构 → 中文 Markdown
  writer.py      ← 写 optimization_advice.md,打日志摘要

rag_eval/shared/models.py   ← 修改:Scenario 加 optimization_advisor 字段
rag_eval/config/schema.py   ← 修改:ScenarioModel 加字段
rag_eval/execution/runner.py ← 修改:末尾加 3 行调用
rag_eval/reporting/artifacts.py ← 修改:RunArtifactPaths 加 advice_md 路径

输出产物

outputs/online/siemens-pdf-question-bank/<run_id>/
  scenario.snapshot.yaml
  scores.csv
  invalid.csv
  summary.md
  metadata.json
  optimization_advice.md     ← 新增

整体看起来 OK 吗?这是新模块与现有链路的接入方式。