اولین سیستم RAG خود را با Python و Openai بسازید

سلام! آیا شما علاقه مند به ساخت سیستم پارچه خود (بازیابی نسل تقویت شده) هستید؟ در این پست ، من به شما نشان خواهم داد که چگونه یک قدم به قدم با استفاده از پایتون و OpenAi ایجاد کنید. RAG با یافتن اطلاعات مربوط به اسناد شما قبل از ایجاد پاسخ ، به AI کمک می کند. این مانند این است که قبل از پاسخ دادن به هوش مصنوعی “مطالعه” کنید!
فهرست مطالب
آنچه یاد خواهید گرفت
در این آموزش ، شما یاد می گیرید که چگونه:
- یک پروژه RAG را از ابتدا تنظیم کنید
- پردازش و تهیه اسناد برای RAG
- از تعبیه OpenAi استفاده کنید
- یک سیستم بازیابی ساده ایجاد کنید
- همه چیز را با API Openai وصل کنید
تنظیم پروژه
ابتدا بیایید به ساختار پوشه خود نگاه کنیم:
rag-project/
│
├── src/
│ ├── __init__.py
│ ├── document_loader.py
│ ├── text_processor.py
│ ├── embeddings_manager.py
│ ├── retrieval_system.py
│ └── rag_system.py
│
├── data/
│ └── documents/
│
├── requirements.txt
├── test.py
├── README.md
└── .env
مرحله 1: تنظیم محیط
ابتدا بیایید محیط مجازی خود را ایجاد کنیم و بسته های مورد نیاز را نصب کنیم:
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install openai python-dotenv numpy pandas
ایجاد a requirements.txt
پرونده:
openai==1.12.0
python-dotenv==1.0.0
numpy==1.24.3
pandas==2.1.0
خود را تنظیم کنید .env
پرونده:
OPENAI_API_KEY=your_api_key_here
مرحله 2: بارگیری سند
ایجاد کردن src/document_loader.py
:
import os
from typing import List
class DocumentLoader:
def __init__(self, documents_path: str):
self.documents_path = documents_path
def load_documents(self) -> List[str]:
documents = []
for filename in os.listdir(self.documents_path):
if filename.endswith('.txt'):
with open(os.path.join(self.documents_path, filename), 'r') as file:
documents.append(file.read())
return documents
مرحله 3: پردازش متن
ایجاد کردن src/text_processor.py
:
from typing import List
class TextProcessor:
def __init__(self, chunk_size: int = 1000):
self.chunk_size = chunk_size
def split_into_chunks(self, text: str) -> List[str]:
words = text.split()
chunks = []
current_chunk = []
current_size = 0
for word in words:
if current_size + len(word) > self.chunk_size:
chunks.append(' '.join(current_chunk))
current_chunk = [word]
current_size = len(word)
else:
current_chunk.append(word)
current_size += len(word) + 1
if current_chunk:
chunks.append(' '.join(current_chunk))
return chunks
مرحله 4: ایجاد تعبیه
ایجاد کردن src/embeddings_manager.py
:
from typing import List
import openai
import numpy as np
class EmbeddingsManager:
def __init__(self, api_key: str):
openai.api_key = api_key
def create_embeddings(self, texts: List[str]) -> List[np.ndarray]:
embeddings = []
for text in texts:
response = openai.embeddings.create(
model="text-embedding-ada-002",
input=text
)
embeddings.append(np.array(response.data[0].embedding))
return embeddings
مرحله 5: ساخت سیستم بازیابی
ایجاد کردن src/retrieval_system.py
:
import numpy as np
from typing import List, Tuple
class RetrievalSystem:
def __init__(self, chunks: List[str], embeddings: List[np.ndarray]):
self.chunks = chunks
self.embeddings = embeddings
def find_similar_chunks(self, query_embedding: np.ndarray, top_k: int = 3) -> List[Tuple[str, float]]:
similarities = []
for i, embedding in enumerate(self.embeddings):
similarity = np.dot(query_embedding, embedding) / (
np.linalg.norm(query_embedding) * np.linalg.norm(embedding)
)
similarities.append((self.chunks[i], similarity))
return sorted(similarities, key=lambda x: x[1], reverse=True)[:top_k]
مرحله ششم: اتصال با OpenAi
ایجاد کردن src/rag_system.py
:
import os
from dotenv import load_dotenv
from typing import List
import openai
from .document_loader import DocumentLoader
from .text_processor import TextProcessor
from .embeddings_manager import EmbeddingsManager
from .retrieval_system import RetrievalSystem
class RAGSystem:
def __init__(self):
load_dotenv()
self.api_key = os.getenv('OPENAI_API_KEY')
self.loader = DocumentLoader('data/documents')
self.processor = TextProcessor()
self.embeddings_manager = EmbeddingsManager(self.api_key)
# Initialize system
self.initialize_system()
def initialize_system(self):
# Load and process documents
documents = self.loader.load_documents()
self.chunks = []
for doc in documents:
self.chunks.extend(self.processor.split_into_chunks(doc))
# Create embeddings
self.embeddings = self.embeddings_manager.create_embeddings(self.chunks)
# Initialize retrieval system
self.retrieval_system = RetrievalSystem(self.chunks, self.embeddings)
def answer_question(self, question: str) -> str:
# Get question embedding
question_embedding = self.embeddings_manager.create_embeddings([question])[0]
# Get relevant chunks
relevant_chunks = self.retrieval_system.find_similar_chunks(question_embedding)
# Prepare context
context = "\n".join([chunk[0] for chunk in relevant_chunks])
# Create prompt
prompt = f"""Context: {context}\n\nQuestion: {question}\n\nAnswer:"""
# Get response from OpenAI
response = openai.chat.completions.create(
model="gpt-4-turbo-preview",
messages=[
{"role": "system", "content": "You are a helpful assistant. Use the provided context to answer the question."},
{"role": "user", "content": prompt}
]
)
return response.choices[0].message.content
مرحله 7: قرار دادن همه اینها
در اینجا نحوه استفاده از سیستم آورده شده است:
برخی از اسناد تست را به خود اضافه کنید data/documents
پوشه:
story.txt
سپس یک تست را اجرا کنید:
# test.py
from src.rag_system import RAGSystem
# Initialize the RAG system
rag = RAGSystem()
# Ask a question
question = "What was the answer to the guardian’s riddle, and how did it help Kai?"
answer = rag.answer_question(question)
print(answer)
پایان
تبریک می گویم! شما یک سیستم RAG اساسی ایجاد کرده اید که می تواند:
- اسناد بارگیری و پردازش
- با استفاده از OpenAi تعبیه کنید
- با استفاده از جستجوی شباهت ، اطلاعات مربوطه را پیدا کنید
- با استفاده از متن پاسخ ها را ایجاد کنید
این فقط آغاز است – شما می توانید این سیستم را توسط:
- افزودن روشهای بهتر متن متن
- اجرای انبارها برای تعبیه
- اضافه کردن خطای
- بهبود مهندسی سریع
- افزودن پشتیبانی از پایگاه داده بردار
مخزن جیتاب
می توانید کد کامل این پروژه را در Github: Python Rag System پیدا کنید.
به یاد داشته باشید که کلید API خود را ایمن نگه دارید و استفاده از API خود را کنترل کنید!
برنامه نویسی مبارک!