چیت‌شیت

پایپ‌لاین ایجنت پژوهش از صفر

Research Agent Pipeline from Scratch

تولید فرضیه‌ها، بازیابی مقالات، اجرای آزمایش‌های داخل ساندباکس، داوری نتایج و انتشار یک گزارش مستند.

  • ۱۰ بخش
  • ۵ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. حلقه‌ی پژوهش
  2. اجرای آن
  3. فراخوانی‌های حلقه در کد
  4. مشخصه‌سازی آزمایش در ساندباکس
  5. اجرای ایجنت گزارش
  6. امتیازها و فرمول‌ها
  7. پیش‌فرض‌های حلقه
  8. پیش‌فرض‌های ایجنت گزارش
  9. خرابی‌ها و راه‌حل‌ها
  10. پرسش‌ها

حلقه‌ی پژوهش

معماری
هد صفتثبیت‌نشدهExperimentResultحکم ارزیابیبهترین branchپیش‌نویسHypothesisGeneratorدرس 50، صف رتبه‌بندی‌شدهRetrievalClientدرس 51، BM25 + گراف استنادیExperimentRunnerدرس 52، محدودیت‌های زیرفرایندEvaluatorدرس 53، آزمون t جفتیپرامپت اولیهشیب تغییر دما (temperature ramp)جست‌وجوی درختینوآوری، کیفیت، بودجهنویسنده‌ی LaTeXنقد بیناییگروه داوران5 داور

اجرای آن

دستورها
دستورکارکرد
python3 code/main.pyدموی درس‌های 50 تا 53. چاپ JSON
python main.pyجست‌وجوی درختی درس 05، بودجه‌ی 30 دلار
docker run --network=none --memory=8g --cpus=2 --pids-limit=256 --read-onlyساندباکس برای یک آزمایش
run_report.py "<question>" --out out/ --code <dir>JSON گزارش، ردگیری محاسبات و شواهد
run_report.py --eval heldout/questions.jsonامتیازدهی به مجموعه‌داده‌های نمونه‌ی عمومی
run_report.py "<question>" --model replay --cassette <file>برنامه‌ریزی بر اساس پاسخ‌های ضبط‌شده
run_report.py "<question>" --corpus <dir> --compare <old>/report.jsonنوشتن changes.json
project_test.py research-report-agent --stage <n> --path <dir>ارزیابی یک مرحله و تمام مراحل قبلی

فراخوانی‌های حلقه در کد

کار و کد
وظیفهکد
پیکربندی شیب تغییرGeneratorConfig(n_passes=4, t_min=0.2, t_max=1.1)
پیش‌نویس و رتبه‌بندیqueue, logs = generator.run(seed_prompt)
ساخت یک بازیابbuild_client(RetrievalConfig(top_k_lexical=5, max_hops=2))
جست‌وجوی مقالاتresult = client.search(query)
اجرای یک مشخصه (spec)ExperimentRunner().run(spec)
پیمایش یک متغیر تنظیمی (knob)AblationRunner(runner).sweep(base, "k", [4, 8, 16, 32])
انتخاب متریکMetricSpec(name="perplexity", direction=LOWER, scale=LOG)
داوری اجراهاevaluator.evaluate(1, metric_spec, candidates, baselines)

مشخصه‌سازی آزمایش در ساندباکس

کد
python
base = ExperimentSpec(
    spec_id="demo_base", hypothesis_id=1,
    script_path=script,         # یک خط json چاپ می‌کند
    config={"k": 16, "steps": 4, "sleep_s": 0.0},
    seed=7,                     # ارسال‌شده به‌عنوان config["__seed"]
    wall_timeout_s=15.0,        # سخت‌گیرانه، توقف اجباری در صورت تجاوز
    memory_cap_mb=256,          # انعطاف‌پذیر، پایش پیوسته‌ی RSS
    metric_keys=["perplexity", "final_loss"],
)
runner = ExperimentRunner()
base_result = runner.run(base)  # پایانی: ok، timeout، oom، crash
base_result.to_dict()           # متریک‌ها، peak_rss_mb، stderr_tail
ablate(base, "k", [4, 8])       # شناسه‌ی spec_id معادل demo_base_k_4

اجرای ایجنت گزارش

گام‌به‌گام
  1. ایندکسکلاس BM25Index(documents) پیکره متنی مارک‌داون را در Rust رتبه‌بندی می‌کند.
  2. برنامه‌ریزیتابع plan_research سؤال را به حداکثر 4 جنبه تفکیک می‌کند.
  3. گردآوریتابع gather_snippets به‌ازای هر جنبه، 3 قطعه‌متن را همراه با آفست نگه می‌دارد.
  4. نگارشتابع write_report جملات را با نشانگرهای [S1] می‌سازد.
  5. تأییدتابع review به هر جمله امتیاز می‌دهد. apply_verdicts بقیه را حذف می‌کند.
  6. وضعیتتابع decide_state وضعیت‌های completed، needs_review یا failed را بازمی‌گرداند.
  7. انتشارتابع write_outputs فایل‌های report.html، report.json و trace.json را می‌نویسد.

امتیازها و فرمول‌ها

مفهوم‌ها
فاصله‌ی کسینوسی
1 - dot(a, b) روی بردارهای واحد.
امتیاز رتبه
0.4 نوآوری + 0.3 جزئی‌نگری + 0.3 آزمون‌پذیری.
امتیاز نهایی
0.5 برای BM25 نرمال‌شده + 0.3 گراف + 0.2 تازگی.
امتیاز گراف
1 برای تطابق واژگانی، 0.6 در یک گام پرش، 0.3 در دو گام پرش.
امتیاز نود
نوآوری 0.4 + کیفیت 0.5 + وزن بودجه 0.1.
میزان بهبود
نسبت (خط مبنا - نامزد) / قدرمطلق(خط مبنا) در شرایطی که کمتر بودن بهتر است.
آزمون t جفتی
t_stat = mean / sqrt(variance / n)، درجه‌ی آزادی n - 1 است.
امتیاز گزارش
100 ضربدر (0.4 دقت + 0.3 بازخوانی + 0.3 فکت‌ها).

پیش‌فرض‌های حلقه

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
n_passes6t_min معادل 0.2 تا t_max معادل 1.2
novelty_threshold0.25فاصله‌ی کمتر به معنای تکراری بودن است
BM25 `k1`, `b`1.5b معادل 0.75 است
top_k_lexical10مقادیر اولیه (seed) برای پیمایش گراف
max_hops2مقادیر بالاتر از 2 محدود (clamp) می‌شوند
wall_timeout_s30.0memory_cap_mb برابر 512 است
improvement_threshold0.02تغییر کوچک‌تر نویز محسوب می‌شود
significance_threshold0.05مقدار p-value بزرگ‌تر نویز محسوب می‌شود

پیش‌فرض‌های ایجنت گزارش

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
--modelrulesهمچنین بازپخش یا زنده
Budget `max_steps`50BudgetExceeded وضعیت failed ایجاد می‌کند
Budget `max_tokens`20000estimate_tokens برابر len / 4 است
`review` threshold0.6همپوشانی لازم برای نگه‌داشتن یک جمله
`citation_precision` threshold0.8سخت‌گیرانه‌تر از ناقد
max_facets4نمای کلی، نحوه، خطرات، زمان
max_sentences3به‌ازای هر بخش
Reference score87.5شش سؤال عمومی، از 100

خرابی‌ها و راه‌حل‌ها

عیب‌یابی
  • لاگ نشان می‌دهد: parse:no hypothesis block found

    علت
    پاسخ فاقد بلوک نشانه‌گذاری‌شده است
    راه‌حل
    دما را روی 1.2 یا کمتر نگه دارید
  • در هر بار گذر، duplicate لاگ می‌شود

    علت
    پیش‌نویس‌ها در اکثر اسم‌ها مشترک هستند
    راه‌حل
    پرامپت اولیه را گسترده‌تر کرده و دوباره اجرا کنید
  • وضعیت terminal برابر crash همراه با متریک‌ها است

    علت
    کد خروج غیر صفر
    راه‌حل
    اسکریپت را اصلاح کنید. اجراهای ناقص failed محسوب می‌شوند
  • PairingError

    علت
    مقادیر seed بین لیست‌ها متفاوت است
    راه‌حل
    هر دو بازو را با مقادیر seed یکسان دوباره اجرا کنید
  • حکم ارزیابی noise همراه با بهبود زیاد

    علت
    کمتر از 2 جفت، بدون p-value
    راه‌حل
    مقادیر seed بیشتری را اجرا کنید
  • نود با خطای loss_diverged شکست می‌خورد

    علت
    تابع زیان (loss) بالاتر از 4.0
    راه‌حل
    آن branch را رها کنید. بقیه را توسعه دهید
  • جمله حذف شد: نام‌ها یا اعداد در منبع نیستند

    علت
    نام جابه‌جا شده یا عدد تغییر کرده است
    راه‌حل
    نگارش را استخراجی (extractive) نگه دارید
  • مقدار source در برنامه rules-fallback است

    علت
    JSON نامعتبر مدل یا عدم تطابق کاست (cassette miss)
    راه‌حل
    یادداشت برنامه را بخوانید. کاست را دوباره ضبط کنید

پرسش‌ها

پرسش و پاسخ
چرا شیب دما تغییر می‌کند؟
پیش‌نویس‌های بعدی از مسیر منحرف می‌شوند. زیر 0.2 مدل پرامپت اولیه را طوطی‌وار تکرار می‌کند.
چرا گراف استنادی پیمایش می‌شود؟
مقالاتی را می‌یابد که از واژگانی غیر از واژگان پرسش استفاده می‌کنند.
چرا فقط دو گام پرش؟
سه گام پرش نتایج را منفجر کرده و باعث دریفت از موضوع می‌شود.
چرا زیرفرایند؟
کد غیرقابل‌اعتماد نباید هماهنگ‌کننده را متوقف کند و کرش دهد.
چرا هربار فقط یک متغیر تنظیمی؟
پیمایش‌های فاکتوریل کامل به‌صورت نمایی رشد می‌کنند.
چرا آزمون جفتی؟
هر seed یک تفاوت ایجاد می‌کند. کف نویز همان خطای استاندارد آن‌هاست.
آیا needs_review شکست محسوب می‌شود؟
خیر. دقیقاً به انسان نشان می‌دهد کجا را بررسی کند.