مدل‌های زبان بزرگ این روزها همه جا هستند – فکر کنید ChatGPT – اما آنها سهم خود را از چالش‌ها دارند.

یکی از بزرگترین چالش هایی که LLM ها با آن مواجه هستند توهم است. این زمانی اتفاق می‌افتد که مدل متنی را تولید می‌کند که از نظر واقعی نادرست یا گمراه‌کننده است و اغلب مبتنی بر آن است روی الگوهایی که از داده های آموزشی خود آموخته است. بنابراین چگونه Retrieval-Augmented Generation یا RAG می تواند به کاهش این مشکل کمک کند؟

RAG با بازیابی اطلاعات مرتبط از یک پایگاه دانش گسترده تر و گسترده تر، اطمینان می دهد که پاسخ های LLM بر اساس حقایق دنیای واقعی است. این به طور قابل توجهی احتمال توهم را کاهش می دهد و دقت و قابلیت اطمینان کلی محتوای تولید شده را بهبود می بخشد.

فهرست مطالب:

  1. Retrieval Augmented Generation (RAG) چیست؟

  2. آشنایی با اجزای یک خط لوله RAG

  3. پیش نیازها

  4. بیایید شروع کنیم!

  5. روش تنظیم دقیق خط لوله

  6. کاربردهای RAG در دنیای واقعی

  7. بهترین اقدامات و ملاحظات RAG

  8. نتیجه گیری

Retrieval Augmented Generation (RAG) چیست؟

RAG تکنیکی است که بازیابی اطلاعات را با تولید زبان ترکیب می کند. به آن به عنوان یک دو مرحله فکر کنید process:

  1. بازیابی: این مدل ابتدا اطلاعات مربوطه را از مجموعه بزرگی از اسناد مبتنی بر بازیابی می کند روی پرس و جو کاربر

  2. نسل: با استفاده از این اطلاعات بازیابی شده، مدل یک پاسخ جامع و آموزنده ایجاد می کند.

چرا از LlamaIndex برای RAG استفاده کنیم؟

LlamaIndex یک چارچوب قدرتمند است که کار را ساده می کند process ساخت خطوط لوله RAG این یک روش انعطاف‌پذیر و کارآمد برای اتصال اجزای بازیابی (مانند پایگاه‌های داده برداری و مدل‌های جاسازی) با اجزای تولید (مانند LLM) ارائه می‌کند.

برخی از مزایای کلیدی استفاده از Llama-Index عبارتند از:

  • مدولاریت: این به شما اجازه می دهد تا به راحتی اجزای مختلف را سفارشی کنید و آزمایش کنید.

  • مقیاس پذیری: می تواند مجموعه داده های بزرگ و پرس و جوهای پیچیده را مدیریت کند.

  • سهولت استفاده: این یک API سطح بالا ارائه می دهد که بسیاری از پیچیدگی های اساسی را از بین می برد.

آنچه در اینجا خواهید آموخت:

در این مقاله، اجزای خط لوله RAG را عمیق‌تر می‌کنیم و چگونگی استفاده از LlamaIndex را برای ساختن این سیستم‌ها بررسی می‌کنیم.

ما موضوعاتی مانند پایگاه های داده برداری، مدل های تعبیه شده، مدل های زبان و نقش LlamaIndex در اتصال این مؤلفه ها را پوشش خواهیم داد.

آشنایی با اجزای یک خط لوله RAG

در اینجا نموداری وجود دارد که به شما کمک می کند تا با اصول معماری RAG آشنا شوید:

معماری RAG جریان را از پرس و جو کاربر تا پاسخ را نشان می دهد

این نمودار از این مقاله الهام گرفته شده است. بیایید قطعات کلیدی را مرور کنیم.

اجزای RAG

مولفه بازیابی:

  • پایگاه های داده برداری: این پایگاه داده ها برای ذخیره و جستجوی بردارهای با ابعاد بالا بهینه شده اند. آنها برای یافتن کارآمد اطلاعات مرتبط از مجموعه وسیعی از اسناد بسیار مهم هستند.

  • مدل های تعبیه شده: این مدل ها متن را به نمایش های عددی یا جاسازی تبدیل می کنند. این تعبیه‌ها معنای معنایی متن را می‌گیرند و امکان مقایسه و بازیابی کارآمد در پایگاه‌های داده برداری را فراهم می‌کنند.

بردار یک جسم ریاضی است که کمیتی را با قدر (اندازه) و جهت نشان می دهد. در زمینه RAG، embedding ها بردارهایی با ابعاد بالا هستند که معنای معنایی متن را به تصویر می کشند. هر بعد از بردار جنبه متفاوتی از معنای متن را نشان می دهد و امکان مقایسه و بازیابی کارآمد را فراهم می کند.

مولفه نسل:

  • مدل های زبان: این مدل ها آموزش دیده اند روی حجم عظیمی از داده های متنی، آنها را قادر می سازد تا متنی با کیفیت انسانی تولید کنند. آنها قادر به درک و پاسخگویی به اطالعات به شیوه ای منسجم و آموزنده هستند.

جریان RAG

  1. ارسال درخواست: کاربر یک سوال یا سوال ارسال می کند.

  2. ایجاد تعبیه: پرس و جو با استفاده از همان مدل جاسازی مورد استفاده برای پیکره به یک جاسازی تبدیل می شود.

  3. بازیابی: جاسازی در پایگاه داده برداری جستجو می شود تا مرتبط ترین اسناد را پیدا کند.

  4. زمینه سازی: اسناد بازیابی شده با پرس و جو اصلی ترکیب می شوند تا یک زمینه را تشکیل دهند.

  5. نسل: مدل زبان بر اساس پاسخ تولید می کند روی زمینه ارائه شده

LamaIndex

LlamaIndex نقش مهمی در اتصال اجزای بازیابی و تولید ایفا می کند. این به عنوان شاخصی عمل می کند که پرس و جوها را به اسناد مربوطه نگاشت می کند. با مدیریت موثر شاخص، LlamaIndex بازیابی را تضمین می کند process سریع و دقیق است

پیش نیازها

ما در این مقاله از Python و IBM watsonx از طریق LlamaIndex استفاده خواهیم کرد. شما باید موارد زیر را داشته باشید روی سیستم شما قبل از شروع:

  • پایتون 3.9+

  • پروژه IBM watsonx و کلید API

  • کنجکاوی برای یادگیری

بیایید شروع کنیم!

در این مقاله، ما از LlamaIndex برای ساخت یک خط لوله RAG ساده استفاده خواهیم کرد.

بیایید با استفاده از دستور زیر یک محیط مجازی برای پایتون ایجاد کنیم terminal: python -m venv venv . این یک محیط مجازی (venv) برای پروژه شما ایجاد می کند. اگر کاربر ویندوز هستید، می توانید آن را با استفاده از آن فعال کنید .\venv\Scripts\activateو کاربران مک می توانند آن را با آن فعال کنند source venv/bin/activate.

حالا بیایید بسته ها را نصب کنیم:

pip install wikipedia llama-index-llms-ibm llama-index-embeddings-huggingface

پس از نصب این بسته ها، به کلید API watsonx.ai نیز نیاز خواهید داشت. این به نوبه خود به شما کمک می کند تا از LLM ها از طریق LlamaIndex استفاده کنید.

پیشنهاد می‌کنیم بخوانید:  چگونه JSON را به شی جاوا اسکریپت تبدیل کنیم. از همان نمادی استفاده می‌کند که برای تعریف اشیاء جاوا اسکریپت استفاده می‌شود و طبیعتاً تبدیل بین یک رشته JSON و اشیاء جاوا اسکریپت بسیار ساده است.

برای آشنایی با روش دریافت کلیدهای API watsonx.ai، اینجا را کلیک کنید. برای اینکه بتوانید کار کنید به شناسه پروژه و کلید API نیاز دارید روی جنبه “نسل” RAG. داشتن آنها به شما کمک می کند تا تماس های LLM را از طریق watsonx.ai برقرار کنید.

import wikipedia

# Search for a specific page
page = wikipedia.page("Artificial Intelligence")

# Access the content
print(page.content)

حالا بیایید ذخیره کنیم page محتوا به یک سند متنی ما این کار را انجام می دهیم تا بعداً بتوانیم به آن دسترسی پیدا کنیم. با استفاده از کد زیر می توانید این کار را انجام دهید:

import os

# Create the 'Document' directory if it doesn't exist
if not os.path.exists('Document'):
    os.mkdir('Document')

# Open the file 'AI.txt' in write mode with UTF-8 encoding
with open('Document/AI.txt', 'w', encoding='utf-8') as f:
    # Write the content of the 'page' object to the file
    f.write(page.content)

اکنون ما از watsonx.ai از طریق LlamaIndex استفاده خواهیم کرد. این به ما کمک می کند تا بر اساس پاسخ ها تولید کنیم روی پرس و جو کاربر

توجه: مطمئن شوید که پارامترها را جایگزین کنید WATSONX_APIKEY و project_id با مقادیر شما در کد زیر:

import os
from llama_index.llms.ibm import WatsonxLLM
from llama_index.core import SimpleDirectoryReader, Document


# Define a function to generate responses using the WatsonxLLM instance
def generate_response(prompt):
    """
    Generates a response to the given prompt using the WatsonxLLM instance.

    Args:
        prompt (str): The prompt to provide to the large language model.

    Returns:
        str: The generated response from the WatsonxLLM.
    """

    response = watsonx_llm.complete(prompt)
    return response

# Set the WATSONX_APIKEY environment variable (replace with your actual key)
os.environ["WATSONX_APIKEY"] = 'YOUR_WATSONX_APIKEY'  # Replace with your API key

# Define model parameters (adjust as needed)
temperature = 0
max_new_tokens = 1500
additional_params = {
    "decoding_method": "sample",
    "min_new_tokens": 1,
    "top_k": 50,
    "top_p": 1,
}

# Create a WatsonxLLM instance with the specified model, URL, project ID, and parameters
watsonx_llm = WatsonxLLM(
    model_id="meta-llama/llama-3-1-70b-instruct",
    url="https://us-south.ml.cloud.ibm.com",
    project_id="YOUR_PROJECT_ID",
    temperature=temperature,
    max_new_tokens=max_new_tokens,
    additional_params=additional_params,
)

# Load documents from the specified directory
documents = SimpleDirectoryReader(
    input_files=["Document/AI.txt"]
).load_data()

# Combine the text content of all documents into a single Document object
combined_documents = Document(text="\n\n".join([doc.text for doc in documents]))

# Print the combined document
print(combined_documents)

در اینجا به تفکیک پارامترها آمده است:

  • دما = 0: این تنظیم باعث می‌شود که مدل محتمل‌ترین دنباله متن را تولید کند که منجر به خروجی قطعی‌تر و قابل پیش‌بینی‌تر می‌شود. مثل این است که به مدل بگویید به رایج ترین کلمات و عبارات پایبند باشد.

  • max_new_tokens = 1500: این متن تولید شده را به حداکثر 1500 نشانه جدید (کلمات یا بخش هایی از کلمات) محدود می کند.

  • extra_params:

    • decoding_method = “نمونه”: این بدان معناست که مدل به صورت تصادفی متنی را تولید می کند روی توزیع احتمال هر توکن

    • min_new_tokens = 1: تضمین می کند که حداقل یک توکن جدید تولید شده است و از تکرار مدل جلوگیری می کند.

    • top_k = 50: این انتخاب مدل را به 50 توکن محتمل در هر مرحله محدود می‌کند و خروجی را متمرکزتر و تصادفی‌تر می‌کند.

    • top_p = 1: این امر احتمال نمونه برداری هسته را روی 1 تنظیم می کند، به این معنی که همه نشانه هایی با احتمال بزرگتر یا مساوی با مقدار top_p در نظر گرفته می شوند.

می‌توانید این پارامترها را برای آزمایش تغییر دهید و ببینید که چگونه بر پاسخ شما تأثیر می‌گذارند. اکنون یک نمایه ذخیره برداری برداری از سند داده شده ایجاد و بارگذاری می کنیم. اما ابتدا بیایید بفهمیم که چیست.

درک نمایه های فروشگاه برداری

شاخص ذخیره برداری یک ساختار داده تخصصی است که برای ذخیره و بازیابی موثر بردارهای با ابعاد بالا طراحی شده است. در زمینه شاخص لاما، این بردارها تعبیه‌های معنایی اسناد را نشان می‌دهند.

ویژگی های کلیدی شاخص های فروشگاه برداری:

  • بردارهای با ابعاد بالا: هر سند به عنوان یک بردار با ابعاد بالا نشان داده می شود که معنای معنایی آن را به تصویر می کشد.

  • بازیابی کارآمد: نمایه‌های فروشگاه برداری برای جستجوی تشابه سریع بهینه‌سازی شده‌اند و به شما امکان می‌دهند اسنادی را که از نظر معنایی شبیه به یک جستار داده شده هستند، به سرعت بیابید.

  • مقیاس پذیری: آنها می توانند مجموعه داده های بزرگ را مدیریت کنند و با افزایش تعداد اسناد، مقیاس آنها را به طور کارآمد انجام دهند.

چگونه Llama Index از نمایه های ذخیره برداری برداری استفاده می کند:

  1. جاسازی سند: اسناد ابتدا با استفاده از مدل زبانی مانند Llama به بردارهای با ابعاد بالا تبدیل می شوند.

  2. ایجاد شاخص: تعبیه‌ها در یک فهرست ذخیره بردار ذخیره می‌شوند.

  3. پردازش پرس و جو: هنگامی که یک کاربر درخواستی را ارسال می کند، آن را نیز به یک بردار تبدیل می کند. سپس از نمایه ذخیره برداری برای یافتن مشابه ترین اسناد مبتنی بر استفاده می شود روی تعبیه های آنها

  4. تولید پاسخ: اسناد بازیابی شده برای ایجاد پاسخ مربوطه استفاده می شود.

در کد زیر با کلمه chunk مواجه خواهید شد. یک تکه یک واحد کوچکتر و قابل مدیریت از متن استخراج شده از یک سند بزرگتر است. معمولاً یک پاراگراف یا چند جمله است. آنها برای کارآمدتر کردن بازیابی و پردازش اطلاعات، به ویژه در هنگام برخورد با اسناد بزرگ استفاده می شوند.

با تقسیم اسناد به قطعات، سیستم های RAG می توانند تمرکز کنند روی مرتبط ترین بخش ها و ایجاد پاسخ های دقیق تر و مختصرتر.

from llama_index.core.node_parser import SentenceSplitter
from llama_index.core import VectorStoreIndex, load_index_from_storage
from llama_index.core import Settings
from llama_index.core import StorageContext

def get_build_index(documents, embed_model="local:BAAI/bge-small-en-v1.5", save_dir="./vector_store/index"):
    """
    Builds or loads a vector store index from the given documents.

    Args:
        documents (list[Document]): A list of Document objects.
        embed_model (str, optional): The embedding model to use. Defaults to "local:BAAI/bge-small-en-v1.5".
        save_dir (str, optional): The directory to save or load the index from. Defaults to "./vector_store/index".

    Returns:
        VectorStoreIndex: The built or loaded index.
    """

    # Set index settings
    Settings.llm = watsonx_llm
    Settings.embed_model = embed_model
    Settings.node_parser = SentenceSplitter(chunk_size=1000, chunk_overlap=200)
    Settings.num_output = 512
    Settings.context_window = 3900

    # Check if the save directory exists
    if not os.path.exists(save_dir):
        # Create and load the index
        index = VectorStoreIndex.from_documents(
            [documents], service_context=Settings
        )
        index.storage_context.persist(persist_dir=save_dir)
    else:
        # Load the existing index
        index = load_index_from_storage(
            StorageContext.from_defaults(persist_dir=save_dir),
            service_context=Settings,
        )
    return index

# Get the Vector Index
vector_index = get_build_index(documents=documents, embed_model="local:BAAI/bge-small-en-v1.5", save_dir="./vector_store/index")

این آخرین بخش RAG است: ما یک موتور جستجو با جایگزینی ابرداده و رتبه بندی مجدد ترانسفورماتور جمله ایجاد می کنیم. رفیق پسر! اکنون رتبه بندی مجدد چیست؟

پیشنهاد می‌کنیم بخوانید:  تجزیه URL ها با پایتون

یک رتبه بندی مجدد مؤلفه ای است که اسناد بازیابی شده را مجدداً مرتب می کند روی ارتباط آنها با پرس و جو از اطلاعات اضافی مانند شباهت معنایی یا عوامل زمینه خاص برای اصلاح رتبه بندی اولیه ارائه شده توسط سیستم بازیابی استفاده می کند. این کمک می کند تا اطمینان حاصل شود که مرتبط ترین اسناد به کاربر ارائه می شود و منجر به پاسخ های دقیق تر و آموزنده تر می شود.

from llama_index.core.postprocessor import MetadataReplacementPostProcessor, SentenceTransformerRerank

def get_query_engine(sentence_index, similarity_top_k=6, rerank_top_n=2):
    """
    Creates a query engine with metadata replacement and sentence transformer reranking.

    Args:
        sentence_index (VectorStoreIndex): The sentence index to use.
        similarity_top_k (int, optional): The number of similar nodes to consider. Defaults to 6.
        rerank_top_n (int, optional): The number of nodes to rerank. Defaults to 2.

    Returns:
        QueryEngine: The query engine.
    """

    postproc = MetadataReplacementPostProcessor(target_metadata_key="window")
    rerank = SentenceTransformerRerank(
        top_n=rerank_top_n, model="BAAI/bge-reranker-base"
    )
    engine = sentence_index.as_query_engine(
        similarity_top_k=similarity_top_k, node_postprocessors=[postproc, rerank]
    )
    return engine

# Create a query engine with the specified parameters
query_engine = get_query_engine(sentence_index=vector_index, similarity_top_k=8, rerank_top_n=5)

# Query the engine with a question
query = 'What is Deep learning?'
response = query_engine.query(query)
prompt = f'''Generate a detailed response for the query asked based only روی the context fetched:
            Query: {query}
            Context: {response}

            Instructions:
            1. Show query and your generated response based روی context.
            2. Your response should be detailed and should cover every aspect of the context.
            3. Be crisp and concise.
            4. Don't include anything else in your response - no header/footer/code etc
            '''
response = generate_response(prompt)
print(response.text)

'''
OUTPUT - 
Query: What is Deep learning? 

Deep learning is a subset of artificial intelligence that utilizes multiple layers of neurons between the network's inputs and outputs to progressively extract higher-level features from raw input data. 
This technique allows for improved performance in various subfields of AI, such as computer vision, speech recognition, natural language processing, and image classification. 
The multiple layers in deep learning networks are able to identify complex concepts and patterns, including edges, faces, digits, and letters.
The reason behind deep learning's success is not attributed to a recent theoretical breakthrough, but rather the significant increase in computer power, particularly the shift to using graphics processing units (GPUs), which provided a hundred-fold increase in speed. 
Additionally, the availability of vast amounts of training data, including large curated datasets, has also contributed to the success of deep learning.
Overall, deep learning's ability to analyze and extract insights from raw data has led to its widespread application in various fields, and its performance continues to improve with advancements in technology and data availability. '''

روش تنظیم دقیق خط لوله

هنگامی که یک خط لوله اصلی RAG را ساختید، گام بعدی تنظیم دقیق آن برای عملکرد بهینه است. این شامل تنظیم مکرر مؤلفه ها و پارامترهای مختلف برای بهبود کیفیت پاسخ های تولید شده است.

روش ارزیابی عملکرد خط لوله

برای ارزیابی اثربخشی خط لوله، می توانید استفاده کنید معیارها مانند:

  • دقت: خط لوله هر چند وقت یک بار پاسخ های صحیح و مرتبط ایجاد می کند؟

  • ارتباط: اسناد بازیابی شده چقدر با پرس و جو مطابقت دارند؟

  • انسجام: آیا متن تولید شده ساختار خوبی دارد و به راحتی قابل درک است؟

  • واقعیت: آیا پاسخ های ایجاد شده دقیق و با حقایق شناخته شده سازگار است؟

تکرار کنید روی ساختار شاخص، مدل تعبیه شده و مدل زبان

شما می توانید با موارد مختلف آزمایش کنید ساختارهای شاخص (به عنوان مثال نمایه مسطح، نمایه سلسله مراتبی) برای یافتن موردی که به بهترین وجه با داده ها و الگوهای جستجوی شما مطابقت دارد. استفاده را در نظر بگیرید مدل های مختلف تعبیه برای گرفتن ظرایف معنایی مختلف. تنظیم دقیق مدل زبان همچنین می تواند توانایی خود را برای ایجاد پاسخ های با کیفیت بالا بهبود بخشد.

با فراپارامترهای مختلف آزمایش کنید

فراپارامترها تنظیماتی هستند که رفتار اجزای خط لوله را کنترل می کنند. با آزمایش مقادیر مختلف، می توانید عملکرد خط لوله را بهینه کنید. چند نمونه از هایپرپارامترها عبارتند از:

  • ابعاد تعبیه شده: اندازه بردارهای تعبیه شده

  • اندازه شاخص: حداکثر تعداد اسناد برای ذخیره در فهرست

  • آستانه بازیابی: حداقل امتیاز شباهت برای سندی که باید مرتبط در نظر گرفته شود

کاربردهای RAG در دنیای واقعی

خطوط لوله RAG طیف گسترده ای از کاربردها را دارند، از جمله:

  • چت ربات های پشتیبانی مشتری: ارائه پاسخ های آموزنده و مفید به سوالات مشتریان

  • جستجوی پایگاه دانش: بازیابی کارآمد اطلاعات مرتبط از مجموعه اسناد بزرگ

  • خلاصه اسناد بزرگ: متراکم کردن اسناد طولانی به خلاصه های مختصر

  • سیستم های پاسخگویی به سوالات: پاسخ به سوالات پیچیده بر اساس روی مجموعه معینی از دانش

بهترین اقدامات و ملاحظات RAG

برای ایجاد خطوط لوله RAG موثر، این بهترین شیوه ها را در نظر بگیرید:

  • کیفیت داده ها و پیش پردازش: اطمینان حاصل کنید که داده های شما تمیز، سازگار و مرتبط با مورد استفاده شما هستند. داده ها را برای حذف نویز و بهبود کیفیت آن از قبل پردازش کنید.

  • انتخاب مدل تعبیه شده: یک مدل جاسازی را انتخاب کنید که برای دامنه و کار خاص شما مناسب باشد. عواملی مانند دقت، کارایی محاسباتی و تفسیرپذیری را در نظر بگیرید.

  • بهینه سازی شاخص: ساختار و پارامترهای شاخص را برای بهبود کارایی و دقت بازیابی بهینه کنید.

  • ملاحظات و تعصبات اخلاقی: از سوگیری های احتمالی در داده ها و مدل های خود آگاه باشید. اقداماتی را برای کاهش تعصب و اطمینان از عدالت در خط لوله RAG خود انجام دهید.

نتیجه گیری

خطوط لوله RAG یک رویکرد قدرتمند برای استفاده از مدل های زبان بزرگ برای کارهای مختلف ارائه می دهد. با انتخاب دقیق و تنظیم دقیق اجزای یک خط لوله RAG، می‌توانید سیستم‌هایی بسازید که پاسخ‌های آموزنده، دقیق و مرتبط را ارائه دهند.

نکات کلیدی که باید به خاطر بسپارید:

  • RAG ترکیبی از بازیابی اطلاعات و تولید زبان است.

  • Llama-Index را ساده می کند process ساخت خطوط لوله RAG

  • تنظیم دقیق برای بهینه سازی عملکرد خط لوله ضروری است.

  • RAG دارای طیف گسترده ای از برنامه های کاربردی در دنیای واقعی است.

  • ملاحظات اخلاقی در ایجاد سیستم های RAG مسئول بسیار مهم است.

همانطور که فناوری RAG به تکامل خود ادامه می دهد، می توانیم انتظار داشته باشیم که در آینده شاهد برنامه های نوآورانه و قدرتمندتر باشیم. تا آن زمان، بیایید منتظر آینده باشیم!