فاز 19 · درس 29

درس پایانی: ساخت ایجنت کدنویسی سرتاسری روی بستر آزمایشی

نوع
ساختنی
زمان
حدود 90 دقیقه
زبان‌ها
Python (stdlib)
پیش‌نیاز
فاز 19 · درس 25 (گیت‌های اعتبارسنجی)، فاز 19 · درس 26 (ساندباکس)، فاز 19 · درس 27 (بستر ارزیابی)، فاز 19 · درس 28 (قابلیت مشاهده‌پذیری)، فاز 14 · درس 38 (گیت‌های اعتبارسنجی)، فاز 14 · درس 41 (میز کار مخازن واقعی)، فاز 14 · درس 42 (پروژه پایانی میز کار ایجنت)
یک صفحه شفاف شیشه‌ای از مدارها و قطعات متصل مکانیکی که چرخ‌دنده‌ها، گیت‌های کنترل و سنجه‌ها را در یک کل واحد روی یک میز کار مهندسی نمایش می‌دهد.
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفهوم اصلی
  4. معماری
  5. آنچه خواهید ساخت
  6. چرا خط‌مشی یک LLM نیست؟
  7. اعتبارسنجی‌های دمو
  8. هماهنگی با بقیه‌ی مسیر A
  9. اجرای کد

بسیاری از آموزش‌ها اجزای یک سیستم ایجنتی را جداگانه بررسی می‌کنند: یک ساندباکس ساده در خلأ، یک بستر تست بدون ناظر، یا تنظیم ترکینگ بدون گیت‌های امنیتی. اما چالش اصلی مهندسی زمانی رخ می‌دهد که این لایه‌ها را کنار هم قرار می‌دهید؛ جایی که ناسازگاری سهمیه توکن‌ها، بلاک‌های ناخواسته در گیت‌های امنیتی و ناهماهنگی متریک‌ها سیستم را فلج می‌کنند.

در این درس پایانی، تمام بخش‌های ساخته‌شده شامل زنجیره گیت، محیط ایزوله ساندباکس، بستر ارزیابی و تلمتری OTel را در یک حلقه اجرایی واحد ادغام می‌کنیم تا یک باگ پایتونی واقعی را رفع کند. با جایگزینی مدل زبانی با یک خط‌مشی قطعی مبتنی بر ماشین وضعیت، ساختار معماری را بدون نیاز به کلیدهای API خارجی یا اجرای ابری پرهزینه، به‌صورت کاملاً محلی، سریع و تکرارپذیر روی سیستم شخصی پیاده‌سازی می‌کنید.

ثمره‌ی تلاش‌های مسیر A اینجاست. در این درس، زنجیره‌ی گیت، ساندباکس، بستر آزمایشی ارزیابی و اسپن‌های OTel را به هم پیوند می‌زنیم تا یک ایجنت کدنویسی کاربردی بسازیم؛ ایجنتی که یک باگ واقعی (در مقیاس فیکسچر و کوچک) را در پروژه‌ای چندفایلی در Python برطرف می‌کند. این ایجنت به‌جای LLM، از یک خط‌مشی قطعی (Deterministic policy) استفاده می‌کند؛ این جایگزینی باعث می‌شود درس کاملاً تکرارپذیر باشد و نشان می‌دهد که بخش جذاب ماجرا از همان ابتدا بستر آزمایشی بوده است. قرارداد کاری دقیقاً یکسان است: یک مدل واقعی درست در درز و مرز اتصال خط‌مشی می‌نشیند.

اهداف یادگیری

  • ترکیب زنجیره‌ی گیت، ساندباکس، بستر آزمایشی ارزیابی و سازنده‌ی اسپن در یک حلقه‌ی ایجنت واحد.
  • پیاده‌سازی یک خط‌مشی قطعی که با استفاده از read_file، run_tests و write_file باگ یک فیکسچر را رفع می‌کند.
  • اعمال سهمیه‌ی گام‌های سراسری به همراه سهمیه‌ی توکن مشاهده در طول یک اجرای سرتاسری.
  • انتشار ردگیری محاسبات کامل OTel GenAI و معیارهای Prometheus برای کل فرایند اجرا.
  • اعتبارسنجی اینکه ایجنت فیکسچر را در کمتر از 12 گام و بدون هیچ فعال‌شدن ناخواسته‌ی گیت روی ابزارهای مجاز حل می‌کند.

صورت مسئله

بیشتر دموهای ایجنت به‌صورت ایزوله کار می‌کنند: ساندباکس به‌تنهایی، بستر آزمایشی ارزیابی به‌تنهایی، و ارسال‌کننده‌ی اسپن هم به‌تنهایی. کارشان در ظاهر خوب به نظر می‌رسد؛ اما وقتی آن‌ها را ترکیب می‌کنید، درزها و آرتیفکت‌های مرزی خود را نشان می‌دهند.

زنجیره‌ی گیت وضعیت ALLOW را برمی‌گرداند، اما ساندباکس به دلیلی که زنجیره پیش‌بینی نکرده بود از اجرا سر باز می‌زند. بستر آزمایشی ارزیابی موفقیت را ثبت می‌کند، اما اسپن‌های OTel می‌گویند گیت جلوی اجرای ابزاری را گرفته که ایجنت ادعای استفاده از آن را دارد. شمارنده‌ی Prometheus دو بار افزایش می‌یابد، در حالی که باید یک بار شمرده می‌شد. سهمیه‌ی توکن مشاهده تمام می‌شود، اما ایجنت به کارش ادامه می‌دهد؛ چون بودجه داخل زنجیره ردگیری می‌شد و ساندباکس از آن بی‌خبر بود.

این درس، آزمون یکپارچگی کل این مسیر آموزشی است. ایجنت باید شش کار را به ترتیب انجام دهد: پروژه را بخواند، تست‌ها را اجرا کند، باگ را از روی خطای تست شناسایی کند، اصلاحیه را بنویسد، تست‌ها را دوباره اجرا کند و متوقف شود. تک‌تک عملیات‌ها از زنجیره‌ی گیت عبور می‌کنند. همه‌ی فراخوانی‌های ابزار داخل ساندباکس اجرا می‌شوند. هر گام در قالب یک اسپن پوشش داده می‌شود. در پایان، بستر آزمایشی ارزیابی به کل فرایند امتیاز می‌دهد.

مفهوم اصلی

فراخوانی ابزارمشاهدهفیکسچر مخزنsrc/fizz.py دارای باگtests/test_fizz.pyبستر آزمایشیزنجیره گیت / ساندباکسسازنده اسپن / دفتر مشاهدهسیاستجایگزین قطعیبرای مدلگزارش ارزیابی + JSONL+ اکسپوزیشن Prometheus

خط‌مشی ایجنت یک ماشین وضعیت با پنج وضعیت است:

SURVEY: ایجنت فهرست فایل‌های پروژه را می‌خواند. وضعیت بعدی RUN_TESTS است.

RUN_TESTS: ایجنت دستور تست را اجرا می‌کند. اگر تست‌ها پاس شوند، ماشین وضعیت با موفقیت متوقف می‌شود؛ در غیر این صورت وضعیت بعدی INSPECT است.

INSPECT: ایجنت فایل سورس دارای خطا را می‌خواند. وضعیت بعدی FIX است.

FIX: ایجنت فایل اصلاح‌شده را می‌نویسد. وضعیت بعدی VERIFY است.

VERIFY: ایجنت دوباره دستور تست را اجرا می‌کند. اگر تست‌ها پاس شوند، با موفقیت متوقف می‌شود؛ در غیر این صورت با وضعیت شکست متوقف خواهد شد.

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

باگ فیکسچر، یک خطای یکی‌کم‌و‌زیاد (off-by-one) در fizz.py است. خط‌مشی قطعی با استفاده از regex باگ را از پیام خطای تست تشخیص می‌دهد و فایل اصلاح‌شده را تولید می‌کند. جایگزینی این خط‌مشی با یک LLM، قرارداد بستر آزمایشی را تغییر نمی‌دهد.

بستر آزمایشی سرتاسریهر گام از چهار لایه عبور می‌کند
HARNESS END TO ENDThe end-to-end run is one token weaving through four strata on every step: the gate chain rules on the call, the sandbox executes it, a span wraps the whole exchange, and the eval harness scores the finished trajectory. The components stop disagreeing because the budgets live in one place and every layer reads the same ledger. The fixture bug falls in nine steps, under the twelve-step ceiling, with zero gate trips on legal tools.زنجیره گیتساندباکساسپن otelبستر ارزیابیخواندنتست‌هانوشتنتست‌هاگزارش اجراPASS9 گام · 0 خطابودجه‌های سراسری: 12 گام · 8K توکن مشاهده
اجرای سرتاسری جریانی از یک توکن است که در هر گام از چهار لایه عبور می‌کند: زنجیره گیت روی فراخوانی تصمیم می‌گیرد، ساندباکس آن را اجرا می‌کند، یک اسپن کل تبادل را در بر می‌گیرد، و بستر ارزیابی به مسیر کاملِ اجرا امتیاز می‌دهد. تداخل اجزا از بین می‌رود زیرا بودجه‌ها در یک نقطه متمرکز شده و هر لایه همان دفترکل مشترک را می‌خواند. باگ فیکسچر در نه گام، کمتر از سقف دوازده گام و بدون هیچ خطای گیت روی ابزارهای مجاز رفع می‌شود.

معماری

گاممجازردPolicyStepDispatcherGateChain.evaluateSandboxیادداشت ردمشاهدهافزودن به دفتر ثبتSpanاسپن خطابازگشت به سیاست

این درس کاملاً خودکفاست. هر جزء سازنده‌ی پیشین در مقیاسی حداقلی درون main.py بازنویسی شده است (گیت، ساندباکس، دفتر کل و اسپن) تا درس بدون نیاز به ایمپورت از درس‌های هم‌جوار اجرا شود. نام‌ها دقیقاً با درس‌های 25 تا 28 مطابقت دارند تا نگاشت مفهومی کاملاً روشن و بدون ابهام بماند.

آنچه خواهید ساخت

آنچه در main.py ارائه می‌شود:

  1. اجزای سازنده‌ی حداقلی بستر آزمایشی، با همان نام‌های درس‌های 25 تا 28: GateChain، Sandbox، ObservationLedger، SpanBuilder و MetricsRegistry.
  2. کلاس CodingAgentPolicy: ماشین وضعیت با پنج وضعیت.
  3. هلپر Repo: آماده‌سازی یک دایرکتوری موقت با فیکسچر باگ‌دارِ همراه پروژه.
  4. کلاس AgentRun: هدایت خط‌مشی، ارسال فراخوانی‌ها از طریق بستر آزمایشی و بازگرداندن AgentRunReport.
  5. یک فیکسچر همراه (fixture_repo/) شامل src/fizz.py، tests/test_fizz.py و ساختار درختی expected/ برای بستر آزمایشی ارزیابی.
  6. دمو: اجرای سرتاسری خط‌مشی، چاپ گام‌به‌گام ردگیری محاسبات، اعتبارسنجی پاس شدن تست‌ها (assert pass) و چاپ معیارها.

فیکسچر همراه پروژه ساختاری مشابه وظیفه‌ی درس 27 دارد: یک فایل باگ‌دار و یک فایل تست. پیام خطای تست داده‌های کافی را در اختیار خط‌مشی قطعی قرار می‌دهد تا اصلاحیه را تشخیص دهد. یک LLM واقعی نیز همین کار را با سرعتی کمتر و بازخوانی گسترده‌تر انجام می‌دهد، اما تاثیری روی انتظارات بستر آزمایشی نخواهد داشت.

چرا خط‌مشی یک LLM نیست؟

یک LLM واقعی به کلید API، فراخوانی شبکه و رفتار تصادفی غیرقابل‌تایید نیاز دارد. این در حالی است که بخش مهم این درس، همان بستر آزمایشی است. جایگزینی آن با یک خط‌مشی قطعی اجازه می‌دهد این درس روی لپ‌تاپ هر توسعه‌دهنده‌ای بدون وابستگی خارجی اجرا شود و مجموعه تست‌ها بتوانند تعداد دقیق گام‌ها را بسنجند.

خط‌مشی این درس زیرمجموعه‌ی دقیقی از کارهایی است که یک ایجنت LLM انجام می‌دهد. خط‌مشی مخزن را می‌خواند، تست ناموفق را می‌بیند، خط مشکل‌دار را پیدا می‌کند و اصلاحیه را می‌فرستد. یک LLM دقیقاً همین حلقه را با همان قرارداد بستر آزمایشی طی می‌کند؛ ثبت داده‌ها در پشت صحنه کاملاً یکسان است.

اعتبارسنجی‌های دمو

دموی سرتاسری در زمان خروج پنج مورد را بررسی می‌کند و مجموعه‌ی تست‌ها نیز دوباره آن‌ها را به‌شکل برنامه‌نویسی‌شده اعتبارسنجی می‌کنند:

خط‌مشی توانسته است فیکسچر را در کمتر از 12 گام حل کند.

سهمیه‌ی توکن مشاهده در هیچ نقطه‌ای رد نشده است.

هیچ امتناعی در گیت برای ابزارهای مجاز رخ نداده است (ایجنت هیچ ابزار نامجازی از خود نساخته است).

هر گام یک اسپن متناظر در traces.jsonl دارد.

خروجی Prometheus شامل یک ورودی tools_called_total{tool="read_file"} و یک هیستوگرام tool_latency_ms است.

هماهنگی با بقیه‌ی مسیر A

این درس نقطه‌ی یکپارچه‌سازی است. در درس 25 زنجیره‌ی گیت را نوشتیم. در درس 26 ساندباکس را آماده کردیم. در درس 27 بستر آزمایشی ارزیابی را توسعه دادیم. در درس 28 قابلیت مشاهده‌پذیری را پیاده کردیم. اکنون درس 29 اثبات می‌کند که این بخش‌ها در قالب یک سیستم کار می‌کنند. ارتقای بستر آزمایشی ایجنت به یک محیط واقعی آسان است: خط‌مشی قطعی را با یک مدل جایگزین کنید، فیکسچر پروژه را با وظیفه‌ای از یک مخزن واقعی تغییر دهید و صادرکننده‌ی JSONL را به OTLP متصل کنید.

اجرای کد

cd phases/19-capstone-projects/29-end-to-end-coding-task-demo
python3 code/main.py
python3 -m pytest code/tests/ -v

دمو ردگیری محاسبات گام‌به‌گام، گزارش نهایی ارزیابی و خروجی Prometheus را نمایش می‌دهد. کد خروج صفر است. تست‌ها انتقال وضعیت‌های خط‌مشی، امتناع‌های گیت در فراخوانی‌های ساختگی ابزار، اجرای سرتاسری روی فیکسچر همراه، و پایدار بودن سهمیه‌ی گام‌ها را پوشش می‌دهند.

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسپیش از خواندن درس: چرا دموی سرتاسری LLM را با یک خط‌مشی قطعی (deterministic policy) جایگزین می‌کند؟
  2. حین درسماشین وضعیت ایجنت دارای پنج وضعیت است. در یک اجرای عادی، آن‌ها را به چه ترتیبی اجرا می‌کند؟
  3. حین درسباگ فیکسچر همراه، یک خطای یکی کم/زیاد (off-by-one) در src/fizz.py است: range(1, n) به جای range(1, n + 1). خط‌مشی در کجا تصمیم به اعمال اصلاحیه می‌گیرد؟
  4. حین درسهر فراخوانی ابزار دقیقاً از چه زنجیره‌ای از مؤلفه‌ها و با چه ترتیبی عبور می‌کند؟
  5. پس از درساگر خط‌مشی قطعی را با یک LLM واقعی جایگزین کنید، کدام مؤلفه‌ی بستر آزمایشی تغییر می‌کند؟
  6. پس از درسدمو تضمین می‌کند که ایجنت فیکسچر را در کمتر از 12 گام حل کند. خط‌مشی قطعی از 5 گام استفاده می‌کند. یک ایجنت مبتنی بر LLM واقعی احتمالاً چگونه رفتار می‌کند و بستر آزمایشی چطور آن را مدیریت می‌کند؟

سؤالات متداول

چرا در این پروژه به‌جای LLM واقعی از خط‌مشی قطعی (Deterministic Policy) استفاده شده است؟

استفاده از خط‌مشی قطعی نیاز به کلید API و وابستگی‌های شبکه را حذف کرده و با از بین بردن رفتارهای تصادفی مدل، امکان بررسی دقیق گام‌ها، سهمیه‌ها و اعتبارسنجی بستر آزمایشی را روی سیستم محلی فراهم می‌کند.

ایجنت کدنویسی در این معماری از چه وضعیت‌هایی تشکیل شده است؟

این ایجنت از یک ماشین وضعیت با پنج حالت SURVEY (بررسی ساختار)، RUN_TESTS (اجرای تست اولیه)، INSPECT (خواندن کد مشکل‌دار)، FIX (اعمال اصلاحیه) و VERIFY (اجرای مجدد تست‌ها برای تایید نهایی) استفاده می‌کند.

چه مواردی در پایان اجرای سرتاسری سیستم اعتبارسنجی می‌شوند؟

رفع باگ در کمتر از 12 گام، رعایت کامل سهمیه توکن مشاهده، عدم رد ابزارهای مجاز در گیت، ثبت کامل اسپن‌های OTel برای هر گام و انتشار صحیح متریک‌های Prometheus اعتبارسنجی می‌شوند.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.