ما الذي سنبنيه
التنفيذ المرجعي مشروع Python صغير ببضعة أجزاء واضحة:| الجزء | ما يفعله |
|---|---|
| CLI | يقبل موضوع بحث، ونموذجًا، ومزوّدين، وإعدادات عمق، ومسار إخراج، ودليل مخرجات |
| عميل Venice | يستدعي إكمالات المحادثة، والإكمالات المتدفقة، وPOST /augment/scrape |
| طبقة البحث | تبحث في DuckDuckGo افتراضيًا، مع اكتشاف أوراق arXiv اختياريًا |
| نماذج البيانات | تتبّع روابط المصادر، والروابط المعيارية، والمقاطع، والأدلة، والملاحظات، والأخطاء، والتقارير |
| وكيل البحث | يخطّط البحث، ويقرأ المصادر، ويستخرج الأدلة، ويحلّل الفجوات، ويولّد استعلامات متابعة، ويكتب التقرير النهائي |
| كاتب المخرجات | يخزّن سجلات JSONL قابلة للتدقيق للاستعلامات وفجوات البحث والنتائج والجلب والمقاطع وملاحظات المصادر ومسودات التقارير والأخطاء والتقارير |
- اطلب من Venice توليد استعلامات بحث متنوعة للموضوع.
- ابحث في الويب مع مزوّد واحد أو أكثر.
- أزل تكرار الروابط قبل قراءتها.
- استخدم نقطة نهاية scrape من Venice لتحويل كل صفحة مصدر عامة إلى Markdown.
- قسّم الصفحات الطويلة إلى مقاطع.
- اطلب من Venice استخراج الأدلة من كل مقطع.
- اطلب من Venice تحويل أدلة المقاطع إلى ملاحظات مصدر.
- حدّد فجوات البحث ومشكلات توازن المصادر قبل توليد استعلامات متابعة.
- اطلب من Venice تركيب التقرير النهائي باستشهادات على شكل حواشٍ.
إعداد المشروع
يستخدم المشروع المرجعي Python 3.13 وuv، لكن نفس الكود يعمل أيضًا مع بيئة افتراضية عادية.
أنشئ مشروعًا جديدًا:
pip، أنشئ بيئة افتراضية وثبّت نفس الحزم:
.env للتطوير المحلي:
VENICE_MODEL لتتمكن من تغيير النموذج دون تعديل الكود. التنفيذ المرجعي حاليًا افتراضيًا openai-gpt-55، لكن يمكنك استبداله بأي نموذج محادثة آخر متاح لحسابك في Venice.
إنشاء نماذج البيانات
قبل كتابة منطق الوكيل، سنُعرّف الكائنات التي تتحرّك عبر خط الأنابيب. تُسهّل هذه النماذج فهم باقي الكود لأن كل مصدر يحمل أصله: من أين أتى، وأي استعلام عثر عليه، ومتى تم استرجاعه، وكيف تم تقسيمه. أنشئresearch_agent/models.py:
canonical_url وcontent_hash وchunks.
يتيح canonical_url للوكيل تجنّب قراءة نفس المصدر مرارًا عندما تختلف نتائج البحث فقط في معاملات التتبّع أو الشظايا. ويساعد content_hash على التقاط الصفحات المكررة حتى عندما تكون عند روابط مختلفة. ويسمح لنا chunks بتلخيص الصفحات الطويلة في قطع أصغر بدلًا من فقد أدلة مفيدة بسبب حدود السياق.
أضف الدوال المساعدة أسفل dataclasses:
بناء عميل Venice
بعدها، سننشئ عميل Venice صغيرًا. يمكنك استخدام OpenAI Python SDK لإكمالات المحادثة لأن Venice متوافق مع OpenAI، لكن التنفيذ المرجعي يستخدمhttpx مباشرة بحيث يستطيع نفس العميل استدعاء نقطة نهاية POST /augment/scrape من Venice.
أنشئ research_agent/venice.py:
from_env() الأسرار خارج كود المصدر. كما تُسهّل التطوير المحلي لأن python-dotenv يستطيع تحميل VENICE_API_KEY وVENICE_MODEL من .env.
الآن أضف إكمالات المحادثة:
_post_chat_stream() متين يقرأ server-sent events من إكمالات المحادثة المتدفقة. يمكنك البدء بدون تدفق، ثم إضافته بمجرد عمل بقية تدفق البحث.
إضافة مزوّدي البحث
طبقة البحث لها وظيفتان: العثور على روابط المصادر وجلب تلك الروابط عبر scrape من Venice. يستخدم التنفيذ المرجعي نقطة نهاية HTML من DuckDuckGo للبحث العام في الويب وApi Atom من arXiv للأوراق. أنشئresearch_agent/web.py:
WebSearch المزوّدين وتجلب الصفحات:
كتابة المخرجات المحلية
في تدفقات البحث، يهمّ القابلية للتدقيق. إذا قال التقرير النهائي شيئًا مفاجئًا، ينبغي أن تكون قادرًا على فحص أي مصدر أدّى إليه. أنشئresearch_agent/artifacts.py:
بناء وكيل البحث
الآن وقد أصبح لدينا Venice والبحث والنماذج والمخرجات، يمكننا بناء الوكيل الفعلي. أنشئresearch_agent/agent.py:
models.py إذا لم تضفهما بعد:
ResearchAgent:
run() تمريرات البحث:
seen_* هما ما يمنع الوكيل من إضاعة الوقت على مصادر مكرّرة. إزالة تكرار الروابط يلتقط الروابط المتكرّرة. وإزالة تكرار content_hash تلتقط المرايا والمنشورات المتعدّدة والصفحات التي تُعيد التوجيه إلى نفس المحتوى النهائي.
تخطيط عمليات البحث الأولية والمتابعة
استدعاء النموذج الأول يحوّل الموضوع إلى استعلامات بحث:_gap_follow_up_queries()، الذي يطلب من Venice إرجاع كل من سجلات الفجوات والاستعلامات:
--artifacts مُمكَّنًا، تُكتب هذه السجلات إلى research_gaps.jsonl. ذلك يمنحك أثر تدقيق مفيدًا لسبب بحث الوكيل عن استعلام تمريرة ثانية معيّن.
ينبغي أن يكون المحلّل متسامحًا. إذا أعاد النموذج JSON مشوّهًا، يلجأ الوكيل إلى الموضوع الأصلي:
قراءة المصادر وتلخيصها
الآن نجمع ملاحظات المصدر. يبحث الوكيل عن كل استعلام، ويجلب كل نتيجة عبر scrape من Venice، ويقسّم Markdown، ويُلخّص الأدلة المفيدة.كتابة التقرير النهائي
بمجرد أن تتوفر لدى الوكيل ملاحظات المصدر، يمكنه كتابة التقرير. ابدأ بكاتب تقرير ذي تمريرة واحدة:إضافة واجهة CLI
الآن نحتاج إلى نقطة دخول من سطر الأوامر. أنشئmain.py:
| الخيار | ما يتحكم به |
|---|---|
--iterations | عدد تمريرات البحث |
--queries | استعلامات البحث المولّدة لكل تمريرة |
--results | النتائج المقروءة لكل مزوّد لكل استعلام |
--providers | مزوّدو البحث، مثل duckduckgo أو duckduckgo,arxiv |
--max-sources | أقصى عدد مصادر قابلة للاستخدام لجمعها |
--chunk-chars | حجم المقطع التقريبي قبل استخراج أدلة المصدر |
--max-chunks-per-source | عدد المقاطع المُلخّصة لكل مصدر |
--report-style | عمق التقرير النهائي: brief أو standard أو deep |
--artifacts | دليل لسجلات تدقيق JSONL |
--output | مسار تقرير Markdown النهائي |
تشغيل الوكيل
نفّذ تمريرة بحث سريعة:brief لملخص موجز مدعوم بالمصادر، وstandard لدراسة أوسع، وdeep لتدفق المخطط/الأقسام/المحرر المرحلي.
احفظ مخرجات قابلة للتدقيق:
source_notes.jsonl أدلة المصدر المُلخّصة، ويُظهر research_gaps.jsonl لماذا وُلِّدت عمليات بحث المتابعة، ويُظهر errors.jsonl الصفحات التي فشلت أثناء البحث أو الـ scraping أو التلخيص.
ملاحظات الخصوصية والموثوقية
يلامس وكيل البحث عدة أنظمة، لذا يساعد أن تكون دقيقًا حول ما يذهب إلى أين:| الطبقة | من يرى البيانات |
|---|---|
| CLI المحلي | يبقى الموضوع والتكوين وملاحظات المصدر والمخرجات والتقارير النهائية على جهازك |
| مزوّد البحث | تُرسَل استعلامات البحث إلى المزوّد الذي اخترته، مثل DuckDuckGo أو arXiv |
| Venice scrape | تُرسَل روابط المصادر العامة إلى نقطة نهاية scrape في Venice |
| إكمالات محادثة Venice | تُرسَل التعليمات ومقاطع المصادر وملاحظات المصدر وتعليمات توليد التقارير إلى Venice |
| ملفات الإخراج | تُكتَب تقارير Markdown ومخرجات JSONL محليًا |
POST /augment/search من Venice بدلًا من الاستعلام من DuckDuckGo مباشرة. يستخدم التنفيذ المرجعي مزوّدين عامين بسيطين كي يبقى التجريب سهل التشغيل والفهم.
من أجل الموثوقية، أبقِ هذه الإعدادات الافتراضية متحفظة:
- استخدم إعادات محاولة لاستدعاءات Venice وطلبات الويب.
- أضف
--request-delayصغيرًا إذا كنت تقرأ صفحات كثيرة من نفس المضيف. - ضع حدًا أعلى لـ
--max-sourcesكي لا تستمر المواضيع الواسعة إلى ما لا نهاية. - احفظ
--artifactsللتقارير المهمة كي تستطيع تدقيق الإخراج النهائي. - اعتبر التقرير ملخصًا، لا حقيقة مطلقة. اتبع الاستشهادات إلى المصدر الأصلي حين تكون الدقة مهمة.
اختبار القطع
لا تحتاج إلى طلبات ويب حية أو استدعاءات Venice لاختبار معظم النظام. يستخدم المستودع المرجعي فئات Venice و web وهمية لاختبار حلقة البحث وسلوك إزالة التكرار والمخرجات وتعليمات التقرير. اختبار أول مفيد هو معايرة الروابط:القياس المرجعي (Benchmarking)
كثير من مزوّدي الذكاء الاصطناعي لديهم الآن تدفقات بحث عميق خاصة بهم، لذا يتضمن المستودع المرجعي قياسًا مرجعيًا بسيطًا مقابل أداة Deep Research من Perplexity. طُلب من كلا الوكيلين كتابة تقرير عن هندسة أُطر وكلاء الذكاء الاصطناعي، ثم أُودِعت التقارير المُولَّدة في مستودع GitHub. هذا ليس قياسًا رسميًا. إنه طريقة عملية لفحص هيكل التقرير وتغطية المصادر وجودة الاستشهادات وما إذا كان الوكيل يركّز فرطًا على تجمع مصدر واحد. ولهذا أيضًا يتتبّع التنفيذ المُحدَّثresearch_gaps.jsonl وتوازن المصادر قبل عمليات بحث المتابعة.
توسيع هذا المثال
بمجرد عمل الوكيل الأساسي، إليك طرقًا عملية لتحسينه:- أضف مزوّد بحث Venice باستخدام
POST /augment/search. - خزّن التقارير والمخرجات في قاعدة بيانات SQLite صغيرة بدلًا من ملفات JSONL.
- أضف قوائم بيضاء أو سوداء للنطاقات البحثية الموثوقة.
- أضف دعم PDF بدمج Venice scrape مع تحليل المستندات للمصادر التي لا تكشف HTML نظيفًا.
- أضف مجموعة تقييم من المواضيع وأنواع المصادر المتوقعة لتتمكن من مقارنة جودة البحث بعد تغييرات التعليمات.
- أضف خطوة مراجعة تطلب من Venice إيجاد ادعاءات غير مدعومة في التقرير النهائي قبل حفظه.