![]()
تا اینجا در دوره، عاملهایی ساختهاید که روی لپتاپ شما، داخل یک نوتبوک، با استفاده از az login و چند متغیر محیطی اجرا میشوند. این دقیقاً روش درستی برای یادگیری است. اما این روش درست برای اجرای عاملی که هزاران مشتری به آن در ساعت 3 صبح وابستهاند، نیست.
این درس درباره شکاف بین «روی دستگاه من کار میکند» و «بهطور قابلاعتماد و مقرون به صرفه در محیط تولید کار میکند» است. این شکاف را با استفاده از مایکروسافت فاندری و خدمات عامل مایکروسافت فاندری پر میکنیم، و این کار را با ساخت یک عامل پشتیبانی مشتری واقعی انجام میدهیم که ابزار، بازیابی، حافظه، ارزیابی و نظارت دارد.
این درس موارد زیر را شامل میشود:
پس از اتمام این درس، شما خواهید دانست چگونه:
این درس فرض میکند که شما درسهای قبلی را گذراندهاید و به:
همچنین موارد زیر را نیاز خواهید داشت:
az login).requirements.txt.یک عامل نمونه اولیه و یک عامل تولید همان حلقه اصلی را دارند — استدلال، فراخوانی ابزارها، پاسخ. تغییر چیزی که دور این حلقه پیچیده شده است. مدل شاید ۲۰٪ از یک عامل تولید باشد؛ ۸۰٪ باقیمانده اسکلت عملیاتی است.
| ملاحظه | نمونه اولیه | تولید |
|---|---|---|
| میزبانی | در نوتبوک شما اجرا میشود | به عنوان یک سرویس میزبانی شده، نسخهگذاری شده و پیادهسازی میشود |
| هویت | توکن az login شما |
هویت مدیریت شده با RBAC محدودهبندیشده |
| حالت | درونحافظه، در زمان راهاندازی مجدد از دست میرود | برونسپاری شده (فروشگاه رشته، سرویس حافظه) |
| خطا | شما استکتریس را میبینید | تلاش مجدد، جایگزینها، پیامهای مرده، هشدارها |
| هزینه | “چند سنت است” | بر اساس درخواست ردیابی، هدایت شده، کش شده، بودجهبندی شده |
| کیفیت | خروجی را مستقیم نگاه میکنید | بهطور خودکار قبل از هر انتشار ارزیابی میشود |
| اعتماد | شما هر عمل را تأیید میکنید | سیاست + حلقه انسانی برای اقدامات پرریسک |
این جدول را به ذهن بسپارید. هر بخش زیر به یکی از این ردیفها مربوط میشود.
سه الگو وجود دارد که اغلب به صورت ترکیبی استفاده میکنید.
شیء عامل داخل فرایند برنامه شما زندگی میکند. کد شما مستقیماً به ارائهدهنده مدل فراخوانی میکند؛ حلقه استدلال در سرویس شما اجرا میشود. این همان کاری است که همه درسهای قبلی انجام دادهاند.
عامل بهعنوان یک منبع ثبت شده در مایکروسافت فاندری است. فاندری حلقه استدلال را میزبانی میکند، رشتهها را ذخیره میکند، امنیت محتوا و RBAC را اجرا میکند و عامل را در پرتال فاندری قابل مشاهده میکند. برنامه شما یک کلاینت سبک میشود که رشتهها را میسازد و پاسخها را میخواند.
چندین عامل (و ابزار) در یک گراف با جریان کنترل صریح ترکیب میشوند — مراحل متوالی، انشعاب، گرههای تأیید انسانی، و نقاط بازبینی دائمی که میتوانند توقف و ادامه پیدا کنند. این قابلیت گردش کارها چارچوب عامل مایکروسافت است که در مقیاس استقرار بهکار میرود.
flowchart TB
subgraph P1[Client-Hosted]
A1[Your App Process] --> M1[Model Provider]
end
subgraph P2[Hosted Agent]
A2[Thin Client] --> F2[Foundry Agent Service]
F2 --> M2[Model + Tools + Thread Store]
end
subgraph P3[Agent Workflow]
A3[Orchestrator] --> S1[Triage Agent]
S1 --> S2[Resolver Agent]
S2 --> H[Human Approval Node]
H --> S3[Action Agent]
end
استقرار یک عامل یک push یکباره نیست. این یک حلقه است، و بسیار شبیه چرخه انتشار نرمافزار است چون دقیقاً همان است.
flowchart LR
Create[Create / Author] --> Version[Version]
Version --> Evaluate[Evaluate offline]
Evaluate -->|passes gate| Deploy[Deploy hosted]
Evaluate -->|fails gate| Create
Deploy --> Observe[Observe online]
Observe --> Improve[Collect failures]
Improve --> Create
Deploy --> Retire[Retire old version]
ایده کلیدی، که از درس ۱۰ منتقل شده: ارزیابی آفلاین یک دروازه است، نه یک فکر بعدی. نسخه جدید عامل تا وقتی که معیارهای ارزیابی شما را پاس نکند منتشر نمیشود. قابلیت مشاهده آنلاین سپس خطاهای واقعی را به مجموعه آزمایش آفلاین شما برمیگرداند. این کل حلقه است.
مقیاسدهی یک عامل با مقیاسدهی یک API وب بدون حالت متفاوت است، چون هر درخواست میتواند چندین فراخوانی ابزار و مدل پرهزینه را فعال کند. چهار تکنیک بیشتر بار را حمل میکنند.
پردازش درخواست بدون حالت. هیچ حالت کاربر به ازای هر درخواست در حافظه فرایند نگه ندارید. رشتههای مکالمه را در فروشگاه رشته فاندری یا سرویس حافظه ذخیره کنید تا هر نمونهای بتواند هر درخواستی را مدیریت کند. این چیزی است که به شما امکان مقیاسپذیری افقی را میدهد — اضافه کردن نمونهها، بدون جلسات چسبیده.
هدایت مدل. هر درخواستی نیازمند مدل قدرتمند (و پرهزینه) شما نیست. درخواستهای ساده — طبقهبندی قصد، پاسخهای کوتاه و واقعی — را به مدل کوچک و سریع هدایت کنید، و مدل بزرگ را برای استدلال واقعی نگه دارید. مدل روتر فاندری میتواند این کار را برای شما انجام دهد، یا میتوانید خودتان یک طبقهبند سبک بسازید. نسخه DIY را در آزمایشگاه خواهید ساخت.
کشینگ پاسخ. بسیاری از سوالات پشتیبانی تقریباً تکراریاند (“چگونه رمز عبورم را ریست کنم؟”). پاسخ به سوالات رایج را کش کنید و بدون تماس با مدل به آنها سرویس دهید. حتی نرخ برخورد کش متوسط بهطور معنیداری هزینه و تأخیر را کاهش میدهد.
همزمانی و فشار بازگشتی. ارائهدهندگان مدل محدودیت نرخ دارند. همزمانی خود را محدود کنید، از تلاشهای مجدد با تأخیر نمایی استفاده کنید، و با نرمی شکست بخورید (یک پاسخ صف شده «روی آن هستیم» بهتر از ارور 500 است).
flowchart LR
Q[User query] --> C{Cache hit?}
C -->|yes| R[Return cached answer]
C -->|no| Router{Complexity?}
Router -->|simple| SLM[Small model]
Router -->|complex| LLM[Large model]
SLM --> Out[Response]
LLM --> Out
Out --> Store[Cache + trace]
نمیتوانید چیزی را اداره کنید که نمیتوانید ببینید. همانطور که در درس ۱۰ پوشش داده شد، چارچوب عامل مایکروسافت به طور بومی ردگیریهای OpenTelemetry را صادر میکند — هر فراخوان مدل، فراخوان ابزار، و مرحله سازماندهی به یک span تبدیل میشود. در تولید این spans را به مایکروسافت فاندری (یا هر backend سازگار با OTel) صادر میکنید تا بتوانید:
from agent_framework.observability import get_tracer
tracer = get_tracer()
with tracer.start_as_current_span("support_request") as span:
span.set_attribute("customer.tier", "enterprise")
span.set_attribute("routed.model", "gpt-5-nano")
# agent execution is traced automatically inside this span
ویژگیهایی مانند customer.tier و routed.model چیزی هستند که یک دیوار ردگیریها را به سوالات قابل پاسخ تبدیل میکنند («آیا مشتریان سازمانی خیلی اغلب به مدل کوچک هدایت میشوند؟»).
هزینه در عوامل تولیدی تحت سلطه توکنها است. سه دسته دسته اهرم به ترتیب تأثیر:
۱. اندازه مناسب مدل. یک مدل کوچک که گیت ارزیابی شما را پاس کند تقریباً همیشه ارزانتر از یک مدل بزرگ است که همچنین پاس میکند. از ارزیابی برای اثبات کافی بودن مدل کوچک استفاده کنید، نه اینکه از روی احتیاط به بزرگترین مدل پیشفرض دهید. ۲. هدایت بر اساس پیچیدگی. همانطور که بالاتر گفتیم — فقط برای درخواستهایی که به استدلال مدل بزرگ نیاز دارند هزینه مدل بزرگ را بپردازید. ۳. کشینگ قوی. ارزانترین فراخوان مدل همان است که هرگز نمیزنید.
گیتهای ارزیابی و کنترل هزینه همان رشتهای هستند که از دو زاویه دیده میشوند: ارزیابی به شما کف کیفیت را میگوید، هدایت و کشینگ هزینه را به کف نزدیک نگه میدارند.
حاکمیت. عاملهای میزبانی شده از RBAC، امنیت محتوا، و ثبت حسابرسی فاندری ارث میبرند. به هر عامل یک هویت مدیریت شده با حداقل دسترسی که نیاز دارد بدهید — دسترسی فقط خواندنی به پایگاه دانش، دسترسی محدودهدار به API تیکتینگ، و بس.
انسان در حلقه. برخی اقدامات خیلی مهم هستند که به طور کامل خودکار نشوند — صدور بازپرداخت، حذف حساب، ارجاع به تیم حقوقی. چارچوب عامل مایکروسافت ابزارهای نیازمند تأیید را پشتیبانی میکند: عامل پیشنهاد عمل را میدهد، اجرا متوقف میشود، انسان تأیید یا رد میکند، و گردش کار ادامه مییابد. شما این ابزار ساده را در درس ۶ دیدهاید؛ اینجا آن را مستقر میکنید.
MCP در تولید. MCP به عامل شما اجازه میدهد ابزارهای خارجی را از طریق یک رابط استاندارد مصرف کند. در تولید، هر سرور MCP را به عنوان مرز غیرقابل اعتماد در نظر بگیرید: نسخه سرور را تعیین کنید، آن را با هویت محدودهدار اجرا کنید، خروجیهایش را اعتبارسنجی کنید، و هرگز اسرار را به آن ندهید. یک سرور MCP یک وابستگی است، و وابستگیها وصله، حسابرسی، و محدودیت نرخ میگیرند.
flowchart TB
subgraph Dev[Development Architecture]
D1[Notebook] --> D2[Agent Framework]
D2 --> D3[Model Provider]
D2 --> D4[Local tools]
end
subgraph Deploy[Deployment Architecture]
E1[CI pipeline] --> E2[Evaluation gate]
E2 -->|pass| E3[Foundry Agent Service]
E3 --> E4[Versioned hosted agent]
end
subgraph Run[Runtime Architecture]
F1[Client app] --> F2[Hosted agent]
F2 --> F3[Model Router]
F2 --> F4[Azure AI Search RAG]
F2 --> F5[Memory service]
F2 --> F6[MCP tools]
F2 --> F7[OTel -> Foundry tracing]
F2 --> F8[Human approval]
end
آن سه نمودار — توسعه، استقرار، زمان اجرا — همان عامل در سه مرحله زندگی است. آزمایشگاهی که در ادامه میآید، شما را در ساخت آن راهنمایی میکند.
code_samples/16-python-agent-framework.ipynb را باز کنید و کامل آن را پیش بروید. شما یک عامل پشتیبانی مشتری Contoso با همه ملاحظات تولیدی متصل شده جمعآوری خواهید کرد:
۱. فراخوانی ابزار — وضعیت سفارش و تیکتهای پشتیبانی باز را بررسی کنید. ۲. RAG — به سوالات سیاستی از پایگاه دانش پاسخ دهید (Azure AI Search، با جایگزین درونحافظه تا نوتبوک بدون منبع جستجو اجرا شود). ۳. حافظه — مشتری را در طول چرخشهای مکالمه به خاطر بسپارید. ۴. هدایت مدل — طبقهبندی پیچیدگی هر درخواست را به مدل کوچک یا بزرگ هدایت میکند. ۵. کشینگ پاسخ — سوالات تکراری از کش سرو میشوند. ۶. تأیید انسانی — بازپرداختها بالاتر از آستانه برای تأیید انسانی متوقف میشوند. ۷. خط لوله ارزیابی — یک مجموعه آزمایش کوچک آفلاین عامل را امتیاز میدهد و به عنوان دروازه انتشار عمل میکند. ۸. قابلیت مشاهده — ردگیری OpenTelemetry دور هر درخواست.
نوتبوک طوری سازماندهی شده که هر ملاحظه تولیدی یک بخش مستقل و قابل اجرا باشد. قلب آن، هندلر درخواست هدایت بعلاوه کش است:
async def handle_support_request(query: str, customer_id: str) -> str:
# 1. Serve from cache when we can.
cached = response_cache.get(normalize(query))
if cached:
return cached
# 2. Route by complexity to control cost.
model = "gpt-5-nano" if is_simple(query) else "gpt-5-mini"
# 3. Run the agent inside a trace span for observability.
with tracer.start_as_current_span("support_request") as span:
span.set_attribute("routed.model", model)
span.set_attribute("customer.id", customer_id)
response = await support_agent.run(query, model=model)
# 4. Cache and return.
response_cache.set(normalize(query), response.text)
return response.text
دروازه ارزیابی که از انتشار محافظت میکند اینگونه به نظر میرسد:
async def evaluation_gate(agent, test_cases, threshold: float = 0.8) -> bool:
passed = 0
for case in test_cases:
result = await agent.run(case["input"])
if score_response(result.text, case["expected"]) >= 0.8:
passed += 1
pass_rate = passed / len(test_cases)
print(f"Evaluation pass rate: {pass_rate:.0%} (gate: {threshold:.0%})")
return pass_rate >= threshold # only deploy if the gate passes
هر خط را بخوانید — نوتبوک primitves را عمداً کوچک نگه داشته تا چیزی پشت فراخوان چارچوب مخفی نباشد.
دروازه ارزیابی بالا به صورت آفلاین روی شیء عامل شما اجرا میشود. وقتی عامل به عنوان یک عامل میزبانی شده مستقر میشود، یک بررسی ارزانتر دیگر نیاز دارید: آیا نقطه پایانی مستقر شده در واقع پاسخ میدهد؟
استقرار «موفقیتآمیز» فقط نشان میدهد کنترل پلین تعریف را پذیرفته است — این ثابت نمیکند که عامل پاسخگو است. یک وابستگی گمشده، هدایت بد مدل، یا اتصال منقضی میتواند باعث استقرار سبز بدون هیچ پاسخی شود. یک تست دود این موضوع را در چند ثانیه، در هر استقرار، بدون هزینه کامل ارزیابی پیدا میکند.
این مخزن خط لوله تست دود آماده استفاده را بر پایه عمل GitHub آزمون دود AI ارائه میدهد:
tests/lesson-16-smoke-tests.json شامل پرامپتها و اظهارات برای عامل پشتیبانی Contoso (پاسخهای سیاستی با منبع، جستجوی سفارش، ماندن در موضوع و تداوم رشته چندمرحلهای). کتالوگهای عوامل دیگر درسها در کنار آن هستند — ببینید tests/README.md..github/workflows/smoke-test.yml با Azure OIDC لاگین میکند و هر پرامپت را به نقطه پایانی پاسخهای عامل POST میکند، عملیات را در صورت هر اظهار خطا رد میکند.- name: Smoke-test hosted agent
uses: JFolberth/ai-smoketest@v1
with:
project_endpoint: $
agent_name: ContosoSupportAgent
tests_file: tests/lesson-16-smoke-tests.json
آن را از برگه Actions اجرا کنید پس از استقرار عامل خود، نقطه انتهایی پروژه Foundry و نام عامل خود را وارد نمایید. هویت فدرالشده نیاز به نقش Azure AI User در حوزه پروژه Foundry دارد. لایهها را مانند یک هرم در نظر بگیرید: تستهای دود (قابل دسترسی و پاسخگو بودن؟) در هر استقرار اجرا میشوند، ارزیابی آفلاین (برای عرضه کافی است؟) قبل از ارتقاء اجرا میشود، و ارزیابی آنلاین (عملکرد در شرایط واقعی چگونه است؟) به طور مداوم اجرا میشود.
قبل از رفتن به تمرین، درک خود را آزمایش کنید.
1. تقریباً چقدر از یک عامل تولیدی “مدل” است و بقیه چیست؟
2. چه زمانی یک Hosted Agent را به جای عامل میزبانیشده توسط مشتری انتخاب میکنید؟
3. چرا یک عامل مقیاسپذیر باید بدون حالت در حافظه فرایند خود باشد؟
4. مدل مسیریابی چه مشکلی را حل میکند و چگونه به ارزیابی مرتبط است؟
5. «دروازه ارزیابی» چیست و در چرخه زندگی کجا قرار دارد؟
6. چرا باید سرور MCP در تولید به عنوان یک مرز غیرقابل اعتماد محسوب شود؟
7. کدام تغییر معمولاً بیشترین تأثیر را بر هزینه عامل تولید دارد و چرا؟
۸. ویژگیهای اسپن مانند customer.tier و routed.model چه نقشی در قابلیت مشاهده دارند؟
عامل پشتیبانی مشتری از آزمایشگاه را بردارید و آن را به صورت سخت برای یک سناریوی خاص آماده کنید: عامل پشتیبانی صورتحساب اشتراک برای یک شرکت SaaS.
ارسال شما باید شامل موارد زیر باشد:
۱. ابزارها را جایگزین کنید با ابزارهای مرتبط با صورتحساب: get_subscription_status، get_invoice، و issue_credit (اعتبارهای بالای ۵۰ دلار نیازمند تأیید انسانی است).
۲. سه سند RAG اضافه کنید که شامل سیاست بازپرداخت شرکت، دوره صورتحساب و سیاست لغو است.
۳. مجموعه ارزیابی را به حداقل هشت مورد گسترش دهید که حداقل دو مورد باید مسیر تأیید انسانی را فعال کند، و تأیید کنید دروازه ارزیابی شما به درستی عبور یا رد میکند.
۴. یک گزارش هزینه اضافه کنید: پس از اجرای ده پرسش ترکیبی از طریق عامل، تعداد مواردی که به مدل کوچک ارسال شده، مدل بزرگ و موارد سرو شده از کش را چاپ کنید.
یک پاراگراف کوتاه (در یک سلول مارکداون) بنویسید که توضیح میدهد کدام قانون مسیریابی مدل را انتخاب کردهاید و چگونه آن را با ترافیک واقعی اعتبارسنجی میکنید. پاسخ واحد صحیحی وجود ندارد — ارزیابی شما بر اساس این است که آیا نگرانیهای تولید به هم پیوسته و منسجم هستند یا خیر.
در این درس، شما یک عامل را از نمونه اولیه به تولید با Microsoft Foundry منتقل کردید:
درس بعدی مسیر مخالف را طی میکند: به جای مقیاس دادن عوامل در ابر، آنها را به پایین روی یک ماشین توسعهدهنده میآورید و کاملاً به صورت محلی اجرا میکنید.
ساخت عوامل استفاده از کامپیوتر (CUA)
سلب مسئولیت: این سند با استفاده از سرویس ترجمه هوش مصنوعی Co-op Translator ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیهایی باشند. سند اصلی به زبان مادری خود باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفهای انسانی توصیه میشود. ما در قبال هرگونه سوء تفاهم یا برداشت نادرست ناشی از استفاده از این ترجمه مسئولیتی نداریم.