هوش مصنوعی به سرعت در حال تحول است، اما مدلهای زبانی بزرگ (LLMs) همچنان از یک محدودیت حیاتی رنج میبرند: آنها تنها به آنچه آموزش دیدهاند آگاه هستند. این موضوع شکاف قابل توجهی هنگام کار با دادههای اختصاصی، رویدادهای اخیر یا دانش تخصصی ایجاد میکند. تولید تقویتشده با بازیابی (RAG) این شکاف را با امکان بازیابی اطلاعات مرتبط از منابع خارجی پیش از تولید پاسخ پر میکند. در این راهنما، نحوه ساخت یک پایپلاین RAG قدرتمند با استفاده از LangChain و پایگاههای داده برداری را بررسی خواهیم کرد.
درک معماری RAG
در هسته خود، یک سیستم RAG از دو فاز اصلی تشکیل شده است: نمایهسازی (Indexing) و بازیابی (Retrieval). در فاز نمایهسازی، شما دادههای ساختارنیافته (مانند فایلهای PDF، فایلهای مارکداون یا رکوردهای پایگاه داده) را وارد کرده و آنها را به نمایشهای عددی به نام امبدینگ (Embeddings) تبدیل میکنید. این امبدینگها در یک پایگاه داده برداری ذخیره میشوند که امکان جستجوی شباهت را فراهم میکند. در فاز بازیابی، زمانی که کاربر سوالی میپرسد، سیستم پرسوجو را به یک امبدینگ تبدیل کرده، مشابهترین اسناد را در پایگاه داده پیدا میکند و آن اسناد را به عنوان زمینه (Context) به LLM میدهد تا پاسخی دقیق و مستند تولید کند.
راهاندازی محیط
قبل از ورود به کدنویسی، مطمئن شوید که پایتون نصب شده است. ما به چند کتابخانه کلیدی نیاز داریم: langchain برای چارچوب ارکستراسیون، langchain-community برای یکپارچهسازیهای خاص و یک فروشگاه برداری. برای این مثال، ما از faiss-cpu برای ذخیرهسازی محلی استفاده میکنیم، اگرچه محیطهای تولید اغلب از Pinecone، Weaviate یا Elasticsearch استفاده میکنند.
وابستگیها را با استفاده از pip نصب کنید:
pip install langchain langchain-community langchain-openai faiss-cpython python-dotenv
یک فایل .env ایجاد کنید تا کلید API اوپنایآی خود را به صورت امن ذخیره کنید:
OPENAI_API_KEY=your_api_key_here
گام ۱: بارگذاری و تکهتکه کردن اسناد
LLMs محدودیتهای پنجره زمینه (Context Window) دارند، بنابراین باید اسناد خود را به قطعات کوچکتر تقسیم کنیم. ما از RecursiveCharacterTextSplitter برای شکستن متن به قطعات قابل مدیریت استفاده خواهیم کرد، به طوری که معنای معنایی حفظ شود.
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import PyPDFLoader
# بارگذاری اسناد
loader = PyPDFLoader("example.pdf")
documents = loader.load()
# تقسیم به قطعات
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)
گام ۲: امبدینگها و ذخیرهسازی برداری
در مرحله بعد، ما نیاز داریم این قطعات متنی را به بردارها تبدیل کنیم. ما از مدل امبدینگ اوپنایآی و یک فروشگاه برداری FAISS استفاده خواهیم کرد. این مرحله «حافظه» چتبات ما را ایجاد میکند.
from langchain.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(chunks, embeddings)
گام ۳: ساخت بازیاب و زنجیره
اکنون نحوه بازیابی اطلاعات توسط چتبات را تعریف میکنیم. ما یک بازیاب از فروشگاه برداری خود ایجاد کرده و آن را با یک LLM ترکیب میکنیم تا زنجیره نهایی را تشکیل دهیم. اینجاست که بخش «تولید» در RAG رخ میدهد. LLM زمینه بازیابی شده و سوال کاربر را دریافت میکند تا پاسخی را فرمولبندی کند.
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
# ایجاد زنجیره پرسش و پاسخ بازیابی
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
گام ۴: تعامل با چتبات
در نهایت، میتوانیم سیستم RAG خود را پرسوجو کنیم. زمانی که کاربر سوالی میپرسد، سیستم قطعات مرتبط را از PDF بازیابی میکند، آنها را به LLM میدهد و پاسخی را که کاملاً بر اساس متن ارائه شده است، باز میگرداند.
query = "What are the main findings in the document?"
result = qa_chain.invoke({"query": query})
print(result["result"])
نتیجهگیری
ساخت یک چتبات مبتنی بر RAG، LLMهای ایستا را به دستیاران پویا و آگاه از دانش تبدیل میکند. با بهرهگیری از پایگاههای داده برداری و LangChain، توسعهدهندگان میتوانند برنامههایی ایجاد کنند که نه تنها هوشمند، بلکه دقیق و بهروز باشند. اگرچه این مثال از FAISS و PDFهای محلی استفاده میکند، همان اصول برای انبارهای داده در مقیاس سازمانی و پایگاههای داده بلادرنگ نیز صدق میکند. در حالی که پیادهسازی خود را بهبود میبخشید، در نظر بگیرید که با مدلهای امبدینگ مختلف، استراتژیهای تکهتکه کردن و تکنیکهای بازیابی آزمایش کنید تا عملکرد را برای مورد استفاده خاص خود بهینه کنید.