أهلاً بك في درس جديد في رحلتنا لبناء وكلاء الذكاء الاصطناعي!
في الدروس السابقة، وضعنا أساساً متيناً. تعلمنا كيف نجعل وكيلنا "يفكر بصوت عالٍ" باستخدام إطار عمل "الفعل والاستدلال" (ReAct)، مما سمح له بالتخطيط لخطواته واختيار الأداة المناسبة. لكن حتى الآن، كانت أدواتنا بسيطة ومحدودة.
اليوم، سنمنح وكيلنا قدرة خارقة: الوصول إلى المعرفة اللامحدودة وشبه الفورية للإنترنت. هدفنا هو تحقيق مخرج التعلم التالي: بناء أداة للبحث على الإنترنت باستخدام واجهة برمجية جاهزة. سنحول وكيلنا من كيان يعتمد فقط على معرفته المدمجة إلى باحث نشط يمكنه العثور على أحدث المعلومات والإجابة على الأسئلة المتعلقة بالأحداث الجارية.
1. لماذا يحتاج وكيلنا إلى البحث في الإنترنت؟
نماذج اللغة الكبيرة (LLMs)، التي تمثل "عقل" وكيلنا، هي قوية بشكل لا يصدق، لكن لديها قيود جوهرية: معرفتها ليست محدّثة. تم تدريبها على كميات هائلة من البيانات حتى تاريخ معين (يُعرف بـ "knowledge cutoff"). هذا يعني أن النموذج لا يعرف أي شيء حدث بعد ذلك التاريخ.
على سبيل المثال، إذا سألت نموذج GPT-4 مباشرةً عن "نتائج مباراة كرة القدم التي جرت بالأمس"، فسيجيب بأنه لا يملك وصولاً للمعلومات في الوقت الفعلي.
هنا يأتي دور الأدوات. من خلال تزويد وكيلنا بأداة للبحث على الإنترنت، نحن نمنحه القدرة على:
- تجاوز حدود المعرفة: الإجابة على أسئلة حول الأحداث الأخيرة والأخبار العاجلة.
- التحقق من الحقائق: التأكد من صحة المعلومات التي قد تكون تغيرت مع مرور الوقت.
- إيجاد معلومات محددة: البحث عن تفاصيل دقيقة قد لا تكون جزءاً من بيانات التدريب الأساسية.
2. واجهة برمجة تطبيقات البحث (Search API)
في الوحدة الثانية، تعلمنا عن واجهات برمجة التطبيقات (APIs) وكيف تسمح لبرامجنا بالتواصل مع خدمات أخرى عبر الإنترنت. والآن سنطبق ذلك عملياً.

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

3. بناء أداة البحث خطوة بخطوة
الآن، لنقم ببناء الأداة. سنتبع ثلاث خطوات رئيسية: الحصول على مفتاح API، كتابة دالة Python، ثم وصف هذه الدالة كأداة للوكيل.
الخطوة الأولى: الحصول على مفتاح API من Tavily
- اذهب إلى موقع Tavily AI.
- أنشئ حساباً مجانياً.
- بعد تسجيل الدخول، اذهب إلى لوحة التحكم الخاصة بك وانسخ مفتاح API الخاص بك (API Key).
- مهم جداً: تذكر ما تعلمناه في الوحدة الثانية عن تأمين مفاتيح API. لا تضع المفتاح مباشرة في الكود! قم بتخزينه كمتغير بيئة (environment variable)، على سبيل المثال باسم
TAVILY_API_KEY.
الخطوة الثانية: كتابة دالة البحث في Python
سنكتب الآن دالة search_tavily التي تأخذ استعلاماً (query) كمدخل، وتتصل بـ Tavily API، وتعيد نتائج البحث. ستحتاج إلى تثبيت مكتبة requests إذا لم تكن مثبتة بالفعل (pip install requests).
import os
import requests
import json
def search_tavily(query: str) -> str:
"""
تستخدم هذه الدالة Tavily API للبحث عن استعلام معين على الإنترنت.
"""
# جلب مفتاح API من متغيرات البيئة
api_key = os.environ.get("TAVILY_API_KEY")
if not api_key:
return "خطأ: لم يتم العثور على مفتاح Tavily API في متغيرات البيئة."
# إعداد الطلب إلى Tavily API
url = "https://api.tavily.com/search"
payload = json.dumps({
"api_key": api_key,
"query": query,
"search_depth": "basic", # يمكن استخدام "advanced" لنتائج أكثر تفصيلاً
"max_results": 3
})
headers = {
'Content-Type': 'application/json'
}
try:
# إرسال طلب POST
response = requests.post(url, headers=headers, data=payload)
response.raise_for_status() # يثير خطأ إذا كانت الاستجابة غير ناجحة
# استخلاص وتنسيق النتائج
results = response.json()
# تنسيق النتائج في نص مبسط لنموذج اللغة
formatted_results = f"نتائج البحث عن '{query}':\n\n"
if "results" in results and results["results"]:
for res in results["results"]:
formatted_results += f"- العنوان: {res.get('title', 'N/A')}\n"
formatted_results += f" الرابط: {res.get('url', 'N/A')}\n"
formatted_results += f" المحتوى: {res.get('content', 'N/A')}\n\n"
else:
return f"لم يتم العثور على نتائج لـ '{query}'."
return formatted_results
except requests.exceptions.RequestException as e:
return f"حدث خطأ أثناء الاتصال بـ Tavily API: {e}"
except Exception as e:
return f"حدث خطأ غير متوقع: {e}"
# مثال للاختبار (تأكد من إعداد متغير البيئة أولاً)
# print(search_tavily("ما هي آخر أخبار شركة أبل؟"))
هذه الدالة تقوم بكل العمل الشاق: تتصل بالـ API، تعالج الاستجابة، وتتعامل مع الأخطاء المحتملة.
4. دمج أداة البحث في الوكيل
الآن بعد أن أصبح لدينا دالة بايثون تعمل، كيف نجعل الوكيل يستخدمها؟ هنا نعود إلى ما تعلمناه في الدروس السابقة عن "استدعاء الدوال" (Function Calling) ودورة "التفكير-الفعل-الملاحظة".
العملية ستكون متطابقة تماماً مع ما رأيناه في الدرس السابق، ولكن بدلاً من أداة لتحليل المشاعر أو حساب الطقس، لدينا الآن أداة للبحث.
الفيديو التالي يشرح هذه العملية بشكل ممتاز باستخدام مثال لواجهة برمجة تطبيقات الطقس. المبدأ هو نفسه تماماً. ركز على تسلسل الخطوات، وليس على تفاصيل الطقس.
Building AI Agents in Pure Python - Beginner Course
لفهم كيفية دمج أداتنا الجديدة مع الوكيل، دعنا نشاهد هذا الفيديو. على الرغم من أنه يستخدم مثالاً عن واجهة برمجة تطبيقات الطقس (weather API)، إلا أن المبدأ والخطوات البرمجية هي نفسها تماماً لما سنفعله مع أداة البحث. ركز على العملية المكونة من خطوتين: الأولى حيث يقرر النموذج اللغوي استدعاء الأداة، والثانية حيث يستخدم نتيجة الأداة لصياغة الإجابة النهائية.
شاهد المقاطع التالية بالترتيب: من 08:36 إلى 10:45: يقدم هذا الجزء فكرة استخدام الأدوات وكيف يقرر الذكاء الاصطناعي استدعاءها. من 10:45 إلى 12:22: يوضح كيفية تعريف دالة بايثون ثم وصفها كأداة للنموذج اللغوي بالتنسيق الذي يتوقعه (اسم، وصف، معلمات). من 12:22 إلى 14:03: يشرح كيف يحلل النموذج اللغوي سؤال المستخدم ('ما الطقس في باريس؟') ويستخرج المعلمات اللازمة للأداة. من 14:03 إلى 17:53: يعرض أهم خطوة: كيف يقوم الكود الخاص بنا بتنفيذ الدالة باستخدام المعلمات التي قدمها النموذج، ثم يعيد النتيجة إلى النموذج ليستخدمها في تكوين الإجابة النهائية.
كما شاهدت في الفيديو، العملية تتلخص في:
-
وصف الأداة للنموذج: نقوم بإنشاء وصف بصيغة JSON لدالة
search_tavilyحتى يفهم النموذج اللغوي ما تفعله ومتى يستخدمها.{ "type": "function", "function": { "name": "search_tavily", "description": "يبحث على الإنترنت عن معلومات حول استعلام معين باستخدام Tavily API. استخدم هذا للحصول على معلومات حديثة أو عن أحداث جارية.", "parameters": { "type": "object", "properties": { "query": { "type": "string", "description": "سؤال البحث الذي سيتم إرساله. على سبيل المثال: 'سعر سهم Nvidia اليوم'." } }, "required": ["query"] } } } -
حلقة التفكير والفعل:
- المستخدم: يسأل "ما الجديد في نموذج Sora من OpenAI؟"
- الوكيل (Thought): "هذا سؤال عن حدث تكنولوجي حديث. معرفتي قد تكون قديمة. يجب أن أستخدم أداة البحث
search_tavily." - الوكيل (Action): يقرر استدعاء
search_tavily(query="الجديد في نموذج Sora من OpenAI"). - الكود الخاص بنا: يستقبل هذا القرار، وينفذ دالة
search_tavilyالفعلية، ويحصل على نتائج البحث كنص. هذه هي الملاحظة (Observation). - الكود الخاص بنا: يرسل هذه الملاحظة (نتائج البحث) مرة أخرى إلى الوكيل.
- الوكيل (Thought): "لدي الآن ملخص للمقالات الحديثة حول Sora. يمكنني استخدام هذه المعلومات لصياغة إجابة شاملة للمستخدم."
- الوكيل (Action): يقدم الإجابة النهائية.
بهذه الطريقة، قمنا بدمج أداة قوية جداً في ترسانة وكيلنا.
اختبر فهمك!
لنفترض أنك سألت الوكيل: "لخّص لي رواية الحرب والسلام". هل يجب على الوكيل استخدام أداة البحث في هذه الحالة؟ لماذا؟
اظهر الإجابة
على الأرجح لا. رواية "الحرب والسلام" هي عمل أدبي كلاسيكي ومشهور جداً. المعلومات عنها مستقرة ومن المؤكد أنها كانت جزءاً من بيانات تدريب النموذج اللغوي. استخدام أداة البحث سيكون غير فعال وبطيئاً. يجب على الوكيل الذكي أن يقرر استخدام أداة البحث فقط عندما يكون السؤال حول معلومات حديثة، متغيرة، أو متخصصة جداً قد لا تكون ضمن معرفته الأساسية. هذا هو جوهر "التفكير" قبل "الفعل".
خلاصة الدرس
في هذا الدرس، حققنا قفزة نوعية في قدرات وكيلنا. لم يعد مقيداً بمعرفته المسبقة، بل أصبح قادراً على استكشاف العالم الرقمي للعثور على إجابات.
أهم النقاط التي تعلمناها:
- لماذا البحث مهم: وكلاء الذكاء الاصطناعي يحتاجون إلى أدوات بحث للتغلب على قيود المعرفة المحدّثة لنماذج اللغة الكبيرة.
- APIs البحث المتخصصة: خدمات مثل Tavily مصممة خصيصاً لتوفير نتائج بحث موجزة ومناسبة للوكلاء.
- بناء الأداة: العملية تتضمن كتابة دالة Python تستخدم مكتبة
requestsللاتصال بالـ API وتأمين مفتاح API باستخدام متغيرات البيئة. - التكامل مع الوكيل: دمج الأداة يتبع نفس نمط "استدعاء الدوال" الذي تعلمناه: نصف الأداة للنموذج، وننفذها عندما يقرر الوكيل استخدامها، ثم نعيد النتائج إليه ليكمل مهمته.
ماذا بعد؟
لقد منحنا وكيلنا "عيوناً" ليرى بها الإنترنت. في الدرس القادم، سنمنحه "يداً" ليتفاعل مع بيئته المباشرة. سنتعلم كيفية بناء أداة لقراءة وكتابة محتوى ملف نصي محلي، مما يسمح للوكيل بحفظ المعلومات والعمل مع الملفات على جهاز الكمبيوتر الخاص بك.