استضافة ذاتية للـ Embeddings لـ DiscourseAI

يحتوي المكون الإضافي Discourse AI على العديد من الميزات التي تتطلب تضمينات للعمل، مثل المواضيع ذات الصلة، والبحث بالذكاء الاصطناعي، واقتراح فئة وعلامة مساعد الذكاء الاصطناعي، وما إلى ذلك. بينما يمكنك استخدام واجهة برمجة تطبيقات لطرف ثالث، مثل تكوين مفاتيح API لـ OpenAI، تكوين مفاتيح API لـ Cloudflare Workers AI أو تكوين مفاتيح API لـ Google Gemini، فقد قمنا ببناء Discourse AI منذ اليوم الأول لعدم الارتباط بهذه الخدمات.

التشغيل باستخدام HuggingFace TEI

توفر HuggingFace صورة حاوية رائعة يمكنها تشغيلك بسرعة.

على سبيل المثال:

mkdir -p /opt/tei-cache
docker run --rm --gpus all --shm-size 1g -p 8081:80 \
  -v /opt/tei-cache:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id BAAI/bge-large-en-v1.5

يجب أن يؤدي هذا إلى تشغيل نسخة محلية من BAAI/bge-large-en-v1.5، وهو نموذج مفتوح المصدر عالي الأداء جدًا.
يمكنك التحقق مما إذا كان يعمل باستخدام

curl http://localhost:8081/ \
    -X POST \
    -H 'Content-Type: application/json' \
    "{ \"inputs\": \"Testing string for embeddings\" }"

والذي يجب أن يعيد مصفوفة من الأرقام العشرية في التشغيل العادي.

جعله متاحًا لمثيل Discourse الخاص بك

في معظم الأوقات، ستقوم بتشغيل هذا على خادم مخصص بسبب تسريع وحدة معالجة الرسومات. عند القيام بذلك، أوصي بتشغيل وكيل عكسي، وإجراء إنهاء TLS، وتأمين نقطة النهاية بحيث لا يمكن الاتصال بها إلا بواسطة مثيل Discourse الخاص بك.

تكوين DiscourseAI

يتضمن Discourse AI إعدادات الموقع لتكوين خادم الاستدلال للنماذج مفتوحة المصدر. يجب عليك توجيهه إلى خادمك باستخدام علامة التبويب Embeddings في إعدادات المسؤول للمكون الإضافي للذكاء الاصطناعي.

11 إعجابًا

هل يجب أن يعمل النموذج bge-m3 مع المواقع متعددة اللغات (أو غير الإنجليزية)؟

نعم، لقد لعبت بها الأسبوع الذي تمت مشاركته فيه بصمت على GitHub وهي تعمل بشكل جيد. ما زلت أنتظر رؤية كيف ستظهر على لوحات المتصدرين MTEB، حيث لم تكن هناك آخر مرة نظرت فيها.

ومع ذلك، لدينا مثيلات Discourse مستضافة كبيرة تستخدم المكون الإضافي متعدد اللغات الذي يتم شحنه، e5، وهو يؤدي أداءً جيدًا جدًا.

إعجاب واحد (1)

شكراً، هل كانت لديك خطط لتمكين نقاط النهاية المخصصة مفتوحة المصدر للتضمينات؟ أحاول استخدام هذه النماذج على Huggingface.

عذرًا، لا أفهم ما تحاول نقله هنا. هذا الموضوع هو دليل حول كيفية تشغيل نماذج مفتوحة المصدر لتضمينات Discourse AI.

أوه، عذرًا على ذلك. أحاول استخدام نموذج مفتوح المصدر من نقطة نهاية مخصصة لـ HuggingFace وأتساءل عما إذا كان ذلك ممكنًا أو ما إذا كان ضمن الخطط للتمكين في المستقبل القريب :slight_smile:

للتحقق مما إذا كان يعمل، فإن الأمر التالي يعمل معي (مع نموذج BAAI/bge-m3):

curl -X 'POST' \
  'http://localhost:8081/embed' \
  -H 'Content-Type: application/json' \
  -d '{ "inputs": "Testing string for embeddings"}'

بالمناسبة، يمكنك أيضًا استخدام واجهة ويب Swagger على http://localhost:8081/docs/.

إعجابَين (2)

هذا أيضًا خادم تضمينات لطيف:

إعجاب واحد (1)

لتوفير المساحة، هل من الممكن استخدام تضمينات مُكمّاة؟ أود استخدام تضمينات ثنائية مُكمّاة لتقليل حجم التخزين بشكل كبير. بعد إجراء بعض الاختبارات، حصلت على أداء يزيد عن 90% مع تخزين أقل بـ 32 مرة!

إعجاب واحد (1)

نقوم بتخزين التضمينات باستخدام نصف الدقة (نصف مساحة التخزين) واستخدام التكميم الثنائي للفهارس (أصغر بـ 32 مرة) افتراضيًا منذ بضعة أسابيع، لذا فإن مجرد تحديث موقعك إلى أحدث إصدار يجب أن يوفر لك تقليلًا كبيرًا في استخدام القرص.

3 إعجابات

هل يمكنك أيضًا إضافة:

إلى نماذج التضمين المدعومة؟

نخطط لجعل التضمينات قابلة للتكوين بنفس الطريقة التي فعلناها مع نماذج اللغة الكبيرة (LLMs)، لذا ستكون أي نموذج متوافقًا قريبًا.

4 إعجابات

إذا واجه أي شخص آخر مشاكل مع نقاط النهاية على الشبكة المحلية مثل 192.168.x.x - يبدو أن هذه محظورة بواسطة discourse (يفترض لأسباب أمنية) ويجب تجاوز الحظر. لقد أضعت بعض الساعات في اكتشاف ذلك!

إعجاب واحد (1)

@Falco سيكون ذلك رائعًا. في غضون ذلك، إذا أردت أن أحاول إضافة نموذج تضمين جديد، فهل أحتاج فقط إلى إضافة:

 lib/embeddings/vector_representations/mxbai-embed-xsmall-v1.rb
 lib/tokenizer/mxbai-embed-xsmall-v1.rb
 tokenizers/mxbai-embed-xsmall-v1.json

وتعديل lib/embeddings/vector_representations/base.rb لتضمين النموذج الجديد، أم أن هناك شيئًا آخر أحتاج إلى تغييره أيضًا؟

@Falco لقد جربت إضافة النموذج وأرسلت طلب سحب. أعتذر إذا ارتكبت خطأ ما لأنني لست مطور برامج حقًا. كنت آمل أن تتمكن من إلقاء نظرة عليه ومعرفة ما إذا كان مناسبًا للإدراج.

للأسف، لم أتمكن من جعله يعمل مع TEI. تمكنت من جعل all-mpnet يعمل مع TEI، لكن أعتقد أن هناك خطأ ما فيما فعلته لجعل mxbai يعمل.

بالمناسبة، هل هناك أي فرصة لدعم https://github.com/michaelfeil/infinity كخادم تضمين؟

تعديل: أرى أن هذا سيكون فوضويًا لأن فهارس HNSW في قاعدة البيانات تبدو مبرمجة بشكل ثابت، لذا يجب إضافة النماذج الجديدة في النهاية لتجنب تعطيل الترتيب، ويحتاج كل نموذج جديد إلى إضافة فهرسه الخاص.

أنا أوصي بشدة بالانتظار بضعة أسابيع حتى نقوم بشحن دعم التضمينات القابلة للتكوين.

يجب أن يعمل هذا بشكل جيد عندما نقوم بشحن التضمينات القابلة للتكوين، ولكن بدافع الفضول، ما الذي سيجلبه هذا فوق https://github.com/huggingface/text-embeddings-inference؟

لم أتابع TEI لذا لن أذكر المزايا التي لم أختبرها مؤخرًا، ولكن من بين الأشياء التي رأيتها مؤخرًا:

  • دعم الأجهزة: infinity لديه دعم أفضل لوحدة معالجة الرسومات (GPU) من TEI
  • يمكن لخادم infinity استضافة نماذج تضمين متعددة في خادم واحد (ما لم أفتقد هذا في TEI)

إنه لطيف جدًا. إذا لم تكن قد جربته، فيجب عليك إلقاء نظرة!

إعجاب واحد (1)

قام صديق بإرسال هذا الموضوع لي عبر الرسائل المباشرة.

بعض الإيجابيات/السلبيات:

  • يدعم infinity تضمينات متعددة الوسائط (أي إرسال صور/صوت) إلى
  • دعم بطاقات الرسوميات AMD
  • نماذج متعددة مدعومة في نفس الحاوية (تحكم في النموذج عبر المعلمة model).
  • أنواع بيانات إضافية مثل تكميم int8 للأوزان (هذا غير مهم في الغالب، ذاكرة التنشيط أكبر)
  • غالبًا ما تظهر نماذج جديدة عبر “رمز نمذجة مخصص” يتم شحنه في مستودع huggingface. يقرأ Infinity رمز pytorch هذا إذا لزم الأمر. سيساعدك هذا على تجنب “هل يمكنك دعم نماذج كذا وكذا” بشكل مستمر)
  • المزيد من النماذج المدعومة (مثل debertav2 لـ mixedbread)

السلبيات:

  • وقت البدء البارد لـ TEI أفضل
3 إعجابات

مرحباً مايكل :wave:

لقد كان @roman مشغولاً بإعادة هيكلة إعدادات التضمين الخاصة بنا على:

يجب أن ننتهي قريباً جداً، وبمجرد الانتهاء من ذلك، سيكون إضافة الدعم لـ inifinity أمراً بسيطاً.

ما زلت أفكر كثيراً في التضمين متعدد النماذج، فهو يمنحك اختصاراً عند محاولة القيام بـ RAG على ملفات PDF لأنك تقوم بمعالجتها إلى صور وتضمين كل صورة، مما يتجنب الحاجة إلى OCR أو تحويل الصور المكلف إلى نص مدعوم بنموذج لغوي كبير.

بمجرد الانتهاء من طلب السحب هذا، سنكون أكثر من سعداء لإضافة دعم infinity (ودعم النماذج المتعددة) إلى إعدادات التضمين.

شكراً لمرورك :hugs:

4 إعجابات

أتساءل عما إذا كان بناء دعم litellm قد يوفر طريقًا مختصرًا، حيث تستفيد بعد ذلك من جميع النماذج المدعومة عبر litellm. يبدو أن المشاريع الأخرى تدمج هذا.