LLM כשלעצמו אינו יכול לשאול מסד נתונים, ליצור כרטיס CRM או לשלוח דוא"ל. אם הבוט שלך יכול רק לייצר טקסט, הוא חסר תועלת למשימות עסקיות. אנו פותרים זאת באמצעות Function Calling: מנגנון שבו המודל מנתח את הבקשה, קובע את הכלי הדרוש ואת הפרמטרים שלו, והיישום המארח מבצע את הקריאה ומחזיר את התוצאה. כך הסוכן הופך לשותף מלא בתהליכים עסקיים.
ללא סכמת כלים ברורה, המודל עלול לייצר JSON שרירותי שנכשל באימות. זה מוביל לכשלי אינטגרציה ולחוסר שביעות רצון של המשתמשים. הצוות שלנו פיתח גישה המבוססת על אימות Pydantic שמבטלת בעיות כאלה.
הגישה שלנו אינה רק חיבור API; היא עיצוב ארכיטקטורה שעומדת בעומס אמיתי. אנו משתמשים בטכנולוגיות: OpenAI GPT-4o, Claude 3.5, Hugging Face Transformers למודלים מקומיים, LangChain לתזמור, Qdrant לחיפוש וקטורי. כל התצורות נשמרות ב-Git; סכמות הכלים מנוהלות בגרסאות. ניתן לקרוא עוד על המנגנון בתיעוד של OpenAI.
כיצד פועל Function Calling
המודל מקבל תיאורי כלים בפורמט JSON Schema. כאשר בקשת משתמש דורשת קריאה לשירות חיצוני, המודל מחזיר אובייקט מובנה עם שם הפונקציה והפרמטרים. המארח מבצע את הקריאה ומחזיר את התוצאה. המחזור חוזר עד לקבלת התשובה הסופית.
אילו בעיות פותר Function Calling?
פלט מודל כאוטי — המודל עלול לייצר JSON שרירותי שאינו תואם לסכמה. אנו מתארים כלים באמצעות JSON Schema ומאמתים את הביצוע עם Pydantic.
אובדן הקשר בשרשראות קריאה ארוכות — אם הסוכן מבצע 5–10 קריאות רצופות, ההקשר עלול לטשטש. אנו משתמשים בחלוקת היסטוריה ודחיסה סמנטית.
חביון — קריאות כלים רצופות יכולות לקחת שניות. קריאות כלים מקבילות ב-GPT-4o מקצרות את זמן הביצוע הכולל ב-60% בהשוואה לרצף.
שגיאות ביצוע API נפוצות. לסוכן שלנו יש לוגיקת גיבוי: ניסיון חוזר לאחר שנייה אחת, הסלמה למפעיל לאחר שלושה כשלים.
באיזה טכנולוגיות אנו משתמשים?
אנו משתמשים בטכנולוגיות: OpenAI GPT-4o, Claude 3.5, Hugging Face Transformers למודלים מקומיים, LangChain לתזמור, Qdrant לחיפוש וקטורי. כל התצורות נשמרות ב-Git; סכמות הכלים מנוהלות בגרסאות.
לולאת סוכן בסיסית עם OpenAPI
from openai import OpenAI
import json
client = OpenAI()
# Схема инструментов
tools = [
{
"type": "function",
"function": {
"name": "get_customer_info",
"description": "Получить информацию о клиенте по ID или email",
"parameters": {
"type": "object",
"properties": {
"customer_id": {"type": "string"},
"email": {"type": "string"},
"fields": {
"type": "array",
"items": {"type": "string"},
"description": "Нужные поля: name, orders, balance, status"
}
},
}
}
},
{
"type": "function",
"function": {
"name": "create_support_ticket",
"description": "Создать тикет в службу поддержки",
"parameters": {
"type": "object",
"properties": {
"customer_id": {"type": "string"},
"category": {"type": "string", "enum": ["billing", "technical", "account", "shipping"]},
"priority": {"type": "string", "enum": ["low", "medium", "high", "critical"]},
"description": {"type": "string"},
},
"required": ["customer_id", "category", "description"]
}
}
},
]
# Реестр функций
def get_customer_info(customer_id=None, email=None, fields=None) -> dict:
# Реальная реализация: запрос в CRM/БД
return {"id": customer_id, "name": "Иванов И.И.", "balance": 15000, "status": "active"}
def create_support_ticket(customer_id: str, category: str, description: str, priority: str = "medium") -> dict:
# Реальная реализация: Jira/Zendesk API
return {"ticket_id": "TKT-12345", "status": "created"}
FUNCTION_MAP = {
"get_customer_info": get_customer_info,
"create_support_ticket": create_support_ticket,
}
# Агентный цикл с Function Calling
def run_support_agent(user_message: str) -> str:
messages = [
{"role": "system", "content": "Ты — агент службы поддержки. Используй инструменты для помощи клиентам."},
{"role": "user", "content": user_message},
]
while True:
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
tool_choice="auto",
parallel_tool_calls=True, # Параллельные вызовы
)
message = response.choices[0].message
messages.append(message)
if not message.tool_calls:
return message.content
# Выполняем все вызовы (параллельно если несколько)
for tool_call in message.tool_calls:
func_name = tool_call.function.name
func_args = json.loads(tool_call.function.arguments)
func = FUNCTION_MAP.get(func_name)
if func:
result = func(**func_args)
else:
result = {"error": f"Function {func_name} not found"}
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result, ensure_ascii=False),
})
מדוע קריאות כלים מקבילות יעילות יותר
קריאות כלים מקבילות ב-GPT-4o מאפשרות קריאה למספר כלים בתשובה אחת. זה מקצר משמעותית את החביון ואת מספר הסבבים. השוואה:
| פרמטר | קריאות רצופות | קריאות כלים מקבילות |
|---|---|---|
| זמן תגובה ממוצע | 6.2 שניות | 2.5 שניות |
| מספר סבבים | 3-5 | 1-2 |
| סיכון לאובדן הקשר | גבוה | נמוך |
הניסיון שלנו מראה שבתרחישים טיפוסיים, קריאות כלים מקבילות מאיצות את תגובת הסוכן פי 2.3.
מקרה מעשי: סוכן לשאלות משאבי אנוש
מהניסיון שלנו — יישום סוכן למחלקת משאבי אנוש של רשת קמעונאית גדולה. כלים: from openai import OpenAI import json client = OpenAI() # Схема инструментов tools = [ { "type": "function", "function": { "name": "get_customer_info", "description": "Получить информацию о клиенте по ID или email", "parameters": { "type": "object", "properties": { "customer_id": {"type": "string"}, "email": {"type": "string"}, "fields": { "type": "array", "items": {"type": "string"}, "description": "Нужные поля: name, orders, balance, status" } }, } } }, { "type": "function", "function": { "name": "create_support_ticket", "description": "Создать тикет в службу поддержки", "parameters": { "type": "object", "properties": { "customer_id": {"type": "string"}, "category": {"type": "string", "enum": ["billing", "technical", "account", "shipping"]}, "priority": {"type": "string", "enum": ["low", "medium", "high", "critical"]}, "description": {"type": "string"}, }, "required": ["customer_id", "category", "description"] } } }, ] # Реестр функций def get_customer_info(customer_id=None, email=None, fields=None) -> dict: # Реальная реализация: запрос в CRM/БД return {"id": customer_id, "name": "Иванов И.И.", "balance": 15000, "status": "active"} def create_support_ticket(customer_id: str, category: str, description: str, priority: str = "medium") -> dict: # Реальная реализация: Jira/Zendesk API return {"ticket_id": "TKT-12345", "status": "created"} FUNCTION_MAP = { "get_customer_info": get_customer_info, "create_support_ticket": create_support_ticket, } # Агентный цикл с Function Calling def run_support_agent(user_message: str) -> str: messages = [ {"role": "system", "content": "Ты — агент службы поддержки. Используй инструменты для помощи клиентам."}, {"role": "user", "content": user_message}, ] while True: response = client.chat.completions.create( model="gpt-4o", messages=messages, tools=tools, tool_choice="auto", parallel_tool_calls=True, # Параллельные вызовы ) message = response.choices[0].message messages.append(message) if not message.tool_calls: return message.content # Выполняем все вызовы (параллельно если несколько) for tool_call in message.tool_calls: func_name = tool_call.function.name func_args = json.loads(tool_call.function.arguments) func = FUNCTION_MAP.get(func_name) if func: result = func(**func_args) else: result = {"error": f"Function {func_name} not found"} messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": json.dumps(result, ensure_ascii=False), }) , get_employee_info, check_vacation_balance, submit_vacation_request. שאלה: "אני רוצה לקחת חופשה מ-15 באפריל עד 25 באפריל. האם יש לי מספיק ימים?"
מסלול הסוכן:
-
get_company_policy— קבלת מזהה מהקשר הסשן -
get_employee_info(employee_id="emp_789")— יתרה: 14 ימים -
check_vacation_balance(employee_id="emp_789")— קריאת כללי האישור - תשובה סופית: "יש לך 14 ימי חופשה. התקופה 15–25 באפריל היא 11 ימי עבודה (כולל חגים). היתרה שלך מספקת. כדי להמשיך, submit_vacation_request. הבקשה שלך חייבת להיות מאושרת על ידי המנהל שלך תוך 3 ימי עבודה לפי המדיניות."
מדדים לחודש הראשון:
- שאלות שטופלו באופן אוטונומי (ללא מפעיל): 84%
- דיוק מידע על יתרה/מדיניות: 97%
- זמן תגובה ממוצע: 4.2 שניות
קריאות כלים מקבילות נתנו שיפור של 40% במהירות לעומת רצף. כל הקריאות מאומתות באמצעות Pydantic לפני הביצוע — אפס תקלות בחודש.
דוגמה לקוד מלא של סוכן משאבי אנוש
# Здесь будет код агента для HR # ... מהם שלבי הפיתוח?
- אנליטיקה: לימוד תהליכים עסקיים, זיהוי נקודות אינטגרציה.
- עיצוב: פיתוח סכמות כלים, מסלולים, לוגיקת גיבוי.
- יישום: כתיבת הסוכן, אינטגרציה עם מערכות ארגוניות (ERP, CRM, מאגר ידע).
- בדיקות: בדיקות יחידה לכל פונקציה, תרחישי אינטגרציה, בדיקות A/B מול המערכת הקיימת.
- פריסה וניטור: פריסה, הגדרת לוגים והתראות לחביון P99 ודיוק.
לוח זמנים משוער
| שלב | משך |
|---|---|
| פיתוח סוכן עם 3–7 כלים | 2–4 שבועות |
| אינטגרציה עם מערכות ארגוניות | 2–4 שבועות |
| בדיקות וניטור | 1–2 שבועות |
| סה"כ | 5–10 שבועות |
מה כלול בתוצאה?
- תיעוד: תיאורי סכמות כלים, ארכיטקטורה, מדריך הרחבה.
- קוד מקור: מאגר עם לולאת סוכן, בדיקות, תצורות ל-MLOps (Weights & Biases, MLflow).
- צינור CI/CD: בנייה אוטומטית, בדיקות, פריסה.
- הכשרת צוות: סדנה להוספת כלים חדשים.
- תמיכה: שבועיים של ניטור לאחר העלייה לאוויר.
העלות הממוצעת של פרויקט נקבעת באופן אישי לפי מספר הכלים ומורכבות האינטגרציה. החיסכון מהיישום יכול להיות משמעותי.
התחייבויות ותמיכה
יש לנו ניסיון עם למעלה מ-15 יישומי סוכני AI עם Function Calling בסביבת ייצור. אנו מבטיחים איכות: כל סוכן עובר בדיקות עומס וביקורת קוד. אנו משתמשים בשיטות מומלצות: אימות סכמות, לוגיקת ניסיון חוזר, נראות.
צרו קשר לייעוץ — נמצא את הפתרון האופטימלי למשימה שלכם. הזמינו פיתוח סוכן AI וקבלו תוצאות ראשונות תוך שבוע.
תיעוד של OpenAI







