ما الذي يتناوله هذا المنشور
شاركتُ في تحدي RAG (التوليد المعزز بالاسترجاع) المنظَّم من قِبل ARSII بالشراكة مع Rose Blanche Group. كان التحدي يحتوي على قواعد مكتوبة وواضحة تحدد القيود التقنية بدقة. الحل الفائز لا يستخدم PostgreSQL، في حين أن ملف PDF الخاص بالمسابقة ينص صراحةً على أن استخدامها شرط إلزامي. أثرتُ هذه المسألة مع المنظمين، ولم يصلني أي رد حتى تاريخ نشر هذا المنشور.
يعرض هذا المنشور الأدلة — قواعد المسابقة، والكود البرمجي، ونتائج الاختبارات القابلة للتكرار — حتى يتمكن أي شخص من التحقق من هذه التصريحات بشكل مستقل.
يركز هذا التحليل على المخرجات التقنية — الكود، وملفات الإعداد، ومقاييس الاسترجاع القابلة للقياس — وليس على أي مشارك بعينه.
قواعد المسابقة
اقترح هذا التحدي Rose Blanche Group (STE AGRO MELANGE TECHNOLOGIE). الجائزة: قسيمة شراء بقيمة 1000 دينار تونسي.
وصف التحدي الرسمي
Développer un module de recherche sémantique permettant d'interroger cette base vectorielle (RAG)
AR: تطوير وحدة بحث دلالي للاستعلام عن هذه القاعدة المتجهية (RAG)
Dans un contexte où une base documentaire contient un grand volume d'informations [...] L'objectif est de développer un module intelligent capable d'assister l'utilisateur en retrouvant automatiquement les fragments les plus pertinents à partir d'une question formulée en langage naturel.
AR: في سياق تحتوي فيه قاعدة وثائق على حجم كبير من المعلومات [...] الهدف هو تطوير وحدة ذكية قادرة على مساعدة المستخدم عبر استرجاع المقاطع الأكثر صلةً تلقائياً من سؤال صاغه بلغة طبيعية.
ملف PDF التقني الرسمي — القيود الحرفية
يُحدد ملف PDF للمسابقة (Développement d'un Module de Recherche Sémantique pour la Formulation en Boulangerie & Pâtisserie) ما يلي حرفياً:
السياق: Ces fiches ont déjà été : Converties en texte, Découpées en fragments (chunks), Transformées en embeddings, Stockées dans une base PostgreSQL
AR: هذه البطاقات جرى بالفعل: تحويلها إلى نص، وتقطيعها إلى مقاطع (chunks)، وتحويلها إلى تضمينات (embeddings)، وتخزينها في قاعدة بيانات PostgreSQL
الموارد المتاحة: Base de données PostgreSQL — Table : embeddings — Structure : id (Primary Key), id_document (int), texte_fragment (text), vecteur (VECTOR(384))
AR: قاعدة بيانات PostgreSQL — الجدول: embeddings — الهيكل: id (المفتاح الأساسي)، id_document (int)، texte_fragment (text)، vecteur (VECTOR(384))
المعاملات المفروضة: Méthode de similarité : Cosine Similarity — Nombre de résultats à retourner : Top K = 3 — Langage recommandé : Python
نموذج التضمين المطلوب: Modèle imposé : all-MiniLM-L6-v2 — Bibliothèque : sentence-transformers — Dimension : 384
مثال على الاستعلام: Améliorant de panification : quelles sont les quantités recommandées d'alpha-amylase, xylanase et d'Acide ascorbique ?
AR: مُحسِّن الخبز: ما الكميات الموصى بها من alpha-amylase وxylanase وحمض الأسكوربيك؟
قيد قاعدة البيانات ليس مجرد اقتراح. ينص ملف PDF على أن البيانات "Stockées dans une base PostgreSQL" (مخزَّنة في قاعدة بيانات PostgreSQL) ويوفر مخطط جدول دقيقاً بأنواع بيانات تشمل vecteur VECTOR(384) — وهو نوع بيانات لا يوجد إلا في PostgreSQL عبر امتداد pgvector. التحدي بأكمله مُؤطَّر حول الاستعلام عن هذه القاعدة المتجهية في PostgreSQL.
ما الذي يختبره هذا التحدي فعلاً
القيود المذكورة أعلاه ليست اعتباطية. إنها تُحدد مسألة هندسية محددة للغاية: بالنظر إلى نموذج تضمين صغير (22 مليون معامل، 384 بُعداً)، وعمق استرجاع ثابت (K=3)، وقاعدة بيانات PostgreSQL محلية — ما مدى قدرتك على المعالجة المسبقة للبيانات وهيكلتها وتحسينها للحصول على أفضل نتائج استرجاع ممكنة؟
هذا تحدٍّ في هندسة البيانات والتحسين، وليس تمريناً في ربط واجهات برمجية (APIs). النموذج الثابت، وK الثابت، واشتراط قاعدة البيانات المحلية — كلها موجودة تحديداً لتوفير تكافؤ الفرص بين المتسابقين وقياس ما يفعله كل مشارك مع البيانات ذاتها: جودة استخراج PDF، واستراتيجية التقطيع، وطريقة هيكلة التضمينات، ومعالجة الاستعلامات.
لو كان التحدي مجرد بناء نظام RAG، لأمكن لأي أحد توصيل LangChain بواجهة برمجية لنموذج لغوي ضخم (LLM) للحصول على إجابات سلسة في دقائق. لكن هذا النهج لا يتطلب أي تحسين، ويتكبد تكاليف API مرتفعة، ويرسل بيانات مؤسسية ربما تكون حساسة إلى موفرين خارجيين، ولا يُثبت أي فهم لآليات الاسترجاع الجوهرية. المسابقة تلغي هذا المختصر عمداً بفرض إعداد محلي ومكتفٍ بذاته.
المهارة الحقيقية التي يتم اختبارها هي: هل يمكنك جعل نموذج بعشرين ومليوني معامل يتجاوز قدرته الظاهرة من خلال المعالجة الذكية للبيانات وهندسة البحث؟
الحل الفائز لا يستخدم PostgreSQL
كود الفريق الفائز متاح للعموم على: github.com/AyaZantour/RagProject. إليك ما تفعله طبقة التخزين لديهم فعلاً.
vector_store.py — الأسطر 57–68 (دالة الحفظ)
def save(self, path: str) -> None: os.makedirs(os.path.dirname(path) if os.path.dirname(path) else ".", exist_ok=True) np.savez_compressed(f"{path}.npz", embeddings=self.embeddings) with open(f"{path}.json", "w", encoding="utf-8") as f: json.dump(self.metadata, f, ensure_ascii=False, indent=2)
تُخزَّن المتجهات في ملف NumPy بامتداد .npz. البيانات الوصفية مخزنة في ملف JSON. لا يوجد PostgreSQL، لا psycopg2، لا SQL، لا pgvector.
vector_store.py — الأسطر 94–119 (دالة البحث)
def search(self, query: str, top_k: int = 3) -> list: # Embed the query query_embedding = self.model.encode( [query], convert_to_numpy=True, normalize_embeddings=True ) # Cosine similarity (dot product since vectors are normalized) similarities = np.dot(self.embeddings, query_embedding.T).flatten() # Get top-k indices top_indices = np.argsort(similarities)[::-1][:top_k]
يُنفَّذ البحث عبر الضرب النقطي لـ NumPy على مصفوفات في الذاكرة. لا استعلام قاعدة بيانات. لا ORDER BY بـ SQL. لا عامل <=> في pgvector.
requirements.txt
PyPDF2>=3.0.0 sentence-transformers>=2.2.0 numpy>=1.24.0 flask>=3.0.0 groq>=0.4.0
لا psycopg2. لا مشغّل قاعدة بيانات من أي نوع.
مخطط الجدول المطلوب (من ملف PDF للمسابقة)
CREATE TABLE embeddings (
id SERIAL PRIMARY KEY,
id_document INT,
texte_fragment TEXT,
vecteur VECTOR(384)
);
النوع VECTOR(384) لا يوجد إلا في PostgreSQL عبر امتداد pgvector. لا يذكر ملف PDF صراحةً pgvector، لكن المخطط يستلزمه ضرورةً. على أي حال، هذا جدول PostgreSQL — وليس ملفات NumPy.
حلّي — الامتثال الكامل
الكود متاح للعموم على: github.com/mohamedyaakoubi/RBG-ARSII-RAG.
docker-compose.yml — PostgreSQL مع pgvector
services:
postgres-vector:
build: .
container_name: postgres-vector-db
environment:
POSTGRES_USER: rag
POSTGRES_PASSWORD: ragpassword
POSTGRES_DB: ragdb
ports:
- "5432:5432"
Dockerfile — PostgreSQL 16 + pgvector
FROM postgres:16 RUN apt-get update && apt-get install -y \ git build-essential postgresql-server-dev-16 RUN git clone https://github.com/pgvector/pgvector.git \ && cd pgvector && make && make install COPY init.sql /docker-entrypoint-initdb.d/
init.sql
CREATE EXTENSION IF NOT EXISTS vector;
مخطط الجدول المطلوب بالضبط (database/models.py)
cursor.execute(f""" CREATE TABLE IF NOT EXISTS embeddings ( id SERIAL PRIMARY KEY, id_document INT, texte_fragment TEXT, vecteur vector({config.EMBEDDING_DIMENSION}) ) """)
يطابق هذا مواصفات ملف PDF للمسابقة حرفاً بحرف.
البحث بتشابه جيب التمام عبر pgvector (database/models.py)
cursor.execute(""" SELECT id_document, texte_fragment, 1 - (vecteur <=> %s::vector) AS score FROM embeddings ORDER BY vecteur <=> %s::vector LIMIT %s """, (query_vector.tolist(), query_vector.tolist(), top_k))
العامل <=> هو عامل مسافة جيب التمام في pgvector — متوافق مع نوع العمود VECTOR(384) واشتراط تشابه جيب التمام في التحدي.
ملخص الامتثال للقيود
| القيد (من ملف PDF) | حلّي | الحل الفائز |
|---|---|---|
| قاعدة بيانات PostgreSQL | ✓ Docker PostgreSQL 16 + pgvector | ✗ ملفات NumPy .npz + JSON |
embeddings(id, id_document, texte_fragment, vecteur VECTOR(384)) | ✓ المخطط مطابق تماماً | ✗ لا يوجد جدول SQL |
| all-MiniLM-L6-v2, 384d | ✓ | ✓ |
| تشابه جيب التمام | ✓ عامل <=> في pgvector | ✓ np.dot() على متجهات مُوحَّدة |
| Top K = 3 | ✓ | ✓ |
| Python | ✓ | ✓ |
| إعادة نص المقطع + درجة التشابه | ✓ | ✓ (يُضيف أيضاً إجابات مُولَّدة بواسطة LLM خارجي) |
| لا اعتماد على API خارجي | ✓ بالكامل دون اتصال | ✗ يعتمد على Groq API + Llama 3.3 70B |
الحل الفائز لا يستخدم PostgreSQL، في حين أن ملف PDF للمسابقة ينص على أنها شرط إلزامي. هذه حقيقة ثنائية قابلة للتحقق — يمكن لأي شخص مراجعة الكود.
جودة الاسترجاع — اختبار أداء قابل للتكرار
تم اختبار كلا الحلين بنفس 16 استعلاماً، ونفس نموذج التضمين (all-MiniLM-L6-v2)، وK=3. الدرجة = تشابه جيب التمام للمقطع الأول المُسترجَع (R1). القيمة الأعلى تعني استرجاعاً أفضل.
طريقة إعادة التشغيل
الحل الفائز:
- استنسخ
github.com/AyaZantour/RagProject pip install -r requirements.txt- شغّل
python app.py— يُبنى الفهرس تلقائياً عند أول تشغيل - أرسل طلب POST إلى
/searchبصيغة{"query": "سؤالك"}أو استخدم واجهة الويب
حلّي:
- استنسخ
github.com/mohamedyaakoubi/RBG-ARSII-RAG - شغّل
docker-compose up -dلتشغيل PostgreSQL pip install -r requirements.txtpython main.py(يُشغّل الاستيعاب ثم يُشغّل واجهة Streamlit)
نتائج الاختبار
| # | الاستعلام | درجتي | درجة الفائز | Δ |
|---|---|---|---|---|
| 1 | استعلام مثال المسابقة (alpha-amylase + xylanase + حمض الأسكوربيك) | 0.9330 | 0.5210 | +0.4120 |
| 2 | جرعة الليباز (بالفرنسية) | 0.7758 | 0.4912 | +0.2846 |
| 3 | جرعة الزيلاناز (بالفرنسية) | 0.8178 | 0.4980 | +0.3198 |
| 4 | الغرض من حمض الأسكوربيك (بالفرنسية) | 0.7395 | 0.5949 | +0.1446 |
| 5 | تأثير الزيلاناز على حجم الخبز (بالفرنسية) | 0.6917 | 0.3494 | +0.3423 |
| 6 | جرعة Alpha-amylase (بالإنجليزية) | 0.7786 | 0.5689 | +0.2097 |
| 7 | ظروف التخزين AF110 | 0.6818 | 0.4356 | +0.2462 |
| 8 | جرعة الترانسغلوتاميناز (بالفرنسية) | 0.8209 | 0.4197 | +0.4012 |
| 9 | مسببات الحساسية | 0.7649 | 0.5399 | +0.2250 |
| 10 | الرقم الهيدروجيني الأمثل للزيلاناز | 0.6188 | 0.5310 | +0.0878 |
| 11 | تحسين الملمس بالليباز | 0.6718 | 0.6049 | +0.0669 |
| 12 | مدة الصلاحية | 0.8143 | 0.6130 | +0.2013 |
| 13 | نشاط Alpha-amylase (بالفرنسية) | 0.7608 | 0.6067 | +0.1541 |
| 14 | المصدر الميكروبي للزيلاناز | 0.7917 | 0.7230 | +0.0687 |
| 15 | دمج الأميلاز + الزيلاناز (بالإنجليزية) | 0.9330 | 0.6472 | +0.2858 |
| 16 | التغليف | 0.7175 | 0.6232 | +0.0943 |
مدى مفيدية الإجابات — ما الذي يُعيده كل نظام فعلاً
بعيداً عن درجات التشابه، السؤال الجوهري هو: هل يُجيب المقطع المُسترجَع فعلاً على سؤال المستخدم؟
6.1 استعلام مثال المسابقة
| حلّي | الحل الفائز | |
|---|---|---|
| R1 | Dosage alpha-amylase (BVZyme AF330) boulangerie panification : 2–10 (0.9330) | Product Description Enzyme preparation based on Maltogenic Amylase… Improve freshness… (0.5210) |
| R2 | Dosage xylanase (BVzyme HCF400) boulangerie panification : 15–35 (0.9185) | رأس TDS للزيلاناز (0.5075) |
| R3 | Dosage acide ascorbique (vitamine C, E300) boulangerie panification : 50–75 ppm (0.8635) | رأس TDS للزيلاناز (0.5054) |
| هل يشمل alpha-amylase؟ | ✓ مع نطاق الجرعة | ✗ يُعيد Maltogenic Amylase (إنزيم مختلف) |
| هل يشمل الزيلاناز؟ | ✓ مع نطاق الجرعة | جزئياً — رأس المنتج فقط، بدون جرعة |
| هل يشمل حمض الأسكوربيك؟ | ✓ مع نطاق الجرعة | ✗ غائب تماماً |
| هل تمت الإجابة على الإنزيمات الثلاثة؟ | ✓ | ✗ |
6.2 الاستعلامات الفرنسية — معالجة اللغة
| حلّي | الحل الفائز | |
|---|---|---|
| R1 | Dosage lipase (L65pdf) boulangerie panification : 5–50 | Dosages Recommandés (ppm)… — من ملف PDF حمض الأسكوربيك، وليس الليباز |
| الإنزيم صحيح؟ | ✓ الليباز، 3 منتجات مختلفة | ✗ يُعيد جدول جرعات حمض الأسكوربيك |
all-MiniLM-L6-v2 مُحسَّناً للغة الإنجليزية — الآلية وتأثيرها على الاستعلامات الفرنسية مفصَّلة في القسم 8.
| حلّي | الحل الفائز | |
|---|---|---|
| R1 | BVzyme HCF MAX X (xylanase): Bread Improvement 1–15ppm | xyder si dosage excessif (mie collante, défauts) — من قسم الآثار الجانبية لحمض الأسكوربيك |
| هل يُجيب على السؤال؟ | ✓ بيانات تحسين الخبز بالزيلاناز | ✗ تحذيرات جرعة حمض الأسكوربيك الزائدة |
6.3 استعلامات المنتجات المحددة
| حلّي | الحل الفائز | |
|---|---|---|
| R1 | BVZyme AF110 (alpha-amylase) storage conditions and shelf life: minimum durability: 24 months. Store in a cool, dry place (below 20°C). | BVZyme A FRESH 202 is an amylolytic enzyme… — منتج خاطئ تماماً |
| المنتج صحيح؟ | ✓ AF110 تحديداً | ✗ يُعيد A FRESH 202 |
| حلّي | الحل الفائز | |
|---|---|---|
| R1 | BVZyme AF330 (alpha-amylase): Activity 11900 FAU/g | Enzyme preparation based on Maltogenic Amylase… — نوع إنزيم خاطئ |
| R2 | BVZyme AF220 (alpha-amylase): Activity 11000 FAU/g | BVZyme AF110… alpha-amylase (0.5860) |
| R3 | BVZyme AF110 (alpha-amylase): Activity 150000 SKB/g | BVZyme AF220… alpha-amylase (0.5837) |
| هل تحتوي على بيانات؟ | ✓ 3 منتجات بقيم النشاط | ✗ أوصاف منتجات بدون أرقام نشاط |
6.4 ملخص تقييم مدى مفيدية الإجابات
| المعيار | حلّي | الحل الفائز |
|---|---|---|
| الإنزيم الصحيح في النتائج | 16/16 استعلام | ~11/16 استعلام |
| بيانات قابلة للاستخدام في R1 | 14/16 (جرعات، قيم نشاط، مواصفات تخزين) | 4/16 (معظمها أوصاف منتجات عامة) |
| المنتج الصحيح عند السؤال عن منتج محدد | ✓ (AF110 → AF110) | ✗ (AF110 → A FRESH 202) |
| معالجة الاستعلامات الفرنسية | يترجم إلى الإنجليزية، يبحث باللغتين | لا معالجة — يُدخل الفرنسية الخام في النموذج المُحسَّن للإنجليزية |
| الاستعلامات متعددة الكيانات | يُفكك إلى استعلامات فرعية، نتيجة واحدة لكل كيان | أعلى 3 بالتشابه الكلي (غالباً نفس الكيان متكرر) |
الأرقام الواردة أعلاه استُخلصت في البداية من سكريبت مطابقة تلقائي يقارن الكلمات المفتاحية في المقاطع المُسترجَعة بمصطلحات الإجابات المتوقعة. أنتجت هذه الطريقة نتائج مضخمة للحل الفائز — مثل احتساب "acid" في "fatty acids" مطابقةً لحمض الأسكوربيك، أو احتساب كلمة "xylanase" مطابقةً حتى حين لا يحتوي المقطع على بيانات جرعات. لحل هذه التناقضات، جرت مراجعة يدوية لكل واحد من 52 زوجاً (استعلام + نتيجة): قُرئت المقاطع الثلاثة المُعادة (R1، R2، R3) كاملةً وحُكم عليها مقارنةً بمحتوى ملف PDF المصدر. تُحدد R1 الحكم الأساسي؛ وتُميز R2/R3 بين جزئي وفشل. التقييم اليدوي الكامل متاح في results/manual_helpfulness_assessment.md.
مقارنة جودة المقاطع
حلّي — مقاطع محورية الكيانات (استخراج pdfplumber)
Dosage alpha-amylase (BVZyme AF330) boulangerie panification : 2-10.
BVZyme HCB710 (xylanase): Product: Enzyme preparation based on endo-xylanase. Source: Bacterial xylanase produced by fermenting a selected unique strain of Bacillus subtilis. Activity: 583 XylH/g.
BVZyme AF110 (alpha-amylase) storage conditions and shelf life: minimum durability: 24 months. Store in a cool, dry place (below 20°C).
كل مقطع مركّز دلالياً على نوع واحد من الأسئلة حول منتج واحد.
الحل الفائز — نافذة منزلقة ذات حجم ثابت (استخراج PyPDF2)
Product Description
Enzyme preparation based on Maltogenic Amylase
Effective material
Improve freshness, enhance softness, and extend shelf life.
Dosage
Aspect: free flowing powder
Color: white -cream
Physicochemical
Moisture: <15%
ustries.TECH NICAL DATA SHEET BVZyme TG MAX64 « Bakery Enzyme Product Description BVZyme TG MAX64 « is used in bakery as a strong protein cross-linking(connecting residues of the amino acid L-glutamine to the amino acid £¿L-lysine)Application
مسافات بيضاء مفرطة، وعناوين مدمجة، وكلمات مقطوعة، وأخطاء ترميز (£¿، «). تقطع النافذة ذات الـ500 حرف عبر الجداول والأقسام دون مراعاة لهيكل الوثيقة.
سبب الفجوة التقنية
الأمر لا يتعلق بأن أحد الفريقين "أفضل" — بل يتعلق بالخيارات المعمارية التي صُمم التحدي لاختبارها.
استخراج PDF
| حلّي | الحل الفائز | |
|---|---|---|
| المكتبة | pdfplumber (يحافظ على التخطيط والجداول) | PyPDF2 (استخراج نص عادي) |
| معالجة الجداول | يحوّل الجداول إلى نص منظم | لا معالجة |
| إزالة الضوضاء | إزالة قائمة على Regex للرؤوس والتذييلات ومعلومات الاتصال | لا شيء |
استراتيجية التقطيع
| حلّي | الحل الفائز | |
|---|---|---|
| النهج | محوري الكيانات: 9 فئات منظمة لكل منتج (الهوية، الجرعة، الوظيفة، التخزين، التغليف، مسببات الحساسية، السلامة، الخصائص الفيزيائية، التنظيم) | نافذة منزلقة ذات حجم ثابت: 500 حرف، تداخل 50 |
| إجمالي المقاطع | 924 مقطعاً منظماً → 1,635 تضميناً (مع الإثراء) | 176 مقطعاً |
| جودة المقاطع | كل مقطع مركّز دلالياً على موضوع واحد | تقطع المقاطع بشكل اعتباطي عبر الأقسام |
استراتيجية التضمين
| حلّي | الحل الفائز | |
|---|---|---|
| النهج | تضمينات مزدوجة: المقطع الأصلي + نسخة مُثراة (11 قاعدة إثراء). 924 مقطعاً → 1,635 تضميناً | تضمين واحد لكل مقطع. 176 تضميناً إجمالاً |
| الإثراء | تُلحق كلمات مفتاحية مشتقة من محتوى المقطع بمُدخل التضمين (لا تُخزَّن أو تُعاد أبداً). مثلاً، مقطع الجرعة يحصل على إلحاق "dosage quantity ppm recommended amount" للتضمين فقط | لا شيء |
هندسة البحث
| حلّي | الحل الفائز | |
|---|---|---|
| معالجة اللغة | 86 قاعدة ترجمة فرنسية→إنجليزية + بحث ثنائي اللغة (استعلامات بالفرنسية والإنجليزية، يدمج أفضل النتائج) | لا شيء — فرنسية خام في النموذج المُحسَّن للإنجليزية |
| تفكيك الاستعلام | يكشف الاستعلامات متعددة الكيانات، يقسمها إلى استعلامات فرعية، نتيجة واحدة لكل كيان | لا شيء — استعلام واحد، أعلى 3 بالتشابه الكلي |
| API خارجية | لا شيء — مكتفٍ بذاته تماماً | Groq API + Llama 3.3 70B لتوليد الإجابات |
all-MiniLM-L6-v2 مُحسَّن للإنجليزية. الاستعلامات الفرنسية على مقاطع إنجليزية تُنتج درجات تشابه أدنى بشكل ملحوظ (~0.40 مقابل ~0.70 لنفس الاستعلام بالإنجليزية). حلّي يسد هذه الفجوة بترجمة وقت الاستعلام. الحل الفائز يُدخل الفرنسية الخام مباشرةً في النموذج.النطاق والنهج
| الجانب | حلّي | الحل الفائز |
|---|---|---|
| النهج الجوهري | هندسة الاسترجاع الصرف — تعظيم جودة ما يمكن لنموذج التضمين إيجاده | معالجة LLM اللاحقة — استخدام Groq API + Llama 3.3 70B لتوليد إجابات بلغة طبيعية من المقاطع |
| موضع الذكاء | في استراتيجية التقطيع، وقواعد الإثراء، وترجمة الاستعلامات، والتفكيك | في نموذج Llama 3.3 70B عبر استدعاء API خارجي |
| عرض الإجابة | مقاطع خام مع درجات (كما تحدده المسابقة) | إجابة بلغة طبيعية مُولَّدة بواسطة LLM |
لا يملك LLM وصولاً إلى ملفات PDF الأصلية أو أي مصدر معرفي خارجي — يرى المقاطع الثلاث المُسترجَعة فقط. أخطاء الاسترجاع الموثقة في القسم 6 تنتقل مباشرةً إلى الإجابة النهائية. حين يُعيد الاسترجاع محتوى خاطئاً، تَرث الإجابة المُولَّدة بواسطة LLM تلك الأخطاء بصرف النظر عن مدى سلاسة المخرجات.
قابلية التوسع — كيف يتعامل كل نظام مع المنتجات الجديدة
قابلية التوسع لم تكن متطلباً معلناً في المسابقة. لكن نظام RAG الذي لا يعمل إلا على البيانات التي بُني عليها ليس نظام RAG — بل هو جدول بحث. النقطة الكاملة من التوليد المعزز بالاسترجاع هي أنه يمكن إضافة وثائق جديدة والاستعلام عنها دون تعديل المسار. يختبر هذا القسم تعميم الاسترجاع: هل النهج الهندسي لكل نظام متين فعلاً أم مُعايَر فقط على الـ35 ملف PDF الأصلية؟
أضفتُ 6 ملفات PDF منتجات جديدة لم تكن في مجموعة البيانات الأصلية: GEbake Amyl، وDomax SF Bingo Plus، وTigris Gold، وO-TENTIC DURUM، وصحيفة مواصفات حمض الأسكوربيك، ووثيقة ترخيص مضافات. شُغِّل 10 استعلامات وقُيِّمت بـمدى مفيدية الإجابة: هل تأتي R1 من ملف PDF المنتج الصحيح، وهل يحتوي المقطع فعلاً على الإجابة؟
| الاستعلام | الإجابة المتوقعة | حلّي | الحل الفائز |
|---|---|---|---|
| جرعة GEbake Amyl | 20–100 ppm | جزئي — المنتج صحيح | جزئي — المنتج صحيح، لا جرعة في المقطع |
| الرقم الهيدروجيني GEbake Amyl | pH 5.5–6.5 | ناجح تماماً | جزئي — لا رقم هيدروجيني في المقطع |
| مدة صلاحية GEbake Amyl | 12 شهراً | جزئي — مقطوع | جزئي — مدة الصلاحية غير موجودة |
| إنزيمات Domax SF Bingo Plus | Xylanase, Maltogenic Amylase | جزئي | جزئي — R1 منتج خاطئ، الإجابة في R3 |
| جرعة Domax SF Bingo Plus | 50–150 g/100kg | ناجح تماماً | ناجح تماماً |
| جرعة Tigris Gold | 0.5% من الطحين | جزئي | ✗ فشل — R1 هو حمض الأسكوربيك |
| حمض الأسكوربيك في Tigris Gold | في قائمة المكونات | جزئي — مقطوع | ✗ فشل — بيانات الدهون الغذائية |
| غرض O-TENTIC DURUM | عجين محمّض، متوسطي | ناجح تماماً | جزئي — رأس TDS، لا وصف للمنتج |
| جرعة O-TENTIC DURUM | 4% من الطحين | ناجح تماماً | ✗ فشل — R1-R2 هما حمض الأسكوربيك |
| جرعة حمض الأسكوربيك (بالفرنسية) | 20–60 ppm | ناجح تماماً | جزئي — ملخص عام، لا قيمة جرعة |
استراتيجية التقطيع محوري الكيانات تُضيف بادئة اسم المنتج لكل مقطع، مما يتيح لنموذج التضمين تمييز المنتجات بهويتها حتى مع نمو قاعدة البيانات. دون هذا التثبيت، تتنافس مقاطع الحل الفائز ذات الرؤوس العامة عبر ملفات PDF — مُعيدةً مقاطع حمض الأسكوربيك لاستعلامات Tigris Gold وO-TENTIC DURUM.
التخزين مقابل الدقة — المقايضة بين المساحة والحوسبة
يُخزن حلّي 9.3× أكثر من تضمينات الحل الفائز (1,635 مقابل 176). السؤال الطبيعي هو: ما تكلفة ذلك، وما العائد منه؟
| حلّي | الحل الفائز | |
|---|---|---|
| التضمينات | 1,635 | 176 |
| تخزين المتجهات | 1,635 × 384 × 4 بايت = 2.51 MB | 176 × 384 × 4 بايت = 0.27 MB |
| تعقيد البحث | O(1,635) ضرباً نقطياً لكل استعلام | O(176) ضرباً نقطياً لكل استعلام |
| زمن استجابة البحث | < 5 مللي ثانية (بحث شامل) | < 1 مللي ثانية (بحث شامل) |
| تكلفة API الخارجية لكل استعلام | ✓ لا شيء | ✗ استدعاء Groq API واحد (Llama 3.3 70B) |
تفرض المسابقة نموذج بـ22 مليون معامل و384 بُعداً — صغير ورخيص عمداً. مع نموذج ثابت، رافعة التحسين الوحيدة هي كيفية إعداد البيانات له. ينتج التقطيع محوري الكيانات متجهات أكثر، لكن كل واحدة مركزة دلالياً: موضوع واحد، منتج واحد، سؤال واحد قابل للإجابة. هذا يمنح النموذج الصغير احتمالاً أعلى بكثير لإنتاج مطابقة قوية بتشابه جيب التمام.
يسلك الحل الفائز المسار المعاكس: مقاطع أقل وأكبر تخلط أوصاف المنتجات وجداول الجرعات والخصائص الفيزيائية في نوافذ من 500 حرف. هذا يوفر تخزيناً لا يُذكر لكنه يُجبر نموذج التضمين على ضغط مفاهيم غير مترابطة في متجه واحد بـ384 بُعداً — بالضبط السيناريو الذي يفقد فيه النموذج الصغير قوته التمييزية.
في نظرية استرجاع المعلومات، هذه هي المفاضلة بين الدقة والاستدعاء: مقاطع أكثر وأصغر تزيد الاستدعاء بتكلفة مساحة تخزين إضافية. لمجموعة من 35 ملف PDF، تلك التكلفة هي 2.24 MB. استدعاء API الخارجي للحل الفائز يُدخل زمن استجابة متغيراً وتكلفة تشغيلية تفوق التخزين الإضافية بأكمله.
كيف يتوسع التخزين مع المنتجات الجديدة
| حجم قاعدة البيانات | تضميناتي | تخزيني | تضمينات الفائز | تخزين الفائز |
|---|---|---|---|---|
| 35 ملف PDF (الحالي) | 1,635 | 2.51 MB | 176 | 0.27 MB |
| 100 ملف PDF | ~4,670 | ~7.2 MB | ~500 | ~0.77 MB |
| 1,000 ملف PDF | ~46,700 | ~71.7 MB | ~5,000 | ~7.7 MB |
| 10,000 ملف PDF | ~467,000 | ~717 MB | ~50,000 | ~77 MB |
يستخدم حلّي PostgreSQL مع pgvector الذي يدعم فهارس HNSW وIVFFlat للجار الأقرب التقريبي. هذه تخفض البحث من O(n) إلى O(log n)، مما يبقي زمن الاستجابة تحت 10 مللي ثانية حتى عند مئات الآلاف من المتجهات. الحل الفائز يستخدم البحث الشامل لـ NumPy بدون هيكل فهرسة — لا يتيح توسعاً دون تربيع زمني دون إعادة كتابة جذرية.
عدم التوازن الحقيقي في التكاليف: استدعاء Groq API لكل استعلام له زمن استجابة متغير، وتكلفة نقدية لكل رمز، واعتماد على توفر خدمة خارجية. التخزين الإضافي لحلّي لا يُكلف شيئاً للتشغيل بعد الكتابة على القرص.
استجابة الجهة المنظمة
في 18 مارس 2026، أرسلتُ بريداً إلكترونياً رسمياً إلى ARSII يتضمن تقرير المقارنة التقنية الكامل، وطلبتُ شرحاً لمعايير التقييم المُستخدمة.
كان رد ARSII بريداً إلكترونياً جماعياً لجميع المشاركين (وليس رداً مباشراً):
"We would like to clarify that ARSII does not interfere in the evaluation process of the challenges, except for those proposed by ARSII itself. Each challenge is assessed independently by the respective partner organization responsible for it."
AR: «نودّ أن نوضّح أن ARSII لا تتدخل في عملية تقييم التحديات، باستثناء تلك المقترحة من ARSII نفسها. يُقيَّم كل تحدٍّ بشكل مستقل من قبل المنظمة الشريكة المعنية.»
"In case of any objections or concerns, you are absolutely welcome to submit a reclamation. We will ensure that you are put in direct contact with the responsible party of the challenge."
AR: «في حال وجود أي اعتراضات أو مخاوف، يسعدنا تلقّي شكواكم. سنحرص على وضعكم في تواصل مباشر مع الجهة المسؤولة عن التحدي.»
وفقاً لهذا الرد، تُفوِّض ARSII تقييم التحديات إلى الجهة الشريكة المعنية. المسار المتاح هو التواصل المباشر مع Rose Blanche Group.
حتى 26 مارس 2026، لم يصلني أي رد مباشر، ولم يُصدَر أي إقرار بالتناقض الموثق في متطلبات المسابقة.
ما يُثبته هذا المنشور
هذا المنشور سجلٌ عام للنتائج، وليس طلباً. الأدلة المُقدَّمة هنا قابلة للتحقق بشكل مستقل من أي شخص لديه وصول إلى مستودعَي GitHub وملف PDF للمسابقة. تحديداً:
- الحل الفائز لا يستخدم PostgreSQL — ظاهر في الكود المصدري (القسم 2).
- جودة الاسترجاع أدنى قياساً على كل مقياس اختُبر — تشابه جيب التمام، ومفيدية الإجابة، ودقة المنتج.
- لم تُشرح عملية التقييم. ما المعايير المُستخدمة؟ إذا كان قيد PostgreSQL قد أُعفي، متى وكيف أُبلغ المشاركون؟
هذه ملاحظات موثقة. للقارئ أن يستخلص استنتاجاته بنفسه.
جميع الأدلة — تحقق بنفسك
كل ما وُرد في هذا المنشور قابل للتحقق العلني:
| المورد | الرابط |
|---|---|
| حلّي (Noobmaster) | github.com/mohamedyaakoubi/RBG-ARSII-RAG |
| الحل الفائز | github.com/AyaZantour/RagProject |
| أدوات الاختبار والإبلاغ | github.com/mohamedyaakoubi/noobmaster-vs-double_a--winner-- |
| ملف PDF للمسابقة | مُدرج في مستودع الحل الفائز |
| تقرير المقارنة التقنية الكامل | مُدرج في مستودع الاختبار |
الخلاصة
حلّي يمتثل لجميع قيود المسابقة، ويحقق دقة استرجاع أعلى بنسبة 40.4%، ويُعيد محتوى صحيحاً وقابلاً للتطبيق لـ14 من أصل 16 استعلاماً (مع 0 فشل تام)، وذلك كله دون اتصال بالإنترنت ودون اعتماد على APIs خارجية.
استرجاع الحل الفائز — المهمة الجوهرية للتحدي — يسجل درجات أدنى على كل مقياس اختُبر. مع 176 مقطعاً مُنتَجاً بنافذة منزلقة ذات عرض ثابت، ودون معالجة للفرنسية، ودون تفكيك استعلام، ودون PostgreSQL (وهو شرط مُصرَّح به)، وفقط 4 من 16 استعلاماً تُعيد بيانات قابلة للاستخدام، و5 حالات فشل تام في الاختبار الأساسي، لا تتوافق المخرجات الملاحظة مع مواصفات المسابقة.
كسياق إضافي (غير مُحتسَب — قابلية التوسع لم تكن متطلباً): يتوسع Noobmaster للمنتجات غير المرئية دون إعادة نتائج منتجات خاطئة (5/10 ناجح تماماً، 5/10 جزئي، 0 فشل)، بينما يسترجع الحل الفائز المنتج الخاطئ في 3 من 10 استعلامات منتجات جديدة مع نجاح كامل واحد فقط.
نُفِّذ الاختبار في الفترة 17–26 مارس 2026. كلا الحلين اختُبرا بنفس 16 استعلاماً + 10 استعلامات قابلية توسع، ونفس نموذج التضمين (all-MiniLM-L6-v2)، ونفس K=3، على نفس الجهاز. درجات الاسترجاع هي قيم تشابه جيب التمام القابلة للتكرار. قُيِّمت مفيدية الإجابات بمراجعة يدوية لكل مقطع R1 مقارنةً بمحتوى ملف PDF المصدر — دون مطابقة تلقائية بالكلمات المفتاحية. جرى التحقق المتقاطع لمفيدية إجابات قابلية التوسع مقابل ملفات PDF المصدر باستخدام pdfplumber.
يحتوي هذا المنشور فقط على معلومات متاحة للعموم وحقائق تقنية قابلة للتحقق. يمكن التحقق من جميع التصريحات بشكل مستقل عبر استنساخ المستودعات المُشار إليها وتشغيل الاختبارات الموثقة.