(انقر على الصورة أعلاه لمشاهدة فيديو هذا الدرس)
الأدوات مثيرة للاهتمام لأنها تتيح لوكلاء الذكاء الاصطناعي مجموعة أوسع من القدرات. بدلاً من أن يمتلك الوكيل مجموعة محدودة من الإجراءات التي يمكنه تنفيذها، يمكن للوكيل الآن أداء مجموعة واسعة من الإجراءات من خلال إضافة أداة. في هذا الفصل، سننظر إلى نمط تصميم استخدام الأدوات، الذي يصف كيف يمكن لوكلاء الذكاء الاصطناعي استخدام أدوات محددة لتحقيق أهدافهم.
في هذا الدرس، نهدف إلى الإجابة على الأسئلة التالية:
عند إكمال هذا الدرس، ستكون قادرًا على:
يركز نمط تصميم استخدام الأدوات على منح نماذج اللغة الكبيرة (LLMs) القدرة على التفاعل مع أدوات خارجية لتحقيق أهداف محددة. الأدوات هي تعليمات برمجية يمكن تنفيذها بواسطة وكيل لأداء إجراءات. يمكن أن تكون الأداة دالة بسيطة مثل الآلة الحاسبة، أو استدعاء API لخدمة طرف ثالث مثل البحث عن أسعار الأسهم أو التنبؤ بالطقس. في سياق وكلاء الذكاء الاصطناعي، تم تصميم الأدوات لتُنفّذ بواسطة الوكلاء استجابةً لـ مكالمات دوال مولدة عن طريق النموذج.
يمكن لوكلاء الذكاء الاصطناعي الاستفادة من الأدوات لإكمال مهام معقدة، استرجاع المعلومات، أو اتخاذ القرارات. غالبًا ما يُستخدم نمط تصميم استخدام الأدوات في السيناريوهات التي تتطلب تفاعلًا ديناميكيًا مع الأنظمة الخارجية، مثل قواعد البيانات، خدمات الويب، أو مفسري الشفرات. هذه القدرة مفيدة لعدد من حالات الاستخدام المختلفة بما في ذلك:
تسمح هذه الكتل الأساسية لوكيل الذكاء الاصطناعي بأداء مجموعة واسعة من المهام. دعونا نلقي نظرة على العناصر الرئيسية اللازمة لتطبيق نمط تصميم استخدام الأدوات:
مخططات الدوال/الأدوات: تعريفات مفصلة للأدوات المتاحة، بما في ذلك اسم الدالة، الغرض منها، المعلمات المطلوبة، والمخرجات المتوقعة. تتيح هذه المخططات للنموذج فهم الأدوات المتاحة وكيفية إنشاء طلبات صالحة.
منطق تنفيذ الدوال: ينظم كيفية ووقت استدعاء الأدوات بناءً على نية المستخدم وسياق المحادثة. قد يشمل ذلك وحدات تخطيطية، آليات توجيه، أو تدفقات شرطية تحدد استخدام الأدوات بشكل ديناميكي.
نظام إدارة الرسائل: مكونات تدير تدفق المحادثة بين مدخلات المستخدم، ردود النموذج، استدعاءات الأدوات، ومخرجات الأدوات.
إطار تكامل الأدوات: البنية التحتية التي تربط الوكيل بالأدوات المختلفة، سواء كانت دوال بسيطة أو خدمات خارجية معقدة.
معالجة الأخطاء والتحقق: آليات للتعامل مع فشل تنفيذ الأدوات، التحقق من المعلمات، وإدارة الاستجابات غير المتوقعة.
إدارة الحالة: تتبع سياق المحادثة، التفاعلات السابقة مع الأدوات، والبيانات المستمرة لضمان الاتساق عبر التفاعلات متعددة الأدوار.
بعد ذلك، دعونا نلقي نظرة على استدعاء الدوال/الأدوات بمزيد من التفصيل.
يُعد استدعاء الدوال الطريقة الأساسية التي نُمكّن من خلالها نماذج اللغة الكبيرة (LLMs) من التفاعل مع الأدوات. غالبًا ما ترى ‘الدالة’ و’الأداة’ يُستخدمان بالتبادل لأن ‘الدوال’ (وحدات التعليمات البرمجية المعاد استخدامها) هي ‘الأدوات’ التي يستخدمها الوكلاء لأداء المهام. لكي يتم استدعاء رمز دالة، يجب على النموذج مقارنة طلب المستخدم بوصف الدوال. للقيام بذلك، يتم إرسال مخطط يحتوي على أوصاف جميع الدوال المتاحة إلى النموذج. ثم يختار النموذج الدالة الأنسب للمهمة ويُرجع اسمها والمعاملات الخاصة بها. يتم استدعاء الدالة المحددة، وتُرسل استجاباتها مرة أخرى إلى النموذج، الذي يستخدم المعلومات للرد على طلب المستخدم.
لكي يتمكن المطورون من تنفيذ استدعاء الدوال للوكلاء، سيحتاجون إلى:
دعونا نستخدم مثال الحصول على الوقت الحالي في مدينة لتوضيح ذلك:
تهيئة نموذج LLM يدعم استدعاء الدوال:
ليست كل النماذج تدعم استدعاء الدوال، لذا من المهم التحقق من دعم النموذج لذلك. يدعم Azure OpenAI استدعاء الدوال. يمكننا البدء بتهيئة عميل Azure OpenAI.
# تهيئة عميل Azure OpenAI
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_AI_PROJECT_ENDPOINT"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-05-01-preview"
)
إنشاء مخطط دالة:
بعد ذلك سنعرف مخطط JSON يحتوي على اسم الدالة، وصف لما تقوم به الدالة، وأسماء ووصف معاملات الدالة. ثم نأخذ هذا المخطط ونرسله إلى العميل الذي أنشأناه سابقًا، مع طلب المستخدم للعثور على الوقت في سان فرانسيسكو. من المهم ملاحظة أن مكالمة الأداة هي ما يتم إرجاعه، وليس الجواب النهائي على السؤال. كما ذكرنا سابقًا، النموذج يُرجع اسم الدالة التي اختارها للمهمة والمعاملات التي سيتم تمريرها إليها.
# وصف الدالة للنموذج للقراءة
tools = [
{
"type": "function",
"function": {
"name": "get_current_time",
"description": "Get the current time in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city name, e.g. San Francisco",
},
},
"required": ["location"],
},
}
}
]
# رسالة المستخدم الأولية
messages = [{"role": "user", "content": "What's the current time in San Francisco"}]
# أول استدعاء للواجهة البرمجية: اطلب من النموذج استخدام الدالة
response = client.chat.completions.create(
model=deployment_name,
messages=messages,
tools=tools,
tool_choice="auto",
)
# معالجة استجابة النموذج
response_message = response.choices[0].message
messages.append(response_message)
print("Model's response:")
print(response_message)
Model's response:
ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_pOsKdUlqvdyttYB67MOj434b', function=Function(arguments='{"location":"San Francisco"}', name='get_current_time'), type='function')])
الكود اللازم لتنفيذ المهمة:
الآن بعد أن اختار النموذج أي دالة يجب تشغيلها، يجب تنفيذ الكود لتنفيذ المهمة. يمكننا تنفيذ كود الحصول على الوقت الحالي باستخدام بايثون. سنحتاج أيضًا إلى كتابة كود لاستخلاص الاسم والمعاملات من response_message للحصول على النتيجة النهائية.
def get_current_time(location):
"""Get the current time for a given location"""
print(f"get_current_time called with location: {location}")
location_lower = location.lower()
for key, timezone in TIMEZONE_DATA.items():
if key in location_lower:
print(f"Timezone found for {key}")
current_time = datetime.now(ZoneInfo(timezone)).strftime("%I:%M %p")
return json.dumps({
"location": location,
"current_time": current_time
})
print(f"No timezone data found for {location_lower}")
return json.dumps({"location": location, "current_time": "unknown"})
# التعامل مع استدعاءات الدالة
if response_message.tool_calls:
for tool_call in response_message.tool_calls:
if tool_call.function.name == "get_current_time":
function_args = json.loads(tool_call.function.arguments)
time_response = get_current_time(
location=function_args.get("location")
)
messages.append({
"tool_call_id": tool_call.id,
"role": "tool",
"name": "get_current_time",
"content": time_response,
})
else:
print("No tool calls were made by the model.")
# استدعاء واجهة برمجة التطبيقات الثانية: الحصول على الاستجابة النهائية من النموذج
final_response = client.chat.completions.create(
model=deployment_name,
messages=messages,
)
return final_response.choices[0].message.content
get_current_time called with location: San Francisco
Timezone found for san francisco
The current time in San Francisco is 09:24 AM.
استدعاء الدوال هو جوهر معظم، إن لم يكن كل، نمط تصميم استخدام الأدوات، ومع ذلك فإن تنفيذه من الصفر قد يكون تحديًا أحيانًا. كما تعلمنا في الدرس 2 توفر الأُطُر الوكيلة كتلًا جاهزة لبناء تطبيقات استخدام الأدوات.
فيما يلي بعض الأمثلة على كيفية تطبيق نمط تصميم استخدام الأدوات باستخدام أُطُر وكيلة مختلفة:
إطار عمل Microsoft Agent هو إطار عمل مفتوح المصدر لبناء وكلاء الذكاء الاصطناعي. يُبسط عملية استخدام استدعاء الدوال من خلال السماح لك بتعريف الأدوات كدوال بايثون باستخدام المزخرف @tool. يدير الإطار التفاعل بين النموذج والكود الخاص بك. كما يوفر الوصول إلى أدوات جاهزة مثل البحث في الملفات ومفسر الشفرة عبر AzureAIProjectAgentProvider.
الرسم التوضيحي التالي يوضح عملية استدعاء الدوال باستخدام إطار عمل Microsoft Agent:

في إطار عمل Microsoft Agent، تُعرف الأدوات كدوال مزخرفة. يمكننا تحويل دالة get_current_time التي رأيناها سابقًا إلى أداة باستخدام المزخرف @tool. يقوم الإطار تلقائيًا بتسلسل الدالة ومعاملاتها، وإنشاء المخطط لإرساله إلى نموذج اللغة الكبيرة.
from agent_framework import tool
from agent_framework.azure import AzureAIProjectAgentProvider
from azure.identity import AzureCliCredential
@tool
def get_current_time(location: str) -> str:
"""Get the current time for a given location"""
...
# إنشاء العميل
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())
# إنشاء وكيل وتشغيله باستخدام الأداة
agent = await provider.create_agent(name="TimeAgent", instructions="Use available tools to answer questions.", tools=get_current_time)
response = await agent.run("What time is it?")
خدمة Azure AI Agent هي إطار وكيل أحدث مصمم لتمكين المطورين من بناء، نشر، وتوسيع نطاق وكلاء ذكيين عالي الجودة وقابلين للتوسع بأمان دون الحاجة لإدارة الموارد الحاسوبية والتخزينية الأساسية. هو مفيد بشكل خاص لتطبيقات المؤسسات لأنه خدمة مُدارة بالكامل مع أمان على مستوى المؤسسات.
بالمقارنة مع تطوير باستخدام واجهة برمجة تطبيقات LLM مباشرةً، تقدم خدمة Azure AI Agent بعض المزايا، بما في ذلك:
يمكن تقسيم الأدوات المتاحة في خدمة Azure AI Agent إلى فئتين:
تتيح لنا خدمة الوكيل القدرة على استخدام هذه الأدوات معًا كمجموعة أدوات (toolset). كما تستخدم threads التي تتبع تاريخ الرسائل من محادثة معينة.
تخيل أنك وكيل مبيعات في شركة تسمى Contoso. تريد تطوير وكيل حواري يمكنه الرد على أسئلة تتعلق ببيانات المبيعات الخاصة بك.
توضح الصورة التالية كيف يمكنك استخدام خدمة Azure AI Agent لتحليل بيانات مبيعاتك:

لاستخدام أي من هذه الأدوات مع الخدمة، يمكننا إنشاء عميل وتعريف أداة أو مجموعة أدوات. لتنفيذ ذلك عمليًا يمكننا استخدام كود بايثون التالي. سيتمكن نموذج اللغة الكبيرة من النظر إلى مجموعة الأدوات وتحديد ما إذا كان سيستخدم الدالة التي أنشأها المستخدم، fetch_sales_data_using_sqlite_query، أو مفسر الشفرة المدمج اعتمادًا على طلب المستخدم.
import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from fetch_sales_data_functions import fetch_sales_data_using_sqlite_query # دالة fetch_sales_data_using_sqlite_query والتي يمكن العثور عليها في ملف fetch_sales_data_functions.py.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool
project_client = AIProjectClient.from_connection_string(
credential=DefaultAzureCredential(),
conn_str=os.environ["PROJECT_CONNECTION_STRING"],
)
# تهيئة مجموعة الأدوات
toolset = ToolSet()
# تهيئة وكيل استدعاء الدوال مع دالة fetch_sales_data_using_sqlite_query وإضافتها إلى مجموعة الأدوات
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)
# تهيئة أداة مفسر الكود وإضافتها إلى مجموعة الأدوات.
code_interpreter = code_interpreter = CodeInterpreterTool()
toolset.add(code_interpreter)
agent = project_client.agents.create_agent(
model="gpt-4o-mini", name="my-agent", instructions="You are helpful agent",
toolset=toolset
)
من المخاوف الشائعة المتعلقة بـ SQL الذي يتم إنشاؤه ديناميكيًا بواسطة نماذج اللغة الكبيرة هي الأمان، خصوصًا خطر حقن SQL أو الأفعال الخبيثة مثل حذف أو العبث بقاعدة البيانات. في حين أن هذه المخاوف صحيحة، يمكن التخفيف منها بفعالية من خلال تكوين أذونات الوصول إلى قاعدة البيانات بشكل صحيح. بالنسبة لمعظم قواعد البيانات، يتطلب هذا تكوين قاعدة البيانات للقراءة فقط. بالنسبة لخدمات قواعد البيانات مثل PostgreSQL أو Azure SQL، يجب تعيين دور للقراءة فقط (SELECT) للتطبيق.
يشكل تشغيل التطبيق في بيئة آمنة حماية إضافية. في السيناريوهات المؤسسية، يتم عادةً استخراج البيانات وتحويلها من أنظمة تشغيلية إلى قاعدة بيانات أو مستودع بيانات للقراءة فقط بهيكل بيانات سهل الاستخدام. هذه المقاربة تضمن أن البيانات آمنة، ومحسنة للأداء والوصول، وأن التطبيق يتمتع بإمكانية وصول مقيدة للقراءة فقط.
انضم إلى خادم Microsoft Foundry على ديسكورد للتواصل مع متعلمين آخرين، حضور الساعات المكتبية، والحصول على إجابات لأسئلتك حول وكلاء الذكاء الاصطناعي.
إخلاء المسؤولية: تمت ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي Co-op Translator. بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر المعتمد والموثوق. بالنسبة للمعلومات الحساسة أو الهامة، يُنصح باستخدام الترجمة المهنية من قبل مترجم بشري. نحن غير مسؤولين عن أي سوء فهم أو سوء تفسير ناتج عن استخدام هذه الترجمة.