Prompt Engineering

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

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

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

فهم الهندسة المعمارية

استدعاء الوظائف ليس سحراً؛ إنه بروتوكول اتصال منظم بين نموذج اللغة الكبير (LLM) وبنيتك التحتية للخلفية (Backend). عادةً ما تتبع العملية دورة حياة صارمة:

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

مثال على التنفيذ

لننظر في مثال عملي باستخدام واجهة برمجة تطبيقات OpenAI. تخيل أننا نبني مساعداً للطقس. نحتاج إلى تعريف وظيفة تجلب بيانات الطقس.

import openai

# Define the function schema
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_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"]
                    }
                },
                "required": ["location"]
            }
        }
    }
]

# User query
messages = [{"role": "user", "content": "What's the weather like in Tokyo?"}]

# Call the API
response = openai.chat.completions.create(
    model="gpt-4-turbo",
    messages=messages,
    tools=tools,
    tool_choice="auto"
)

# Check if the model wants to call a function
response_message = response.choices[0].message
tool_calls = response_message.tool_calls

if tool_calls:
    # The model has requested a function call
    available_functions = {
        "get_weather": get_weather_from_api
    }
    
    # Execute the function
    function_name = tool_calls[0].function.name
    function_args = json.loads(tool_calls[0].function.arguments)
    function_response = available_functions[function_name](**function_args)
    
    # Send response back to the model
    messages.append(response_message) # Add assistant message
    messages.append({
        "tool_call_id": tool_calls[0].id,
        "role": "tool",
        "name": function_name,
        "content": function_response
    })
    
    # Get final answer
    second_response = openai.chat.completions.create(
        model="gpt-4-turbo",
        messages=messages
    )
    print(second_response.choices[0].message.content)

أفضل الممارسات للمتانة

بينما المفهوم بسيط، يتطلب التنفيذ في بيئة الإنتاج اهتماماً دقيقاً بالتفاصيل:

  • تصميم المخطط الدلالي: يجب أن تكون مخططات JSON الخاصة بك دقيقة. استخدم enum للقيم المقيدة وقدم حقول description مفصلة. يعتمد نموذج LLM كلياً على هذه الأوصاف لتحديد متى يجب استدعاء وظيفة.
  • معالجة الأخطاء: قد تفشل طلبات الشبكة إلى واجهات برمجة التطبيقات الخارجية. تأكد من أن الخلفية الخاصة بك تلتقط هذه الأخطاء وتعيد إرسالها إلى نموذج LLM كرسالة role: "tool" مع حالة خطأ. هذا يسمح للنموذج بمحاولة إعادة المحاولة أو إبلاغ المستخدم بأناقة.
  • التنظيف الأمني: لا تنفذ أبداً معاملات الوظائف المستلمة من نموذج LLM بشكل أعمى. تحقق من جميع المدخلات مقابل الأنماط والقيود الداخلية الخاصة بك قبل التنفيذ لمنع هجمات الحقن.

الخاتمة

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

Share: