إنشاء نظام توليد معزز بالاسترجاع متعدد الوسائط ومدعوم بالذكاء الاصطناعي باستخدام Docling وGranite

المؤلفون

BJ Hargrave

Open Source Developer, STSM

Erika Russi

Data Scientist

IBM

في هذا البرنامج التعليمي، ستستخدم Docling من IBM ورؤية IBM Granite مفتوحة المصدر، والتضمينات النصية ونماذج الذكاء الاصطناعي التوليدي من أجل إنشاء نظام توليد معزز بالاسترجاع. تتوفر هذه النماذج عبر العديد من أُطر العمل مفتوحة المصدر. في هذا البرنامج التعليمي، سنستخدم Replicate للاتصال برؤية IBM Granite ونماذج الذكاء الاصطناعي التوليدي، وHuggingFace للاتصال بنموذج التضمينات.

التوليد المعزز بالاسترجاع متعدد الوسائط

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

يمكن لنظام التوليد المعزز بالاسترجاع متعدد الوسائط استخدام نماذج لغوية كبرى متعددة الوسائط (MLLM) لمعالجة المعلومات من أنواع متعددة من البيانات وتضمينها كجزء من القاعدة المعرفية الخارجية المستخدمة في نظام التوليد المعزز بالاسترجاع. يمكن أن تتضمن البيانات متعددة الوسائط النصوص أو الصور أو المقاطع الصوتية أو مقاطع فيديو أو أشكالاً أخرى. تشمل النماذج اللغوية الكبرى متعددة الوسائط الشهيرة Gemini من Google، وLlama 3.2 من Meta، وGPT-4 وGPT-4o من OpenAI.

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

نظرة عامة على البرنامج التعليمي

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

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

يستخدم هذا البرنامج التعليمي ثلاث تقنيات متطورة:

  1. Docling: مجموعة أدوات مفتوحة المصدر تُستخدم لتحليل المستندات وتحويلها.
  2. Granite: نموذج لغوي كبير متطور يوفر إمكانات فائقة في معالجة اللغة الطبيعية ونموذج لغة ورؤية يوفر إمكانات تحويل الصور إلى نص.
  3. LangChain: إطار عمل فائق يُستخدم لإنشاء تطبيقات مدعومة بنماذج لغوية، وهو مصمم لتبسيط سير العمل المعقدة ودمج الأدوات الخارجية بسلاسة.

بحلول نهاية هذا البرنامج التعليمي، ستتمكن من إنجاز ما يلي:

  • اكتسب الكفاءة في المعالجة المسبقة للمستندات وتقسيمها وفهم الصور.
  • ادمج قواعد بيانات المتجهات لتعزيز إمكانات الاسترجاع.
  • استخدم التوليد المعزز بالاسترجاع لإجراء استرجاع بيانات فعال ودقيق في التطبيقات الواقعية.

هذا البرنامج التعليمي مصمم لمطوري الذكاء الاصطناعي والباحثين والهواة الذين يتطلعون إلى تعزيز معرفتهم بإدارة المستندات وتقنيات معالجة اللغة الطبيعية (NLP). يمكن أيضًا العثور على هذا البرنامج التعليمي في Granite Snack Cookbook GitHub من IBM Granite Community في شكل Jupyter Notebook.

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

  • الإلمام بالبرمجة بلغة Python.
  • الفهم الأساسي للنماذج اللغوية الكبرى، ومفاهيم معالجة اللغة الطبيعية ورؤية الكمبيوتر.

الخطوات

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

! echo "::group::Install Dependencies"
%pip install uv
! uv pip install git+https://github.com/ibm-granite-community/utils.git \
    transformers \
    pillow \
    langchain_classic \
    langchain_core \
    langchain_huggingface sentence_transformers \
    langchain_milvus 'pymilvus[milvus_lite]' \
    docling \
    'langchain_replicate @ git+https://github.com/ibm-granite-community/langchain-replicate.git'
! echo "::endgroup::"

الخطوة 2: تحديد نماذج الذكاء الاصطناعي

التسجيل

لرؤية بعض معلومات التسجيل، يمكننا تكوين مستوى سجل INFO.

ملاحظة: يمكن تخطي تنفيذ هذه الخلية دون مشكلة.

import logging

logging.basicConfig(level=logging.INFO)


حمّل نماذج Granite

حدد نموذج التضمينات المراد استخدامه في إنشاء متجهات تضمين النص. هنا سنستخدم أحد نماذج تضمينات Granite

لاستخدام نموذج تضمينات آخر، استبدل خلية التعليمات البرمجية هذه بخلية من وصفة نموذج التضمينات هذه.

from langchain_huggingface import HuggingFaceEmbeddings
from transformers import AutoTokenizer

embeddings_model_path = “ibm-granite/granite-embedding-30m-english”
embeddings_model = HuggingFaceEmbeddings(
    model_name=embeddings_model_path,
)
embeddings_tokenizer = AutoTokenizer.from_pretrained(embeddings_model_path)

 

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

from ibm_granite_community.notebook_utils import get_env_var
from langchain_community.llms import Replicate
from transformers import AutoProcessor

vision_model_path = “ibm-granite/granite-vision-3.2-2b”
vision_model = Replicate(
    model=vision_model_path,
    replicate_api_token=get_env_var(“REPLICATE_API_TOKEN”),
    model_kwargs={
        “max_tokens”: embeddings_tokenizer.max_len_single_sentence, # Set the maximum number of tokens to generate as output.
        “min_tokens”: 100, # Set the minimum number of tokens to generate as output.
    },
)
vision_processor = AutoProcessor.from_pretrained(vision_model_path)

 

حدد النموذج اللغوي المراد استخدامه في عملية إنشاء نظام التوليد المعزز بالاسترجاع.  هنا نستعين بعميل Replicate LangChain للاتصال بنموذج Granite من مؤسسة ibm-granite على Replicate.

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

للاتصال بنموذج من مقدم خدمة آخر غير Replicate، استبدل خلية التعليمات البرمجية هذه بواحدة من وصفة عنصر النموذج اللغوي الكبير.

from langchain_replicate import ChatReplicate

model_path = "ibm-granite/granite-4.0-h-small"
model = ChatReplicate(
    model=model_path,
    replicate_api_token=get_env_var("REPLICATE_API_TOKEN"),
    model_kwargs={
        "max_tokens": 1000, # Set the maximum number of tokens to generate as output.
        "min_tokens": 100, # Set the minimum number of tokens to generate as output.
    },
)

الخطوة 3: تحضير المستندات لقاعدة بيانات المتجهات

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

استخدام Docling لتنزيل المستندات وتحويلها إلى نصوص وصور

سيعمل Docling على تنزيل مستندات PDF ومعالجتها حتى نتمكن من الحصول على النصوص والصور التي تحتوي عليها المستندات. يوجد في ملف PDF أنواع مختلفة من البيانات، بما في ذلك النصوص والجداول والرسوم البيانية والصور.

from docling.document_converter import DocumentConverter, PdfFormatOption
from docling.datamodel.base_models import InputFormat
from docling.datamodel.pipeline_options import PdfPipelineOptions

pdf_pipeline_options = PdfPipelineOptions(
    do_ocr=False,
    generate_picture_images=True,
)
format_options = {
    InputFormat.PDF: PdfFormatOption(pipeline_options=pdf_pipeline_options),
}
converter = DocumentConverter(format_options=format_options)

sources = [
    “https://midwestfoodbank.org/images/AR_2020_WEB2.pdf”,
]
conversions = { source: converter.convert(source=source).document for source in sources }

 

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

from docling_core.transforms.chunker.hybrid_chunker import HybridChunker
from docling_core.types.doc.document import TableItem
from langchain_core.documents import Document

doc_id = 0
texts: list[Document] = []
for source, docling_document in conversions.items():
    for chunk in HybridChunker(tokenizer=embeddings_tokenizer).chunk(docling_document):
        items = chunk.meta.doc_items
        if len(items) == 1 and isinstance(items[0], TableItem):
            continue # we will process tables later
        refs = “ “.join(map(lambda item: item.get_ref().cref, items))
        print(refs)
        text = chunk.text
        document = Document(
            page_content=text,
            metadata={
                “doc_id”: (doc_id:=doc_id+1),
                “source”: source,
                “ref”: refs,
            },
        )
        texts.append(document)

print(f”{len(texts)} text document chunks created”)

 

بعد ذلك، نعالج أي جداول موجودة في المستندات. ونحول بيانات الجداول إلى تنسيق Markdown لتمريره إلى النموذج اللغوي. تُنشأ قائمة بمستندات LangChain من تصورات الجداول بتنسيق Markdown.

from docling_core.types.doc.labels import DocItemLabel

doc_id = len(texts)
tables: list[Document] = []
for source, docling_document in conversions.items():
    for table in docling_document.tables:
        if table.label in [DocItemLabel.TABLE]:
            ref = table.get_ref().cref
            print(ref)
            text = table.export_to_markdown()
            document = Document(
                page_content=text,
                metadata={
                    “doc_id”: (doc_id:=doc_id+1),
                    “source”: source,
                    “ref”: ref
                },
            )
            tables.append(document)


print(f”{len(tables)} table documents created”)

 

وأخيرًا، نعالج أي صور موجودة في المستندات. نستخدم هنا نموذج اللغة والرؤية لفهم محتوى الصورة. في هذا المثال، نحن مهتمون بأي معلومات نصية موجودة في الصورة. قد ترغب في تجربة موجه مختلف لترى كيف يمكن تحسين النتائج.

ملاحظة: قد تستغرق معالجة الصور وقتًا طويلاً جدًا اعتمادًا على عدد الصور والخدمة التي تشغل نموذج اللغة والرؤية.

import base64
import io
import PIL.Image
import PIL.ImageOps
from IPython.display import display

def encode_image(image: PIL.Image.Image, format: str = “png”) -> str:
    image = PIL.ImageOps.exif_transpose(image) or image
    image = image.convert(“RGB”)

    buffer = io.BytesIO()
    image.save(buffer, format)
    encoding = base64.b64encode(buffer.getvalue()).decode(“utf-8”)
    uri = f”data:image/{format};base64,{encoding}”
    return uri

# Feel free to experiment with this prompt
image_prompt = “If the image contains text, explain the text in the image.”
conversation = [
    {
        “role”: “user”,
        “content”: [
            {“type”: “image”},
            {“type”: “text”, “text”: image_prompt},
        ],        
    },
]
vision_prompt = vision_processor.apply_chat_template(
    conversation=conversation,
    add_generation_prompt=True,
)
pictures: list[Document] = []
doc_id = len(texts) + len(tables)
for source, docling_document in conversions.items():
    for picture in docling_document.pictures:
        ref = picture.get_ref().cref
        print(ref)
        image = picture.get_image(docling_document)
        if image:
            text = vision_model.invoke(vision_prompt, image=encode_image(image))
            document = Document(
                page_content=text,
                metadata={
                    “doc_id”: (doc_id:=doc_id+1),
                    “source”: source,
                    “ref”: ref,
                },
            )
            pictures.append(document)

print(f”{len(pictures)} image descriptions created”)

 

يمكننا بعد ذلك عرض مستندات LangChain التي تم إنشاؤها من مستندات الإدخال.

import itertools
from docling_core.types.doc.document import RefItem

# Print all created documents
for document in itertools.chain(texts, tables):
    print(f”Document ID: {document.metadata[‘doc_id’]}”)
    print(f”Source: {document.metadata[‘source’]}”)
    print(f”Content:\n{document.page_content}”)
    print(“=” * 80) # Separator for clarity

for document in pictures:
    print(f”Document ID: {document.metadata[‘doc_id’]}”)
    source = document.metadata[‘source’]
    print(f”Source: {source}”)
    print(f”Content:\n{document.page_content}”)
    docling_document = conversions[source]
    ref = document.metadata[‘ref’]
    picture = RefItem(cref=ref).resolve(docling_document)
    image = picture.get_image(docling_document)
    print(“Image:”)
    display(image)
    print(“=” * 80) # Separator for clarity

ملء قاعدة بيانات المتجهات

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

ملاحظة: قد تستغرق عملية تجميع قاعدة بيانات المتجهات بعض الوقت اعتمادًا على نموذج التضمينات والخدمة.

اختيار قاعدة بيانات المتجهات

حدِّد قاعدة البيانات لاستخدامها لتخزين واسترجاع متجهات التضمين.

للاتصال بقاعدة بيانات متجهات غير Milvus، استبدل خلية التعليمات البرمجية هذه بواحدة من وصفة مخزن المتجهات هذه.

import tempfile
from langchain_core.vectorstores import VectorStore
from langchain_milvus import Milvus

db_file = tempfile.NamedTemporaryFile(prefix=”vectorstore_”, suffix=”.db”, delete=False).name
print(f”The vector database will be saved to {db_file}”)

vector_db: VectorStore = Milvus(
    embedding_function=embeddings_model,
    connection_args={“uri”: db_file},
    auto_id=True,
    enable_dynamic_field=True,
    index_params={“index_type”: “AUTOINDEX”},
)

 

نضيف الآن جميع مستندات LangChain الخاصة بالنصوص والجداول وأوصاف الصور إلى قاعدة بيانات المتجهات.

import itertools
documents = list(itertools.chain(texts, tables, pictures))
ids = vector_db.add_documents(documents)
print(f”{len(ids)} documents added to the vector database”)

الخطوة 4: التوليد المعزز بالاسترجاع باستخدام Granite

الآن وبعد أن نجحنا في تحويل مستنداتنا وتحويلها إلى متجهات، يمكننا إعداد مسار التوليد المعزز بالاسترجاع.

استرجع الأجزاء ذات الصلة

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

لا تتردد في تجربة استعلامات مختلفة.

query = "How much was spent on food distribution relative to the amount of food distributed?"
for doc in vector_db.as_retriever().invoke(query):
    print(doc)
    print("=" * 80) # Separator for clarity

 

يجب أن يكون المستند المسترد مستجيبًا للاستعلام. هيا بنا نمضي قدمًا ونُنشئ مسار التوليد المعزز بالاسترجاع.


أنشئ مسار التوليد المعزز بالاسترجاع لنموذج Granite

يتعين علينا أولاً إنشاء موجهات Granite لإجراء استعلام توليد معزز بالاسترجاع. نستخدم قالب دردشة Granite ونوفر القيم المؤقتة التي سيستبدلها مسار LangChain للتوليد المعزز بالاسترجاع.

بعد ذلك، نُنشئ مسار التوليد المعزز بالاسترجاع باستخدام قوالب موجهات Granite المُنشأة مسبقًا.

from ibm_granite_community.langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_classic.chains.retrieval import create_retrieval_chain
from langchain_core.prompts import ChatPromptTemplate

# Create a Granite prompt for question-answering with the retrieved context
prompt_template = ChatPromptTemplate.from_template("{input}")

# Assemble the retrieval-augmented generation chain
combine_docs_chain = create_stuff_documents_chain(
    llm=model,
    prompt=prompt_template,
)
rag_chain = create_retrieval_chain(
    retriever=vector_db.as_retriever(),
    combine_docs_chain=combine_docs_chain,
)

إنشاء استجابة معززة بالاسترجاع لسؤال

يستخدم المسار الاستعلام لتحديد موقع المستندات من قاعدة بيانات المتجهات واستخدامها كسياق للاستعلام.

from ibm_granite_community.notebook_utils import wrap_text

output = rag_chain.invoke({"input": query})

print(wrap_text(output['answer']))

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

الخطوات التالية

  • استكشف سير عمل التوليد المعزز بالاسترجاع المتقدمة في الصناعات الأخرى.
  • جرِّب أنواعًا أخرى من المستندات ومجموعات بيانات أكبر.
  • حسّن هندسة الموجِّهات لتحسين استجابات Granite.
حلول ذات صلة
IBM watsonx.ai

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

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

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

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

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

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

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

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