ساخت پایپ لاین RAG در یک قدم بسیار ساده + نمونه کد واقعی

ساخت پایپ لاین RAG در یک قدم بسیار ساده + نمونه کد واقعی

نوشته شده توسط: نگین فاتحی
تاریخ انتشار: ۰۱ آبان ۱۴۰۳
آخرین بروزرسانی: 01 آبان 1403
زمان مطالعه: 4 دقیقه
۳
(۲)

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

خیر. کلید این قفل به‌دست “Pipeline” در تکنیک RAG است. پایپ‌لاین روشی برای ارائه دانش خاص به مدل‌های هوش مصنوعی مولد است؛ دانشی که آن‌ها درحال‌حاضر ندارند. در این مقاله، نحوه ساخت یک فایل PDF از سوالات متداول کاربران را به‌همراه کد آن نشان خواهیم داد.

RAG چیست؟

مدل‌های هوش مصنوعی بر پایه زبان بزرگ (LLM) بسیار توان‌مند هستند؛ اما با مسائل متعددی مانند ایجاد محتوای نادرست و نامربوط (هذیان‌گویی) و عدم شفافیت در نحوه عملکرد مواجه می‌شوند. Retrieval-Augmented Generation (RAG) تکنیکی برای حل این مشکلات با تقویت دانش LLM است. این فرآیند با ارائه داده‌های خاص به مدل، دامنه پاسخ‌گویی آن را افزایش می‌دهد.

یکی از کاربردهای کلیدی مدل‌های مبتنی‌بر LLM در ربات‌های پرسش‌وپاسخ پیشرفته (Q&A) است. برای ایجاد این ربات لازم است که دانش مدل‌های LLM را با داده‌های خاص مورد نیاز گسترش داد.  

 

دوره آموزش Vector Database [با رویکرد تصویر و متون فارسی] نیک آموز

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

مبانی پایپ‌لاین در RAG

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

 

مبانی پایپ‌لاین در RAG

 

یک پایپ‌لاین RAG در دو فاز اصلی فرآیند را اجرا می‌کند:

  1. فرآیند ایندکس کردن داده‌ ها

این بخش شامل مراحل زیر می‌شود:

  • بارگذاری داده‌ها: اولین مرحله که در آن، تمام اسناد یا اطلاعات مورد استفاده وارد مدل می‌شوند؛
  • تقسیم داده‌ها: اسناد بزرگ به قطعات کوچک‌تر تقسیم می‌شوند؛ به‌عنوان مثال، بخش‌هایی که هرکدام حداکثر ۵۰۰ کاراکتر دارند؛
  • جاسازی داده‌ها: داده‌ها با استفاده از یک مدل جاسازی (Embedding Model)، به‌شکل برداری تبدیل می‌شوند تا برای سیستم‌های کامپیوتری قابل درک باشند؛
  • ذخیره‌سازی داده‌ها: این جاسازی‌های برداری در یک پایگاه داده برداری (Vector Database) ذخیره می‌شوند. بنابراین جست‌وجوی هر فیلد آسان خواهد بود.
  1. فرآیند بازیابی و تولید

فرآیند بازیابی “Retrieval” و فرآیند تولید “Generation” نام دارد. در ادامه، ابتدا به تشریح مراحل Retrieval خواهیم پرداخت.

بازیابی: وقتی کاربر سوالی می‌پرسد:

  • ابتدا ورودی او با استفاده از همان مدل تعبیه‌شده از مرحله ایندکس کردن داده، به یک بردار (بردار کوئری) تبدیل می‌شود؛
  • سپس این بردار کوئری با همه بردارهای Vector Database مطابقت داده می‌شود. هدف از این تطابق، پیدا کردن مشابه‌ترین بردارهایی است که احتمال می‌رود حاوی پاسخ سوال کاربر باشند. به‌طور مثال، استفاده از متریک فاصله Euclidean می‌تواند فرآیند را به نتیجه مورد نظر برساند. این مرحله تلاش دارد تا بخش‌هایی از دانش مدل که با پرسش کاربر مرتبط هستند را شناسایی کند.

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

ساخت یک پایپ‌لاین ساده برای سوالات متداول کاربران

ساخت یک پایپ‌لاین ابتدایی RAG، با نوشتن چند خط کد ممکن است. برای این کار،  از چهار مورد استفاده می‌کنیم:

  1. Langchain
  2. OpenAI Embeddings
  3. Chroma Vector Database
  4. OpenAI LLM

 “Langchain” کتاب‌خانه‌ای محبوب در پایتون است که برای ساخت برنامه‌های سفارشی RAG استفاده می‌شود. کتاب‌خانه پرطرفدار دیگر برای همین هدف، “LlamaIndex” است.

برای ساخت یک سند PDF که حاوی سوالات متداول کاربران است، کدهای زیر را در پایتون نوشته و آن‌ها را اجرا کنید.

 

# import libraries
import os
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') # add your OpenAI API Key
# for this example I used Alphabet Inc 10-K Report 2022 
# https://www.sec.gov/Archives/edgar/data/1652044/000165204423000016/goog-20221231.htm
DOC_PATH = "../alphabet_10K_2022.pdf"
CHROMA_PATH = "your_db_name" 
# ----- Data Indexing Process -----
# load your pdf doc
loader = PyPDFLoader(DOC_PATH)
pages = loader.load()
# split the doc into smaller chunks i.e. chunk_size=500
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(pages)
# get OpenAI Embedding model
embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY)
# embed the chunks as vectors and load them into the database
db_chroma = Chroma.from_documents(chunks, embeddings, persist_directory=CHROMA_PATH)
# ----- Retrieval and Generation Process -----
# this is an example of a user question (query)
query = 'what are the top risks mentioned in the document?'
# retrieve context - top 5 most relevant (closests) chunks to the query vector 
# (by default Langchain is using cosine distance metric)
docs_chroma = db_chroma.similarity_search_with_score(query, k=5)
# generate an answer based on given user query and retrieved context information
context_text = "\n\n".join([doc.page_content for doc, _score in docs_chroma])
# you can use a prompt template
PROMPT_TEMPLATE = """
Answer the question based only on the following context:
{context}
Answer the question based on the above context: {question}.
Provide a detailed answer.
Don’t justify your answers.
Don’t give information not mentioned in the CONTEXT INFORMATION.
Do not say "according to the context" or "mentioned in the context" or similar.
"""
# load retrieved context and user query in the prompt template
prompt_template = ChatPromptTemplate.from_template(PROMPT_TEMPLATE)
prompt = prompt_template.format(context=context_text, question=query)
# call LLM model to generate the answer based on the given context and query
model = ChatOpenAI()
response_text = model.predict(prompt)
"""
Generated response:
The top risks mentioned in the provided context are:
۱. Decline in the value of investments
۲. Lack of adoption of products and services
۳. Interference or interruption from various factors such as modifications, terrorist attacks, natural disasters, etc.
۴. Compromised trade secrets and legal and financial risks
۵. Reputational, financial, and regulatory exposure
۶. Abuse of platforms and misuse of user data
۷. Errors or vulnerabilities leading to service interruptions or failure
۸. Risks associated with international operations.
"""

 

آنچه در ساخت پایپ لاین در RAG خواندیم

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

 

چه رتبه ای می‌دهید؟

میانگین ۳ / ۵. از مجموع ۲

اولین نفر باش

گوش به زنگ یلدا
title sign
معرفی نویسنده
نگین فاتحی
مقالات
35 مقاله توسط این نویسنده
محصولات
0 دوره توسط این نویسنده
نگین فاتحی

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

title sign
دیدگاه کاربران

close-image