البحث العميق في الذكاء الاصطناعي ليس نموذجًا أحاديًا ضخمًا - بل هو عملية، سير عمل تكراري يتضمن البحث، القراءة، والتفكير حتى يتم العثور على إجابة. تستخدم أنظمة OpenAI المملوكة، مثل تلك التي تشغّل ChatGPT أو GPT-4، خطوط أنابيب معقدة تقوم بتكرير الردود باستمرار. الآن تخيل إمكانية بناء نظام مشابه باستخدام أدوات مفتوحة المصدر. هذه المقالة تشرح كيفية إعادة إنشاء نظام البحث العميق باستخدام مشروع jina-ai/node-DeepResearch. سنقوم بتحليل الكود، وتفصيل كل مكون، وسنظهر لك كيفية إعداد النظام وتوسيعه.
1. نظرة عامة وطبيعة الغرض
تم بناء DeepResearch حول فكرة بسيطة لكنها قوية:
استمر في البحث وقراءة صفحات الويب حتى تجد الإجابة (أو تتجاوز ميزانية التوكن).
تأخذ النظام استفسارًا (على سبيل المثال، "من هو الأكبر؟ cohere، jina ai، voyage؟") ويدخل في حلقة. في كل خطوة، يقرر الوكيل (وحدة ذكية) على إجراء. قد يبحث عن كلمات مفتاحية جديدة، يقرأ محتويات عناوين URL، يفكر عن طريق توليد أسئلة متابعة، أو يقدم إجابة إذا كان متأكدًا. تستمر هذه الدورة التكرارية حتى تكون الإجابة نهائية أو تتجاوز ميزانية التوكن (وهي رمز لموارد الحوسبة).
التركيب والإعداد
قبل الغوص في الكود، تحتاج إلى تثبيت التبعيات المطلوبة وضبط مفاتيح API الخاصة بك. يستخدم المشروع Gemini لنمذجة اللغة، وBrave أو DuckDuckGo للبحث على الويب، وJina Reader لجلب محتوى صفحات الويب. إليك كيفية إعداد المشروع:
export GEMINI_API_KEY=... # لمفتاح API Gemini، اسأل هان
export JINA_API_KEY=jina_... # مفتاح API Jina المجاني، احصل عليه من https://jina.ai/reader
export BRAVE_API_KEY=... # اختياري؛ إذا لم يتم تقديمه، فإنه يتم تعيينه على بحث DuckDuckGo
git clone https://github.com/jina-ai/node-DeepResearch.git
cd node-DeepResearch
npm install
يوفر README أمثلة لتشغيل النظام مع استفسارات مختلفة:
- استفسار بسيط:
npm run dev "1+1="أوnpm run dev "ما هي عاصمة فرنسا؟" - استفسار متعدد الخطوات:
npm run dev "ما هي آخر الأخبار من Jina AI؟"npm run dev "ما هو حساب تويتر لمؤسس جينا AI" - استفسار غامض، يشبه البحث:
npm run dev "من هو الأكبر؟ cohere، jina ai، voyage؟"npm run dev "من سيكون رئيس الولايات المتحدة في 2028؟"npm run dev "ما ينبغي أن تكون استراتيجية جينا AI لعام 2025؟"
بالإضافة إلى واجهة سطر الأوامر، يتضمن المشروع أيضًا واجهة برمجة تطبيقات خادم الويب التي تكشف النقاط النهائية لتقديم الاستفسارات وبث تحديثات التقدم.
2. الهيكل والمكونات الرئيسية
دعنا نفصل المكونات الرئيسية للنظام من خلال استكشاف الملفات الأساسية:
2.1 agent.ts – المنطق الأساسي
ملف agent.ts هو قلب النظام. يقوم بتنفيذ المنطق لدورة "البحث العميق": توليد المطالبات، اتخاذ القرارات، والتكرار خلال خطوات البحث، القراءة، التفكير، والإجابة.
العناصر الرئيسية في agent.ts:
الاستيرادات والإعداد:
يبدأ الملف باستيراد أدوات ومكتبات مختلفة:
- GoogleGenerativeAI يُستخدم لتوليد اللغة.
- readUrl من
./tools/readيجلب ويعالج محتوى صفحة الويب. - duckSearch وbraveSearch توفران إمكانيات البحث الخارجية.
- وظائف مساعدة مثل rewriteQuery، dedupQueries، evaluateAnswer، وanalyzeSteps تساعد في تحسين الاستفسارات وتقييم الردود.
- قيم التكوين (مفاتيح API، ميزانيات التوكن، وتكوينات النموذج) يتم استيرادها من
config.ts. - تستخدم أدوات تتبع التوكن والإجراء لمراقبة الاستخدام الحالي للتوكن وحالة تقدم الوكيل.
- أخيرًا، يستورد الملف الأنواع (مثل
StepAction،ResponseSchema) المعرفة فيtypes.ts.
دالة النوم:
async function sleep(ms: number) {
const seconds = Math.ceil(ms / 1000);
console.log(`انتظار ${seconds}s...`);
return new Promise(resolve => setTimeout(resolve, ms));
}
تستخدم هذه الوظيفة المساعدة لتأخير العمليات - مفيدة لتجنب الحدود القصوى عند استدعاء واجهات برمجة التطبيقات الخارجية.
توليد المخطط:
تعرف دالة getSchema مخطط JSON لاستجابة الوكيل. تبني ديناميكيًا مخططًا يتضمن خصائص لـ:
- البحث: يتطلب استفسارًا قائمًا على كلمات مفتاحية
searchQuery. - الإجابة: يحدد أنه يجب أن تتضمن الإجابة النهائية نصًا بلغة طبيعية ومراجع داعمة (اقتباسات دقيقة وروابط URLs).
- التفكير: يسرد الأسئلة الفرعية التوضيحية لسد الفجوات المعرفية.
- الزيارة: يحتوي على أهداف URL لقراءة المحتوى الخارجي.
من خلال فرض مخطط JSON صارم، تظل مخرجات الوكيل متسقة ويمكن قراءتها بواسطة الآلات.
توليد المطالبات:
تقوم دالة getPrompt بإنشاء مطالبة مفصلة يتم إرسالها إلى نموذج اللغة. تجمع بين عدة أقسام:
- عنوان: يتضمن التاريخ الحالي والسؤال الأصلي.
- السياق والمعرفة: يتم تضمين أي إجراءات سابقة والمعرفة الوسيطة المجمعة.
- محاولات غير ناجحة: إذا فشلت الإجراءات السابقة في إنتاج إجابة حاسمة، يتم تسجيل تلك الإخفاقات (مع الأسباب والتحسينات).
- الإجراءات: تظهر قائمة بالإجراءات المحتملة. اعتمادًا على العلامات (مثل
allowSearch،allowRead، إلخ)، تعدد العمليات المسموح بها. في "وضع الوحش"، تحث التعليمات الوكيل على بذل قصارى جهده لإنتاج إجابة حتى لو بقيت شكوك.
توجه هذه المطالبة متعددة الطبقات نموذج الذكاء الاصطناعي التوليدي "للتفكير" خطوة بخطوة واختيار إجراء واحد في كل مرة.
الحلقة الرئيسية في getResponse:
تعد دالة getResponse جوهر حلقة الوكيل التكرارية. تقوم بإعداد السياق الأولي:
- المتعقبات: يتم استخدام متعقبين - متعقب التوكن لمراقبة عدد التوكنات المستخدمة (لتجنب تجاوز ميزانية النظام) ومتتبع الإجراء لتتبع كل خطوة ونتائجها.
- الفجوات والمعرفة: يبدأ بـ "فجوة" (السؤال الأصلي) ثم يضيف أسئلة وسيطة إذا كان النظام يحتاج إلى التفكير في تفكيره.
داخل حلقة بينما، يفعل الوكيل:
- ينتظر (باستخدام دالة النوم) لتجنب حدود API.
- يولد مطالبة بناءً على السياق الحالي.
- يستدعي النموذج التوليدي (عبر GoogleGenerativeAI) لإنتاج استجابة.
- يحلل الاستجابة JSON لتحديد أي إجراء تم اتخاذه (إجابة، تفكير، بحث، أو زيارة).
- اعتمادًا على الإجراء:
- الإجابة: يقيم الإجابة وإذا كانت حاسمة، ينهي الحلقة.
- التفكير: يعالج الأسئلة الفرعية لسد الفجوات المعرفية.
- البحث: يعيد كتابة استفسار البحث، ويزيل التكرار من الكلمات المفتاحية المستخدمة مسبقًا، ويسترجع URLs جديدة إما من DuckDuckGo أو Brave.
- الزيارة: يقرأ المحتوى من URLs المقدمة ويحدث قاعدة المعرفة.
إذا نفدت الحلقة الميزانية أو حدثت الكثير من المحاولات السيئة، يدخل النظام "وضع الوحش"، حيث يتم إجراء محاولة نهائية عدوانية للإجابة.
تخزين السياق:
تسجل دالة storeContext المطالبة الحالية والحالات المختلفة للذاكرة (السياق، الاستفسارات، الأسئلة، والمعرفة المجمعة) إلى ملفات. تساعد هذه العملية الأرشيفية في تصحيح الأخطاء وتسمح بمزيد من التحليل لعملية اتخاذ القرار.
التنفيذ النهائي:
تستخدم دالة main() في نهاية agent.ts معلمة سطر الأوامر (الاستفسار)، تستدعي getResponse، وتطبع الإجابة النهائية إلى جانب ملخص لاستخدام التوكنات.
2.2 config.ts – إعداد البيئة
ملف config.ts هو المكان الذي يتم فيه تعريف بيئة النموذج وتكويناته:
- المتغيرات البيئية: باستخدام
dotenv، يقوم بتحميل مفاتيح API لـ Gemini، Jina، وBrave. كما يدعم إعداد وكيل HTTPS. - موفر البحث: يحدد النظام موفر البحث ديناميكيًا بناءً على ما إذا كان مفتاح API Brave قد تم تقديمه؛ إذا لم يكن كذلك، يتم تعيينه إلى DuckDuckGo.
- تكوينات النموذج: يتم إعداد ملف تكوينات النموذج الافتراضية والخاصة لمهام مختلفة، مثل إعادة كتابة الاستفسارات، إزالة التكرار، والتقييم. على سبيل المثال، يتم تكوين النموذج التوليدي للوكيل بدرجة حرارة 0.7 لتحقيق توازن بين الإبداع والحتمية.
- ميزانية التوكن والتأخير: يتم تعيين الثابت
STEP_SLEEPإلى 1000 مللي ثانية، مما يضمن توقفًا لمدة ثانية واحدة بين الخطوات.
يسهل ملف التكوين هذا تغيير الإعدادات وتكييف النظام مع بيئات أو سلوكيات نموذج مختلفة.
2.3 server.ts – واجهة برمجة تطبيقات خادم الويب
للسماح للمستخدمين بالتفاعل مع DeepResearch عبر طلبات HTTP، يتضمن النظام خادمًا بسيطًا يعتمد على Express في server.ts. يقوم هذا الملف بإعداد نقاط النهاية التي تتعامل مع تقديم الاستفسارات وبث تحديثات التقدم في الوقت الفعلي.
النقاط الرئيسية في server.ts:
إعداد Express:
يستخدم الخادم Express وCORS لدعم الطلبات عبر الأصول. يستمع إلى المنفذ 3000 (أو منفذ محدد في البيئة).
نقطة نهاية الاستفسار (POST /api/v1/query):
- ترسل العملاء حمولة JSON تحتوي على الاستفسار، ميزانية التوكن، وعدد المحاولات السيئة المسموح بها.
- ينشئ الخادم متعقبًا جديدًا (لاستخدام التوكن وحالة الإجراء) ويعين معرف طلب فريد
requestId. - يتم معالجة الطلب بشكل غير متزامن عن طريق استدعاء
getResponse. - بمجرد الانتهاء، يتم تخزين الإجابة النهائية، ويتم بث التقدم باستخدام
EventEmitter.
نقطة نهاية البث (GET /api/v1/stream/:requestId):
- تستخدم هذه النقطة أحداث الخدمة المرسلة (SSE) لدفع التحديثات باستمرار إلى العميل.
- عندما يتخذ الوكيل إجراءات (البحث، التفكير، الزيارة، الإجابة)، يتم بث أحداث التقدم. تتضمن كل حدث معلومات الخطوة الحالية، واستخدام التوكن، وتفاصيل الإجراء.
- هذا يسمح للعملاء بمراقبة عملية البحث في الوقت الفعلي.
تخزين المهام واسترجاعها:
يكتب الخادم نتائج المهام إلى نظام الملفات (تحت دليل tasks) ويوفر نقطة نهاية (GET /api/v1/task/:requestId) لاسترجاع نتيجة مخزنة.
تجعل هذه المكونة لخادم الويب وكيل البحث متاحًا عبر HTTP، مما يتيح كل من التجارب التفاعلية والتكامل في أنظمة أكبر.
2.4 test-duck.ts – أداة لاختبار البحث
ملف test-duck.ts هو نص مستقل يستخدم Axios لإرسال طلب HTTP GET إلى واجهة برمجة تطبيقات خارجية (في هذه الحالة، jsonplaceholder.typicode.com) كاختبار. على الرغم من أن وظيفته الأساسية هي التحقق من أن طلبات HTTP تعمل بشكل صحيح (بما في ذلك إعداد الرؤوس ومعالجة الأخطاء)، إلا أنه يعمل كأحد الأمثلة على كيفية التعامل مع الطلبات الخارجية داخل النظام. في إعداد أكثر تعقيدًا، تُستخدم أنماط مماثلة عند الاستعلام عن واجهات برمجة تطبيقات البحث مثل DuckDuckGo أو Brave.
2.5 types.ts – تعريف هياكل بيانات متسقة
يحدد ملف types.ts جميع الأنواع المخصصة المستخدمة عبر المشروع:
أنواع الإجراءات:
تشمل هذه الأنواع المختلفة من الإجراءات التي يمكن أن يقوم بها الوكيل:
- SearchAction: يحتوي على سلسلة
searchQuery. - AnswerAction: يتطلب سلسلة
answerومراجع داعمةreferences. - ReflectAction: يتضمن مصفوفة من
questionsToAnswer. - VisitAction: يحتوي على قائمة من
URLTargets.
أنواع الاستجابة:
يحدد الملف استجابات مهيكلة لنتائج البحث، قراءة URLs، التقييم، تحليل الأخطاء، والمزيد. يساعد ذلك في الحفاظ على الاتساق ويضمن أن كل وحدة تفسر البيانات بنفس الطريقة.
أنواع المخطط:
تضمن تعريفات مخطط JSON أن الاستجابات المولدة من النموذج اللغوي تتبع بدقة التنسيق المتوقع. هذا مهم لمعالجة البيانات المستقبلية.
سياق المتعقب:
يتم أيضًا تعريف أنواع مخصصة لمتعقبي التوكن والإجراء، والتي تُستخدم لمراقبة حالة المحادثة وعملية البحث.
3. عملية البحث العميق التكرارية
يتبع النظام العام عملية منهجية وتكرارية mimics كيف يمكن أن يعمل الباحث البشري:
التهيئة:
تبدأ العملية بالسؤال الأصلي، الذي يضاف إلى قائمة "الفجوات" (أي المجهولات التي تحتاج إلى ملء).
توليد المطالبات:
يبني الوكيل مطالبة باستخدام السؤال الحالي، السياق السابق، المعرفة المجمعة، وحتى المحاولات غير الناجحة. ثم تُرسل هذه المطالبة إلى نموذج الذكاء الاصطناعي التوليدي.
اختيار الإجراء:
استنادًا إلى مخرجات النموذج، يختار الوكيل واحدة من عدة إجراءات:
- البحث: صياغة استفسار جديد لجمع المزيد من البيانات.
- الزيارة: استعادة محتوى مفصل من URL محدد.
- التفكير: توليد أسئلة فرعية توضيحية لمعالجة أي فجوات معرفية.
- الإجابة: تقديم إجابة نهائية إذا تم اعتبار المعلومات محددة.
تحديث السياق:
تقوم كل خطوة بتحديث المتعقبات الداخلية (استخدام التوكن وحالة الإجراء) وتؤرخ الحالة الحالية إلى الملفات. يضمن هذا الشفافية ويسمح بتصحيح الأخطاء أو المراجعة لاحقًا.
التقييم والتكرار:
عندما يُقترح إجابة، تتحقق خطوة تقييم مما إذا كانت حاسمة. إذا لم يكن الأمر كذلك، يقوم النظام بتخزين تفاصيل المحاولة الفاشلة ويعدّل استراتيجيته. تستمر الدورة حتى يتم العثور على إجابة مرضية أو تنفد ميزانية التوكن.
وضع الوحش:
إذا فشلت الخطوات الطبيعية في إنتاج إجابة حاسمة ضمن القيود، يدخل النظام "وضع الوحش". في هذا الوضع، يُجبر الذكاء الاصطناعي التوليدي على إنتاج إجابة بناءً على السياق المتراكم - حتى لو كان ذلك يعني تقديم تخمين مثقف.
4. التقدم والتعليقات في الوقت الحقيقي
تُعتبر ميزة أساسية في نظام DeepResearch هي آلية التعليقات في الوقت الحقيقي. من خلال نقطة نهاية البث الخاصة بالخادم الويب:
- يتلقى العملاء تحديثات التقدم التي توضح أي إجراء تم اتخاذه، إحصاءات استخدام التوكن، والحالة الحالية لمتعقب الإجراء.
- تتضمن أحداث التقدم (كما هو موضح في أمثلة README) كلًا من عملية تفكير الوكيل وتفاصيل مثل الخطوة الحالية وتفكيك التوكنات.
- تكون حلقة التغذية الراجعة الحية هذه قيمة للغاية لتصحيح الأخطاء، مراقبة استخدام الموارد، وفهم كيفية تفكير النظام.
على سبيل المثال، قد يبدو حدث التقدم هكذا:
data: {
"type": "progress",
"trackers": {
"tokenUsage": 74950,
"tokenBreakdown": {
"agent": 64631,
"read": 10319
},
"actionState": {
"action": "search",
"thoughts": "النص يذكر العديد من المستثمرين في Jina AI لكن لا يحدد النسب المئوية للملكية. حاجة البحث المباشر.",
"URLTargets": [],
"answer": "",
"questionsToAnswer": [],
"references": [],
"searchQuery": "نسب ملكية المستثمرين في Jina AI"
},
"step": 7,
"badAttempts": 0,
"gaps": []
}
}
يسمح هذا التقرير المفصل حول التقدم للمطورين برؤية كيف تتطور تفكير الوكيل بمرور الوقت، مما يوفر رؤى حول كل من النجاحات والمجالات التي تحتاج إلى تحسين.
5. توسيع وتخصيص DeepResearch
تعني الطبيعة المفتوحة المصدر لهذا المشروع أنك تستطيع تكييف النظام لاحتياجاتك. إليك بعض الأفكار لتوسيع DeepResearch:
موفرو بحث مخصصون:
قد تدمج مزودين إضافيين للبحث أو تخصيص عملية إعادة كتابة الاستفسارات لعمليات البحث المحددة للمجال.
وحدات قراءة محسّنة:
إذا كنت بحاجة إلى معالجة نصوص أكثر دقة، يمكنك دمج نماذج NLP بديلة أو تعديل مكون Jina Reader للتعامل مع أنواع محتوى جديدة.
تحسين التقييم:
تتحقق وحدة التقييم حاليًا مما إذا كانت الإجابة حاسمة. يمكنك توسيع ذلك لتضمين مقاييس أكثر دقة، مثل تحليل المشاعر أو خوارزميات التحقق من الحقائق.
واجهة مستخدم:
بينما يستخدم النظام الحالي واجهة سطر الأوامر وخادم ويب بسيط لتدفق الأحداث، يمكنك بناء واجهة ويب أو هاتف محمول كاملة للجلسات البحثية التفاعلية.
تحسينات القابلية للتوسع:
تعمل التهيئة الحالية كخدمة ذات عقدة واحدة. للاستخدام الإنتاجي، ضع في اعتبارك إنشاء حاوية للتطبيق ونشرها باستخدام Kubernetes أو منصة أخرى للتنظيم للتعامل مع الحركة العالية والمعالجة الموزعة.
6. الأمان والأداء وأفضل الممارسات
عند نشر نظام مدفوع بالذكاء الاصطناعي مثل DeepResearch، هناك بعض الاعتبارات الأخرى:
إدارة مفاتيح API:
تأكد من أنه يتم تخزين مفاتيح API الخاصة بك (لـ Gemini وJina وBrave) بشكل آمن ومحددة بشفرة المصدر الخاصة بك. يوصى باستخدام المتغيرات البيئية والخزائن الآمنة.
تحديد المعدلات:
تساعد دالة sleep المدمجة في تجنب تحديد المعدلات عن طريق تأخير الطلبات المتعاقبة. ومع ذلك، ضع في اعتبارك تنفيذ آليات تحديد معدل إضافية على مستوى الخادم أو بوابة واجهة برمجة التطبيقات.
التحقق من البيانات:
تحقق صارم من الاستفسارات المدخلة والاستجابات. يساعد مخطط JSON المحدد في الوكيل، ولكن يجب عليك أيضًا التحقق من طلبات HTTP الواردة لمنع المدخلات الضارة.
التعامل مع الأخطاء:
يعد التعامل القوي مع الأخطاء (كما هو موضح في الشفرة الخادمة وtest-duck.ts) أمرًا بالغ الأهمية. يضمن ذلك أن فشل واجهة برمجة التطبيقات غير المتوقع أو استجابات غير صحيحة لا تؤدي إلى تعطل النظام.
مراقبة الموارد:
تتبع استخدام التوكنات أمر ضروري. توفر فئات TokenTracker وActionTracker رؤى حول استهلاك الموارد. يمكن أن تساعد مراقبة هذه المقاييس في تعديل أداء النظام وتجنب الاستخدام المفرط.
7. الخلاصة
يمثل مشروع DeepResearch من Jina AI كيف يمكن بناء عمليات البحث المعقدة والتكرارية باستخدام أدوات مفتوحة المصدر. من خلال دمج محركات البحث، نماذج الذكاء الاصطناعي التوليدية، وحلقات التفكير الذكي، يقوم النظام بتكرار إجابته باستمرار حتى يتأكد - أو حتى تصل حدود الموارد.
في هذه المقالة، استكشفنا كيفية إعادة إنشاء بحث OpenAI العميق باستخدام نهج مفتوح المصدر:
- ناقشنا خطوات التثبيت وإعداد البيئة.
- فصلنا الوحدات الأساسية، بدءًا من منطق الوكيل التكراري في
agent.tsإلى التكوين، واجهة برمجة تطبيقات خادم الويب، وتعريفات النوع. - استعرضنا آلية التغذية الراجعة في الوقت الحقيقي التي تبث تحديثات التقدم، مما يوفر الشفافية في عملية التفكير.
- أخيرًا، نظرنا في التوسعات المحتملة، خيارات التخصيص، وأفضل الممارسات لنشر مثل هذا النظام.
من خلال جعل هذه التقنيات البحثية المتقدمة متاحة كموارد مفتوحة، تسهم مشاريع مثل DeepResearch في ديمقراطية الوصول إلى أساليب الذكاء الاصطناعي الحديثة. سواء كنت باحثًا، مطورًا، أو مؤسسة تسعى لتكامل قدرات البحث العميق في سير العمل الخاص بك، فإن هذا المشروع يعد بمثابة إلهام وأساسي عملي لبناء حلك الخاص.
تضمن التصميم التكراري - الذي يجمع بين البحث، القراءة، التفكير، والإجابة في حلقة مستمرة - التعامل مع الاستفسارات الغامضة أو المعقدة مع وجود طبقات متعددة من التدقيق. ومع وجود هيكل تفصيلي يراقب استخدام التوكن ويقدم ردود فعل مباشرة، تحصل على رؤى عميقة حول عملية التفكير وراء كل إجابة.
إذا كنت متحمسًا للتجربة، قم باستنساخ المستودع، إعداد بيئتك كما هو موضح، وتشغيل الاستفسارات التي تتراوح من الرياضيات البسيطة إلى أسئلة البحث متعددة الأبعاد. مع القليل من التخصيص، يمكنك تخصيص النظام لمجالات جديدة وحتى تعزيز قدرات تفكيره. تفتح المشاريع مفتوحة المصدر مثل هذه الطريق للابتكار قادماً من المجتمع في أبحاث الذكاء الاصطناعي.
من خلال اتباع هذا التحليل الشامل والتفصيل، يمكنك إعادة إنشاء وتوسيع الأفكار وراء البحث العميق لـ OpenAI بطريقة مفتوحة المصدر بالكامل. سواء كنت تتطلع إلى البناء على قاعدة الكود الحالية أو دمج منهجيات مشابهة في مشاريعك، فإن خارطة الطريق واضحة: ابدأ، قم بتحسين، ودفع حدود البحث الآلي.
