Skip to content

Latest commit

 

History

History
281 lines (173 loc) · 21.8 KB

File metadata and controls

281 lines (173 loc) · 21.8 KB

تولید تقویت‌شده با بازیابی (RAG) و پایگاه‌های داده برداری

تولید تقویت‌شده با بازیابی (RAG) و پایگاه‌های داده برداری

در درس برنامه‌های جستجو، به طور خلاصه نحوه ادغام داده‌های خود با مدل‌های زبان بزرگ (LLMs) را آموختیم. در این درس، عمیق‌تر به مفاهیم پایه‌گذاری داده‌ها در برنامه LLM خود، مکانیک فرآیند و روش‌های ذخیره‌سازی داده‌ها، شامل هم جاسازی‌ها و هم متن، خواهیم پرداخت.

ویدئو به زودی منتشر می‌شود

مقدمه

در این درس موارد زیر را پوشش خواهیم داد:

  • معرفی RAG، چیستی آن و دلیل استفاده از آن در هوش مصنوعی (AI).

  • شناخت پایگاه‌های داده برداری و ایجاد یکی برای برنامه خودمان.

  • یک مثال عملی درباره نحوه ادغام RAG در یک برنامه.

اهداف یادگیری

پس از اتمام این درس، قادر خواهید بود:

  • اهمیت RAG در بازیابی و پردازش داده‌ها را توضیح دهید.

  • برنامه RAG را راه‌اندازی کرده و داده‌های خود را روی LLM پایه‌گذاری کنید.

  • ادغام مؤثر RAG و پایگاه‌های داده برداری در برنامه‌های LLM.

سناریوی ما: ارتقاء LLM‌های خود با داده‌های خودمان

برای این درس، می‌خواهیم یادداشت‌های خود را در پروژه آموزشی اضافه کنیم؛ که به چت‌بات اجازه می‌دهد اطلاعات بیشتری در موضوعات مختلف کسب کند. با استفاده از یادداشت‌هایی که داریم، یادگیرندگان می‌توانند بهتر مطالعه کنند و موضوعات مختلف را بفهمند که باعث آسان‌تر شدن مرور برای امتحاناتشان می‌شود. برای ایجاد این سناریو، از موارد زیر استفاده خواهیم کرد:

  • Azure OpenAI: مدل LLM که برای ساخت چت‌بات خود استفاده می‌کنیم

  • درس هوش مصنوعی برای مبتدیان درباره شبکه‌های عصبی: داده‌ای که روی آن LLM ما پایه‌گذاری می‌شود

  • Azure AI Search و Azure Cosmos DB: پایگاه داده برداری برای ذخیره داده و ایجاد شاخص جستجو

کاربران قادر خواهند بود کوییز تمرینی از یادداشت‌هایشان بسازند، کارت‌های مرور بسازند و خلاصه‌ای مختصر تهیه کنند. برای شروع، بیایید ببینیم RAG چیست و چگونه کار می‌کند:

تولید تقویت‌شده با بازیابی (RAG)

یک چت‌بات مبتنی بر LLM ورودی کاربر را پردازش می‌کند تا پاسخ تولید کند. این چت‌بات به گونه‌ای طراحی شده که تعاملی باشد و با کاربران در موضوعات مختلف گفتگو کند. اما پاسخ‌های آن محدود به متن داده شده و داده‌های پایه آموزشی آن است. به عنوان مثال، قطع دانش GPT-4 در سپتامبر ۲۰۲۱ است، یعنی از رویدادهای پس از آن آگاهی ندارد. همچنین، داده‌های استفاده شده برای آموزش LLM شامل اطلاعات محرمانه مثل یادداشت‌های شخصی یا دفترچه راهنمای محصولات یک شرکت نیست.

نحوه کار RAGها (تولید تقویت‌شده با بازیابی)

تصویری که نمایش می‌دهد RAG چگونه کار می‌کند

فرض کنید می‌خواهید یک چت‌بات ایجاد کنید که کوییز از یادداشت‌های شما تولید کند، نیاز به اتصال به پایگاه دانش دارید. اینجا RAG به کمک می‌آید. RAGها به شکل زیر عمل می‌کنند:

  • پایگاه دانش: پیش از بازیابی، این اسناد باید وارد شده و پردازش اولیه شوند؛ معمولاً تقسیم اسناد بزرگ به بخش‌های کوچکتر، تبدیل آنها به جاسازی‌های متنی و ذخیره در پایگاه داده.

  • سؤال کاربر: کاربر پرسشی مطرح می‌کند.

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

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

تصویری از معماری RAGها

معماری RAGها با استفاده از ترنسفورمرها شامل دو قسمت است: انکودر و دیکودر. مثلاً وقتی کاربر سؤال می‌کند، متن ورودی «کدگذاری» می‌شود به بردارهایی که معنای کلمات را دارند و این بردارها «دیکد» می‌شوند بر اساس شاخص سند ما و متن جدیدی بر اساس پرسش کاربر تولید می‌کنند. LLM از مدل انکودر-دیکودر برای تولید خروجی استفاده می‌کند.

دو رویکرد در پیاده‌سازی RAG بر اساس مقاله پیشنهادی: تولید تقویت‌شده با بازیابی برای وظایف پردازش زبان طبیعی نیازمند دانش هستند:

  • RAG-Sequence استفاده از اسناد بازیابی‌شده برای پیش‌بینی بهترین پاسخ ممکن به پرسش کاربر

  • RAG-Token استفاده از اسناد برای تولید توکن بعدی، سپس بازیابی آنها برای پاسخ به سؤال کاربر

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

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

  • کاهش ساختگی‌سازی با استفاده از داده‌های قابل تأیید در پایگاه دانش برای ارائه زمینه به پرسش‌های کاربران.

  • اقتصادی بودن زیرا نسبت به تنظیم دقیق یک LLM هزینه کمتری دارد.

ایجاد پایگاه دانش

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

پایگاه‌های داده برداری

یک پایگاه داده برداری برخلاف پایگاه داده‌های سنتی، یک پایگاه تخصصی برای ذخیره، مدیریت و جستجوی بردارهای جاسازی شده است. این پایگاه نمایش‌های عددی اسناد را ذخیره می‌کند. شکستن داده به جاسازی‌های عددی باعث می‌شود سیستم AI ما داده را بهتر درک و پردازش کند.

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

برخی پایگاه‌های داده برداری محبوب شامل Azure Cosmos DB، Clarifyai، Pinecone، Chromadb، ScaNN، Qdrant و DeepLake هستند. شما می‌توانید یک مدل Azure Cosmos DB را با استفاده از Azure CLI با دستور زیر ایجاد کنید:

az login
az group create -n <resource-group-name> -l <location>
az cosmosdb create -n <cosmos-db-name> -r <resource-group-name>
az cosmosdb list-keys -n <cosmos-db-name> -g <resource-group-name>

از متن به جاسازی‌ها

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

def split_text(text, max_length, min_length):
    words = text.split()
    chunks = []
    current_chunk = []

    for word in words:
        current_chunk.append(word)
        if len(' '.join(current_chunk)) < max_length and len(' '.join(current_chunk)) > min_length:
            chunks.append(' '.join(current_chunk))
            current_chunk = []

    # اگر بخش آخر به حداقل طول نرسید، به هر حال آن را اضافه کن
    if current_chunk:
        chunks.append(' '.join(current_chunk))

    return chunks

وقتی بخش‌بندی انجام شد، سپس می‌توانیم متن خود را با مدل‌های مختلف جاسازی کنیم. برخی مدل‌ها عبارتند از: word2vec، ada-002 از OpenAI، Azure Computer Vision و بسیاری دیگر. انتخاب مدل به زبان‌های استفاده‌شده، نوع محتوای کدگذاری‌شده (متن/تصویر/صدا)، اندازه ورودی قابل رمزگذاری و طول خروجی جاسازی بستگی دارد.

نمونه‌ای از متن جاسازی‌شده با مدل text-embedding-ada-002 از OpenAI به این صورت است: یک جاسازی از کلمه cat

بازیابی و جستجوی برداری

وقتی کاربر پرسشی می‌کند، بازیاب آن را توسط انکودر پرسش به بردار تبدیل می‌کند، سپس با جستجو در شاخص جستجوی سند ما، بردارهای مرتبط را در اسناد پیدا می‌کند که به ورودی مرتبط هستند. سپس هر دو بردار ورودی و اسناد به متن تبدیل شده و از طریق LLM ارسال می‌شوند.

بازیابی

بازیابی وقتی صورت می‌گیرد که سیستم می‌کوشد سریعاً اسنادی را از شاخص پیدا کند که معیارهای جستجو را برآورده کنند. هدف بازیاب گرفتن اسنادی است که به عنوان زمینه و پایه برای LLM بر روی داده‌های شما استفاده شود.

روش‌های مختلفی برای جستجو در پایگاه داده وجود دارد مانند:

  • جستجوی کلمه کلیدی - برای جستجوی متنی استفاده می‌شود.

  • جستجوی برداری - اسناد را از متن به نمایش برداری با استفاده از مدل‌های جاسازی تبدیل می‌کند و اجازه جستجوی معنایی با مفهوم کلمات را می‌دهد. بازیابی با پرسش اسنادی انجام می‌شود که بردارهایشان به سؤال کاربر نزدیک‌تر است.

  • ترکیبی - ترکیبی از جستجوی کلمه کلیدی و برداری.

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

شباهت برداری

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

ما می‌توانیم از جایگزین‌های دیگر اندازه‌گیری تشابه مانند فاصله اقلیدسی که خط مستقیم بین نقاط برداری است و ضرب داخلی که حاصل جمع حاصل‌ضرب‌های اعضای متناظر دو بردار است، استفاده کنیم.

شاخص جستجو

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

from sklearn.neighbors import NearestNeighbors

embeddings = flattened_df['embeddings'].to_list()

# ایجاد نمایه جستجو
nbrs = NearestNeighbors(n_neighbors=5, algorithm='ball_tree').fit(embeddings)

# برای پرس و جو از نمایه، می‌توانید از متد kneighbors استفاده کنید
distances, indices = nbrs.kneighbors(embeddings)

رتبه‌بندی مجدد

وقتی پایگاه داده را پرس‌وجو کردید، ممکن است نیاز باشد نتایج را از مرتبط‌ترین مرتب کنید. LLM برای رتبه‌بندی مجدد با استفاده از یادگیری ماشین به بهبود مرتبط بودن نتایج جستجو کمک می‌کند. با استفاده از Azure AI Search، رتبه‌بندی مجدد به طور خودکار با رتبه‌دهنده معنایی انجام می‌شود. مثالی از نحوه کار رتبه‌بندی مجدد با استفاده از نزدیک‌ترین همسایه‌ها:

# یافتن مشابه‌ترین اسناد
distances, indices = nbrs.kneighbors([query_vector])

index = []
# چاپ مشابه‌ترین اسناد
for i in range(3):
    index = indices[0][i]
    for index in indices[0]:
        print(flattened_df['chunks'].iloc[index])
        print(flattened_df['path'].iloc[index])
        print(flattened_df['distances'].iloc[index])
    else:
        print(f"Index {index} not found in DataFrame")

همه چیز را کنار هم آوردن

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

user_input = "what is a perceptron?"

def chatbot(user_input):
    # سوال را به یک بردار پرس‌وجو تبدیل کنید
    query_vector = create_embeddings(user_input)

    # بیشترین اسناد مشابه را پیدا کنید
    distances, indices = nbrs.kneighbors([query_vector])

    # اسناد را به پرس‌وجو اضافه کنید تا زمینه فراهم شود
    history = []
    for index in indices[0]:
        history.append(flattened_df['chunks'].iloc[index])

    # تاریخچه و ورودی کاربر را ترکیب کنید
    history.append(user_input)

    # یک شیء پیام ایجاد کنید
    messages=[
        {"role": "system", "content": "You are an AI assistant that helps with AI questions."},
        {"role": "user", "content": "\n\n".join(history) }
    ]

    # از تکمیل چت برای تولید پاسخ استفاده کنید
    response = openai.chat.completions.create(
        model="gpt-4",
        temperature=0.7,
        max_tokens=800,
        messages=messages
    )

    return response.choices[0].message

chatbot(user_input)

ارزیابی برنامه ما

معیارهای ارزیابی

  • کیفیت پاسخ‌ها: اطمینان از طبیعی، روان و انسانی‌بودن پاسخ

  • پایه‌گذاری داده‌ها: ارزیابی این که آیا پاسخ از مستندات ارائه شده گرفته شده است

  • مرتبط بودن: ارزیابی تطابق و ارتباط پاسخ با سؤال پرسیده شده

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

موارد استفاده از RAG (تولید تقویت‌شده با بازیابی) و پایگاه‌های داده برداری

موارد استفاده متعددی وجود دارد که فراخوانی عملکرد می‌تواند برنامه شما را بهبود دهد مانند:

  • پرسش و پاسخ: پایه‌گذاری داده‌های شرکت خود روی چتی که کارمندان بتوانند سوال بپرسند.

  • سیستم‌های توصیه‌گر: جایی که سیستمی ایجاد می‌کنید که بیشترین موارد مشابه را تطبیق دهد، مثلاً فیلم‌ها، رستوران‌ها و بسیاری موارد دیگر.

  • خدمات چت‌بات: می‌توانید تاریخچه گفتگو را ذخیره و مکالمه را بر اساس داده‌های کاربر شخصی‌سازی کنید.

  • جستجوی تصویر بر اساس جاسازی‌های برداری؛ مفید در شناسایی تصویر و تشخیص ناهنجاری.

خلاصه

ما بخش‌های بنیادی RAG را از افزودن داده تا پرسش کاربر و خروجی پوشش دادیم. برای ساده‌سازی ایجاد RAG، می‌توانید از فریمورک‌هایی مثل Semantic Kernel، Langchain یا Autogen استفاده کنید.

تمرین

برای ادامه یادگیری تولید تقویت‌شده با بازیابی (RAG) می‌توانید:

  • یک فرانت‌اند برای برنامه با فریمورک مورد علاقه خود بسازید.

  • از یک فریمورک مانند LangChain یا Semantic Kernel استفاده کرده و برنامه خود را بازسازی کنید.

تبریک به خاطر اتمام این درس 👏.

یادگیری اینجا متوقف نمی‌شود، مسیر را ادامه دهید

پس از اتمام این درس، مجموعه یادگیری هوش مصنوعی مولد را بررسی کنید تا دانش خود در زمینه هوش مصنوعی مولد را ارتقا دهید!


سلب مسؤولیت:
این سند با استفاده از سرویس ترجمه ماشینی Co-op Translator ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است حاوی اشتباهات یا نواقص باشند. سند اصلی به زبان بومی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس و حیاتی، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما مسئول هیچ‌گونه سوءتفاهم یا تفسیر نادرستی که ناشی از استفاده از این ترجمه باشد، نیستیم.