أحدث نموذج LLM معزز بالاسترجاع: bge-large-en-v1.5

أحدث نموذج LLM معزز بالاسترجاع: bge-large-en-v1.5

مقدمة

هل أنت مهتم بنموذج LLM المتطور معزز بالاسترجاع ‘bge-large-en-v1.5’؟ انضم إلينا في هذه المدونة بينما نستكشف هذا النموذج بعمق. ستكتشف دور نماذج التضمين وتطبيقاتها العملية. سنرشدك خلال نشر ‘bge-large-en-v1.5’ في الكود، وضبطه الدقيق، ودمجه بسلاسة مع LLM API. استعد لفتح إمكانيات جديدة عند تقاطع نماذج التضمين و LLMs!

ما هو bge-large-en-v1.5؟

باختصار، bge-large-en-v1.5 هو نموذج تضمين مفتوح المصدر أنشأته BAAI.

على وجه التحديد، ‘bge’ في ‘bge-large-en-v1.5’ يرمز إلى ‘BAAI General Embedding’. BAAI، المعروفة أيضًا باسم ‘FlagEmbedding’ على Github، هي منظمة خاصة غير ربحية مكرسة للبحث والتطوير في الذكاء الاصطناعي. مع التركيز على نماذج اللغة الكبيرة المدعومة بالاسترجاع (LLMs)، أطلقت BAAI العديد من المشاريع ذات الصلة. تتضمن هذه المشاريع LLM طويل السياق (Activation Beacon)، وضبط LM الدقيق (LM-Cocktail)، والاسترجاع الكثيف (BGE-M3، LLM Embedder، BGE Embedding)، ونموذج إعادة الترتيب (BGE Reranker)، والمعايير (C-MTEB). ينتمي Bge-large-en-v1.5 إلى سلسلة نماذج BGE Embedding، المطورة خصيصًا لأغراض الاسترجاع الكثيف.

ماذا يفعل نموذج التضمين للاسترجاع الكثيف؟

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

تحويل النص إلى تمثيلات كثيفة

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

غالبًا ما تدمج LLMs نماذج التضمين كجزء من بنيتها. على سبيل المثال، يستخدم BERT تقنيات التضمين لتمثيل الكلمات وتسلسلات الإدخال قبل معالجتها عبر طبقات المحول الخاصة به. تستفيد LLMs من نماذج التضمين من خلال قدرتها على التقاط العلاقات الدلالية والفروق الدقيقة السياقية، والتي تعتبر حاسمة لتوليد استجابات متماسكة ومناسبة سياقيًا في مهام مثل توليد الحوار أو الترجمة الآلية.

دور المسترجع الكثيف

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

أمثلة على التطبيقات

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

على سبيل المثال، يمكن تحويل استعلام مثل “ما هي أعراض COVID-19؟” إلى متجه تضمين. وبالمثل، يتم تحويل المستندات التي تناقش أعراض COVID-19 إلى تضمينات. من خلال مقارنة التشابه بين تضمين الاستعلام وتضمينات المستند (باستخدام تقنيات مثل تشابه جيب التمام)، يمكن تحديد المستندات الأكثر صلة وترتيبها بسرعة.

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

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

كيف يمكنني استخدام bge-large-en-v1.5 في الكود؟

استخدام bge-large-en-v1.5 مع Langchain

يمكنك استخدام bge في langchain بهذه الطريقة:

from langchain.embeddings import HuggingFaceBgeEmbeddings
model_name = "BAAI/bge-large-en-v1.5"
model_kwargs = {'device': 'cuda'}
encode_kwargs = {'normalize_embeddings': True} # set True to compute cosine similarity
model = HuggingFaceBgeEmbeddings(
    model_name=model_name,
    model_kwargs=model_kwargs,
    encode_kwargs=encode_kwargs,
    query_instruction="Generate a representation for this sentence to be used for retrieving relevant articles:"
)
model.query_instruction = "Generate a representation for this sentence to be used for retrieving relevant articles:"

استخدام bge-large-en-v1.5 مع Huggingface Transformers

باستخدام حزمة transformers، يمكنك استخدام النموذج بهذه الطريقة: أولاً، تمرير المدخلات عبر نموذج المحول، ثم تحديد الحالة المخفية الأخيرة للرمز الأول (أي [CLS]) كتضمين الجملة.

from transformers import AutoTokenizer, AutoModel
import torch
# Sentences we want sentence embeddings for
sentences = ["Sample Data-1", "Sample Data-2"]

# Load model from HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained('BAAI/bge-large-en-v1.5')
model = AutoModel.from_pretrained('BAAI/bge-large-en-v1.5')
model.eval()
# Tokenize sentences
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
# for s2p(short query to long passage) retrieval task, add an instruction to query (not add instruction for passages)
# encoded_input = tokenizer([instruction + q for q in queries], padding=True, truncation=True, return_tensors='pt')
# Compute token embeddings
with torch.no_grad():
    model_output = model(**encoded_input)
    # Perform pooling. In this case, cls pooling.
    sentence_embeddings = model_output[0][:, 0]
# normalize embeddings
sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1)
print("Sentence embeddings:", sentence_embeddings)

لمزيد من المعلومات حول استخدام نماذج bge، يمكنك زيارة FlagEmbedding على Github.

كيف يمكنني ضبط bge-large-en-v1.5 بدقة؟

الخطوة 1: التثبيت

  • التثبيت باستخدام pip: pip install -U FlagEmbedding
  • أو التثبيت من المصدر بعد استنساخ المستودع والدخول إليه: pip install .
  • للتطوير، استخدم التثبيت القابل للتعديل: pip install -e .

الخطوة 2: تحضير البيانات

  • يجب أن تكون بيانات التدريب بتنسيق JSON مع كل سطر كقاموس يحتوي على query (استعلام) و pos (قائمة النصوص الإيجابية) و neg (قائمة النصوص السلبية).
  • إذا لم تكن النصوص السلبية متوفرة، يمكن أخذ عينات عشوائية من المجموعة.

الخطوة 3: استخراج الأمثلة السلبية الصعبة

  • استخدم برنامجًا نصيًا لاستخراج الأمثلة السلبية الصعبة لتحسين جودة تضمين الجملة.
  • يمكنك استخراج الأمثلة السلبية الصعبة باتباع هذا الأمر:
python -m FlagEmbedding.baai_general_embedding.finetune.hn_mine \
--model_name_or_path BAAI/bge-base-en-v1.5 \
--input_file toy_finetune_data.jsonl \
--output_file toy_finetune_data_minedHN.jsonl \
--range_for_sampling 2-200 \
--negative_number 15 \
--use_gpu_for_searching
  • ملف الإدخال: ملف JSON يحتوي على بيانات للضبط الدقيق، حيث يحدد البرنامج النصي أفضل المستندات لكل استعلام ثم يختار عشوائيًا أمثلة سلبية من هذه النتائج العليا، باستثناء أي أمثلة إيجابية مقدمة بالفعل.
  • ملف الإخراج: الوجهة حيث سيتم تخزين ملف JSON، المخصب بالأمثلة السلبية الصعبة التي تم استخراجها حديثًا، لاستخدامها في عملية الضبط الدقيق.
  • عدد الأمثلة السلبية: يحدد عدد العينات السلبية التي سيتم جمعها.
  • نطاق أخذ العينات: يحدد النطاق الذي سيتم استخلاص العينات السلبية منه. على سبيل المثال، نطاق 2–100 يعني أن الأمثلة السلبية ستؤخذ من أفضل 2 إلى أفضل 200 مستند. توسيع هذا النطاق، مثل 60–300، يجعل اختيار الأمثلة السلبية أقل تحديًا من خلال النظر في مجموعة أوسع من المستندات.
  • مجموعة الاسترجاع: المصدر الذي سيسحب منه البرنامج النصي المستندات للاسترجاع. افتراضيًا، هذه هي مجموعة جميع الأمثلة السلبية في ملف الإدخال، بتنسيق مشابه لبيانات ما قبل التدريب. إذا تم تحديد مجموعة استرجاع معينة، فسيستخدم البرنامج النصي هذه المجموعة بدلاً من ذلك للعثور على أمثلة سلبية.
  • البحث المستند إلى GPU: خيار للإشارة إلى ما إذا كان يجب استخدام faiss-gpu المسرع بواسطة GPU لتعزيز كفاءة عملية استرجاع الأمثلة السلبية.

الخطوة 4: التدريب

torchrun --nproc_per_node {عدد وحدات GPU} \
-m FlagEmbedding.baai_general_embedding.finetune.run \
--output_dir {مسار حفظ النموذج} \
--model_name_or_path BAAI/bge-large-en-v1.5 \
--train_data ./toy_finetune_data.jsonl \
--learning_rate 1e-5 \
--fp16 \
--num_train_epochs 5 \
--per_device_train_batch_size {حجم الدفعة الكبير; اضبط 1 للبيانات التجريبية} \
--dataloader_drop_last True \
--normlized True \
--temperature 0.02 \
--query_max_len 64 \
--passage_max_len 256 \
--train_group_size 2 \
--negatives_cross_device \
--logging_steps 10 \
--save_steps 1000 \
--query_instruction_for_retrieval ""
  • حجم دفعة التدريب لكل جهاز: كمية العينات المعالجة في كل دفعة تدريب. عادةً، يزيد حجم الدفعة الأكبر من أداء النموذج. يمكنك زيادة هذا الحجم باستخدام خيارات مثل التدريب بنصف الدقة (--fp16)، وتكوين DeepSpeed (--deepspeed ./df_config.json، حيث يمكن أيضًا تسمية df_config.json باسم ds_config.json)، وتدقيق التدرج (--gradient_checkpointing).
  • حجم مجموعة التدريب: يحدد العدد الإجمالي للأمثلة، الإيجابية والسلبية، المستخدمة لكل استعلام أثناء التدريب. نظرًا لوجود مثال إيجابي مضمون، يحدد هذا الإعداد عدد الأمثلة السلبية (محسوبة على أنها train_group_size - 1). ضع في اعتبارك أن هذا الرقم يجب ألا يتجاوز الأمثلة السلبية المتاحة في قائمة neg ببياناتك. بالإضافة إلى هذه الأمثلة السلبية للمجموعة، يتم أيضًا دمج الأمثلة السلبية الأخرى داخل الدفعة في عملية الضبط الدقيق.
  • مشاركة الأمثلة السلبية عبر الأجهزة: تسمح بتوزيع الأمثلة السلبية عبر جميع وحدات GPU المتاحة، مما يزيد بشكل فعال من العدد الإجمالي للأمثلة السلبية المستخدمة في التدريب.
  • معدل التعلم: اختر قيمة تناسب نموذجك المحدد. للنماذج الكبيرة أو الأساسية أو الصغيرة الحجم، يُوصى عادةً بقيم مثل 1e-5 أو 2e-5 أو 3e-5.
  • درجة الحرارة: تؤثر على انتشار توزيع درجات التشابه. تتراوح القيم المقترحة من 0.01 إلى 0.1.
  • الحد الأقصى لطول الاستعلام: الحد الأعلى لطول الاستعلام، والذي يجب أن يتوافق مع متوسط طول الاستعلام في مجموعة البيانات الخاصة بك.
  • الحد الأقصى لطول المقطع: الحد الأعلى لطول المقطع، يتم تعيينه وفقًا لمتوسط طول المقاطع في بياناتك.
  • تعليمات استعلام الاسترجاع: توجيه اختياري يضاف إلى كل استعلام لأغراض الاسترجاع. يمكنك تركه فارغًا عن طريق تعيينه كسلسلة فارغة إذا لم تكن هناك حاجة إلى سياق إضافي.
  • استخدام الأمثلة السلبية داخل الدفعة: علامة تشير إلى ما إذا كان يجب اعتبار المقاطع من نفس الدفعة كأمثلة سلبية في التدريب. الإعداد الافتراضي مفعل (True).
  • فاصل حفظ نقاط التفتيش: يحدد تكرار حفظ نقاط تفتيش النموذج بناءً على عدد خطوات التدريب المنجزة.

الخطوة 5: تحميل النموذج

بمجرد ضبط نموذج BGE بدقة، يمكنك تحميله بسهولة كما هو موضح في هذا المثال. إذا قمت بتحديد قيمة فريدة للمعامل الفائق --query_instruction_for_retrieval أثناء مرحلة الضبط الدقيق، فتأكد من استبدال query_instruction_for_retrieval وفقًا لذلك.

الخطوة 6: تحميل النموذج

لتقييم النموذج، يمكنك تشغيل هذا البرنامج النصي المقدم من FlagEmbedding.

يمكن أن يؤدي تعديل نموذج bge الأساسي من خلال الضبط الدقيق إلى أداء أفضل خاص بالمهمة، ولكنه قد يتسبب أيضًا في انخفاض ملحوظ في فعالية النموذج الكلي خارج النطاق المستهدف (على سبيل المثال، انخفاض في الأداء في مهام c-mteb). للحصول على معلومات حول الحل (باستخدام LM-Cocktail) بالإضافة إلى عملية الضبط الدقيق، راجع “FlagEmbedding/examples/finetune” على Github.

كيف يمكنني دمج bge-large-en-v1.5 مع LLM API؟

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

الخطوة 1: إعداد بيئتك

أولاً، تأكد من أن لديك بيئة Python اللازمة مع الحزم المطلوبة مثبتة.

pip install openai
# تثبيت حزم أخرى ضرورية، على سبيل المثال، requests، numpy، إلخ.

الخطوة 2: تهيئة عميل Novita AI API

لقد قدمت بالفعل الكود لتهيئة عميل Novita AI API. إليك كمرجع:

from openai import OpenAI

client = OpenAI(
    base_url="https://api.novita.ai/v3/openai",
    api_key="<مفتاح API الخاص بك Novita AI>",  # استبدل بمفتاح API الفعلي الخاص بك
)
model = "nousresearch/nous-hermes-llama2-13b"

الخطوة 3: الحصول على نموذج التضمين

بافتراض أن لديك إمكانية الوصول إلى نموذج bge-large-en-v1.5، ستقوم بتحميله. إذا كان نموذج Hugging Face، يمكنك استخدام مكتبة transformers كما يلي:

from transformers import AutoModel, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-large-en-v1.5")
model = AutoModel.from_pretrained("BAAI/bge-large-en-v1.5")

الخطوة 4: تعريف دالة للحصول على التضمينات

أنشئ دالة للحصول على التضمينات من نموذج bge-large-en-v1.5.

def get_embeddings(text):
    inputs = tokenizer(text, return_tensors="pt")
    with torch.no_grad():
        embeddings = model(**inputs)[0].mean(dim=1)
    return embeddings.numpy()

الخطوة 5: التكامل مع Novita AI LLM API

الآن، قم بدمج نموذج التضمين مع LLM API لتعزيز استجابات API أو أداء مهام مثل البحث الدلالي.

def enhanced_llm_response(prompt):
    # الحصول على الاستجابة الأولية من LLM
    response = client.completions.create(
        model=model,
        prompt=prompt,
        stream=True,
        max_tokens=512,
    )
    
    # معالجة الاستجابة (على سبيل المثال، استخراج النص)
    # هذا مكان مؤقت لمعالجة الاستجابة الفعلية
    response_text = next(response)['choices'][0]['text'].content
    
    # الحصول على تضمينات للاستجابة
    response_embeddings = get_embeddings(response_text)
    
    # هنا، يمكنك استخدام التضمينات لأغراض مختلفة،
    # مثل البحث الدلالي، التصفية، إلخ.
    
    return response_text, response_embeddings

الخطوة 6: استخدام الدالة المحسنة

الآن يمكنك استخدام الدالة enhanced_llm_response للحصول على استجابات من LLM ومعالجتها باستخدام نموذج التضمين.

prompt = "محادثة بين مستخدم فضولي ومساعد ذكاء اصطناعي"
response, embeddings = enhanced_llm_response(prompt)
print(response)
# قم بفعل شيء مع التضمينات، على سبيل المثال، تخزينها، البحث عن نصوص مشابهة، إلخ.

الخطوة 7: معالجة الأخطاء وتسجيلها

أضف معالجة الأخطاء والتسجيل إلى الكود الخاص بك لإدارة حدود API، وفشل الطلبات، والمشكلات المحتملة الأخرى.

الخطوة 8: الاختبار والتكرار

اختبر التكامل بدقة وكرر بناءً على النتائج. قد تحتاج إلى ضبط المعاملات، أو التعامل مع المزيد من الحالات الطرفية، أو تحسين الأداء.

يرجى ملاحظة أن تفاصيل التنفيذ الفعلية قد تختلف بناءً على القدرات والمتطلبات المحددة لـ Novita AI LLM API ونموذج bge-large-en-v1.5. يمكنك الاتصال بفريق Novita AI للحصول على الدعم الفني: support@novita.ai.

الخاتمة

باختصار، أبرز استكشافنا لـ ‘bge-large-en-v1.5’ دوره الأساسي في مهام الاسترجاع الكثيف، حيث قدم نظرة عميقة على قدراته وتطبيقاته وتنفيذه العملي. من تقديم النموذج وأهميته في مجال التضمين إلى عرض استخدامه في الكود وعملية الضبط الدقيق، وضعنا دليلاً شاملاً. علاوة على ذلك، يوضح التكامل مع Novita AI LLM API إمكانات النموذج لتعزيز الفهم الدلالي ودقة الاسترجاع لـ LLMs.

ترقبوا المزيد من التحديثات حول LLMs!

الأسئلة الشائعة

1. كيف يعمل BGE reranker؟

عن طريق إدخال استعلام ومقطع إلى معيد الترتيب، يمكنك الحصول على درجة الصلة. يمكن تحويل هذه الدرجة إلى قيمة فاصلة عائمة ضمن النطاق [0، 1] باستخدام دالة السيني. تهدف هذه العملية إلى ضمان أن النتائج الأعلى ترتيبًا تكون أكثر صلة وجودة أعلى، مما يحسن أداء النظام الكلي.

2. ما هو طول السياق لـ BGE؟

أحدث نموذج bge-m3 له طول سياق يبلغ 8 كيلوبايت.

3. ما هو حجم تضمين bge-m3؟

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

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

قراءة موصى بها

ما هي تضمينات LLM: كل ما تحتاج إلى معرفته

كشف قوة BGE Large: مستقبل تضمين النص