השיעור הזה יעסוק ב:
לאחר סיום השיעור, תדעו כיצד:
דוגמאות קוד עבור Microsoft Agent Framework (MAF) ניתן למצוא במאגר זה תחת הקבצים xx-python-agent-framework
ו-xx-dotnet-agent-framework
.
Microsoft Agent Framework (MAF) מבוסס על הניסיון והלמידות מ-Semantic Kernel ו-AutoGen. הוא מציע גמישות להתמודדות עם מגוון רחב של מקרי שימוש סוכניים בסביבות ייצור ומחקר, כולל:
כדי לספק סוכנים מבוססי AI בייצור, MAF כולל גם תכונות עבור:
Microsoft Agent Framework מתמקד גם ביכולת פעולה הדדית על ידי:
בואו נבחן כיצד תכונות אלו מיושמות על כמה מהמושגים המרכזיים של Microsoft Agent Framework.
יצירת סוכנים
יצירת סוכן מתבצעת על ידי הגדרת שירות ההסקה (ספק LLM), סט הוראות שהסוכן צריך לעקוב אחריהן, ושם מוקצה:
agent = AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent( instructions="You are good at recommending trips to customers based on their preferences.", name="TripRecommender" )
הדוגמה לעיל משתמשת ב-Azure OpenAI
, אך ניתן ליצור סוכנים באמצעות מגוון שירותים, כולל Azure AI Foundry Agent Service
:
AzureAIAgentClient(async_credential=credential).create_agent( name="HelperAgent", instructions="You are a helpful assistant." ) as agent
OpenAI Responses
, ChatCompletion
APIs
agent = OpenAIResponsesClient().create_agent( name="WeatherBot", instructions="You are a helpful weather assistant.", )
agent = OpenAIChatClient().create_agent( name="HelpfulAssistant", instructions="You are a helpful assistant.", )
או סוכנים מרוחקים באמצעות פרוטוקול A2A:
agent = A2AAgent( name=agent_card.name, description=agent_card.description, agent_card=agent_card, url="https://your-a2a-agent-host" )
הפעלת סוכנים
סוכנים מופעלים באמצעות השיטות .run
או .run_stream
עבור תגובות לא-זורמות או זורמות.
result = await agent.run("What are good places to visit in Amsterdam?")
print(result.text)
async for update in agent.run_stream("What are the good places to visit in Amsterdam?"):
if update.text:
print(update.text, end="", flush=True)
כל הפעלת סוכן יכולה לכלול אפשרויות להתאמת פרמטרים כמו max_tokens
שהסוכן משתמש בהם, tools
שהסוכן יכול לקרוא להם, ואפילו המודל עצמו שהסוכן משתמש בו.
זה שימושי במקרים בהם נדרשים מודלים או כלים ספציפיים להשלמת משימת המשתמש.
כלים
ניתן להגדיר כלים גם בעת הגדרת הסוכן:
def get_attractions( location: Annotated[str, Field(description="The location to get the top tourist attractions for")], ) -> str: """Get the top tourist attractions for a given location.""" return f"The top attractions for {location} are."
# When creating a ChatAgent directly
agent = ChatAgent( chat_client=OpenAIChatClient(), instructions="You are a helpful assistant", tools=[get_attractions]
וגם בעת הפעלת הסוכן:
result1 = await agent.run( "What's the best place to visit in Seattle?", tools=[get_attractions] # Tool provided for this run only )
תהליכי סוכן
תהליכי סוכן משמשים לניהול שיחות מרובות פניות. ניתן ליצור תהליכים על ידי:
get_new_thread()
שמאפשר לשמור את התהליך לאורך זמן.כדי ליצור תהליך, הקוד נראה כך:
# Create a new thread.
thread = agent.get_new_thread() # Run the agent with the thread.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)
ניתן לאחר מכן לסדר את התהליך כדי לשמור אותו לשימוש עתידי:
# Create a new thread.
thread = agent.get_new_thread()
# Run the agent with the thread.
response = await agent.run("Hello, how are you?", thread=thread)
# Serialize the thread for storage.
serialized_thread = await thread.serialize()
# Deserialize the thread state after loading from storage.
resumed_thread = await agent.deserialize_thread(serialized_thread)
Middleware של סוכן
סוכנים מתקשרים עם כלים ו-LLMs כדי להשלים משימות של משתמשים. בתרחישים מסוימים, אנו רוצים לבצע או לעקוב בין האינטראקציות הללו. Middleware של סוכן מאפשר לנו לעשות זאת באמצעות:
Middleware פונקציונלי
Middleware זה מאפשר לנו לבצע פעולה בין הסוכן לבין פונקציה/כלי שהוא יקרא להם. דוגמה לשימוש בזה היא כאשר רוצים לבצע רישום של קריאת הפונקציה.
בקוד למטה next
מגדיר אם יש לקרוא ל-Middleware הבא או לפונקציה עצמה.
async def logging_function_middleware(
context: FunctionInvocationContext,
next: Callable[[FunctionInvocationContext], Awaitable[None]],
) -> None:
"""Function middleware that logs function execution."""
# Pre-processing: Log before function execution
print(f"[Function] Calling {context.function.name}")
# Continue to next middleware or function execution
await next(context)
# Post-processing: Log after function execution
print(f"[Function] {context.function.name} completed")
Middleware שיחה
Middleware זה מאפשר לנו לבצע או לרשום פעולה בין הסוכן לבין הבקשות בין ה-LLM.
זה מכיל מידע חשוב כמו messages
שנשלחים לשירות ה-AI.
async def logging_chat_middleware(
context: ChatContext,
next: Callable[[ChatContext], Awaitable[None]],
) -> None:
"""Chat middleware that logs AI interactions."""
# Pre-processing: Log before AI call
print(f"[Chat] Sending {len(context.messages)} messages to AI")
# Continue to next middleware or AI service
await next(context)
# Post-processing: Log after AI response
print("[Chat] AI response received")
זיכרון סוכן
כפי שנלמד בשיעור Agentic Memory
, זיכרון הוא אלמנט חשוב שמאפשר לסוכן לפעול על פני הקשרים שונים. MAF מציע כמה סוגי זיכרונות:
אחסון בזיכרון
זהו הזיכרון המאוחסן בתהליכים במהלך זמן הריצה של האפליקציה.
# Create a new thread.
thread = agent.get_new_thread() # Run the agent with the thread.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)
הודעות מתמשכות
זיכרון זה משמש כאשר שומרים היסטוריית שיחות בין מפגשים שונים. הוא מוגדר באמצעות chat_message_store_factory
:
from agent_framework import ChatMessageStore
# Create a custom message store
def create_message_store():
return ChatMessageStore()
agent = ChatAgent(
chat_client=OpenAIChatClient(),
instructions="You are a Travel assistant.",
chat_message_store_factory=create_message_store
)
זיכרון דינמי
זיכרון זה נוסף להקשר לפני הפעלת סוכנים. זיכרונות אלו יכולים להישמר בשירותים חיצוניים כמו mem0:
from agent_framework.mem0 import Mem0Provider
# Using Mem0 for advanced memory capabilities
memory_provider = Mem0Provider(
api_key="your-mem0-api-key",
user_id="user_123",
application_id="my_app"
)
agent = ChatAgent(
chat_client=OpenAIChatClient(),
instructions="You are a helpful assistant with memory.",
context_providers=memory_provider
)
תצפיות סוכן
תצפיות חשובות לבניית מערכות סוכנים אמינות וניתנות לתחזוקה. MAF משתלב עם OpenTelemetry כדי לספק מעקב ומדדים לתצפיות טובות יותר.
from agent_framework.observability import get_tracer, get_meter
tracer = get_tracer()
meter = get_meter()
with tracer.start_as_current_span("my_custom_span"):
# do something
pass
counter = meter.create_counter("my_custom_counter")
counter.add(1, {"key": "value"})
MAF מציע תהליכי עבודה שהם שלבים מוגדרים מראש להשלמת משימה וכוללים סוכני AI כמרכיבים בשלבים אלו.
תהליכי עבודה מורכבים ממרכיבים שונים שמאפשרים שליטה טובה יותר בזרימת העבודה. תהליכי עבודה גם מאפשרים תזמור רב-סוכני ו-שמירת נקודות ציון כדי לשמור את מצב תהליך העבודה.
המרכיבים המרכזיים של תהליך עבודה הם:
מבצעים
מבצעים מקבלים הודעות קלט, מבצעים את המשימות שהוקצו להם, ואז מפיקים הודעת פלט. זה מקדם את תהליך העבודה לקראת השלמת המשימה הגדולה יותר. מבצעים יכולים להיות סוכני AI או לוגיקה מותאמת אישית.
קצוות
קצוות משמשים להגדרת זרימת ההודעות בתהליך עבודה. אלו יכולים להיות:
קצוות ישירים - חיבורים פשוטים אחד-לאחד בין מבצעים:
from agent_framework import WorkflowBuilder
builder = WorkflowBuilder()
builder.add_edge(source_executor, target_executor)
builder.set_start_executor(source_executor)
workflow = builder.build()
קצוות מותנים - מופעלים לאחר שמתקיים תנאי מסוים. לדוגמה, כאשר חדרי מלון אינם זמינים, מבצע יכול להציע אפשרויות אחרות.
קצוות Switch-case - מנתבים הודעות למבצעים שונים בהתבסס על תנאים מוגדרים. לדוגמה, אם ללקוח נסיעות יש גישה עדיפות, המשימות שלו יטופלו דרך תהליך עבודה אחר.
קצוות Fan-out - שולחים הודעה אחת למספר יעדים.
קצוות Fan-in - אוספים מספר הודעות ממבצעים שונים ושולחים ליעד אחד.
אירועים
כדי לספק תצפיות טובות יותר בתהליכי עבודה, MAF מציע אירועים מובנים לביצוע כולל:
WorkflowStartedEvent
- תחילת ביצוע תהליך העבודהWorkflowOutputEvent
- תהליך העבודה מפיק פלטWorkflowErrorEvent
- תהליך העבודה נתקל בשגיאהExecutorInvokeEvent
- מבצע מתחיל לעבדExecutorCompleteEvent
- מבצע מסיים לעבדRequestInfoEvent
- בקשה מונפקתיצירת סוכן פשוטה
Semantic Kernel מסתמך על יצירת מופע Kernel עבור כל סוכן. MAF משתמש בגישה פשוטה יותר באמצעות הרחבות עבור הספקים המרכזיים.
agent = AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent( instructions="You are good at reccomending trips to customers based on their preferences.", name="TripRecommender" )
יצירת תהליכי סוכן
Semantic Kernel דורש יצירת תהליכים באופן ידני. ב-MAF, הסוכן מוקצה ישירות לתהליך.
thread = agent.get_new_thread() # Run the agent with the thread.
רישום כלים
ב-Semantic Kernel, כלים נרשמים ל-Kernel וה-Kernel מועבר לסוכן. ב-MAF, כלים נרשמים ישירות במהלך תהליך יצירת הסוכן.
agent = ChatAgent( chat_client=OpenAIChatClient(), instructions="You are a helpful assistant", tools=[get_attractions]
צוותים לעומת תהליכי עבודה
Teams
הם מבנה האירועים לפעילות מונעת אירועים עם סוכנים ב-AutoGen. MAF משתמש ב-Workflows
שמנתבים נתונים למבצעים דרך ארכיטקטורה מבוססת גרף.
יצירת כלים
AutoGen משתמש ב-FunctionTool
לעטוף פונקציות שסוכנים יכולים לקרוא להן. MAF משתמש ב-@ai_function שפועל באופן דומה אך גם מסיק את הסכמות באופן אוטומטי עבור כל פונקציה.
התנהגות סוכן
סוכנים הם סוכנים של פנייה אחת כברירת מחדל ב-AutoGen אלא אם כן max_tool_iterations
מוגדר לערך גבוה יותר. ב-MAF, ה-ChatAgent
הוא רב-פניות כברירת מחדל, כלומר הוא ימשיך לקרוא לכלים עד שמשימת המשתמש תושלם.
דוגמאות קוד עבור Microsoft Agent Framework ניתן למצוא במאגר זה תחת הקבצים xx-python-agent-framework
ו-xx-dotnet-agent-framework
.
הצטרפו ל-Azure AI Foundry Discord כדי לפגוש לומדים אחרים, להשתתף בשעות קבלה ולקבל תשובות לשאלות שלכם על סוכני AI.
כתב ויתור:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית Co-op Translator. למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.