AI Agents

إتقان استدعاء الدوال: بناء وكلاء يتخذون إجراءات

نماذج اللغة الكبيرة (LLMs) هي معالجات قوية للغة الطبيعية، لكنها أنظمة مغلقة بطبيعتها. لا يمكنها التحقق من حالة الطقس، أو الاستعلام عن قاعدة بيانات، أو إرسال بريد إلكتروني. يمكنها فقط التنبؤ بالرمز التالي بناءً على بيانات التدريب الخاصة بها. لسد الفجوة بين المعرفة الثابتة والإجراء الديناميكي، يستخدم المطورون استدعاء الدوال. تتيح هذه التقنية لنموذج اللغة أن "يهلوس" قرارًا باستخدام أداة، مما يولّد مخرجات JSON منظمة يمكن لتطبيقك تحليلها وتنفيذها. عند تصميمها بشكل صحيح، يحوّل استدعاء الدوال روبوت الدردشة إلى وكيل مستقل قادر على التفاعل مع العالم الحقيقي.

تشريح مكالمة الدالة

استدعاء الدوال ليس سحرًا؛ بل هو عملية فك ترميز مقيدة. يتم تلميح النموذج بقائمة الدوال المتاحة ومخططاتها. بدلاً من توليد نص حر، يولّد النموذج بنية JSON محددة تحتوي على اسم الدالة والحجج. ثم يقوم كودك باعتراض هذا JSON، والتحقق منه مقابل المخطط، وتنفيذ طريقة بايثون أو مكالمة API المقابلة.

المكوّن الحاسم هنا هو مخطط JSON. على عكس توثيق API القياسي الذي قد يكون غامضًا، يتطلب استدعاء الدوال تعريفات صارمة وصريحة. يحتاج النموذج إلى معرفة أنواع البيانات المتوقعة بالضبط، وأي الحقول اختيارية، وما هي التعدادات (enums) المسموح بها. إذا كان مخططك غامضًا، سيقوم النموذج بافتراضات، مما يؤدي إلى أخطاء وقت التشغيل.

التطبيق العملي بلغة بايثون

فيما يلي مثال مبسط يستخدم واجهة LLM عامة. لاحظ كيف نعرّف الأداة أولاً، ثم نلهم النموذج لاختيارها.

import json
from typing import Callable, Dict, Any

# 1. Define the function logic
def get_weather(city: str) -> str:
    """Simulates fetching weather data."""
    # In a real app, this would call an external API
    return f"The weather in {city} is sunny and 72F."

# 2. Define the schema for the LLM
weather_tool = {
    "name": "get_weather",
    "description": "Get the current weather for a given city.",
    "parameters": {
        "type": "object",
        "properties": {
            "city": {
                "type": "string",
                "description": "The name of the city."
            }
        },
        "required": ["city"]
    }
}

# 3. The LLM Output (Simulated)
# In a real scenario, you would send the prompt and tool definitions to the API.
llm_response = """
{
    "tool_name": "get_weather",
    "arguments": {
        "city": "San Francisco"
    }
}
"""

# 4. Parse and Execute
def dispatch_call(response_json: str) -> Any:
    data = json.loads(response_json)
    tool_name = data["tool_name"]
    args = data["arguments"]
    
    # Map function names to actual methods
    tool_map: Dict[str, Callable] = {
        "get_weather": get_weather
    }
    
    if tool_name in tool_map:
        return tool_map[tool_name](**args)
    else:
        raise ValueError(f"Unknown tool: {tool_name}")

result = dispatch_call(llm_response)
print(result)

معالجة الغموض والأخطاء

أحد أكثر الفخاخ شيوعًا في استدعاء الدوال هو المبالغة في هندسة المخطط. إذا كشفت عن عدد كبير جدًا من المعاملات، يصبح النموذج مرتبكًا بشأن أي منها يجب ملؤه. تقترح أفضل الممارسات إبقاء الدوال الفردية ذرّية (atomistic). إذا كنت بحاجة إلى بيانات معقدة، أنشئ دالة محددة لذلك السيناريو بدلاً من دالة "استعلام" عامة تحتوي على خمسين حقلًا اختياريًا.

علاوة على ذلك، يجب عليك معالجة أخطاء تحليل JSON. حتى أقوى النماذج تخرج أحيانًا JSON غير صحيح، خاصة عند التعامل مع سياقات كبيرة. قم دائمًا بتغليف منطق تحليل JSON الخاص بك في كتلة try-catch. إذا فشل التحليل، لا تجعل الوكيل ينهار. بدلاً من ذلك، أرسل رسالة الخطأ مرة أخرى إلى نموذج اللغة مع تلميح مثل: "مخرجاتك السابقة كانت JSON غير صالح. يرجى المحاولة مرة أخرى." يحسّن هذا حلقة التصحيح الذاتي الموثوقية بشكل كبير.

اعتبارات أمنية

يُقدم استدعاء الدوال سطحًا أمنيًا كبيرًا. يقوم نموذج اللغة بتوليد حجج كود يقوم خادمك الخلفي بتنفيذها. إذا سمحت بالتنفيذ التعسفي، فقد تكون هجوم حقن التلميح كارثيًا. على سبيل المثال، قد يخدع المستخدم النموذج لاستدعاء دالة مثل delete_database أو send_email مع حمولات خبيثة.

لتخفيف هذا الخطر، نفّذ نظام القائمة البيضاء. لا تسمح أبدًا لنموذج اللغة باختيار الدوال ديناميكيًا من مجموعة كبيرة دون تحقق صارم. بالإضافة إلى ذلك، أضف خطوات تأكيد بشري في الحلقة (human-in-the-loop) للإجراءات عالية المخاطر. قبل تنفيذ دالة تعدل البيانات أو تنفق المال، أوقف الوكيل مؤقتًا واطلب موافقة صريحة من المستخدم.

الخلاصة

استدعاء الدوال هو العمود الفقري لوكلاء الذكاء الاصطناعي الحديثين. إنه يوفر الواجهة المنظمة بين نية اللغة الطبيعية والتنفيذ البرمجي. من خلال تصميم مخططات دقيقة، وتنفيذ معالجة أخطاء قوية، وأولوية الأمان، يمكنك بناء وكلاء ليسوا مجرد محاورين، بل تشغيليون حقًا. ابدأ صغيرًا بأدوات قراءة فقط، أتقن النمط، ووسّع قدرات وكيلك تدريجيًا. مستقبل الذكاء الاصطناعي ليس مجرد حديث؛ بل هو عن الفعل.

Share: