Skip to main content
نماذج اللغة بارعة في تلخيص النصوص وضعيفة في تذكّر الحقائق. يُخرج هذا الدرس الحقائقَ من ذاكرة النموذج ويضعها داخل المطالبة، بحيث يمكن تتبّع كل جملة في المخرجات إلى صفحة جلبتها قبل لحظات. سنبني أداة سطر أوامر تجيب عن سؤال بموجز قصير مُوثَّق بالمصادر:
على طول الطريق سنقوم بما يلي:
  1. البحث في الويب الحيّ عبر /augment/search
  2. اتخاذ قرار بأيّ من تلك النتائج تستحق القراءة
  3. تحويل الصفحات المختارة إلى Markdown عبر /augment/scrape
  4. مطالبة نموذج دردشة بكتابة الموجز مع الاستشهاد بالمصادر برقمها
  5. ربط المراحل الأربع في سكربت واحد
القيام بالاسترجاع بأنفسنا، بدلًا من ترك النموذج يقوم به، هو ما يجعل النتيجة قابلة للتدقيق. نحتفظ بالقائمة الدقيقة للصفحات التي دخلت المطالبة ويمكننا أن نُري القارئ من أين جاء كل ادعاء. إن كنت تفضّل أن يتولى Venice الاسترجاع داخل طلب واحد، فعيّن venice_parameters.enable_web_search على إكمال الدردشة بدلًا من ذلك. يقارن دليل البحث في الويب واستخراج الصفحات بين الأسلوبين.

الإعداد

تحتاج إلى Python 3.9 أو أحدث، وحزمة requests، ومفتاح Venice API. راجع توليد مفتاح API إن لم يكن لديك مفتاح.
أنشئ research.py وابدأ بالاستيرادات وكتلة ترويسة مشتركة يعيد كل نداء استخدامها:

1. البحث في الويب

تأخذ /augment/search استعلامًا وتُعيد ما يصل إلى 20 نتيجة مرتّبة. Brave هو المزوّد الافتراضي ويطبّق سياسة عدم الاحتفاظ بالبيانات. Google متاح أيضًا ويتم توجيهه عبر Venice، بحيث لا يُربط الاستعلام بك أبدًا.
كل نتيجة كائن يحتوي على أربعة حقول:
هناك أمران في تلك الاستجابة تجدر معرفتهما قبل البناء عليها. يصل حقل content وفيه HTML، لأن المزوّد يغلّف المصطلحات المطابقة بوسوم <strong>. عملية استبدال HTML_TAG أعلاه تُزيلها بحيث يصل المقتطف إلى النموذج نصًا صرفًا. كثيرًا ما يكون حقل date سلسلة فارغة. كثير من الصفحات لا تنشر تاريخًا قابلًا للقراءة آليًا، لذا عامِل date كتلميح يمكنك استخدامه عند توفّره لا كحقل يمكنك الفرز أو التصفية به.
يجب أن يكون limit بين 1 و20، وأن يكون طول query بين 1 و400 حرف. القيم خارج هذه النطاقات تُعيد HTTP 400 مع جسم تحقّق. لا يتم قصّها من أجلك.

2. اختيار المصادر التي ستقرأها

استخراج جميع النتائج العشر سيكون بطيئًا ومكلفًا ومكرّرًا إلى حدٍّ بعيد. تُعيد محرّكات البحث عدة صفحات من الموقع نفسه، ومواقع التوثيق خاصة تُعيد الصفحة نفسها بعدة لغات، لذا قد يظهر المحتوى ذاته ثلاث أو أربع مرات تحت عناوين URL مختلفة. الاحتفاظ فقط بأعلى نتيجة ترتيبًا لكل نطاق يُزيل معظم هذا التكرار في بضعة أسطر:
تشغيله على النتائج العشر أعلاه يُضيّقها إلى أربعة مواقع متمايزة:
هذا هو المكان الطبيعي لإضافة حكمك الخاص. يمكنك السماح بقائمة نطاقات تثق بها، أو استبعاد النتائج التي لا يذكر مقتطفها المصطلحات الرئيسية، أو تفضيل النتائج التي تحمل date حديثًا. كل مُصفٍّ تطبّقه هنا هو قرار لم يعد للنموذج فرصة أن يُخطئ فيه.

3. استخراج الصفحات المختارة

تجلب /augment/scrape عنوان URL عامًا وتُعيده بصيغة Markdown. تطلب أولاً من الموقع تمثيلًا أصليًا بصيغة Markdown، وتعود إلى الاستخراج المعتمد على المتصفح إن لم يكن متاحًا. بعض الصفحات ستفشل، وأداة البحث ينبغي أن تعامل ذلك كأمر روتيني لا قاتل:
كِلا الحمايتين تستحقّان مكانهما. تلتقط فحوصات الحالة المواقعَ التي ترفض الوصول الآلي، ويلتقط فحص الطول الصفحات التي تُعيد 200 لكنها تُرجع لافتة كوكيز أو هيكلًا فارغًا بدلًا من مقالة.
تُعيد إخفاقات الاستخراج جسمًا بسيطًا بصيغة {"error": "..."} مع رسالة قابلة للقراءة، على سبيل المثال X (formerly Twitter) blocks automated access to their content. يُحجب X وReddit كليًا. لإدراج منشورات من X في إجابة، استخدم venice_parameters.enable_x_search على إكمال الدردشة بدلًا من ذلك.
الطلبات لا تعتمد على بعضها بعضًا، لذلك شغّلها بالتوازي. وبينما نحن هنا، حدّد سقفًا لِما نحتفظ به من كل صفحة:
عادت الصفحة الثالثة بـ 12000 حرف بالضبط، وهذا يعني أنها كانت أطول من الميزانية فتم اقتطاعها.
char_budget ليس ترفًا. تشمل نتائج البحث بانتظام صفحات تجميعية مثل خرائط المواقع وسجلّات التغيير وملفات llms-full.txt، وواحدة منها قد تُعيد قرابة مليون حرف. بلا سقف، نتيجة واحدة سيّئة الحظ قد تحدّد تكلفة الطلب بأكمله.

4. كتابة الموجز

الآن نُعطي النموذج الصفحاتِ التي جمعناها مرقّمةً، ونطلب استشهادات تُحيل إلى تلك الأرقام. الترقيم داخل المطالبة هو ما يتيح لنا لاحقًا تحويل [2] في المخرجات إلى عنوان URL.
قيمة temperature المنخفضة تُبقي الصياغة قريبة من نص المصدر. تعيين enable_web_search إلى off يطابق الإعداد الافتراضي، لكن التصريح به صراحةً يضمن ألا يُدخل النموذج بهدوء مصدرًا غير موجود في قائمة مراجعنا.

5. جمع كل الأجزاء

القطعة الأخيرة تُشغّل المراحل بالترتيب وتُلحق قائمة المراجع التي تحلّ أرقام الاستشهادات:
رسائل التقدّم تُطبع على stderr، بحيث يمكنك توجيه الموجز وحده إلى ملف:
في ما يلي أعلى الموجز الذي أنتجه، مختصرًا:
لاحظ أن المصدر رقم 3 لم يُستشهد به في هذا المقتطف. هذا هو السلوك الذي نريده. استخدم النموذج المصادرَ ذات الصلة وترك البقية، ولأن الاستشهادات مرقّمة يمكنك رؤية ذلك بلمحة.

ضبط خط الأنابيب

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

الخطوات التالية

خط الأنابيب الذي بين يديك الآن أساس لا منتج مكتمل. بعض الاتجاهات التي تستحق الاستكشاف:

البحث في الويب واستخراج الصفحات

مرجع لنقاط نهاية البحث والاستخراج.

سرد المقالات باستخدام تحويل النص إلى كلام

حوّل النص الذي أنشأته للتو إلى صوت.

التضمينات

فهرس Markdown المستخرَج بدلًا من إعادة جلبه.

وكيل البحث الخاص

وكيل أكبر يخطّط لعمليات البحث بنفسه.