وكلاء الذكاء الاصطناعي واستدعاء الدوال: بناء أدوات لنماذج اللغة الكبيرة
أنت تبني وكيل ذكاء اصطناعي يحتاج إلى جلب بيانات في الوقت الفعلي، أو إجراء حسابات، أو التفاعل مع واجهات برمجة التطبيقات الخارجية. لكن كيف تسد الفجوة بين توليد النصوص من نموذج اللغة الكبير وتنفيذ الكود الفعلي؟ استدعاء الدوال (المعروف أيضًا باسم استخدام الأدوات) هو الإجابة. فهو يسمح لنماذج اللغة الكبيرة بطلب إجراءات محددة، ويقوم الكود الخاص بك بتنفيذها. يرشدك هذا الدليل خلال تصميم وتنفيذ وتصحيح استدعاء الدوال لوكلاء الذكاء الاصطناعي.
ما هو استدعاء الدوال؟
استدعاء الدوال هو آلية يمكن لنموذج اللغة الكبير من خلالها إخراج طلب منظم لاستدعاء دالة قمت بتعريفها. بدلاً من توليد نص حر، يعيد النموذج كائن JSON يحتوي على اسم الدالة والوسائط. ثم يقوم تطبيقك بتنفيذ الدالة وإعادة النتيجة إلى النموذج. هذا يمكّن الوكلاء من أداء إجراءات تتجاوز توليد النصوص، مثل الاستعلام عن قواعد البيانات، أو إرسال البريد الإلكتروني، أو استدعاء واجهات برمجة التطبيقات.
يدعم مقدمو نماذج اللغة الكبيرة الرئيسيون مثل OpenAI وAnthropic وGoogle استدعاء الدوال. الفكرة الأساسية متسقة: أنت تصف الأدوات المتاحة، ويقرر النموذج متى يستخدمها، وأنت تتعامل مع التنفيذ.
تصميم الأدوات لنماذج اللغة الكبيرة
الأدوات المصممة جيدًا ضرورية لسلوك الوكيل الموثوق. اتبع هذه المبادئ:
- أسماء وأوصاف واضحة: استخدم أسماء دوال وصفية وأوصافًا مفصلة. يعتمد نموذج اللغة الكبير على هذه لاختيار الأداة الصحيحة.
- معاملات بسيطة: اجعل المعاملات في حدها الأدنى واستخدم أنواعًا قياسية (string، number، boolean، array، object). تجنب الهياكل المتداخلة المعقدة عندما يكون ذلك ممكنًا.
- الخصائص التكرارية (Idempotency): حيثما أمكن، صمم الأدوات لتكون تكرارية (آمنة لإعادة المحاولة) للتعامل مع حالات الفشل بسلاسة.
- معالجة الأخطاء: أعد رسائل خطأ إعلامية حتى يتمكن نموذج اللغة الكبير من تعديل نهجه.
مثال: أداة الطقس
إليك تعريف أداة بسيطة بتنسيق JSON schema، شائع الاستخدام مع واجهة OpenAI API:
{
"name": "get_weather",
"description": "Get the current weather for a given city",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "The city name, e.g., San Francisco"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "Temperature unit"
}
},
"required": ["city"]
}
}
تنفيذ استدعاء الدوال: خطوة بخطوة
لنقم ببناء حلقة وكيل بسيطة باستخدام واجهة OpenAI API (ينطبق النمط على مزودين آخرين).
1. تعريف أدواتك
أنشئ قائمة بمخططات الأدوات وتعيينًا من أسماء الدوال إلى دوال Python الفعلية.
import json
import openai
# Tool schemas
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather for a city",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["city"]
}
}
}
]
# Actual functions
def get_weather(city: str, unit: str = "celsius") -> dict:
# In reality, call a weather API
return {"city": city, "temperature": 22, "unit": unit, "condition": "sunny"}
# Map names to functions
function_map = {
"get_weather": get_weather
}
2. إنشاء حلقة الوكيل
ترسل حلقة الوكيل الرسائل إلى نموذج اللغة الكبير، وتتحقق من استدعاءات الأدوات، وتنفذها، وتكرر حتى يعيد النموذج إجابة نهائية.
def run_agent(user_message: str):
messages = [{"role": "user", "content": user_message}]
while True:
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
tools=tools,
tool_choice="auto"
)
message = response.choices[0].message
messages.append(message)
# If no tool calls, return the content
if not message.get("tool_calls"):
return message["content"]
# Execute each tool call
for tool_call in message.tool_calls:
function_name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
if function_name in function_map:
result = function_map[function_name](**arguments)
else:
result = {"error": f"Unknown function: {function_name}"}
# Append tool result to messages
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result)
})
تستمر هذه الحلقة حتى ينتج نموذج اللغة الكبير استجابة بدون استدعاءات أدوات، مما يشير إلى أنه يمتلك معلومات كافية.
3. التعامل مع الأخطاء والحالات الحدية
يجب على الوكلاء في العالم الحقيقي التعامل مع:
- وسائط غير صالحة: التقاط الاستثناءات عند تحليل الوسائط أو استدعاء الدوال.
- أدوات غير معروفة: إرجاع رسالة خطأ إلى نموذج اللغة الكبير حتى يتمكن من تصحيح نفسه.
- المهلات الزمنية: تعيين مهلات زمنية لاستدعاءات واجهات برمجة التطبيقات الخارجية لتجنب التعليق.
- حدود المعدل: تنفيذ إعادة المحاولات مع التراجع الأسي.
أفضل الممارسات للوكلاء الموثوقين
- حدد عدد الأدوات: عدد كبير جدًا من الأدوات يربك النموذج. قم بتجميع الدوال ذات الصلة أو استخدم موجهًا.
- تحقق من المدخلات: قم بتنقية والتحقق من جميع الوسائط قبل التنفيذ.
- سجل كل شيء: سجل استدعاءات الأدوات والنتائج لتصحيح الأخطاء والتدقيق.
- اختبر بمطالبات متنوعة: تأكد من أن الوكيل يختار الأدوات الصحيحة في سيناريوهات مختلفة.
- وفر بدائل: إذا فشلت أداة، يجب على الوكيل تجربة بدائل أو طلب توضيح.
مقارنة دعم استدعاء الدوال
| المزود | اسم الميزة | التنسيق |
|---|---|---|
| OpenAI | Function Calling | JSON Schema |
| Anthropic | Tool Use | JSON Schema |
| Function Calling | OpenAPI Schema |
أنماط متقدمة
مع نمو وكيلك، ضع في اعتبارك هذه الأنماط:
- استدعاءات الأدوات المتوازية: يمكن لبعض النماذج طلب أدوات متعددة في وقت واحد. نفذها بشكل متزامن للسرعة.
- الإنسان في الحلقة: للإجراءات الحساسة (مثل إرسال الأموال)، اطلب موافقة بشرية قبل التنفيذ.
- الذاكرة: خزن سجل المحادثة ونتائج الأدوات لتوفير السياق في الجلسات الطويلة.
- توجيه الأدوات: استخدم مصنفًا خفيفًا لتحديد الأدوات ذات الصلة قبل استدعاء نموذج اللغة الكبير الرئيسي.
تصحيح استدعاء الدوال
عندما تسوء الأمور، تحقق من:
- هل أوصاف الأدوات واضحة لا لبس فيها؟
- هل أسماء المعاملات وأنواعها صحيحة؟
- هل لدى النموذج سياق كافٍ لاختيار الأداة الصحيحة؟
- هل تتعامل مع نتائج الأدوات بشكل صحيح (مثل تسلسل JSON)؟
استخدم التسجيل لالتقاط سجل الرسائل الكامل واستدعاءات الأدوات. غالبًا ما تكون المشكلة عدم تطابق بين الوسائط المتوقعة والفعلية.
الأسئلة الشائعة
ما الفرق بين استدعاء الدوال واستخدام الأدوات؟
يشيران إلى نفس المفهوم. تسميه OpenAI "استدعاء الدوال"، بينما تستخدم Anthropic "استخدام الأدوات". كلاهما يسمح لنماذج اللغة الكبيرة بطلب تنفيذ دوال خارجية.
هل يمكنني استخدام استدعاء الدوال مع النماذج مفتوحة المصدر؟
نعم، بعض النماذج مفتوحة المصدر مثل Llama 3.1 تدعم استدعاء الدوال، وتوفر أطر عمل مثل LangChain تجريدات. ومع ذلك، يختلف الدعم، وقد تحتاج إلى ضبط دقيق أو استخدام تنسيقات مطالبات محددة.
كيف أمنع نموذج اللغة الكبير من استدعاء دوال خطيرة؟
لا تعرض أبدًا دوال خطيرة مباشرة. استخدم قوائم السماح، وتحقق من المدخلات، ونفذ فحوصات الأذونات. للعمليات الحساسة، اطلب تأكيدًا بشريًا قبل التنفيذ.
هل أنت مستعد لبناء وكيل الذكاء الاصطناعي الخاص بك؟ ابدأ بتعريف أداة بسيطة واختبار حلقة الوكيل. لمزيد من أدوات المطورين، تحقق من JSON Formatter لتصحيح حمولات استدعاء الأدوات.