Інтеграція OpenAI Function Calling в додаток
Function Calling в OpenAI API дозволяє моделі структурованим чином викликати ваші функції. Модель визначає, коли і з якими аргументами викликати функцію, на основі її опису. Це основа для агентних систем, підключення до баз даних, API та будь-яких зовнішніх сервісів.
Базовий приклад
from openai import OpenAI
import json
client = OpenAI()
# Визначення функцій
tools = [
{
"type": "function",
"function": {
"name": "get_order_status",
"description": "Отримати статус замовлення за його ID",
"parameters": {
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "Ідентифікатор замовлення"
}
},
"required": ["order_id"],
"additionalProperties": False,
},
"strict": True, # Гарантує точну відповідність схемі
}
},
{
"type": "function",
"function": {
"name": "cancel_order",
"description": "Скасувати замовлення (тільки якщо статус pending або processing)",
"parameters": {
"type": "object",
"properties": {
"order_id": {"type": "string"},
"reason": {"type": "string", "description": "Причина скасування"}
},
"required": ["order_id"],
"additionalProperties": False,
},
"strict": True,
}
}
]
# Реалізація функцій
def get_order_status(order_id: str) -> dict:
# Запит до БД
return {"order_id": order_id, "status": "processing", "items": 3}
def cancel_order(order_id: str, reason: str = "") -> dict:
return {"success": True, "message": f"Order {order_id} cancelled"}
FUNCTION_MAP = {
"get_order_status": get_order_status,
"cancel_order": cancel_order,
}
def run_with_tools(user_message: str, conversation_history: list = None) -> str:
messages = conversation_history or []
messages.append({"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
if response.choices[0].finish_reason == "stop":
return message.content
# Обробляємо виклики функцій
messages.append(message.model_dump())
for tool_call in message.tool_calls or []:
func_name = tool_call.function.name
func_args = json.loads(tool_call.function.arguments)
result = FUNCTION_MAP[func_name](**func_args)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result, ensure_ascii=False),
})
Structured Outputs з функціями
from pydantic import BaseModel
from typing import Literal
class OrderAction(BaseModel):
action: Literal["status_check", "cancellation", "escalation"]
order_id: str
priority: Literal["low", "medium", "high"]
notes: str
# Примусове використання конкретної функції з Pydantic
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Замовлення #12345 зависло в обробці вже 3 дні"}],
tools=[openai.pydantic_function_tool(OrderAction)],
tool_choice="required",
)
# Автоматично парсується в Pydantic модель
tool_call = response.choices[0].message.tool_calls[0]
action = OrderAction.model_validate_json(tool_call.function.arguments)
print(action.action, action.priority)
Паралельні виклики для агрегації даних
async def aggregate_customer_data(customer_id: str) -> dict:
"""Паралельно запитує дані з кількох джерел"""
# GPT-4o з parallel_tool_calls=True викличе всі інструменти одночасно
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": f"Зібери повну інформацію про клієнта {customer_id}: профіль, замовлення, тікети"
}],
tools=[get_profile_tool, get_orders_tool, get_tickets_tool],
tool_choice="required",
parallel_tool_calls=True,
)
# Модель викликає всі три функції в одній відповіді
# Потім агрегує результати
...
Практичний кейс: служба підтримки e-commerce
Функції: get_order, track_shipment, process_refund, update_address, get_product_info.
Результат: 64% звернень обробляються автономно (статуси, трекінг, прості повернення). Середній час вирішення: 45 хв → 2 хв.
Строки реалізації
- Базовий function calling цикл: 1–2 дні
- Паралельні виклики + Pydantic: 2–3 дні
- Production з error handling: 1 тиждень







