تعد RAG الأصلية جزءًا من الذكاء الاصطناعي الأصليالمدمج في الواجهة الخلفية Aurabase، إلى جانب NL2SQL: ليست خدمة تابعة لجهة خارجية يتم تجميعها فوق قاعدة عامة. المتطلبات الأساسية لمتابعة هذا البرنامج التعليمي: مشروع Aurabase موجود، وموفر LLM تم تكوينه (OpenAI أو Google Gemini للتضمين، أحد الموفرين الأصليين الثلاثة للإنشاء)، ومفتاح واجهة برمجة تطبيقات المشروع.
- يتكون خط أنابيب Aurabase RAG من مكالمتين:
ragIngest()لفهرسة مستند، وrag()للاستعلام وإنشاء استجابة. تتم إدارة التقطيع والتضمين والبحث عن المتجهات من جانب الخادم. - تحت الغطاء، يوجد PostgreSQL وpgvector القياسيان: جدول
embeddingsبعمود متجه واحد لكل فئة أبعاد (768، 1536، 3072) وفهرس HNSW جزئي لكل فئة. - يستخدم التجميع أداة رمزية حقيقية (
tiktokeno200k)، مع تداخل قابل للتكوين وواقي مضاد للانفجار على المستندات الكبيرة. - يتم تحييد المحتوى المسترد قبل إدخاله في الموجه: يتم إبطال مفعول المستند الذي يحاول الهروب من علامته لانتحال تعليمات النظام بشكل صريح.
- يقوم OpenAI وGemini فقط بإنشاء التضمينات على جانب Aurabase. ليس لدى Anthropic/Claude واجهة برمجة تطبيقات عامة للتضمين، فهي تظل مخصصة لإنشاء الاستجابة النهائية.
كيف يعمل خط أنابيب RAG هذا
يتم تنفيذ خط الأنابيب على خمس مراحل. عند الاستيعاب، يتم تقطيع النص، ويتم نقل كل جزء دفعة واحدة ثم تخزينه. عند الاستعلام، يتم توجيه السؤال بدوره، مقارنة بالقطع المخزنة بواسطة تشابه جيب التمام، ويتم إدخال المقتطفات الأقرب في الموجه المرسل إلى نموذج التوليد.
التقطيع (tiktoken) ← التضمين (دفعة) ← تخزين pgvector (HNSW) ← بحث التشابه ← الجيل المعزز
تفاصيل معمارية مهمة في الإنتاج: لا يتم تعليق اتصال Postgres أثناء مكالمات الشبكة إلى موفر التضمين أو الإنشاء. يتم إغلاق معاملة قاعدة البيانات قبل المكالمة الخارجية وإعادة فتحها بعد ذلك، لعدم حظر واجهة PgBouncer الخلفية المشتركة مطلقًا لزمن انتقال شبكة الطرف الثالث.
إنشاء المشروع
على عكس pgvector النموذجي المستضاف ذاتيًا، لا تحتاج إلى تشغيل CREATE EXTENSION vector أو إنشاء جدول بنفسك لخط الأنابيب هذا. يتم توفير مخطط embeddings الخاص بالمشروع، مع أعمدته المتجهة وفهارس HNSW، تلقائيًا عند إنشاء المشروع.
يتم تكوين موفر التضمين مرة واحدة، على جانب المشروع (Studio → IA → الموردون). هذا المزود هو الذي يحدد البعد الفعال للمتجهات الخاصة بك، وبالتالي العمود المستخدم في الجدول embeddings.
قم بفهرسة مستنداتك باستخدام ragIngest()
استدعاء واحد يكفي لفهرسة مستند: يتم تقسيم النص إلى أجزاء، ويتم توجيه كل قطعة، ثم يتم تخزينها في مساحة الاسم المطلوبة. يستخدم التقسيم أداة رمزية حقيقية (tiktoken، ترميز o200k_base)، وليس تقسيمًا بسيطًا بمسافات، والذي يظل صحيحًا على النص بدون مسافات مثل بعض اللغات الآسيوية.
في HTTP الخام، المسار المكافئ هو POST /v1/ai/{project_id}/rag/ingest، تمت مصادقته بواسطة مفتاح API الخاص بالمشروع.
يكون العرض غير فعال افتراضيًا: يتم اشتقاق معرف المستند تلقائيًا (تجزئة SHA-256 للمحتوى، أو metadata.document_id إذا قدمته). تؤدي إعادة إدخال نفس المحتوى إلى استبدال أجزاءه الموجودة بدلاً من تكرارها، مما يجعل مهمة المزامنة الدورية آمنة لإعادة التشغيل.
ما يهبط بالفعل في Postgres
لا يوجد سحر خاص هنا: الجدول الذي يستقبل المتجهات الخاصة بك هو جدول Postgres عادي، مع عمود vector واحد لكل فئة البعد وفهرس HNSW جزئي لكل عمود (نشط فقط في الصفوف التي تملأه). وهذا هو تعريفها الحقيقي بشكل مبسط:
يقارن كل بحث المتجهات مع عامل مسافة جيب التمام (<=>)، الذي يستهدفه فئتا عاملي الفهرس vector_cosine_ops و halfvec_cosine_ops. للحصول على تفاصيل حول مقايضات الاستدعاء/زمن الاستجابة لـ HNSW مقابل IVFFlat، راجع المقالة المخصصة لفهرسة HNSW. لاختيار بُعد التضمين نفسه، راجع المقارنة 768 مقابل 1536 مقابل 3072.
الاستعلام وإنشاء الاستجابة باستخدام rag()
على جانب الاستعلام، يقوم rag() بربط توجيه السؤال، والبحث عن طريق التشابه في مساحة الاسم، وإنشاء الموجه المعزز واستدعاء نموذج الإنشاء، في رحلة ذهابًا وإيابًا على شبكة واحدة من جانب العميل.
يحمل الرد الرد الناتج ومصادره، مع استخدام الموفر فعليًا:
لا يتم أبدًا إدخال المحتوى المسترد بشكل خام في موجه النظام. هذه بيانات غير موثوقة (تحميل المستخدم، صفحة مفهرسة): يتم تحييد المستند الذي يحتوي، على سبيل المثال، على علامة قسم إغلاق متبوعة بتعليمات خاطئة قبل التجميع، واستبدال أقواس الزوايا بأقواس، ويتم الحفاظ على النص ولكن يتم إبطال مفعول البنية.
إذا لم يجد rag() شيئًا على الرغم من أن مساحة الاسم الخاصة بك ليست فارغة، فإن الاستجابة تحمل تحذيرًا صريحًا بدلاً من الصمت المضلل: من المحتمل أن تتم فهرسة مجموعتك ضمن نموذج آخر أو بُعد تضمين آخر. أعد فهرسته عبر POST /v1/ai/{project_id}/rag/{namespace}/reindex.
من LangChain وpgvector المصنوع يدويًا: ما الذي يتغير؟
إذا كنت قد أنشأت بالفعل روبوت دردشة RAG على PostgreSQL باستخدام LangChain، فإن كل قالب يدوي له مكافئ مُدار من جانب الخادم هنا، دون تغيير قاعدة البيانات الأساسية.
| تفكيك النص | RecursiveCharacterTextSplitter لتعيين نفسك | ragIngest (): تقسيم tiktoken المتكامل، 512 رمزًا / 64 رمزًا متداخلًا بشكل افتراضي |
|---|---|---|
| التضمين | الاتصال اليدوي بـ OpenAIEmbeddings، وإدارة حدود الدفعة | إعادة المحاولة المؤقتة المجمعة تلقائيًا |
| تخزين المتجهات | جدول pgvector + فهرس HNSW لإنشاء وترحيل نفسك | المخطط والفهارس المقدمة لكل مشروع |
| بحث + موجه | PGVector.similarity_search() ثم تجميع الموجه يدويًا | rag(): البحث والتوليد المعزز في مكالمة واحدة |
| المحتوى المسترد | حقن كما هو الحال في الموجه | التحييد التلقائي لعلامات الهيكل قبل التجميع |
هل تقوم بترحيل مشروع موجود مبني على Supabase باستخدام هذا النوع من التجميع اليدوي؟ يتم تغطية منطق الترحيل لبقية الواجهة الخلفية (المخطط، وسياسات RLS، وSDK) في دليل الترحيل Supabase إلى Aurabase.
الإعدادات والحدود التي يجب أن تكون على دراية بها قبل الدخول في الإنتاج
تؤثر ثلاثة إعدادات بشكل مباشر على التكلفة ووقت الاستجابة، ويتم التحقق منها جميعًا في رمز الخدمة aura-ai. عدد المحاولات لاستدعاء التضمين العابر (فشل الشبكة، خطأ الموفر 429) هو 3 بشكل افتراضي، مع تراجع أساسي قدره 100 مللي ثانية. يتم تضمين المستندات الكبيرة في دفعات فرعية تقتصر على 2048 قطعة بشكل افتراضي، وذلك لاحترام الحدود القصوى لواجهة برمجة التطبيقات الخاصة بالموردين دون الفشل في مستند واحد ضخم. يرفض حاجز الحماية (10000 قطعة بشكل افتراضي، قابل للتكوين) بشكل صريح استيعاب مستند من شأنه أن ينتج عددًا شاذًا من القطع.
على جانب البحث، يتم ضبط حجم قائمة مرشحي HNSW تلقائيًا إلى max(64, top_k × 4): كلما زاد عدد النتائج التي تطلبها، زاد عدد المرشحين الذين يستكشفهم الفهرس للحفاظ على الاستدعاء. تظل القيمة الثابتة ممكنة عبر متغير البيئة إذا كان لدى مجموعتك ملف تعريف معين.
لا يتم أبدًا مقارنة المساحات المتجهة للنماذج المختلفة مع بعضها البعض: يظل كل بحث مقتصرًا على نموذج التضمين الحالي، ويتطلب تغيير النماذج إعادة فهرسة صريحة بدلاً من التبديل الصامت الذي من شأنه أن يكسر اتساق النتائج.
الحدود الحالية التي يجب أن تكون على علم بها
يجب أن يقع بُعد التضمين ضمن إحدى الفئات الثلاث المدعومة: 768، أو 1536، أو 3072. يتم رفض الموفر الذي يقوم بإرجاع بُعد آخر بسبب وجود خطأ صريح، ولا يتم اقتطاعه مطلقًا أو إرساله بصمت.
لا يتوفر إنشاء التضمين إلا عبر OpenAI أو Google Gemini من بين الموفرين الأصليين الثلاثة: لا يعرض Anthropic/Claude واجهة برمجة تطبيقات التضمين العامة، لذلك يتم استخدامه فقط لإنشاء الاستجابة النهائية في مسار التدفق هذا، وليس للتوجيه أبدًا.
لم تكشف JavaScript SDK حتى الآن عن تجاوزات top_k وthreshold عند استدعاء rag(): تظل قابلة للوصول في HTTP المباشر، وتقتصر على التوالي على [1، 50] و[0، 1]، ولكن ليس من aura.ai.rag() كما هو الحال اليوم. عتبة التشابه الافتراضية (0.3) مسموح بها بشكل متعمد؛ قم بتضييق نطاقها إلى مجموعة كثيفة لتجنب المصادر غير ذات الصلة في الموجه.
للذهاب أبعد من ذلك
يغطي RAG الأسئلة المتعلقة بالمحتوى غير المنظم (المستندات والملاحظات والتذاكر). بالنسبة للأسئلة حول بياناتك العلائقية، يقوم NL2SQL الأصلي لـ Aurabase بترجمة السؤال مباشرة إلى SQL تم التحقق من صحته. للحصول على تفاصيل حول معلمات HNSW وفئات الأبعاد المذكورة أعلاه، راجع المقالة حول فهرسة HNSW و مقارنة أبعاد التضمين. يظل مرجع واجهة برمجة التطبيقات (API) الكامل هو وثائق RAG & pgvector ووثائق بوابة AI.