22 lutego, 2025

„Jak Zbudować System Retrieval-Augmented Generation (RAG) z DeepSeek R1: Praktyczny Przewodnik Krok po Kroku”

Wprowadzenie do DeepSeek R1 i Systemu Retrieval-Augmented Generation (RAG)

W społeczności sztucznej inteligencji pojawiły się ekscytujące wieści o premierze modelu DeepSeek R1. To open-source’owe rozwiązanie oferuje wyjątkowe osiągi, które w wielu przypadkach dorównują komercyjnym modelom uznawanym za najnowocześniejsze. W związku z tym wiele osób jest zainteresowanych jego możliwościami i zastosowaniami. W tym artykule przedstawimy krok po kroku, jak wdrożyć system Retrieval-Augmented Generation (RAG) przy użyciu DeepSeek R1, od przygotowania środowiska po zapytania użytkownika. Wszystko to z wykorzystaniem kodu i prostych wyjaśnień.

Na czym polega RAG?

System Retrieval-Augmented Generation (RAG) łączy zalety podejść opartych na wyszukiwaniu informacji ze zdolnością generowania odpowiedzi. W praktyce oznacza to, że najpierw wyszukuje on odpowiednie informacje w bazie wiedzy, a następnie generuje na ich podstawie dokładne i kontekstowe odpowiedzi na zapytania użytkownika. To podejście znacząco zwiększa precyzję i użyteczność systemów opartych na sztucznej inteligencji.

Wymagania wstępne

Aby móc uruchomić kod przedstawiony w tym artykule, upewnij się, że masz:

– Zainstalowany Python (najlepiej w wersji 3.7 lub nowszej).
– Zainstalowany framework Ollama, który umożliwia lokalne uruchamianie modeli takich jak DeepSeek R1.

Wdrożenie krok po kroku

Krok 1: Instalacja Ollama

Pierwszym krokiem jest instalacja Ollama. Instrukcje znajdziesz na oficjalnej stronie projektu. Po zainstalowaniu możesz zweryfikować poprawność instalacji, wpisując w terminalu polecenie:

bash
ollama --version

Krok 2: Uruchomienie modelu DeepSeek R1

Aby rozpocząć pracę z modelem, otwórz terminal i wykonaj poniższe polecenie:

bash
ollama run deepseek-r1:1.5b

Komenda ta uruchamia wersję modelu o 1,5 miliarda parametrów, która jest odpowiednia dla wielu zastosowań.

Przygotowanie bazy wiedzy

System RAG wymaga bazy wiedzy, z której będzie mógł pobierać informacje. Może to być kolekcja dokumentów, artykułów lub innych danych tekstowych związanych z Twoją dziedziną.

3.1 Ładowanie dokumentów

Możesz załadować dokumenty z różnych źródeł, takich jak pliki tekstowe, bazy danych czy scraping stron internetowych. Przykład ładowania plików tekstowych wygląda następująco:

python
import os

def load_documents(directory):
    documents = []
    for filename in os.listdir(directory):
        if filename.endswith('.txt'):
            with open(os.path.join(directory, filename), 'r') as file:
                documents.append(file.read())
    return documents

documents = load_documents('sciezka/do/twoich/dokumentow')

Tworzenie wektorowej bazy danych

Aby umożliwić efektywne wyszukiwanie dokumentów, warto skorzystać z narzędzi takich jak FAISS (Facebook AI Similarity Search). Proces ten wymaga wygenerowania tzw. embeddingów dla dokumentów.

4.1 Instalacja wymaganych bibliotek

Najpierw zainstaluj niezbędne biblioteki:

bash
pip install faiss-cpu huggingface-hub

4.2 Generowanie embeddingów i konfiguracja FAISS

Kolejnym krokiem jest wygenerowanie embeddingów i skonfigurowanie indeksu FAISS:

python
from huggingface_hub import HuggingFaceEmbeddings
import faiss
import numpy as np

# Inicjalizacja modelu embeddingów
embeddings_model = HuggingFaceEmbeddings()

# Generowanie embeddingów dla dokumentów
document_embeddings = [embeddings_model.embed(doc) for doc in documents]
document_embeddings = np.array(document_embeddings).astype('float32')

# Tworzenie indeksu FAISS
index = faiss.IndexFlatL2(document_embeddings.shape[1])  # Metryka odległości L2
index.add(document_embeddings)  # Dodanie embeddingów do indeksu

Konfiguracja systemu wyszukiwania

5.1 Tworzenie retrievera

Retriever odpowiada za pobieranie najbardziej trafnych dokumentów na podstawie zapytań użytkownika. Poniżej znajduje się przykład jego implementacji:

python
class SimpleRetriever:
    def __init__(self, index, embeddings_model):
        self.index = index
        self.embeddings_model = embeddings_model
    
    def retrieve(self, query, k=3):
        query_embedding = self.embeddings_model.embed(query)
        distances, indices = self.index.search(np.array([query_embedding]).astype('float32'), k)
        return [documents[i] for i in indices[0]]

retriever = SimpleRetriever(index, embeddings_model)

Konfiguracja modelu DeepSeek R1 dla RAG

Aby model mógł generować odpowiedzi na podstawie kontekstu, należy skonfigurować odpowiedni szablon promptów:

python
from ollama import Ollama
from string import Template

# Inicjalizacja modelu
llm = Ollama(model="deepseek-r1:1.5b")

# Szablon prompta
prompt_template = Template("""
Use ONLY the context below.
If unsure, say "I don't know".
Keep answers under 4 sentences.

Context: $context
Question: $question
Answer:
""")

Obsługa zapytań użytkownika

Na tym etapie można zaimplementować funkcję, która integruje wyszukiwanie i generowanie odpowiedzi:

python
def answer_query(question):
    # Pobieranie kontekstu z bazy wiedzy
    context = retriever.retrieve(question)
    
    # Łączenie pobranych kontekstów
    combined_context = "n".join(context)
    
    # Generowanie odpowiedzi przy użyciu DeepSeek R1
    response = llm.generate(prompt_template.substitute(context=combined_context, question=question))
    
    return response.strip()

Testowanie systemu RAG

Aby przetestować swój system, wystarczy wywołać funkcję answer_query z dowolnym pytaniem:

python
if __name__ == "__main__":
    user_question = "Jakie są kluczowe cechy modelu DeepSeek R1?"
    answer = answer_query(user_question)
    print("Odpowiedź:", answer)

Podsumowanie

Dzięki opisanym krokom możesz z powodzeniem wdrożyć system Retrieval-Augmented Generation (RAG) z wykorzystaniem modelu DeepSeek R1. Taka konfiguracja pozwala skutecznie wyszukiwać informacje w Twojej bazie wiedzy i generować na ich podstawie precyzyjne odpowiedzi. Model DeepSeek R1 może być dostosowany do różnych zastosowań – od analizy danych po obsługę klienta. Zachęcamy do eksperymentowania z jego możliwościami i dostosowywania go do swoich potrzeb.