Prompt Engineering

ما وراء النص: إتقان استدعاء الدوال في تطبيقات نماذج اللغة الكبيرة

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

فهم حلقة استدعاء الدوال

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

  1. تعريف الأدوات: تزود نموذج اللغة بمخطط (عادةً JSON) يحدد الدوال المتاحة، وأسمائها، ووصفها، ومعاملاتها.
  2. استعلام المستخدم: يطرح المستخدم سؤالاً أو يعطي أمراً.
  3. قرار النموذج: يحلل نموذج اللغة الطلب ويحدد ما إذا كانت هناك حاجة لدالة. يعيد مخرجات منظمة تحدد الدالة التي يجب استدعاؤها والمعلمات المستخدمة.
  4. التنفيذ: يستقبل كود تطبيقك هذه المخرجات المنظمة، ويفككها، وينفذ الدالة فعلياً (مثلاً، إجراء طلب HTTP).
  5. إكمال الاستجابة: يُعاد نتيجة تنفيذ الدالة إلى نموذج اللغة، الذي يقوم بعد ذلك بتوليد استجابة نهائية بلغة طبيعية للمستخدم.

تعريف الأدوات: فن المخططات

يعتمد جودة استدعاء الدوال بشكل كبير على جودة تعريفات أدواتك. يستخدم نموذج اللغة الأوصاف للتحديد متى وكيف يستخدم الأدوات. الأوصاف الغامضة تؤدي إلى هلوسات أو استخدام خاطئ للمعاملات.

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "Get the current weather in a given location",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state, e.g. San Francisco, CA"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"],
                        "description": "The temperature unit to use. Infer this from the user's location."
                    }
                },
                "required": ["location"]
            }
        }
    }
]

لاحظ الوصف الصريح لمعامل unit. من خلال إخبار النموذج بـ "استنتاج هذا من موقع المستخدم"، توجهه لاتخاذ افتراضات منطقية بدلاً من طلب معلومات زائدة من المستخدم.

تنفيذ عملي بلغة بايثون

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

import json
from openai import OpenAI

client = OpenAI()

def get_weather(location, unit="fahrenheit"):
    # Placeholder for actual API call
    return f"The weather in {location} is sunny and {72 if unit == 'fahrenheit' else 22} degrees."

# Initial chat
response = client.chat.completions.create(
    model="gpt-4o",
    tools=tools,
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What's the weather like in Boston?"}
    ]
)

# Check if the model wants to call a function
if response.choices[0].message.tool_calls:
    tool_call = response.choices[0].message.tool_calls[0]
    
    # Parse arguments
    function_name = tool_call.function.name
    arguments = json.loads(tool_call.function.arguments)
    
    # Execute the actual function
    if function_name == "get_current_weather":
        result = get_weather(**arguments)
    else:
        result = "Unknown function"
    
    # Send result back to the model
    final_response = client.chat.completions.create(
        model="gpt-4o",
        tools=tools,
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "What's the weather like in Boston?"},
            {"role": "assistant", "content": response.choices[0].message.content},
            {"role": "tool", "tool_call_id": tool_call.id, "content": result}
        ]
    )
    print(final_response.choices[0].message.content)

أفضل الممارسات لأنظمة الإنتاج

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

خاتمة

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

Share: