تنفيذ التجزئة الوكيلية لتحسين مدخلات النموذج اللغوي الكبير باستخدام LangChain وwatsonx.ai

مؤلف

Shalini Harkar

Lead AI Advocate

ما المقصود بالتجزئة الوكيلية؟

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

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

العناصر الرئيسية للتجزئة الوكيلية

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

2. تحديد حجم الأجزاء بطريقة ديناميكية: تعديل أحجام المقاطع في الوقت الفعلي من خلال مراعاة البنية الدلالية والسياق، بدلًا من الالتزام بحدود ثابتة للرموز المميزة.

3. التداخل مع الحفاظ على السياق: تقييم التداخل بين المقاطع بذكاء للحفاظ على التماسك وتجنب فقدان المعلومات الأساسية، وبالتالي تحسين كفاءة الاسترجاع.

 

مزايا التجزئة الوكيلية مقارنةً بالطرق التقليدية

توفّر التجزئة الوكيلية مزايا مقارنةً بالتجزئة التقليدية:

أ. الاحتفاظ بالسياق: الحفاظ على المعلومات المهمة دون انقطاع غير ضروري.

ب. التحجيم الذكي: ضبط حدود الأجزاء وفقًا للمعنى والأهمية.

ج. تحسين الاستعلامات: العمل باستمرار على تحسين الأجزاء لتتوافق مع الاستعلامات المحددة.

د. الاسترجاع الفعَّال: تحسين نتائج أنظمة البحث وRAG عن طريق تقليل التجزئة غير الضرورية.

 

في هذا البرنامج التعليمي، ستُجري تجربة على استراتيجية التجزئة الوكيلية باستخدام نموذج Granite-3.0-8B-Instruct من IBM، والمتاح حاليًا على watsonx.ai.الهدف الأساسي هو تنفيذ تجزئة فعَّالة لضمان تطبيق ناجح لنموذج RAG.

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

تحتاج إلى حساب® 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. يمكن العثور على Jupyter Notebook هذا مع مجموعات البيانات المستخدمة على GitHub.

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

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

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

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

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

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

ملحوظة، تم تطوير هذا البرنامج التعليمي باستخدام Python 3.12.7.

!pip install -q langchain langchain-ibm langchain_experimental langchain-text-splitters langchain_chroma transformers bs4 langchain_huggingface sentence-transformers
import getpass
import requests
from bs4 import BeautifulSoup
from langchain_ibm import WatsonxLLM
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.document_loaders import WebBaseLoader
from langchain.schema import SystemMessage, HumanMessage
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.prompts import ChatPromptTemplate
from langchain.vectorstores import Chroma
from langchain.tools import tool
from langchain.agents import AgentExecutor
from langchain.memory import ConversationBufferMemory
from transformers import AutoTokenizer
from ibm_watsonx_ai.foundation_models.utils.enums import EmbeddingTypes
from ibm_watsonx_ai.metanames import GenTextParamsMetaNames as GenParams
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.schema import Document
from langchain.chains.combine_documents import create_stuff_documents_chain



 

لتعيين بيانات الاعتماد الخاصة بنا، نحتاج إلى "WATSONX_APIKEY" و"WATSONX_PROJECT_ID". سنقوم أيضًا بتعيين عنوان URL الذي يعمل كنقطة نهاية لواجهة برمجة التطبيقات.

load_dotenv(os.getcwd()+"/.env", override=True)
credentials = {
    "url": "https://us-south.ml.cloud.ibm.com",
    "apikey": os.getenv("WATSONX_APIKEY", ""),
}
project_id = os.getenv("PROJECT_ID", "")

الخطوة 4. تهيئة النموذج اللغوي. 

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

llm = WatsonxLLM(
    model_id="ibm/granite-3-8b-instruct",
    url=credentials.get("url"),
    apikey=credentials.get("apikey"),
    project_id=project_id,
    params={
        GenParams.DECODING_METHOD: "greedy",
        GenParams.TEMPERATURE: 0,
        GenParams.MIN_NEW_TOKENS: 5,
        GenParams.MAX_NEW_TOKENS: 250,
        GenParams.STOP_SEQUENCES: ["Human:", "Observation"],
    },
)

 الخطوة 5. تحميل المستند.

تقوم هذه الوظيفة باستخلاص المحتوى النصي من صفحة الشرح الخاصة بالتعلم الآلي من IBM. تُزيل هذه الوظيفة عناصر HTML غير المرغوب فيها (مثل البرامج النصية والأنماط)، وتُعيد نصًا نظيفًا وقابلًا للقراءة.

def get_text_from_url(url):
    response = requests.get(url)
    if response.status_code != 200:
        raise ValueError(f"Failed to fetch the page, status code: {response.status_code}")
    soup = BeautifulSoup(response.text, "html.parser")
    for script in soup(["script", "style"]):
        script.decompose()
    return soup.get_text(separator="\n", strip=True)
url = "https://www.ibm.com/sa-ar/think/topics/machine-learning"
web_text = get_text_from_url(url)
web_text

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

def agentic_chunking(text):
    """
    Dynamically splits text into meaningful chunks using LLM.
    """
    system_message = SystemMessage(content="You are an AI assistant helping to split text into meaningful chunks based on topics.")
    
    human_message = HumanMessage(content=f"Please divide the following text into semantically different, separate and meaningful chunks:\n\n{text}")

    response = llm.invoke([system_message, human_message]) # LLM returns a string
    return response.split("\n\n") # Split based on meaningful sections
chunks = agentic_chunking(web_text)
chunks

لنطبع الأجزاء لفهم أفضل لهيكل الناتج.

for i, chunk in enumerate(chunks,1):
    print(f"Chunk {i}:\n{chunk}\n{'-'*40}")

رائع! تم إنشاء الأجزاء بنجاح بواسطة الوكلاء في الناتج.

الخطوة 6: إنشاء مخزن المتجهات.

والآن، بعد أن جرَّبنا التجزئة الوكيلية على النص، دعونا نتابع تنفيذ نظام RAG.

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

embeddings_model = HuggingFaceEmbeddings(model_name="ibm-granite/granite-embedding-30m-english")
 

أنشئ قاعدة بيانات متجهات Chroma.

vector_db = Chroma(
    collection_name="example_collection",
    embedding_function=embeddings_model
)

حوِّل كل جزء نصي إلى كائن مستند.

documents = [Document(page_content=chunk) for chunk in chunks]

أضِف المستندات إلى قاعدة بيانات المتجهات.

vector_db.add_documents(documents)

الخطوة 7: هيكلة قالب الموجِّه.

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

prompt_template = """<|start_of_role|>user<|end_of_role|>Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.
{context}
Question: {input}<|end_of_text|>
<|start_of_role|>assistant<|end_of_role|>"""
qa_chain_prompt = PromptTemplate.from_template(prompt_template)
combine_docs_chain = create_stuff_documents_chain(llm, qa_chain_prompt)
rag_chain = create_retrieval_chain(vector_db.as_retriever(), combine_docs_chain)

الخطوة 8: إرسال الموجِّه إلى سلسلة RAG

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

output = llm.invoke("What is Model optimization process")
output

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

rag_output = rag_chain.invoke({"input": "What is Model optimization process?"})
rag_output['answer']

رائع! استخدَم نموذج Granite بشكل صحيح أجزاء RAG الوكيلية كسياق لتزويدنا بمعلومات دقيقة حول عملية تحسين النماذج، مع الحفاظ على التماسك الدلالي.

ملخص

في هذا البرنامج التعليمي، أنشأنا أجزاء صغيرة من المعلومات ذات الصلة باستخدام وكلاء الذكاء الاصطناعي في عملية التجزئة، وأنشأنا مسارًا قائمًا على التوليد المعزز بالاسترجاع (RAG).

تعمل هذه الطريقة على تحسين استرجاع المعلومات وتحسين نوافذ السياق باستخدام الذكاء الاصطناعي ومعالجة اللغة الطبيعية (NLP). وهي تبسِّط مقاطع البيانات لرفع كفاءة الاسترجاع عند استخدام النماذج اللغوية الكبيرة (LLMs) مثل نماذج GPT من OpenAI لتحقيق نتائج أفضل.

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

تمكين المطورين من إنشاء وكلاء الذكاء الاصطناعي ونشرهم ومراقبتهم باستخدام استوديو IBM watsonx.ai.

استكشف watsonx.ai
وكلاء ومساعدو الذكاء الاصطناعي من IBM

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

استكشِف وكلاء الذكاء الاصطناعي
IBM Granite

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

استكشف Granite
اتخِذ الخطوة التالية

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

  1. استكشف تطوير وكلاء watsonx.ai
  2. استكشف watsonx Orchestrate