Projekt implementujący Retrieval Augmented Generation (RAG) z lokalną bazą wektorową, embeddingami oraz modelami LLM działającymi w całości offline.
System umożliwia zadawanie pytań dotyczących dokumentów akademicznych (PDF, TXT) z odpowiedziami generowanymi przez lokalne modele sztucznej inteligencji. Projekt zawiera:
✅ Baza wektorowa (ChromaDB) - przechowywanie i wyszukiwanie dokumentów
✅ Embeddingi (sentence-transformers) - reprezentacja semantyczna tekstu
✅ Modele LLM (GGUF format) - generowanie odpowiedzi
✅ Benchmarking - porównanie wydajności różnych modeli
✅ Przetwarzanie dokumentów - PDFy i pliki tekstowe
baza_wektorowa/
├── lokalnie/ # Główny kod aplikacji
│ ├── main_lokalnie.py # Punkt wejścia
│ ├── database.py # Operacje na ChromaDB
│ ├── embedding.py # Model embeddingowy
│ ├── ask_rag.py # Logika RAG
│ ├── ask_rag__from_json_.py # Benchmark modeli z JSON
│ ├── chunks.py # Chunkowanie dokumentów
│ ├── advanced_rag.py # Zaawansowane funkcje RAG
│ ├── modele.json # Konfiguracja modeli LLM
│ ├── dostrajanie/ # Moduł do fine-tuningu
│ └── __pycache__/ # Cache Pythona
│
├── RAG_TEST/ # Testy i eksperymenty
│ ├── RAG.ipynb # Notebook z testami
│ ├── bazawektorowa_pdf/ # ChromaDB - baza wektorowa
│ └── modele.json # Testowa konfiguracja
│
├── dokumenty/ # Dokumenty źródłowe
│ ├── pdfy/ # Pliki PDF
│ │ ├── 1.pdf
│ │ ├── 2.pdf
│ │ └── 3.pdf
│ └── txt/ # Pliki tekstowe
│ ├── 1.txt
│ ├── 2.txt
│ └── 3.txt
│
├── testy.ipynb # Notebook z testami
├── requirements.txt # Zależności Pythona
└── README.md # Ten plik
pip install -r requirements.txt
langchain - framework RAGchromadb - baza wektorowasentence-transformers - embeddingillama-cpp-python - obsługa modeli GGUFpypdf - przetwarzanie PDFcd lokalnie
pip install -r ../requirements.txt
sentence-transformers/all-mpnet-base-v2 (~786 MB)Modele GGUF są pobierane automatycznie z HuggingFace podczas pierwszego użycia.
Konfiguracja w modele.json:
| Model | Rozmiar | Wydajność | Dokładność |
|---|---|---|---|
| Gemma 2 9B | ~5.5 GB | Średnia | Wysoka |
| Qwen 2.5 1.5B | ~1.2 GB | Wysoka | Średnia |
| Llama 3.2 1B | ~1 GB | Wysoka | Średnia |
| Phi 3.5 Mini | ~2.3 GB | Wysoka | Wysoka |
Zaleta: Modele pobierane są tylko raz i cache'owane lokalnie. Nieznacząca objętość repozytorium!
# Uruchomienie głównej aplikacji
python main_lokalnie.py
# Uruchomienie notebooka Jupyter
jupyter notebook RAG_TEST/RAG.ipynb
database.py - Zarządzanie ChromaDBfrom database import (
init_chroma, # Inicjalizacja bazy
load_vectorstore, # Załadowanie wektorów
load_pdf_documents, # Ładowanie PDF
index_documents_in_batches # Indeksowanie
)
Funkcje:
init_chroma() - Tworzenie/połączenie z ChromaDBcheck_collection_exists() - Sprawdzenie kolekcjiload_pdf_documents() - Wczytanie dokumentówindex_documents_in_batches() - Indeksowanie z batchamiembedding.py - Modele Embeddingowefrom embedding import get_embeddings
embeddings = get_embeddings() # all-mpnet-base-v2
Model: sentence-transformers/all-mpnet-base-v2
chunks.py - Chunkowanie Dokumentówfrom chunks import smart_chunk_documents
chunks = smart_chunk_documents(documents)
Strategie:
create_optimized_splitter() - RecursiveCharacterTextSplittercreate_token_splitter() - SentenceTransformersTokenTextSplitterask_rag.py - Logika RAGfrom ask_rag import get_llm, ask_rag
llm = get_llm()
response = ask_rag(question, vectorstore, llm)
Cechy:
ask_rag__from_json_.py - Benchmark Modelifrom ask_rag__from_json_ import run_benchmark
run_benchmark(query, vectorstore)
# Porównuje wszystkie modele z modele.json
modele.json){
"models": {
"gemma_2_9b": {
"repo_id": "bartowski/gemma-2-9b-it-GGUF",
"filename": "gemma-2-9b-it-IQ2_M.gguf",
"prompt_template": "..."
},
"qwen_2.5_1.5b": {
"repo_id": "Qwen/Qwen2.5-1.5B-Instruct-GGUF",
"filename": "qwen2.5-1.5b-instruct-q8_0.gguf",
"prompt_template": "..."
}
}
}
ask_rag.py)MODEL_DIR = "model_llm"
N_THREADS = 4 # Dostosuj do liczby rdzeni CPU
CHUNK_SIZE = 512 # Rozmiar kontekstu
N_CTX = 2048 # Maksymalna długość sekwencji
from main_lokalnie import main
from embedding import get_embeddings
from database import load_vectorstore, init_chroma
from ask_rag import ask_rag, get_llm
# Inicjalizacja
client = init_chroma()
embeddings = get_embeddings()
vectorstore = load_vectorstore(client, "documents", embeddings)
llm = get_llm()
# Pytanie
query = "Jakie ubezpieczenie uczelnia zaleca studentom?"
response = ask_rag(query, vectorstore, llm)
print(response)
from ask_rag__from_json_ import run_benchmark
query = "Jakie ubezpieczenie uczelnia zaleca studentom?"
run_benchmark(query, vectorstore)
# Wyniki w results.json
results.json - Wyniki benchmarku (Format: lista dict z queryami, modelami i odpowiedziami)results_z_pdfow.json - Wyniki specyficzne dla PDF{
"query": "Pytanie...",
"model": "Gemma 2 9B",
"response": "Odpowiedź...",
"context": "Kontekst wyszukany z bazy",
"processing_time": 12.5
}
Umieść dokumenty w:
dokumenty/pdfy/ - pliki PDFdokumenty/txt/ - pliki tekstowefrom database import check_collection_exists, init_chroma
client = init_chroma()
check_collection_exists(client, "documents")
n_threads w ask_rag.pyN_CTX z 2048 do 1024# Modele są cache'owane w HuggingFace cache directory
# Możesz pobrać je ręcznie na innym komputerze z dostępem do sieci:
huggingface-cli download bartowski/gemma-2-9b-it-GGUF gemma-2-9b-it-IQ2_M.gguf --local-dir .
# Lub ustawić ścieżkę cache'u:
export HF_HOME=/ścieżka/do/cache
jupyter notebook RAG_TEST/RAG.ipynb
Zawiera:
# ask_rag.py
N_THREADS = 2 # Zmniejsz z 4
N_BATCH = 64 # Zmniejsz z 128
# chunks.py
CHUNK_SIZE = 256 # Zmniejsz z 512
CHUNK_OVERLAP = 25
# ask_rag.py
N_THREADS = 8 # Zwiększ
N_BATCH = 256 # Zwiększ
N_CTX = 4096 # Zwiększ
Projekt wykorzystuje:
Ostatnia aktualizacja: 2026-04-11
Wersja projektu: 1.0
Status: Aktywny
Projekt implementujący Retrieval Augmented Generation (RAG) z lokalną bazą wektorową, embeddingami oraz modelami LLM działającymi w całości offline.
System umożliwia zadawanie pytań dotyczących dokumentów akademicznych (PDF, TXT) z odpowiedziami generowanymi przez lokalne modele sztucznej inteligencji. Projekt zawiera:
✅ Baza wektorowa (ChromaDB) - przechowywanie i wyszukiwanie dokumentów
✅ Embeddingi (sentence-transformers) - reprezentacja semantyczna tekstu
✅ Modele LLM (GGUF format) - generowanie odpowiedzi
✅ Benchmarking - porównanie wydajności różnych modeli
✅ Przetwarzanie dokumentów - PDFy i pliki tekstowe
baza_wektorowa/
├── lokalnie/ # Główny kod aplikacji
│ ├── main_lokalnie.py # Punkt wejścia
│ ├── database.py # Operacje na ChromaDB
│ ├── embedding.py # Model embeddingowy
│ ├── ask_rag.py # Logika RAG
│ ├── ask_rag__from_json_.py # Benchmark modeli z JSON
│ ├── chunks.py # Chunkowanie dokumentów
│ ├── advanced_rag.py # Zaawansowane funkcje RAG
│ ├── modele.json # Konfiguracja modeli LLM
│ ├── dostrajanie/ # Moduł do fine-tuningu
│ └── __pycache__/ # Cache Pythona
│
├── RAG_TEST/ # Testy i eksperymenty
│ ├── RAG.ipynb # Notebook z testami
│ ├── bazawektorowa_pdf/ # ChromaDB - baza wektorowa
│ └── modele.json # Testowa konfiguracja
│
├── dokumenty/ # Dokumenty źródłowe
│ ├── pdfy/ # Pliki PDF
│ │ ├── 1.pdf
│ │ ├── 2.pdf
│ │ └── 3.pdf
│ └── txt/ # Pliki tekstowe
│ ├── 1.txt
│ ├── 2.txt
│ └── 3.txt
│
├── testy.ipynb # Notebook z testami
├── requirements.txt # Zależności Pythona
└── README.md # Ten plik
pip install -r requirements.txt
langchain - framework RAGchromadb - baza wektorowasentence-transformers - embeddingillama-cpp-python - obsługa modeli GGUFpypdf - przetwarzanie PDFcd lokalnie
pip install -r ../requirements.txt
sentence-transformers/all-mpnet-base-v2 (~786 MB)Modele GGUF są pobierane automatycznie z HuggingFace podczas pierwszego użycia.
Konfiguracja w modele.json:
| Model | Rozmiar | Wydajność | Dokładność |
|---|---|---|---|
| Gemma 2 9B | ~5.5 GB | Średnia | Wysoka |
| Qwen 2.5 1.5B | ~1.2 GB | Wysoka | Średnia |
| Llama 3.2 1B | ~1 GB | Wysoka | Średnia |
| Phi 3.5 Mini | ~2.3 GB | Wysoka | Wysoka |
Zaleta: Modele pobierane są tylko raz i cache'owane lokalnie. Nieznacząca objętość repozytorium!
# Uruchomienie głównej aplikacji
python main_lokalnie.py
# Uruchomienie notebooka Jupyter
jupyter notebook RAG_TEST/RAG.ipynb
database.py - Zarządzanie ChromaDBfrom database import (
init_chroma, # Inicjalizacja bazy
load_vectorstore, # Załadowanie wektorów
load_pdf_documents, # Ładowanie PDF
index_documents_in_batches # Indeksowanie
)
Funkcje:
init_chroma() - Tworzenie/połączenie z ChromaDBcheck_collection_exists() - Sprawdzenie kolekcjiload_pdf_documents() - Wczytanie dokumentówindex_documents_in_batches() - Indeksowanie z batchamiembedding.py - Modele Embeddingowefrom embedding import get_embeddings
embeddings = get_embeddings() # all-mpnet-base-v2
Model: sentence-transformers/all-mpnet-base-v2
chunks.py - Chunkowanie Dokumentówfrom chunks import smart_chunk_documents
chunks = smart_chunk_documents(documents)
Strategie:
create_optimized_splitter() - RecursiveCharacterTextSplittercreate_token_splitter() - SentenceTransformersTokenTextSplitterask_rag.py - Logika RAGfrom ask_rag import get_llm, ask_rag
llm = get_llm()
response = ask_rag(question, vectorstore, llm)
Cechy:
ask_rag__from_json_.py - Benchmark Modelifrom ask_rag__from_json_ import run_benchmark
run_benchmark(query, vectorstore)
# Porównuje wszystkie modele z modele.json
modele.json){
"models": {
"gemma_2_9b": {
"repo_id": "bartowski/gemma-2-9b-it-GGUF",
"filename": "gemma-2-9b-it-IQ2_M.gguf",
"prompt_template": "..."
},
"qwen_2.5_1.5b": {
"repo_id": "Qwen/Qwen2.5-1.5B-Instruct-GGUF",
"filename": "qwen2.5-1.5b-instruct-q8_0.gguf",
"prompt_template": "..."
}
}
}
ask_rag.py)MODEL_DIR = "model_llm"
N_THREADS = 4 # Dostosuj do liczby rdzeni CPU
CHUNK_SIZE = 512 # Rozmiar kontekstu
N_CTX = 2048 # Maksymalna długość sekwencji
from main_lokalnie import main
from embedding import get_embeddings
from database import load_vectorstore, init_chroma
from ask_rag import ask_rag, get_llm
# Inicjalizacja
client = init_chroma()
embeddings = get_embeddings()
vectorstore = load_vectorstore(client, "documents", embeddings)
llm = get_llm()
# Pytanie
query = "Jakie ubezpieczenie uczelnia zaleca studentom?"
response = ask_rag(query, vectorstore, llm)
print(response)
from ask_rag__from_json_ import run_benchmark
query = "Jakie ubezpieczenie uczelnia zaleca studentom?"
run_benchmark(query, vectorstore)
# Wyniki w results.json
results.json - Wyniki benchmarku (Format: lista dict z queryami, modelami i odpowiedziami)results_z_pdfow.json - Wyniki specyficzne dla PDF{
"query": "Pytanie...",
"model": "Gemma 2 9B",
"response": "Odpowiedź...",
"context": "Kontekst wyszukany z bazy",
"processing_time": 12.5
}
Umieść dokumenty w:
dokumenty/pdfy/ - pliki PDFdokumenty/txt/ - pliki tekstowefrom database import check_collection_exists, init_chroma
client = init_chroma()
check_collection_exists(client, "documents")
n_threads w ask_rag.pyN_CTX z 2048 do 1024# Modele są cache'owane w HuggingFace cache directory
# Możesz pobrać je ręcznie na innym komputerze z dostępem do sieci:
huggingface-cli download bartowski/gemma-2-9b-it-GGUF gemma-2-9b-it-IQ2_M.gguf --local-dir .
# Lub ustawić ścieżkę cache'u:
export HF_HOME=/ścieżka/do/cache
jupyter notebook RAG_TEST/RAG.ipynb
Zawiera:
# ask_rag.py
N_THREADS = 2 # Zmniejsz z 4
N_BATCH = 64 # Zmniejsz z 128
# chunks.py
CHUNK_SIZE = 256 # Zmniejsz z 512
CHUNK_OVERLAP = 25
# ask_rag.py
N_THREADS = 8 # Zwiększ
N_BATCH = 256 # Zwiększ
N_CTX = 4096 # Zwiększ
Projekt wykorzystuje:
Ostatnia aktualizacja: 2026-04-11
Wersja projektu: 1.0
Status: Aktywny