تنسيق وكيل LLM: دليل خطوة بخطوة مع LangChain وGranite

مؤلف

Vrunda Gadesha

AI Advocate | Technical Content Author

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

كثير من الناس يسيئون فهم الفرق بين تنسيق LLM وتنسيق وكلاء LLM. ويسلِّط الرسم التوضيحي التالي الضوء على الاختلافات الرئيسية:

رسم تخطيطي يوضِّح الفرق الرئيسي بين تنسيق LLM وتنسيق وكيل LLM الفرق الرئيسي بين تنسيق LLM وتنسيق وكيل LLM

في هذا البرنامج التعليمي، ستتعلم كيفية بناء وكيل مستقل مدعوم بنماذج لغوية كبيرة (LLMs) باستخدام نماذج IBM Granite وLangChain. سنستكشف كيف يستفيد الوكلاء من العناصر الرئيسية مثل الذاكرة والتخطيط والعمل لأداء مهام ذكية. ستقوم أيضًا بتنفيذ نظام عملي يعالج نصًا من كتاب، ويجيب عن الاستفسارات بشكل ديناميكي، ويقيّم أداءه باستخدام مقاييس الدقة مثل BLEU والدقة والاسترجاع ودرجة F1.

إطار عمل للوكلاء المستقلين القائمين على النماذج اللغوية الكبيرة (LLM)

يوفر الإطار المقدَّم في الشكل 1 تصميمًا شاملًا للوكلاء المستقلين القائمين على النموذج اللغوي الكبير (LLM)، مع التركيز على التفاعل بين العناصر الرئيسية: الملف الشخصي والذاكرة والتخطيط والعمل. يمثِّل كل عنصر مرحلة حاسمة في بناء وكيل مستقل قادر على التفكير واتخاذ القرار والتفاعل مع البيئات الديناميكية.1

إطار عمل للوكلاء المستقلين القائمين على النماذج اللغوية الكبيرة (LLM) إطار عمل للوكلاء المستقلين القائمين على النماذج اللغوية الكبيرة (LLM)

1. ملف التعريف: تحديد هوية الوكيل

يمنح ملف التعريف الوكيل هويته من خلال تضمين معلومات مثل الخصائص الديموغرافية وسمات الشخصية والسياق الاجتماعي. تضمن هذه العملية أن الوكيل يمكنه التفاعل بطريقة مخصصة. يمكن إنشاء ملفات التعريف يدويًا، أو إنشاؤها بواسطة نماذج الذكاء الاصطناعي مثل نماذج IBM Granite أو GPT (المحول التوليدي المدرب مسبقًا) من OpenAI، أو محاذاتها مع مجموعات بيانات محددة لتلبية متطلبات المهمة. من خلال الاستفادة من هندسة الموجِّهات، يمكن تحسين ملفات التعريف بشكل ديناميكي لتحسين الاستجابات. بالإضافة إلى ذلك، ضمن تنسيق الوكلاء المتعددين، يساعد ملف التعريف على تحديد الأدوار والسلوكيات، ما يضمن التنسيق السلس عبر خوارزميات الذكاء الاصطناعي وأنظمة صنع القرار.

2. الذاكرة: تخزين السياق واستخدامه

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

3. التخطيط: وضع استراتيجيات للإجراءات

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

4. الإجراء: تنفيذ القرارات

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

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

حالة الاستخدام: بناء وكيل معرفة قابل للاستعلام

يوضِّح هذا البرنامج التعليمي كيفية إنشاء وكيل معرفة قابل للاستعلام مصمم لمعالجة المستندات النصية الكبيرة (مثل الكتب) والإجابة عن استعلامات المستخدم بدقة. باستخدام نماذج IBM Granite وLangChain، تم بناء الوكيل وفقًا للمبادئ الموضحة في إطار عمل الوكلاء المستقلين القائمين على نماذج LLM. تتوافق عناصر إطار العمل بسلاسة مع سير عمل الوكيل لضمان القدرة على التكيف والاستجابات الذكية.

دعونا نتعرَّف على كيفية تطبيق إطار العمل في حالة الاستخدام الخاصة بنا.

تطبيق إطار العمل تطبيق إطار العمل

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

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

التخطيط: يتضمن حل الاستعلامات الاستدلال أحادي المسار. يقوم الوكيل باسترداد أجزاء النص ذات الصلة، وإنشاء إجابات باستخدام Granite LLM من IBM، وتقييم النتائج للتأكد من دقتها. يضمن التخطيط دون تعليقات البساطة، بينما تسمح بنية النظام المرنة بدمج حلقات التعليقات في الإصدارات المستقبلية.

الإجراء: ينفِّذ الوكيل حل الاستعلام من خلال دمج استرجاع الذاكرة ومعالجة LLM. وينجز مهامًا مثل توليد الإجابات، وحساب مقاييس الدقة (BLEU، والدقة، والاستدعاء، ودرجة F1)، وعرض النتائج بصريًا لتفسيرها من قِبَل المستخدم. تعكس هذه المخرجات قدرة الوكيل على التصرف بذكاء بناءً على التفكير والتخطيط.

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

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

الخطوات

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

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

  1. سجِّل الدخول إلى watsonx.ai باستخدام حساب IBM Cloud الخاص بك.
  2. أنشئ مشروع watsonx.ai. يمكنك الحصول على معرِّف المشروع من داخل مشروعك. انقر على علامة التبويب الإدارة (Manage)، ثم انسخ معرِّف المشروع من قسم التفاصيل (Details) في صفحة عام (General). ستحتاج إلى هذا المعرِّف في هذا البرنامج التعليمي.
  3. أنشئ Jupyter Notebook.

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

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

  1. أنشئ مثيل خدمة watsonx.ai Runtime (اختَر خطة Lite، وهي مثيل مجاني).
  2. أنشئ مفتاح واجهة برمجة التطبيقات (API).
  3. اربط مثيل خدمة watsonx.ai Runtime بالمشروع الذي أنشأته في watsonx.ai.

الخطوة 3. تثبيت الحزم.

للعمل باستخدام إطار عمل LangChain ودمج IBM WatsonxLLM، نحتاج إلى تثبيت بعض المكتبات الأساسية. لنبدأ بتثبيت الحزم المطلوبة:

ملاحظة: إذا كنت تستخدم إصدارًا قديمًا منpip ، يمكنك استخدام الأمرpip install --upgrade pip للترقية لسهولة تثبيت أحدث الحزم، والتي قد لا تكون متوافقة مع الإصدارات القديمة. ولكن إذا كنت تستخدم بالفعل أحدث إصدار أو قمت مؤخرًا بترقية حزمك، يمكنك تخطي هذا الأمر.

!pip install --upgrade pip
!pip install langchain faiss-cpu pandas sentence-transformers
%pip install langchain
!pip install langchain-ibm

في خلية التعليمات البرمجية السابقة،

  • langchain  هو إطار العمل الأساسي لبناء التطبيقات باستخدام نماذج اللغة.
  • faiss-cpu  للبحث الفعَّال عن التشابه، ويُستخدَم في إنشاء فهارس المتجهات والاستعلام عنها.
  • pandas  لمعالجة البيانات وتحليلها.
  • sentence-transformers  لإنشاء تضمينات للبحث الدلالي.
  • langchain-ibm  لدمج IBM WatsonxLLM (في هذا البرنامج التعليمي هو Granite-3-8b-instruct) مع LangChain.

تضمن هذه الخطوة أن تكون بيئتك جاهزة للمهام القادمة.

الخطوة 4. استيراد المكتبات المطلوبة.

الآن بعد أن قمنا بتثبيت المكتبات الضرورية، دعنا نستورد الوحدات المطلوبة لهذا البرنامج التعليمي:

import os
from langchain_ibm import WatsonxLLM
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.text_splitter import RecursiveCharacterTextSplitter
import pandas as pd
import getpass

في خلية التعليمات البرمجية السابقة،

  • os  يوفر طريقة للتفاعل مع نظام التشغيل (على سبيل المثال، الوصول إلى متغيرات البيئة).
  • langchain_ibm.WatsonxLLM  يسمح لنا باستخدام IBM Watson Granite LLM بسلاسة داخل إطار عمل LangChain.
  • langchain.embeddings.HuggingFaceEmbeddings  يُنشئ تضمينات للنص باستخدام نماذج HuggingFace، وهي ضرورية للبحث الدلالي.
  • langchain.vectorstores.FAISS  هي مكتبة لتخزين المتجهات الفعَّالة والبحث عن التشابه، ما يُتح لنا إنشاء فهرس متجه والاستعلام عنه.
  • RecursiveCharacterTextSplitter  يساعد على تقسيم كتل كبيرة من النص إلى أجزاء أصغر، وهو أمر ضروري لمعالجة المستندات بكفاءة.
  • pandas  هي مكتبة قوية لتحليل البيانات ومعالجتها، وتُستخدَم هنا للتعامل مع البيانات الجدولية.
  • getpass  هي طريقة آمنة لالتقاط المدخلات الحساسة مثل مفاتيح API دون عرضها على الشاشة.

تؤدي هذه الخطوة إلى إعداد جميع الأدوات والوحدات التي نحتاجها لمعالجة النصوص وإنشاء التضمينات وتخزينها في قاعدة بيانات متجهات والتفاعل مع WatsonxLLM من IBM.

الخطوة 5. إعداد بيانات الاعتماد.

يضبط هذا الكود بيانات الاعتماد للوصول إلى واجهة برمجة تطبيقات IBM Watson machine learning (WML) ويضمن تكوين معرِّف المشروع بشكل صحيح.

  • قاموسبيانات اعتماد تم إنشاؤه باستخدامعنوان URL لخدمة WML ومفتاح واجهة برمجة التطبيقات . يتم جمع مفتاح واجهة برمجة التطبيقات بشكل آمن باستخدام "getpass.getpass" لتجنُّب الكشف عن المعلومات الحساسة.
  • يحاول الرمز إحضار PROJECT_ID  من متغيرات البيئة باستخدام os.environ . إذا كان PROJECT_ID  غير موجود، تتم مطالبة المستخدم بإدخاله يدويًا من خلال الإدخال.
# Set up credentials
credentials = {
      "url": "https://us-south.ml.cloud.ibm.com", # Replace with the correct region if needed
      "apikey": getpass.getpass("Please enter your WML API key (hit enter): ")
     }
# Set up project_id
try:
     project_id = os.environ["PROJECT_ID"]
except KeyError:
     project_id = input("Please enter your project_id (hit enter): ")

الخطوة 6. تهيئة نموذج اللغوي الكبير.

يقوم هذا الكود بتهيئة IBM WatsonXLLM للاستخدام في التطبيق:

  1. يُنشئ هذا الرمز مثيلًا لـ WatsonxLLM باستخدام نموذجibm/granite-3-8b-instruct المصمم لمهام الذكاء الاصطناعي التوليدي القائمة على التعليمات.
  2. يتمurl ,apikey  وproject_id من بيانات الاعتماد التي تم إعدادها مسبقًا للمصادقة والاتصال بخدمة IBM WatsonxLLM.
  3. لتكوين مَعلماتmax_new_tokens للحد من عدد الرموز المميزة التي تم إنشاؤها بواسطة النموذج في كل استجابة (150 رمزًا مميزًا في هذه الحالة).

تعمل هذه الخطوة على إعداد WatsonXLLM لتوليد الاستجابات في سير العمل.

# Initialize the IBM Granite LLM
llm = WatsonxLLM(
      model_id="ibm/granite-3-8b-instruct",
      url=credentials["url"],
      apikey=credentials["apikey"],
      project_id=project_id,
      params={
           "max_new_tokens": 150
      }
)

الخطوة 7. تعريف وظيفة لاستخراج النص من ملف.

لمعالجة النص من مستند، نحتاج إلى وظيفة يمكنها قراءة محتوياته واستخراجها. تم تصميم الوظيفة التالية للتعامل مع ملفات النص العادي:

def extract_text_from_txt(file_path):
      """Extracts text from a plain text file."""
           with open(file_path, "r", encoding="utf-8") as file:
           text = file.read()
return text

هذه الوظيفة،extract_text_from_txt ، مصممة لقراءة واستخراج محتوى ملف نص عادي. تقبل مسار الملف كحجة وتفتح الملف في وضع القراءة باستخدامترميز UTF-8 ، ما يضمن التعامل مع الأحرف الخاصة بشكل صحيح.

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

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

الخطوة 8. تقسيم النص إلى أجزاء.

لمعالجة وفهرسة كتل كبيرة من النص بكفاءة، نحتاج إلى تقسيم النص إلى أجزاء أصغر يمكن التحكم فيها. تتعامل الوظيفة التالية مع هذه المهمة:

def split_text_into_chunks(text, chunk_size=500, chunk_overlap=50):
           """Splits text into smaller chunks for indexing."""
           splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
return splitter.split_text(text)

يتمsplit_text_into_chunks تم تصميمها لتقسيم كتل كبيرة من النص إلى أجزاء أصغر يمكن التحكم فيها من أجل المعالجة والفهرسة بكفاءة. تأخذ النص الخام كإدخال إلى جانب مَعلمتين اختياريتين:chunk_size ، التي تحدِّد الحجم الأقصى لكل جزء (الافتراضي هو 500 حرف)، وchunk_overlap ، والتي تحدِّد عدد الأحرف المتداخلة بين الأجزاء المتتالية (القيمة الافتراضية هي 50).

تضمن هذه الوظيفة استمرارية السياق عبر الأجزاء. تستخدم الوظيفةRecursiveCharacterTextSplitter fromLangChain ، والتي تقسِّم النص بذكاء مع الحفاظ على سياقه. من خلال إرجاع قائمة من أجزاء نصية أصغر، تقوم هذه الوظيفة بإعداد الإدخال للعمليات مثل التضمين والفهرسة.

يُعَد هذا الأمر ضروريًا عند العمل مع مستندات كبيرة، حيث غالبًا ما تكون نماذج اللغة ذات قيود رمزية ولا يمكنها معالجة النصوص الطويلة بشكل مباشر.

الخطوة 9: إنشاء فهرس متجه.

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

def create_vector_index(chunks):
           """Creates a FAISS vector index from text chunks."""
               embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
               vector_store = FAISS.from_texts(chunks, embeddings)
return vector_store

يتمcreate_vector_index هي وظيفة تبنيمؤشر متجه FAISS من أجزاء النص التي تم إنشاؤها في الخطوة السابقة. تُعَد هذه الوظيفة ضرورية لتمكين البحث الدلالي من خلال تعيين كل جزء في مساحة متجهية عالية الأبعاد باستخدام التضمينات.

تبدأ أولًا بتهيئة نموذج HuggingFaceEmbeddings sentence-transformers/all-MiniLM-L6-v2 ، الذي يُنشئ تضمينات متجهية لأجزاء النص. تلتقط هذه التضمينات المعنى الدلالي لكل جزء.

ثم تستخدم الوظيفةFAISS لإنشاء مخزن متجه عن طريق فهرسة هذه التضمينات، ما يسمح بالبحث الفعَّال عن التشابه لاحقًا.

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

الخطوة 10. الاستعلام عن فهرس المتجه باستخدام Granite

تتضمن هذه الخطوة الاستعلام عن مؤشر المتجه لاسترداد المعلومات ذات الصلة واستخدام نموذج Granite LLM من IBM لتوليد استجابة محددة. من خلال دمج البحث عن التشابه واستدلال LLM، توفِّر الوظيفة عملية حل استعلام ديناميكية وذكية.

def query_index_with_granite_dynamic(vector_store, query, llm):
         """Searches the vector index, uses Granite to refine the response, and returns all components."""
             # Perform similarity search
             print("\n> Entering new AgentExecutor chain...")
             thought = f"The query '{query}' requires context from the book to provide an accurate response."
             print(f" Thought: {thought}")
             action = "Search FAISS Vector Store"
             print(f" Action: {action}")
             action_input = query
             print(f" Action Input: \"{action_input}\"")
             # Retrieve context
             results = vector_store.similarity_search(query, k=3)
             observation = "\n".join([result.page_content for result in results])
             print(f" Observation:\n{observation}\n")
            # Generate response with Granite
            prompt = f"Context:\n{observation}\n\nQuestion: {query}\nAnswer:"
            print(f" Thought: Combining retrieved context with the query to generate a detailed answer.")
            final_answer = llm(prompt)
            print(f" Final Answer: {final_answer.strip()}")
            print("\n> Finished chain.")
            # Return all components as a dictionary
            return {
                    "Thought": thought,
                     "Action": action,
                     "Action Input": action_input,
                     "Observation": observation,
                     "Final Answer": final_answer.strip()
                     }

يتمquery_index_with_granite_dynamic تأخذ هذه الوظيفة ثلاثة إدخالات: أولًا - مخزن المتجهات (vector_store )، ثانيًا - استعلام المستخدم (query ) وثالثًا - مثيل Granite LLM (llm ).

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

ثم تُنشئ الوظيفة موجِّهًا من خلال الجمع بين الاستعلام والسياق الذي تم استرجاعه. يتم تمرير هذا الموجِّه إلىGranite LLM ، ما يؤدي إلى توليد استجابة مفصَّلة ودقيقة من الناحية السياقية (final_answer ).

طوال العملية، تتم طباعة الخطوات الوسيطة مثلالتفكير ,واتخاذ الإجراءات  وومدخلات الإجراءات  من أجل الشفافية.

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

تُعَد هذه الخطوة بالغة الأهمية لتحويل استرجاع البيانات الخام إلى رؤى قابلة للتنفيذ وذات معنى من خلال استخدام قدرات الاستدلال في نموذج LLM.

الخطوة 11. إنشاء DataFrame لنتائج الاستعلام.

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

def dynamic_output_to_dataframe(vector_store, queries, llm, csv_filename="output.csv"):
           """Generates a DataFrame dynamically for multiple queries and saves it as a CSV file."""
           # List to store all query outputs
           output_data = []
           # Process each query
           for query in queries:
           # Capture the output dynamically
           output = query_index_with_granite_dynamic(vector_store, query, llm)
           output_data.append(output)
           # Convert the list of dictionaries into a DataFrame
           df = pd.DataFrame(output_data)
           # Display the DataFrame
           print("\nFinal DataFrame:")
           print(df)
           # Save the DataFrame as a CSV file
           df.to_csv(csv_filename, index=False)
           print(f"\nOutput saved to {csv_filename}")

يتمdynamic_output_to_dataframe  تقبل هذه الوظيفة أربعة إدخالات: مخزن المتجهات (vector_store )، وقائمة الاستعلامات (queries )، ومثيل Granite LLM (llm )، واسم ملف CSV اختياري (csv_filename ، الافتراضي هوoutput.csv ).

لكل استعلام، يستخدمquery_index_with_granite_dynamic  الوظيفة لاسترداد السياق ذي الصلة وإنشاء استجابة باستخدام LLM. النتائج، بما في ذلك العناصر الوسيطة مثلThought ,Observation  والإجابة النهائية  يتم تخزينها في قائمة.

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

هذه الخطوة ضرورية لتنظيم المخرجات بتنسيق سهل الاستخدام، ما يُتيح تنفيذ المهام النهائية مثل تقييم الدقة والتصور.

الخطوة 12: تنفيذ سير العمل الرئيسي.

تجمع هذه الخطوة جميع الخطوات السابقة في سير عمل واحد لمعالجة ملف نصي والإجابة عن استفسارات المستخدمين وحفظ النتائج بتنسيق منظم. تعملوظيفة main_workflow كمنسِّق مركزي للبرنامج التعليمي.

def main_workflow():
           # Replace with your text file
           file_path = "aosh.txt"
           # Extract text from the text file
           text = extract_text_from_txt(file_path)
           # Split the text into chunks
           chunks = split_text_into_chunks(text)
           # Create a vector index
           vector_store = create_vector_index(chunks)
           # Define queries
           queries = [
                     "What is the plot of 'A Scandal in Bohemia'?",
                     "Who is Dr. Watson, and what role does he play in the stories?",
                     "Describe the relationship between Sherlock Holmes and Irene Adler.",
                     "What methods does Sherlock Holmes use to solve cases?"
                     ]
           # Generate and save output dynamically
          dynamic_output_to_dataframe(vector_store, queries, llm)

دعونا نتعرَّف على كيفية تنفيذ سير العمل هذا:

إدخال ملف نصي: يحدِّد المتغيرfile_path الملف النصي المُراد معالجته. في هذا البرنامج التعليمي، ملف الإدخال هو"aosh.txt" ، الذي يحتوي على نص مغامرات شيرلوك هولمز.

استخراج النص: يتم استدعاء الوظيفةextract_text_from_txt لقراءة واستخراج محتوى ملف نص الإدخال.

تقسيم النص: يتم تقسيم النص المستخرج إلى أجزاء أصغر باستخدامsplit_text_into_chunks الوظيفة لتسهيل التضمين والفهرسة.

إنشاء فهرس متجه: يتم تحويل أجزاء النص إلى تضمينات وتخزينها فيمؤشر متجه FAISS الفهرس باستخدامcreate_vector_index للمؤسسة تقريبًا.

تحديد الاستعلامات: يتم توفير قائمة من نماذج الاستعلامات، كلٌّ منها مصمم لاسترجاع معلومات محددة من النص. سيتم الرد على هذه الاستفسارات من قِبَل الوكيل.

استعلامات العملية: تعملdynamic_output_to_dataframe  الوظيفة على معالجة الاستعلامات باستخدام فهرس المتجه ونموذج Granite LLM من IBM. تسترد السياق ذي الصلة وتولِّد إجابات وتحفظ النتائج كملف CSV لمزيد من التحليل.

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

لتنفيذ سير العمل، ما عليك سوى استدعاء وظيفةmain_workflow()  وسيتم تشغيل المسار بأكمله بسلاسة.

# Run the workflow
main_workflow()

المخرجات


 

> Entering new AgentExecutor chain...
 Thought: The query 'What is the plot of 'A Scandal in Bohemia'?' requires context from the book to provide an accurate response.
 Action: Search FAISS Vector Store
 Action Input: "What is the plot of 'A Scandal in Bohemia'?"
 Observation:
I. A SCANDAL IN BOHEMIA


I.
“I was aware of it,” said Holmes dryly.

“The circumstances are of great delicacy, and every precaution has to
be taken to quench what might grow to be an immense scandal and
seriously compromise one of the reigning families of Europe. To speak
plainly, the matter implicates the great House of Ormstein, hereditary
kings of Bohemia.”

“I was also aware of that,” murmured Holmes, settling himself down in
his armchair and closing his eyes.
Contents

   I.     A Scandal in Bohemia
   II.    The Red-Headed League
   III.   A Case of Identity
   IV.    The Boscombe Valley Mystery
   V.     The Five Orange Pips
   VI.    The Man with the Twisted Lip
   VII.   The Adventure of the Blue Carbuncle
   VIII.  The Adventure of the Speckled Band
   IX.    The Adventure of the Engineer’s Thumb
   X.     The Adventure of the Noble Bachelor
   XI.    The Adventure of the Beryl Coronet
   XII.   The Adventure of the Copper Beeches

 Thought: Combining retrieved context with the query to generate a detailed answer.
/var/folders/4w/smh16qdx6l98q0534hr9v52r0000gn/T/ipykernel_2648/234523588.py:23: LangChainDeprecationWarning: The method `BaseLLM.__call__` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.
  final_answer = llm(prompt)
 Final Answer: Step 1: Identify the main characters and their roles.
- Sherlock Holmes: The detective who is approached by a client with a delicate matter.
- An unnamed client: A representative of the great House of Ormstein, hereditary kings of Bohemia, who seeks Holmes' help to prevent a potential scandal.

Step 2: Understand the main issue or conflict.
- The main issue is a delicate matter that, if exposed, could lead to a massive scandal and compromise one of the reigning families of Europe, specifically the House of Ormstein.

Step 3: Ident

> Finished chain.

> Entering new AgentExecutor chain...
 Thought: The query 'Who is Dr. Watson, and what role does he play in the stories?' requires context from the book to provide an accurate response.
 Action: Search FAISS Vector Store
 Action Input: "Who is Dr. Watson, and what role does he play in the stories?"
 Observation:
“Sarasate plays at the St. James’s Hall this afternoon,” he remarked.
“What do you think, Watson? Could your patients spare you for a few
hours?”

“I have nothing to do to-day. My practice is never very absorbing.”
“Try the settee,” said Holmes, relapsing into his armchair and putting
his fingertips together, as was his custom when in judicial moods. “I
know, my dear Watson, that you share my love of all that is bizarre and
outside the conventions and humdrum routine of everyday life. You have
shown your relish for it by the enthusiasm which has prompted you to
chronicle, and, if you will excuse my saying so, somewhat to embellish
so many of my own little adventures.”
“My God! It’s Watson,” said he. He was in a pitiable state of reaction,
with every nerve in a twitter. “I say, Watson, what o’clock is it?”

“Nearly eleven.”

“Of what day?”

“Of Friday, June 19th.”

“Good heavens! I thought it was Wednesday. It is Wednesday. What d’you
want to frighten a chap for?” He sank his face onto his arms and began
to sob in a high treble key.

“I tell you that it is Friday, man. Your wife has been waiting this two
days for you. You should be ashamed of yourself!”

 Thought: Combining retrieved context with the query to generate a detailed answer.
 Final Answer: Dr. Watson is a character in the Sherlock Holmes stories, written by Sir Arthur Conan Doyle. He is a former military surgeon who becomes the narrator and chronicler of Holmes' adventures. Watson is a close friend and confidant of Holmes, often accompanying him on cases and providing a more human perspective to the stories. He is known for his enthusiasm for the bizarre and unconventional, as well as his skill in recording the details of their investigations. Watson's role is crucial in presenting the narrative and offering insights into Holmes' character and methods.

> Finished chain.


Final DataFrame:
                                             Thought  \
0  The query 'What is the plot of 'A Scandal in B...   
1  The query 'Who is Dr. Watson, and what role do...   
2  The query 'Describe the relationship between S...   
3  The query 'What methods does Sherlock Holmes u...   

                      Action  \
0  Search FAISS Vector Store   
1  Search FAISS Vector Store   
2  Search FAISS Vector Store   
3  Search FAISS Vector Store   

                                        Action Input  \
0        What is the plot of 'A Scandal in Bohemia'?   
1  Who is Dr. Watson, and what role does he play ...   
2  Describe the relationship between Sherlock Hol...   
3  What methods does Sherlock Holmes use to solve...   

                                         Observation  \
0  I. A SCANDAL IN BOHEMIA\n\n\nI.\n“I was aware ...   
1  “Sarasate plays at the St. James’s Hall this a...   
2  “You have really got it!” he cried, grasping S...   
3  to learn of the case was told me by Sherlock H...   

                                        Final Answer  
0  Step 1: Identify the main characters and their...  
1  Dr. Watson is a character in the Sherlock Holm...  
2  Sherlock Holmes and Irene Adler have a profess...  
3  Sherlock Holmes uses a variety of methods to s...  

Output saved to output.csv

 

بعد تشغيلmain_workflow() الوظيفة، قمنا بمعالجة ملف نصي (aosh.txt) وتنفيذ أربعة استعلامات محددة من قبل المستخدم حول مغامرات شيرلوك هولمز. تقدِّم المخرجات تفصيلًا لكيفية التعامل مع كل استعلام:

  • تصِف الفكرة (Thought) المنطق الكامن وراء الاستفسار والسياق المطلوب للإجابة بدقة.
  • يُشير الإجراء (Action) إلى الخطوة المتخذة، وهي في هذه الحالة إجراء بحث عن التشابه باستخدام فهرس متجه FAISS.
  • إدخال الإجراء (Action input) هو الاستعلام المحدد الذي تتم معالجته في تكرار واحد.
  • الملاحظة (Observation) هي أجزاء النص التي تم استرجاعها من فهرس المتجهات ذات الصلة بالاستعلام.
  • الإجابة النهائية (Final answer) هي الرد التفصيلي الذي تم إنشاؤه بواسطة Granite LLM من IBM باستخدام السياق الذي تم استرجاعه.

بالإضافة إلى ذلك، تمت هيكلة نتائج جميع الاستعلامات في DataFrame وحفظها كـoutput.csv يحتوي هذا الملف على جميع العناصر المذكورة أعلاه لمزيد من التحليل أو المشاركة.

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

تصوُّر النتائج

بعد إنشاء ملف output.csv، سننتقل الآن إلى تصوُّر نتائج الاستعلام ومقاييس الدقة المرتبطة بها، ما يوفر رؤى أعمق حول أداء الوكيل.

في خلية التعليمات البرمجية التالية، نقوم بتحميل نتائج الاستعلام المحفوظة منoutput.csv الملف إلى إطار بيانات pandas DataFrame لتحضيرها للعرض والتحليل. يُتيح لنا DataFrame معالجة البيانات واستكشافها بتنسيق منظم.

# Load the output.csv file into a DataFrame
df = pd.read_csv("output.csv")
print(df.head()) # Display the first few rows

المخرجات


Thought  \
0  The query 'What is the plot of 'A Scandal in B...   
1  The query 'Who is Dr. Watson, and what role do...   
2  The query 'Describe the relationship between S...   
3  The query 'What methods does Sherlock Holmes u...   

                      Action  \
0  Search FAISS Vector Store   
1  Search FAISS Vector Store   
2  Search FAISS Vector Store   
3  Search FAISS Vector Store   

                                        Action Input  \
0        What is the plot of 'A Scandal in Bohemia'?   
1  Who is Dr. Watson, and what role does he play ...   
2  Describe the relationship between Sherlock Hol...   
3  What methods does Sherlock Holmes use to solve...   

                                         Observation  \
0  I. A SCANDAL IN BOHEMIA\n\n\nI.\n“I was aware ...   
1  “Sarasate plays at the St. James’s Hall this a...   
2  “You have really got it!” he cried, grasping S...   
3  to learn of the case was told me by Sherlock H...   

                                        Final Answer  
0  Step 1: Identify the main characters and their...  
1  Dr. Watson is a character in the Sherlock Holm...  
2  Sherlock Holmes and Irene Adler have a profess...  
3  Sherlock Holmes uses a variety of methods to s...

في هذا الكود، يتضمن DataFrame عناصر رئيسية مثلThought ,اتخاذ الإجراءات ,Observation  وFinal Answer  لكل استعلام. عن طريق عرض الصفوف القليلة الأولى باستخدامdf.head() ، نضمن تنسيق البيانات بشكل صحيح وتجهيزها للمرحلة التالية: إنشاء تصوُّرات بيانية ذات مغزى.

استيراد مكتبات العروض المصورة

لإنشاء تصوُّرات لنتائج الاستعلام، نقوم باستيراد المكتبات الضرورية:

import matplotlib.pyplot as plt
from wordcloud import WordCloud

 

matplotlib.pyplot  هي مكتبة مستخدمة على نطاق واسع لإنشاء تصوُّرات ثابتة وتفاعلية ومتحركة في Python. سيتم استخدامها لإنشاء المخططات الشريطية والمخططات الدائرية والتصوُّرات الأخرى.

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

ملاحظة مهمة: إذا واجهت الخطأ"WordCloud not found" ، يمكنك حله عن طريق تثبيت المكتبة باستخدام الأمرpip install wordcloud .

تصوُّر الملاحظة وأطوال الإجابات

يُنشئ هذا الكود مخططًا شريطيًا أفقيًا لمقارنة أطوال الملاحظات (السياق المسترد) والإجابات (الاستجابات التي تم توليدها) لكل استعلام. يوفر هذا التصوُّر رؤى حول مقدار السياق الذي يستخدمه الوكيل مقارنةً بطول الإجابات التي تم إنشاؤها.

def visualize_lengths_with_queries(df):
"""Visualizes the lengths of observations and answers with queries on the y-axis."""
df["Observation Length"] = df["Observation"].apply(len)
df["Answer Length"] = df["Final Answer"].apply(len)
# Extract relevant data
queries = df["Action Input"]
observation_lengths = df["Observation Length"]
answer_lengths = df["Answer Length"]
# Create a horizontal bar chart
plt.figure(figsize=(10, 6))
bar_width = 0.4
y_pos = range(len(queries))
plt.barh(y_pos, observation_lengths, bar_width, label="Observation Length", color="skyblue", edgecolor="black")
plt.barh([y + bar_width for y in y_pos], answer_lengths, bar_width, label="Answer Length", color="lightgreen", edgecolor="black")
plt.yticks([y + bar_width / 2 for y in y_pos], queries, fontsize=10)
plt.xlabel("Length (characters)", fontsize=14)
plt.ylabel("Queries", fontsize=14)
plt.title("Observation and Answer Lengths by Query", fontsize=16)
plt.legend(fontsize=12)
plt.tight_layout()
plt.show()
# Call the visualization function
visualize_lengths_with_queries(df)
 
أطوال الملاحظة والإجابة حسب الاستعلام

هذه الوظيفة،visualize_lengths_with_queries يُنشئ مخططًا شريطيًا أفقيًا لمقارنة أطوال الملاحظات (السياق المسترد) والإجابات (الاستجابات التي تم توليدها) لكل استعلام.

يحسب أطوال الأحرف لكلٍّ من الملاحظات والإجابات، ويضيفها كأعمدة جديدة (Observation Length  وAnswer Length ) إلى DataFrame. باستخدامmatplotlib ، ثم يرسم هذه الأطوال لكل استعلام، مع عرض الاستعلامات على المحور y لتحسين قابلية القراءة.

يتم ترميز الرسم البياني الشريطي بالألوان للتفريق بين أطوال الملاحظة وأطوال الإجابة، ويتضمن تسميات وتوضيحًا وعنوانًا من أجل الوضوح.

يساعد هذا التصوُّر على تحليل التوازن بين حجم السياق الذي تم استرجاعه والتفاصيل في الاستجابة التي تم توليدها، ما يوفر رؤى حول كيفية معالجة الوكيل للاستعلامات والاستجابة لها.

تصوُّر نسبة النص المستخدم في الملاحظات

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

def visualize_text_proportion(df):
     """Visualizes the proportion of text used in observations."""
     total_text_length = sum(df["Observation"].apply(len)) + sum(df["Final Answer"].apply(len))
     observation_text_length = sum(df["Observation"].apply(len))
     sizes = [observation_text_length, total_text_length - observation_text_length]
     labels = ["Observation Text", "Remaining Text"]
     colors = ["#66b3ff", "#99ff99"]
     plt.figure(figsize=(4, 4))
     plt.pie(sizes, labels=labels, colors=colors, autopct="%1.1f%%", startangle=140)
     plt.title("Proportion of Text Used in Observations", fontsize=16)
     plt.show()
# Call the visualization function
visualize_text_proportion(df)
رسم تخطيطي لنسبة النص المستخدم في الملاحظات

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

يتم عرض هذه البيانات في مخطط دائري، مع تسميات واضحة لكل من"نص الملاحظة" و"النص المتبقي" وألوان مميزة لتعزيز قابلية القراءة. يتضمن الرسم البياني قيمًا مئوية لتسهيل تفسير النِسب.

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

إنشاء سُحُب كلمات للملاحظات والإجابات النهائية

يُنشئ هذا الكود سحابتَين من الكلمات لتمثيل الكلمات الأكثر تكرارًا بصريًا في Observation و الإجابة النهائية النصوص.

def generate_wordclouds_side_by_side(df):
      """Generates and displays word clouds for Observations and Final Answers side by side."""
      # Combine text for Observations and Final Answers
      observation_text = " ".join(df["Observation"])
      final_answer_text = " ".join(df["Final Answer"])
      # Create word clouds
      observation_wordcloud = WordCloud(width=800, height=400, background_color="white").generate(observation_text)
      final_answer_wordcloud = WordCloud(width=800, height=400, background_color="white").generate(final_answer_text)
      # Create a side-by-side visualization
      plt.figure(figsize=(16, 8))
      # Plot the Observation word cloud
      plt.subplot(1, 2, 1)
      plt.imshow(observation_wordcloud, interpolation="bilinear")
      plt.axis("off")
      plt.title("Word Cloud of Observations", fontsize=16)
      # Plot the Final Answer word cloud
      plt.subplot(1, 2, 2)
      plt.imshow(final_answer_wordcloud, interpolation="bilinear")
      plt.axis("off")
      plt.title("Word Cloud of Final Answers", fontsize=16)
      plt.tight_layout()
      plt.show()
# Call the function to generate and display the word clouds
generate_wordclouds_side_by_side(df)
 
سحابة كلمات الملاحظات

يُنشئ هذا الكود سحابتَين من الكلمات لتمثيل الكلمات الأكثر تكرارًا بصريًا فيObservation والإجابة النهائية ، وعرضها جنبًا إلى جنب لسهولة المقارنة يتمObservation  والإجابة النهائية  أولًا ربط النصوص في سلسلتين منفصلتين باستخدام" ".join()  لدمج كافة الصفوف من الأعمدة المعنية. ثم يتم استخدام مكتبةWordCloud لإنشاء سُحُب الكلمات لكل نص بتكوينات محددة.

لإنشاء تصوُّر جنبًا إلى جنب، يتم استخدام المخططات الفرعية: يعرض المخطط الفرعي الأول سحابة الكلمات لـObservation ، والثاني يعرض الملف لـالإجابة النهائية .tight_layout()  تضمن هذه الوظيفة التباعد الجيد بين المخططات. تُتيح لنا سُحُب الكلمات هذه تحليل أداء الوكيل بشكل بديهي من خلال تسليط الضوء على المصطلحات الرئيسية المستردة من السياق (Observation ) وتلك التي تم التأكيد عليها في الاستجابات (الإجابة النهائية ).

اختبار دقة الوكيل

في هذا القسم، نقيِّم أداء الوكيل باستخدام مقاييس متعددة للدقة:مطابقة الكلمات الرئيسية ,درجات BLEU ,الدقة/الاستدعاء  ودرجات F1 . توفّر هذه المقاييس نظرة شاملة على مدى كفاءة الوكيل في توليد استجابات دقيقة وذات صلة بناءً على استفسارات المستخدمين.

استيراد المكتبات المطلوبة

قبل بدء الاختبارات، نقوم باستيراد المكتبات اللازمة لتقييم الدقة.

from sklearn.feature_extraction.text import CountVectorizer
from nltk.translate.bleu_score import sentence_bleu
from sklearn.metrics import precision_score, recall_score

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

دقة مطابقة الكلمات الرئيسية

يقيِّم هذا الاختبار مدى جودة تضمين الإجابات التي تم إنشاؤها للكلمات الرئيسية من الاستعلامات. ويستخدمCountVectorizer لترميز الكلمات الرئيسية واستخراجها من الاستعلامات والإجابات. تحسِب الوظيفة نسبة كلمات البحث الموجودة في الإجابة التي تم توليدها، ما يجعل الاستجابة دقيقة إذا تجاوزت هذه النسبة حدًا معينًا (0.5 افتراضيًا). تتم إضافة النتائج إلى DataFrame ضمنKeyword Match Score وIs Accurate columns .

def keyword_matching_accuracy(df):
      """Checks if key phrases from the query are present in the final answer."""
      vectorizer = CountVectorizer(stop_words='english')
      def check_keywords(query, answer):
      query_keywords = set(vectorizer.build_tokenizer()(query.lower()))
      answer_keywords = set(vectorizer.build_tokenizer()(answer.lower()))
      common_keywords = query_keywords & answer_keywords
      return len(common_keywords) / len(query_keywords) # Proportion of matched keywords
      df["Keyword Match Score"] = df.apply(lambda row: check_keywords(row["Action Input"], row["Final Answer"]), axis=1)
      df["Is Accurate"] = df["Keyword Match Score"] >= 0.5 # Set a threshold for accuracy
      return df
# Apply keyword matching
df = keyword_matching_accuracy(df)
df.to_csv("output_with_accuracy.csv", index=False)
df
هذه هي مخرجات خلية التعليمات البرمجية للبرنامج التعليمي في صفحة التفكير.

حساب درجة BLEU

يقيس هذا الاختبار مدى تطابق الإجابات التي تم توليدها مع الملاحظات التي تم استرجاعها.BLEU (التقييم ثنائي اللغة) هو مقياس شائع لتقييم تشابه النصوص بناءً على تداخلاتn-gram . تحسب الوظيفةدرجات BLEU  لكل زوج من الاستعلام والإجابة وإضافتهما إلى DataFrame ضمن عمود درجة BLEU.

def calculate_bleu_scores(df):
    """Calculates BLEU scores for answers against observations."""
    df["BLEU Score"] = df.apply(
       lambda row: sentence_bleu([row["Observation"].split()], row["Final Answer"].split()),
       axis=1
       )
    return df
# Apply BLEU score calculation
df = calculate_bleu_scores(df)
df.to_csv("output_with_bleu.csv", index=False)
تم إنشاء الرسم التخطيطي لبرنامج تعليمي في صفحة "فكر".

الدقة والاستدعاء

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

تتم إضافة هذه المقاييس إلى DataFrame ضمن أعمدة Precision و الاستدعاء .

def calculate_precision_recall(df):
     """Calculates precision and recall for extractive answers."""
         def precision_recall(observation, answer):
                observation_set = set(observation.lower().split())
                answer_set = set(answer.lower().split())
                precision = len(observation_set & answer_set) / len(answer_set) if answer_set else 0
                recall = len(observation_set & answer_set) / len(observation_set) if observation_set else 0
         return precision, recall
        df[["Precision", "Recall"]] = df.apply(
        lambda row: pd.Series(precision_recall(row["Observation"], row["Final Answer"])),
        axis=1
        )
return df
# Apply precision/recall
df = calculate_precision_recall(df)
df.to_csv("output_with_precision_recall.csv", index=False)
df
مخرجات خلية التعليمات البرمجية للبرنامج التعليمي الموجود في صفحة "فكر".

حساب درجة F1

تجمع درجة F1 بين الدقة والاسترجاع في مؤشر واحد، ما يوفر تقييمًا متوازنًا للملاءمة والشمولية. صيغة حساب درجة F1 هي: F1 Score = 2 * (Precision * Recall) / (Precision + Recall)

تتم إضافةدرجات F1 إلى DataFrame ضمن عمود درجة F1.

def calculate_f1(df):
      """Calculates F1 scores based on precision and recall."""
          df["F1 Score"] = 2 * (df["Precision"] * df["Recall"]) / (df["Precision"] + df["Recall"])
          df["F1 Score"].fillna(0, inplace=True) # Handle divide by zero
          return df
# Apply F1 calculation
df = calculate_f1(df)
df.to_csv("output_with_f1.csv", index=False)
df
مخرجات خلية التعليمات البرمجية للبرنامج التعليمي الموجود في صفحة "فكر".

تلخيص مقاييس الدقة

أخيرًا، تجمع وظيفة التلخيص جميع المقاييس لتوفير نظرة عامة حول أداء الوكيل. وتحسِب العدد الإجمالي للاستعلامات وعدد ونسبة الاستجابات الدقيقة ومتوسط درجات BLEU وF1.

def summarize_accuracy_metrics(df):
      """Summarizes overall accuracy metrics."""
          total_entries = len(df)
          accurate_entries = df["Is Accurate"].sum()
          average_bleu = df["BLEU Score"].mean()
          average_f1 = df["F1 Score"].mean()
          print(f"Total Entries: {total_entries}")
          print(f"Accurate Entries: {accurate_entries} ({accurate_entries / total_entries * 100:.2f}%)")
          print(f"Average BLEU Score: {average_bleu:.2f}")
          print(f"Average F1 Score: {average_f1:.2f}")
# Call summary function
summarize_accuracy_metrics(df)

المخرجات


 

Total Entries: 4
Accurate Entries: 4 (100.00%)
Average BLEU Score: 0.04
Average F1 Score: 0.24

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

ملخص

يرشدك هذا البرنامج التعليمي خلال إنشاء وكيل مستقل مدعوم من IBM's Granite LLM وLangChain. بدءًا من استخراج النص إلى التوجيه وحل الاستعلام، قمنا بتغطية العملية الكاملة لتصميم وتنفيذ وكيل قائم على LLM. تضمنت الخطوات الرئيسية إدارة الذاكرة باستخدام مخازن المتجهات، ومعالجة الاستعلامات وتوليد الاستجابات باستخدام Granite.

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

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

حلول ذات صلة
وكلاء الذكاء الاصطناعي للأعمال

يمكنك إنشاء مساعدين ووكلاء ذكاء اصطناعي ووكلاء أقوياء يعملون على أتمتة مهام سير العمل والعمليات باستخدام الذكاء الاصطناعي التوليدي ونشرها وإدارتها.

    استكشف watsonx Orchestrate
    حلول وكلاء الذكاء الاصطناعي من IBM

    يمكنك بناء مستقبل عملك باستخدام حلول الذكاء الاصطناعي الجديرة بالثقة.

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

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

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

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

    استكشف watsonx Orchestrate استكشف watsonx.ai