_reeval_one.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. # -*- coding: utf-8 -*-
  2. """一次性:用当前 eval_prompt_template.md 对单条已存帖子重评(复用生产评估链路 evaluate_posts)。
  3. 支持 --escalate-model 演示 sonnet+flash-lite 组合(模糊带升级)。"""
  4. import argparse, asyncio, json, sys
  5. from pathlib import Path
  6. PROJECT_ROOT = Path(__file__).resolve().parents[3] # …/Agent
  7. sys.path.insert(0, str(PROJECT_ROOT))
  8. from dotenv import load_dotenv
  9. load_dotenv()
  10. MW = Path(__file__).resolve().parent
  11. sys.path.insert(0, str(MW))
  12. import db
  13. from examples.process_pipeline.script.search_eval.search_and_evaluate import evaluate_posts
  14. from examples.process_pipeline.script.llm_evaluate_sources import (
  15. _EVAL_PRODUCT_FIELDS, build_eval_llm_call, DEFAULT_EVAL_MODEL,
  16. )
  17. def _load(query_id):
  18. return json.loads((MW / "runs" / "search_process" / f"{query_id}.json")
  19. .read_text(encoding="utf-8"))
  20. async def main():
  21. ap = argparse.ArgumentParser()
  22. ap.add_argument("--query-id", required=True)
  23. ap.add_argument("--case-id", required=True)
  24. ap.add_argument("--query", default="")
  25. ap.add_argument("--model", default=DEFAULT_EVAL_MODEL)
  26. ap.add_argument("--escalate-model", default="")
  27. ap.add_argument("--escalate-band", type=float, nargs=2, default=[4.0, 6.0])
  28. ap.add_argument("--max-images", type=int, default=4)
  29. a = ap.parse_args()
  30. data = _load(a.query_id)
  31. query = a.query or data.get("query", "")
  32. src = next((s for s in data.get("results", []) if s.get("case_id") == a.case_id), None)
  33. if not src:
  34. raise SystemExit(f"未找到 case_id={a.case_id}")
  35. for k in _EVAL_PRODUCT_FIELDS:
  36. src.pop(k, None)
  37. llm_call, model_id = build_eval_llm_call(a.model)
  38. esc_llm = esc_model = None
  39. if a.escalate_model:
  40. esc_llm, esc_model = build_eval_llm_call(a.escalate_model)
  41. print(f"▶ 重评 {a.case_id} 初评={model_id}"
  42. + (f" 升级={esc_model} 带[{a.escalate_band[0]:g},{a.escalate_band[1]:g}]" if esc_model else "")
  43. + f" query={query!r}\n")
  44. sources, cost = await evaluate_posts(
  45. [src], "", llm_call, model_id, max_concurrent=1,
  46. include_images=True, max_images=a.max_images, image_mode="url", query=query,
  47. escalate_llm=esc_llm, escalate_model=esc_model, escalate_band=tuple(a.escalate_band),
  48. )
  49. ev = sources[0]["llm_evaluation"]
  50. overall = db.overall_score(ev)
  51. pub = (src.get("post") or {}).get("publish_timestamp", "")
  52. adopted = db.is_adopted(overall, ev, pub)
  53. print("\n" + "=" * 60)
  54. print(f"最终评估模型 = {sources[0].get('_escalated') or model_id}")
  55. print(f"综合分(overall_score) = {overall}")
  56. print(f" · 和内容制作知识相关 = {((ev.get('相关性') or {}).get('和内容制作知识相关') or {}).get('得分')}")
  57. print(f" · 可复现性 = {db._fixed_dim_score(ev, '可复现性')} (门槛 <4 → 不采纳)")
  58. print(f" · 意图可控性 = {db._fixed_dim_score(ev, '意图可控性')} (暂只采分)")
  59. print(f"采纳判定(is_adopted) = {adopted}")
  60. print(f"总成本 ≈ ${cost:.4f}")
  61. if __name__ == "__main__":
  62. asyncio.run(main())