تقييم مسار التوليد المعزز بالاسترداد (RAG) باستخدام Ragas في Python باستخدام watsonx

في هذا البرنامج التعليمي، سنستخدم إطار عمل Ragas لتقييم التوليد المعزز للاسترجاع (RAG) في Python باستخدام LangChain.

التوليد المُعزز للاسترجاع (RAG) هو تقنية في معالجة اللغة الطبيعية (NLP) تجمع بين استرجاع المعلومات والنماذج التوليدية لإنتاج استجابات أكثر دقة وصلة ووعيًا بالسياق. في مهام توليد اللغة التقليدية، تُستخدم النماذج اللغوية الكبيرة (LLMs) مثل OpenAI GPT-4 أو نماذج IBM® Granite لإنشاء الإجابات اعتمادًا على مطالبة الإدخال. من بين حالات الاستخدام الشائعة في العالم الواقعي لهذه النماذج اللغوية الكبيرة هي روبوتات المحادثة. تواجه هذه النماذج صعوبةً في إنتاج استجابات ذات صلة بالسياق، ودقيقة من حيث الحقائق، أو محدَّثة.

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

نظرة عامة على تقييم RAG

يوجد العديد من أطر عمل تقييم RAG ومجموعة متنوعة من مقاييس التقييم. بخلاف Ragas، تشمل أطر العمل الأخرى Unitxt من IBM وEvals من OpenAI. على عكس أطر العمل الأخرى، يستخدم Ragas نموذج لغوي كبير آخر كمقيّم لتقييم أداء مسار RAG.

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

  • تقييم التوليد                
    • الموثوقية تقيس إذا ما كان بالإمكان استنتاج جميع الإجابات التي تم توليدها من السياق المسترجَع.
    • ملاءمة الإجابة تقيس مدى ارتباط الرد المولَّد بالسؤال.
  • تقييم الاسترجاع   
    • دقة السياق تقيس ترتيب الكيانات ذات الصلة الواقعية في السياق. تعني دقة السياق الأعلى أن العناصر الحقيقية ذات الصلة تحتل مرتبة أعلى من "الضوضاء".
    • استدعاء السياق يقيس مدى إمكانية العثور على الإجابات التي يولِّدها النموذج اللغوي الكبير في السياق المسترجَع.

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

هناك أيضًا تحيّزات تؤثِّر في تقييم مسار RAG، مثل التفضيل للردود القصيرة أو الطويلة، والمعروفة باسم تحيّز الطول. يمكن أن يؤدي هذا النوع من التحيّز إلى تقييم استجابة أعلى من أخرى بسبب طولها وليس جوهرها.

لهذه الأسباب، من أفضل الممارسات إجراء تقييمات متعددة. يمكن إنجاز هذا التمرين عن طريق تغيير مطالبة النموذج اللغوي الكبير، والمقاييس، وتسلسل التقييم وغير ذلك. إذا كنت تُنشئ مجموعة بيانات خاصة بمسار RAG الخاص بك، يُنصَح أيضًا باستخدام نماذج مختلفة للنموذج اللغوي الكبير الذي يولِّد الردود والنموذج اللغوي الكبير الذي يقيّم هذه الردود. إذا تم استخدام النموذج نفسه لكليهما، فهناك احتمال أكبر لحدوث تحيّز في التقييم الذاتي. نظرًا لأن مقاييس التقييم هذه ذاتية، يجب أيضًا مراجعة النتائج التي تنتجها أطر العمل هذه من قِبَل مقيّمين بشريين.

في هذا البرنامج التعليمي، لن نُنشئ نظام RAG. بدلًا من ذلك، نستخدم Ragas لتقييم ناتج نظام RAG الذي تم إنشاؤه مسبقًا. للمزيد من المعلومات حول كيفية إنشاء نظام RAG الخاص بك باستخدام LangChain، راجِع البرنامج التعليمي التفصيلي حول RAG.

المتطلبات الأساسية

تحتاج إلى حساب IBM Cloud لإنشاء مشروع watsonx.ai . سجِّل للحصول على حساب مجاني هنا.

الخطوات

الخطوة 1. إعداد البيئة.

رغم توفُّر عدة أدوات للاختيار منها، يُرشدك هذا الدليل خلال خطوات إعداد حساب IBM لاستخدام Jupyter Notebook.

  1. سجِّل الدخول إلى watsonx.ai باستخدام حساب IBM Cloud الخاص بك.

  2. أنشئ مشروع watsonx.ai.

    يمكنك الحصول على معرِّف المشروع من داخل مشروعك. انقر على علامة التبويب الإدارة (Manage)، ثم انسخ معرِّف المشروع من قسم التفاصيل (Details) في صفحة عام (General). ستحتاج إلى هذا المعرِّف في هذا البرنامج التعليمي.
     

  3. أنشئ Jupyter Notebook.

    تفتح هذه الخطوة بيئة دفتر ملاحظات حيث يمكنك نسخ التعليمات البرمجية من هذا البرنامج التعليمي لتنفيذ تقييم RAG الخاص بك. أو يمكنك تنزيل هذا الدفتر إلى نظامك المحلي وتحميله إلى مشروع watsonx.ai كأصل. لمشاهدة المزيد من البرامج التعليمية حول Granite، تفضَّل بزيارة مجتمع IBM Granite. بيئة Jupyter Notebook هذه متاحة أيضًا على GitHub.

الخطوة 2. إعداد مثيل watsonx.ai Runtime ومفتاح واجهة برمجة التطبيقات.

  1. أنشئ مثيل خدمة watsonx.ai Runtime (اختَر المنطقة المناسبة لك، واختَر خطة Lite، وهي مثيل مجاني).

  2. أنشئ مفتاح واجهة برمجة التطبيقات.

  3. اربط مثيل خدمة watsonx.ai Runtime بالمشروع الذي أنشأته في watsonx.ai.

الخطوة 3. تثبيت واستيراد المكتبات ذات الصلة وإعداد بيانات الاعتماد الخاصة بك.

نحن بحاجة إلى عدد قليل من المكتبات والوحدات لهذا البرنامج التعليمي. تأكَّد من استيراد العناصر المدرجة، وإذا لم تكن مثبَّتة، يمكن حل المشكلة بسرعة عبر تثبيتها باستخدام pip. تم بناء هذا البرنامج التعليمي باستخدام Python 3.11.9.

#installations
%pip install -q langchain_community
%pip install -q "ragas==0.2.1"
%pip install -q langchain_ibm
%pip install -q ibm_watson_machine_learning
%pip install -q ibm_watsonx_ai
%pip install -q langchain_core
%pip install -q nltk import os

from langchain_community.llms import WatsonxLLM as _WatsonxLLM
from langchain_ibm import WatsonxEmbeddings
from langchain.callbacks.manager import CallbackManagerForLLMRun
from langchain.schema import LLMResult
from ragas import evaluate
from ragas.llms import LangchainLLMWrapper
from ragas.metrics import answer_relevancy, context_precision, context_recall, faithfulness
from typing import List, Optional, Any
from datasets import load_dataset
from ibm_watson_machine_learning.metanames import GenTextParamsMetaNames as GenParams
from ibm_watsonx_ai.foundation_models.utils.enums import EmbeddingTypes

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

  • دالاس: https://us-south.ml.cloud.ibm.com
  • لندن: https://eu-gb.ml.cloud.ibm.com
  • فرانكفورت: https://eu-de.ml.cloud.ibm.com
  • طوكيو: https://jp-tok.ml.cloud.ibm.com
os.environ["WATSONX_APIKEY"] = <API_KEY>
os.environ["WATSONX_PROJECT_ID"] = <PROJECT_ID>
os.environ["WATSONX_URL"] = "https://us-south.ml.cloud.ibm.com"

الخطوة 4. تحميل مجموعة البيانات

يتطلب تقييم Ragas مجموعة البيانات التي تحتوي على عمليات تنفيذ مسار RAG للعديد من المطالبات مختلفة. بالإضافة إلى الأسئلة نفسها، يجب أن تحتوي مجموعة البيانات على الإجابات المتوقعة المعروفة باسم "الحقائق المرجعية"، والإجابات التي يولدها النموذج اللغوي الكبير، وقائمة مقاطع السياق التي استرجعها مسار RAG عند الإجابة عن كل سؤال. يمكنك إنشاء مجموعة بيانات شاملة من البداية إلى النهاية، ولكن لأغراض هذا الدرس، فإن مجموعة البيانات التي نستخدمها متاحة على Hugging Face. دعنا نحمِّل مجموعة البيانات.

amnesty_qa = load_dataset(“explodinggradients/amnesty_qa”, “english_v2”)
amnesty_qa

المخرجات:

Repo card metadata block was not found. Setting CardData to empty.
DatasetDict({
    eval: Dataset({
        features: [‘question’, ‘ground_truth’, ‘answer’, ‘contexts’],
        num_rows: 20
    })
})

يتم تحميل البيانات على شكل DatasetDict، والميزات التي نهتم بها موجودة ضمن القسم "eval".

dataset = amnesty_qa[“eval”]
dataset

المخرجات:

Dataset({
    features: [‘question’, ‘ground_truth’, ‘answer’, ‘contexts’],
    num_rows: 20
})

الآن، حمِّل البيانات في إطار بيانات Pandas. للاطِّلاع على مثال لأحد الإدخالات في مجموعة البيانات هذه، راجِع وثائق HuggingFace.

df = dataset.to_pandas()        

يمكن إنشاء مجموعات البيانات لتقييم RAG بطرق مختلفة. أحد العناصر الأساسية لإنشاء مجموعة البيانات هذه هو قاعدة المعرفة الخارجية التي تم تزويد النموذج اللغوي الكبير بها. يمكن الحصول على هذه المعرفة من صفحة ويب مسحوبة، أو ملف نصي بسيط، أو مستند مُستورد، وغير ذلك. وفي هذه الحالة، يتم استخدام التقارير التي تم جمعها من منظمة العفو الدولية (Amnesty International). ربما يكون محتوى مجموعة البيانات قد تم إنشاؤه بالكامل من البداية، أو باستخدام أسلوب توليد بيانات اصطناعية مثل TestsetGenerator من Ragas. يتطلب استخدام TestsetGenerator وجود المستندات التي تم تحميلها، ونموذج لغوي كبير للتوليد، ونموذج لغوي كبير للتقييم، بالإضافة إلى نموذج تضمين.

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

الخطوة 5. إنشاء نماذج للتقييم والتضمين

في هذا البرنامج التعليمي، نستخدم نموذج IBM Granite كمقيّم.

يستخدم Ragas نماذج OpenAI بشكل افتراضي. يُعَد WatsonxLLM الغلاف لنماذج الأساس في IBM watsonx.ai. غلاف WatsonxLLM المتوافق مع Ragas لا يزال قيد التطوير ولم يتوفر بعد. في الوقت الحالي، لاستخدام Ragas مع نماذج Granite، نحتاج إلى تعديل خصائص الغلاف.

class WatsonxLLM(_WatsonxLLM):
    temperature: float = 0.05
    “””
    A workaround for interface incompatibility: Ragas expected all LLMs to
    have a `temperature` property whereas WatsonxLLM does not define it.
    “””

    def _generate(
        self,
        prompts: List[str],
        stop: Optional[List[str]] = None,
        run_manager: Optional[CallbackManagerForLLMRun] = None,
        stream: Optional[bool] = None,
        **kwargs: Any,
    ) -> LLMResult:
        “””
        A workaround for interface incompatibility: Ragas expected the
        `token_usage` property of the LLM result be of a particular shape.
        WatsonX returns it in a slightly different shape.
        “””
        result: LLMResult = super()._generate(prompts, stop, run_manager, stream, **kwargs)
        if not result.llm_output or “token_usage” not in result.llm_output:
            return result
        usage = result.llm_output[“token_usage”]
        if not isinstance(usage, dict):
            return result
        result.llm_output[“token_usage”] = {
            “prompt_tokens”: usage[“input_token_count”],
            “completion_tokens”: usage[“generated_token_count”],
            “total_tokens”: usage[“input_token_count”] + usage[“generated_token_count”],
        }
    return result

في هذا البرنامج التعليمي، نوصي باستخدام نموذج IBM Granite-3.0-8B-Instruct كنموذج لغوي كبير للحصول على نتائج مشابهة. يمكنك استخدام أي نموذج ذكاء اصطناعي تختاره للمقارنة مع هذا المعيار واختيار الأنسب لتطبيقك. يمكن العثور على نماذج الأساس المتوفرة عبر watsonx.ai من خلال هذا الرابط. الهدف من هذه النماذج في تطبيقات النماذج اللغوية الكبيرة هو أن تعمل كمحرك استدلال يحدِّد الإجراءات الواجب اتخاذها والاستجابات المطلوب توليدها. لاستخدام غلاف WatsonxLLM مع Ragas، نحتاج إلى استخدام LangchainLLMWrapper.

watsonx_llm = LangchainLLMWrapper(
    langchain_llm = WatsonxLLM(
        model_id = “ibm/granite-3-8b-instruct”,
        url = os.getenv(“WATSONX_URL”),
        apikey = os.getenv(“WATSONX_APIKEY”),
        project_id = os.getenv(“WATSONX_PROJECT_ID”),
        params = {
            GenParams.MAX_NEW_TOKENS: 200,
            GenParams.MIN_NEW_TOKENS: 1,
            GenParams.STOP_SEQUENCES: [“<|endoftext|>“],
            GenParams.TEMPERATURE: 0.2,
            GenParams.TOP_K: 50,
            GenParams.TOP_P: 1,
        }
    )
)

يتم استخدام نموذج Granite كنموذج تقييم. لن نستخدم نموذجًا لتوليد أي استجابات لأن الاستجابات مخزَّنة بالفعل في عمود الإجابات الخاص بمجموعة البيانات.

نموذج التضمين الذي نستخدمه هو نموذج IBM Slate عبر غلاف watsonx.ai LangChain. إذا لم يتم تعريف أي نموذج تضمين محدد، يستخدم Ragas تضمينات OpenAI بشكل افتراضي. يُعَد نموذج التضمينات ضروريًا للتقييم حيث يتم استخدامه لتضمين البيانات من الأعمدة المنفصلة لقياس المسافة بينها.

watsonx_embeddings = WatsonxEmbeddings(
    model_id = EmbeddingTypes.IBM_SLATE_30M_ENG.value,
    url = os.getenv(“WATSONX_URL”),
    apikey = os.getenv(“WATSONX_APIKEY”),
    project_id = os.getenv(“WATSONX_PROJECT_ID”)
)

الخطوة 6. إنشاء تقييم باستخدام Ragas

أخيرًا، يمكننا الآن تشغيل تقييم Ragas على مجموعة البيانات. هنا، نعمل على تمرير مجموعة البيانات ومقاييس التقييم والنموذج اللغوي الكبير ونموذج التضمين كمَعلمات.

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

result = evaluate(
    amnesty_qa[“eval”],
    metrics=[
        context_precision,
        faithfulness,
        answer_relevancy,
        context_recall,
    ],
    llm=watsonx_llm,
    embeddings=watsonx_embeddings)
print(result)

المخرجات:

{‘context_precision’: 0.9444, ‘faithfulness’: 0.6000, ‘answer_relevancy’: 0.6917, ‘context_recall’: 0.8333}

وهذا كل شيء. تم الانتهاء من تقييم واحد لمسار RAG. كما ذكرنا، يمكنك إجراء تقييمات متعددة وتجربة نماذج مختلفة وتغيير المَعلمات. كلما تم إجراء المزيد من التقييمات، زادت قدرتنا على تقييم دقة وفاعلية نظام النموذج اللغوي الكامل باستخدام RAG.

الملخص 

في هذا الدرس، استخدمتَ Ragas لتقييم مسار RAG الخاص بك. تضمّنت المخرجات مقاييس context_precision وfaithfulness وanswer_relevancy وcontext_recall. النموذج اللغوي الكبير المستخدم للتقييم كان من IBM Granite، بينما نموذج التضمين المستخدم كان IBM Slate وتم الوصول إليه عبر واجهة برمجة تطبيقات التضمينات في watsonx.ai.

التقييم الذي تم إجراؤه مهم لأنه يمكن تطبيقه على مهام سير عمل الذكاء الاصطناعي التوليدي المستقبلية لتقييم أداء أنظمة RAG وتحسينها.

نوصِي بالاطِّلاع على صفحة وثائق Ragas للمزيد من المعلومات حول المقاييس وعملية التقييم.

حلول ذات صلة
IBM watsonx.ai

تدريب الذكاء الاصطناعي التوليدي والتحقق من صحته وضبطه ونشره، وكذلك قدرات نماذج الأساس والتعلم الآلي باستخدام IBM watsonx.ai، وهو استوديو الجيل التالي من المؤسسات لمنشئي الذكاء الاصطناعي. أنشئ تطبيقات الذكاء الاصطناعي بسرعة أكبر وببيانات أقل.

اكتشف watsonx.ai
حلول الذكاء الاصطناعي

استفد من الذكاء الاصطناعي في عملك بالاستعانة بخبرة IBM الرائدة في مجال الذكاء الاصطناعي ومحفظة حلولها المتوفرة لك.

استكشف حلول الذكاء الاصطناعي
خدمات الذكاء الاصطناعي

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

استكشف خدمات الذكاء الاصطناعي
اتخِذ الخطوة التالية

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

استكشف watsonx.ai احجز عرضًا توضيحيًا مباشرًا