برنامه نویسی

اولین سیستم 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 خود را کنترل کنید!

برنامه نویسی مبارک! 🚀

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا