![]()
עד לנקודה זו בקורס בנית סוכנים שרצים על הלפטופ שלך, בתוך מחברת, מונעים על ידי az login וכמה משתני סביבה. זו בדיוק הדרך הנכונה ללמוד. זו לא הדרך הנכונה להריץ סוכן שעליו תלויים אלפי לקוחות בשעה שלוש לפנות בוקר.
השיעור הזה עוסק בהבדל בין “זה עובד על המחשב שלי” לבין “זה עובד, באמינות ובעלות סבירה, בייצור.” אנו סוגרים את הפער הזה באמצעות Microsoft Foundry ו-Microsoft Foundry Agent Service, ועושים זאת על ידי בניית סוכן תמיכה ללקוחות אמיתי שיש לו כלים, שליפה, זיכרון, הערכה ומעקב.
שיעור זה יכלול:
בסיום שיעור זה, תדעו כיצד:
שיעור זה מניח שסיימתם את השיעורים הקודמים ואתם בנוח עם:
תזדקקו גם ל:
az login).requirements.txt.סוכן אב-טיפוס וסוכן ייצור חולקים את הלולאה הליבה — ניתוח, קריאת כלים, תגובה. מה שמשתנה זה כל מה שמסביב ללולאה הזאת. המודל הוא אולי 20% מסוכן ייצור; 80% הנותרים הם השלד התפעולי.
| דאגה | אב-טיפוס | ייצור |
|---|---|---|
| אירוח | רץ במחברת שלך | רץ כשירות אירוח, בגרסאות ומופץ |
| זהות | הטוקן שלך של az login |
זהות מנוהלת עם RBAC ממוקד |
| מצב | בזיכרון, נאבד באתחול | מופרד (מחסן נושאים, שירות זיכרון) |
| כישלון | אתה רואה את מעקב השגיאות | ניסיונות חוזרים, גיבויים, מכתבים מתים, התראות |
| עלות | “זה כמה סנטים” | מעקב לפי בקשה, ניתוב, מטמון, תקציב |
| איכות | אתה בודק בעין את הפלט | מוערך אוטומטית לפני כל פרסום |
| אמינות | אתה מאשר כל פעולה | מדיניות + אדם בלולאה לפעולות בסיכון |
זכרו את הטבלה הזו. כל קטע למטה מתאים לאחת מהשורות האלה.
ישנם שלושה דפוסים שתשתמשו בהם, לעיתים בשילוב.
האובייקט של הסוכן חי בתוך תהליך היישום שלך. הקוד שלך קורא לספק המודל ישירות; לולאת הניתוח רצה בשירות שלך. זה מה שכל שיעור קודם עשה.
הסוכן נרשם כמשאב ב-Microsoft Foundry. Foundry מארח את לולאת הניתוח, שומר נושאים, אוכף בטיחות תוכן ו-RBAC, ועושה את הסוכן גלוי בפורטל Foundry. האפליקציה שלך הופכת ללקוח דק שיוצר נושאים וקורא תגובות.
סוכנים וכלים רבים מורכבים לגרף עם זרימת בקרה מפורשת — שלבים רצופים, הסתעפויות, נקודות אישור אנושיות, ונקודות בדיקה עמידות שיכולות להפסיק ולהמשיך. זוהי יכולת זרימות עבודה במסגרת Microsoft Agent Framework המיושמת בקנה מידה של פריסה.
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]
הרעיון המרכזי, שנלקח מ-שיעור 10: הערכה לא מקוונת היא שער, לא מחשבה אחרי. גרסה חדשה של סוכן לא יוצרת אלא אם כן היא עוברת את ספי ההערכה שלך. תצפית מקוונת מזינה כישלונות מהעולם האמיתי חזרה לערכות מבחן לא מקוונות. זו כל הלולאה.
סקיילינג של סוכן שונה מסקיילינג של API וובי ללא מצב, כי כל בקשה יכולה להפעיל מספר קריאות למודל וכלים יקרים. ארבע טכניקות נושאות את רוב העומס.
טיפול בבקשה ללא מצב. אל תשמרו מצב לכל משתמש בזיכרון התהליך שלכם. אחסנו את נושאי השיחה במחסן הנושאים Foundry או בשירות זיכרון כך שכל מופע יוכל לטפל בכל בקשה. זה מה שמאפשר לכם סקיילינג אופקי — הוספת מופעים, ללא מושבים דביקים.
ניתוב מודלים. לא כל בקשה זקוקה למודל היעיל (והיקר) ביותר שלכם. ניתבו בקשות פשוטות — סיווג כוונות, תשובות קצרות עובדתיות — למודל קטן ומהיר, ושמרו את המודל הגדול לניתוח אמיתי. Foundry’s Model Router יכול לעשות זאת עבורכם, או שתוכלו ליישם מסווג קל משקל בעצמכם. תבנו את הגרסה ה-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]
אי אפשר להפעיל מה שלא רואים. כפי שנלמד בשיעור 10, Microsoft Agent Framework משדר עקבות OpenTelemetry באופן טבעי — כל קריאה למודל, הפעלת כלי, ושלב תזמור הופכים לרווח. בייצור אתם מייצאים את הרווחים הללו ל-Microsoft Foundry (או לכל 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, בטיחות תוכן, ורישום ביקורת של Foundry. תן לכל סוכן זהות מנוהלת עם ההרשאה המינימלית הנדרשת — גישה רק לקריאה לבסיס הידע, גישה ממוקדת ל-API של טיקטים, ולא יותר.
אדם בלולאה. פעולות מסוימות חשובות מדי לאוטומציה מוחלטת — החזרת תשלום, מחיקת חשבון, העלאה לצוות משפטי. Microsoft Agent Framework תומך בכלים שדורשים אישור: הסוכן מציע את הפעולה, ההרצה נעצרת, אדם מאשר או דוחה, וזרימת העבודה ממשיכה. ראיתם את הפרימיטיב ב-שיעור 6; כאן אתם מפרסים אותו.
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 עם כל דאגה של ייצור מטובלת:
המחברת מאורגנת כך שכל דאגת ייצור היא חלק עצמאי ופועל. הלב שלה הוא מנגנון מטפל בבקשות של ניתוב ושל מטמון:
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
קרא כל שורה — המחברת משאירה את היסודות קטנים בכוונה כך ששום דבר לא מוסתר מאחורי קריאת מסגרת.
שער ההערכה שלמעלה רץ לא מקוון כנגד אובייקט הסוכן שלך. כשהסוכן מפורסם כסוכן אחסון, אתה צריך בדיקה נוספת, אפילו זולה יותר: האם נקודת הקצה המפורסמת באמת עונה?
פריסת “הצלחה” מוכיחה רק שמסלול הבקרה קיבל את ההגדרה — זה לא מוכיח שהסוכן מגיב. תלות חסרה, ניתוב מודל שגוי, או חיבור שפג תוקף יכולים להשאיר פריסה ירוקה שלא מחזירה כלום. בדיקת עשן תופסת את זה בשניות, בכל פריסה, בלי עלות מלאה של הערכה.
מאגר זה כולל צינור בדיקות עשן מוכן לשימוש המבוסס על AI Smoke Test GitHub Action:
tests/lesson-16-smoke-tests.json מכיל הנחיות ואישורים לסוכן תמיכה Contoso (תשובות מדיניות מבוססות, בדיקת הזמנה, שמירה על נושא, ורצף דיון רב-סבבי). קטלוגים לסוכנים של שיעורים אחרים נמצאים לצידו — ראה tests/README.md..github/workflows/smoke-test.yml נכנס עם Azure OIDC ושולח בכל פעם פקודה לנקודת הקצה Responses של הסוכן, ומבצעת כישלון במשימה על כל טעות אישור.- 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. איזו שינוי בודד בדרך כלל משפיע הכי הרבה על עלות סוכן בפרודקשן, ומדוע?
8. איזו תפקיד ממלאים מאפייני span כמו customer.tier ו-routed.model בתצפית?
קחו את סוכן התמיכה בלקוחות מהמעבדה והקשו אותו לתרחיש ספציפי: סוכן תמיכה בחיובי מנוי לחברת SaaS.
ההגשה שלכם צריכה:
get_subscription_status, get_invoice, ו-issue_credit (אשראי מעל 50$ דורש אישור אנושי).כתבו פסקה קצרה (בתא markdown) המסבירה איזו כלל ניתוב מודלים בחרתם וכיצד תאמתם אותו עם תעבורה אמיתית. אין תשובה נכונה יחידה — אתם מוערכים על האם דאגות הפרודקשן מחוברות באופן קוהרנטי.
בשיעור זה העברתם סוכן מפרוטוטייפ לפרודקשן עם Microsoft Foundry:
השיעור הבא מבצע את המסע ההפוך: במקום להתרחב לענן, תורידו אותם למטה למחשב מפתח יחיד ותפעילו אותם באופן מקומי לגמרי.
כתב ויתור: מסמך זה תורגם באמצעות שירות תרגום אוטומטי Co-op Translator. למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה.