(לחץ על התמונה למעלה לצפייה בסרטון של השיעור)
כלים מעניינים כי הם מאפשרים לסוכני AI להחזיק במגוון רחב יותר של יכולות. במקום שלסוכן יש סט מוגבל של פעולות שהוא יכול לבצע, על ידי הוספת כלי, הסוכן יכול עכשיו לבצע מגוון רחב של פעולות. בפרק זה נבחן את תבנית העיצוב שימוש בכלים, שמתארת כיצד סוכני AI יכולים להשתמש בכלים מסוימים כדי להשיג את מטרותיהם.
בשיעור זה אנו רוצים לענות על השאלות הבאות:
לאחר השלמת שיעור זה, תוכל:
תבנית העיצוב שימוש בכלי מתמקדת במתן יכולת למודלים גדולים של שפה (LLMs) לקיים אינטראקציה עם כלים חיצוניים כדי להשיג מטרות ספציפיות. כלים הם קוד שניתן להפעיל על-ידי סוכן לביצוע פעולות. כלי יכול להיות פונקציה פשוטה כמו מחשבון, או קריאת API לשירות צד שלישי כמו חיפוש מחירי מניות או תחזית מזג אוויר. בהקשר של סוכני AI, הכלים מיועדים להתבצע על ידי סוכנים בתגובה לקריאות פונקציה שנוצרו על ידי המודל.
סוכני AI יכולים לנצל כלים כדי להשלים משימות מורכבות, לשלוף מידע, או לקבל החלטות. תבנית העיצוב שימוש בכלים משמשת לעיתים קרובות בסצenarיות הדורשים אינטראקציה דינמית עם מערכות חיצוניות, כגון בסיסי נתונים, שירותי רשת, או מפרשים של קוד. יכולת זו שימושית למספר מקרים שונים הכוללים:
גושי הבנייה הללו מאפשרים לסוכן AI לבצע מגוון רחב של משימות. נבחן את האלמנטים המרכזיים הנדרשים ליישום תבנית העיצוב שימוש בכלים:
סכמות פונקציות/כלים: הגדרות מפורטות של הכלים הזמינים, כולל שם הפונקציה, המטרה, הפרמטרים הנדרשים, והפלט הצפוי. סכמות אלו מאפשרות ל-LLM להבין אילו כלים זמינים וכיצד לבנות בקשות תקפות.
לוגיקת הפעלת פונקציות: קובעת מתי ואיך הכלים מופעלים בהתאם לכוונת המשתמש והקשר השיחה. זה יכול לכלול מודולים לתכנון, מכניזמים להפניית בקשות, או זרמים מותנים שקובעים את השימוש בכלים בדינמיות.
מערכת ניהול הודעות: רכיבים שמנהלים את זרימת השיחה בין כניסות המשתמש, תגובות ה-LLM, קריאות הכלים ותוצאותיהם.
מסגרת אינטגרציה של כלים: תשתית שמחברת את הסוכן לכלים שונים, בין אם פונקציות פשוטות או שירותים חיצוניים מורכבים.
ניהול שגיאות ואימות: מנגנונים לטיפול בכישלונות בהפעלת כלים, אימות פרמטרים, וניהול תגובות לא צפויות.
ניהול מצב: עוקב אחרי הקשר השיחה, אינטראקציות קודמות עם כלים ונתונים מתמשכים כדי להבטיח עקביות לאורך אינטראקציות מרובות.
בהמשך נבחן את קריאת פונקציות/כלים בפירוט רב יותר.
קריאת פונקציות היא הדרך העיקרית שמאפשרת למודלים גדולים של שפה (LLMs) לקיים אינטראקציה עם כלים. ברוב המקרים תראה את המונחים ‘פונקציה’ ו’כלי’ משמשים לסירוגין כי ‘פונקציות’ (גושי קוד חוזר) הן ה’כלים’ שסוכנים משתמשים בהם לביצוע משימות. כדי שקוד של פונקציה יופעל, על ה-LLM להשוות בין בקשת המשתמש לתיאור הפונקציות. לשם כך נשלחת ל-LLM סכימה שמכילה את התיאורים של כל הפונקציות הזמינות. ה-LLM מחליף את הפונקציה המתאימה ביותר למשימה ומחזיר את שמה ואת הפרמטרים שלה. הפונקציה שנבחרה מופעלת, תגובתה נשלחת חזרה ל-LLM, שמשתמש במידע כדי להגיב לבקשת המשתמש.
כדי שמפתחים יוכלו ליישם קריאת פונקציות לסוכנים, יידרשו:
נשתמש בדוגמא של קבלת השעה הנוכחית בעיר כדי להמחיש:
אתחול LLM שתומך בקריאת פונקציות:
לא כל הדגמים תומכים בקריאת פונקציות, לכן חשוב לבדוק שה-LLM שבו משתמשים אכן תומך. Azure OpenAI תומך בקריאת פונקציות. אפשר להתחיל ביצירת לקוח Azure OpenAI.
# אתחול לקוח Azure OpenAI
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_AI_PROJECT_ENDPOINT"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-05-01-preview"
)
יצירת סכימת פונקציה:
לאחר מכן נגדיר סכימת JSON שכוללת את שם הפונקציה, תיאור מה הפונקציה עושה, ושמות ותיאורים של פרמטרי הפונקציה. נשלח את הסכימה ללקוח שנוצר קודם, יחד עם בקשת המשתמש למצוא את השעה בסן פרנסיסקו. חשוב לציין שקריאת כלי היא מה שמוחזר, ולא התשובה הסופית לשאלה. כפי שצויין קודם, ה-LLM מחזיר את שם הפונקציה שנבחרה למשימה והארגומנטים שיועברו אליה.
# תיאור הפונקציה לקריאת המודל
tools = [
{
"type": "function",
"function": {
"name": "get_current_time",
"description": "Get the current time in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city name, e.g. San Francisco",
},
},
"required": ["location"],
},
}
}
]
# הודעת משתמש ראשונית
messages = [{"role": "user", "content": "What's the current time in San Francisco"}]
# קריאת API ראשונה: לבקש מהמודל להשתמש בפונקציה
response = client.chat.completions.create(
model=deployment_name,
messages=messages,
tools=tools,
tool_choice="auto",
)
# עיבוד התגובה של המודל
response_message = response.choices[0].message
messages.append(response_message)
print("Model's response:")
print(response_message)
Model's response:
ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_pOsKdUlqvdyttYB67MOj434b', function=Function(arguments='{"location":"San Francisco"}', name='get_current_time'), type='function')])
קוד הפונקציה הדרוש להשלמת המשימה:
כעת כאשר ה-LLM בחר איזו פונקציה להריץ, יש ליישם ולהריץ את הקוד שמבצע את המשימה. ניישם את הקוד לקבלת השעה הנוכחית בפייתון. נצטרך גם לכתוב קוד להוצאת השם והארגומנטים מתוך response_message כדי לקבל את התוצאה הסופית.
def get_current_time(location):
"""Get the current time for a given location"""
print(f"get_current_time called with location: {location}")
location_lower = location.lower()
for key, timezone in TIMEZONE_DATA.items():
if key in location_lower:
print(f"Timezone found for {key}")
current_time = datetime.now(ZoneInfo(timezone)).strftime("%I:%M %p")
return json.dumps({
"location": location,
"current_time": current_time
})
print(f"No timezone data found for {location_lower}")
return json.dumps({"location": location, "current_time": "unknown"})
# טיפול בקריאות פונקציה
if response_message.tool_calls:
for tool_call in response_message.tool_calls:
if tool_call.function.name == "get_current_time":
function_args = json.loads(tool_call.function.arguments)
time_response = get_current_time(
location=function_args.get("location")
)
messages.append({
"tool_call_id": tool_call.id,
"role": "tool",
"name": "get_current_time",
"content": time_response,
})
else:
print("No tool calls were made by the model.")
# קריאת API שנייה: קבלת התגובה הסופית מהמודל
final_response = client.chat.completions.create(
model=deployment_name,
messages=messages,
)
return final_response.choices[0].message.content
get_current_time called with location: San Francisco
Timezone found for san francisco
The current time in San Francisco is 09:24 AM.
קריאת פונקציות היא ליבת רוב, אם לא כל, תבניות העיצוב של שימוש בכלים לסוכנים, אולם יישום שלה מאפס יכול לעיתים להיות מאתגר. כפי שלמדנו ב-שיעור 2, מסגרות סוכנים נותנות לנו גושי בניה מוכנים מראש ליישום שימוש בכלים.
להלן כמה דוגמאות איך ניתן ליישם את תבנית העיצוב שימוש בכלים באמצעות מסגרות סוכנים שונות:
Microsoft Agent Framework היא מסגרת AI בקוד פתוח לבניית סוכני AI. היא מפשטת את התהליך של קריאת פונקציות על-ידי מתן אפשרות להגדיר כלים כפונקציות Python עם הדקורטור @tool. המסגרת מטפלת בתקשורת הלוך ושוב בין המודל והקוד שלך. היא גם מספקת גישה לכלים מוכנים מראש כגון חיפוש קבצים ומפרש קוד באמצעות AzureAIProjectAgentProvider.
הדיאגרמה הבאה ממחישה את תהליך קריאת הפונקציות במסגרת הסוכנים של מיקרוסופט:

במסגרת הסוכנים של מיקרוסופט, כלים מוגדרים כפונקציות עם הדקורטור. ניתן להפוך את פונקציית get_current_time שראינו קודם לכלי על-ידי שימוש בדקורטור @tool. המסגרת תסדר באופן אוטומטי את הפונקציה ופרמטריה, ותיצור את הסכימה לשליחה ל-LLM.
from agent_framework import tool
from agent_framework.azure import AzureAIProjectAgentProvider
from azure.identity import AzureCliCredential
@tool
def get_current_time(location: str) -> str:
"""Get the current time for a given location"""
...
# צור את הלקוח
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())
# צור סוכן והרץ עם הכלי
agent = await provider.create_agent(name="TimeAgent", instructions="Use available tools to answer questions.", tools=get_current_time)
response = await agent.run("What time is it?")
Azure AI Agent Service היא מסגרת סוכנים חדשה שנועדה להעצים מפתחים לבנות, לפרוס ולשדרג בקלות סוכני AI איכותיים, גמישים ובטוחים מבלי הצורך לנהל משאבי מחשוב ואחסון בתשתית. היא שימושית במיוחד לאפליקציות ארגוניות מאחר והיא שירות מנוהל במלואו עם אבטחה ברמה ארגונית.
בהשוואה לפיתוח ישיר עם API של LLM, Azure AI Agent Service מציעה יתרונות כגון:
הכלים הזמינים בשירות סוכני Azure AI מחולקים לשתי קטגוריות:
שירות הסוכן מאפשר להשתמש בכלים אלו יחד כ’toolset’. השירות גם משתמש ב-‘threads’ ששומרים על היסטוריית ההודעות משיחה מסוימת.
דמיין שאתה סוכן מכירות בחברה בשם Contoso. אתה רוצה לפתח סוכן שיחה שיכול לענות על שאלות לגבי נתוני המכירות שלך.
התמונה הבאה ממחישה כיצד ניתן להשתמש בשירות סוכני Azure AI כדי לנתח את נתוני המכירות:

כדי להשתמש בכל הכלים עם השירות, ניתן ליצור לקוח ולהגדיר כלי או toolset. ליישום מעשי נוכל להשתמש בקוד הפייתון הבא. ה-LLM יוכל להסתכל על ה-toolset ולהחליט האם להשתמש בפונקציה שיצר המשתמש, fetch_sales_data_using_sqlite_query, או במפרש הקוד המובנה בהתאם לבקשת המשתמש.
import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from fetch_sales_data_functions import fetch_sales_data_using_sqlite_query # פונקציית fetch_sales_data_using_sqlite_query שניתן למצוא בקובץ fetch_sales_data_functions.py.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool
project_client = AIProjectClient.from_connection_string(
credential=DefaultAzureCredential(),
conn_str=os.environ["PROJECT_CONNECTION_STRING"],
)
# לאתחל את ערכת הכלים
toolset = ToolSet()
# אתחול סוכן קריאת פונקציות עם הפונקציה fetch_sales_data_using_sqlite_query והוספתה לערכת הכלים
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)
# אתחול כלי Interpreter Code והוספתו לערכת הכלים.
code_interpreter = CodeInterpreterTool()toolset.add(code_interpreter)
agent = project_client.agents.create_agent(
model="gpt-4o-mini", name="my-agent", instructions="You are helpful agent",
toolset=toolset
)
חשש נפוץ בכתיבת שאילתות SQL דינמיות על ידי LLMs הוא בטיחות, בפרט הסיכון להזרקת SQL או פעולות זדוניות, כמו מחיקת או שינוי נתוני בסיס הנתונים. בעוד שהחששות האלה תקפים, ניתן למזערם ביעילות על-ידי תצורת הרשאות גישה מתאימה לבסיס הנתונים. ברוב בסיסי הנתונים, הדבר כרוך בהגדרת גישת קריאה בלבד (read-only). עבור שירותי בסיסי נתונים כמו PostgreSQL או Azure SQL, יש להקצות לאפליקציה תפקיד קריאה בלבד (SELECT).
הרצת האפליקציה בסביבה מאובטחת משפרת גם את ההגנה. בסביבות ארגוניות, נתונים בדרך כלל מחולצים ומעובדים ממערכות תפעוליות אל בסיס נתונים או מחסן נתונים בקריאה בלבד עם סכימה ידידותית למשתמש. גישה זו מבטיחה שהנתונים מאובטחים, מותאמים לביצועים ולנגישות, ושלאפליקציה יש גישה מוגבלת לקריאה בלבד.
הצטרף ל-Microsoft Foundry Discord כדי לפגוש לומדים אחרים, להשתתף בשעות משרד ולקבל תשובות לשאלותיך בנושא סוכני AI.
כתב ויתור: מסמך זה תורגם באמצעות שירות תרגום אוטומטי Co-op Translator. למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה.