7.2 KiB
RAG Solution with LlamaIndex and Qdrant
Project Overview
This is a Retrieval Augmented Generation (RAG) solution built using LlamaIndex as the primary framework and Qdrant as the vector storage. The project is designed to load documents from a shared data directory, store them in a vector database, and enable semantic search and chat capabilities using local Ollama models.
The system has been enhanced to properly handle Russian language documents with Cyrillic characters, ensuring proper encoding during document loading, storage, and retrieval.
Key Technologies
- RAG Framework: LlamaIndex
- Vector Storage: Qdrant
- Embedding Models: Ollama (configurable via environment variables)
- Chat Models: Ollama (configurable via environment variables)
- Data Directory:
./../../../data(relative to project root) - Logging: loguru with file rotation and stdout logging
Architecture Components
- CLI entry point (
cli.py) - Configuration module (
config.py) - manages model strategies and environment variables - Document enrichment module (
enrichment.py) - Vector storage configuration (
vector_storage.py) - Retrieval module (
retrieval.py) - Chat agent (
agent.py)
Building and Running
Prerequisites
- Python virtual environment (already created in
venvfolder) - Ollama running locally on default port 11434
- Qdrant running locally (REST API on port 6333, gRPC on port 6334)
- Data files in the
./../../../datadirectory
Setup Process
-
Activate the virtual environment:
source venv/bin/activate -
Install required packages based on the document extensions found in the data directory (see EXTENSIONS.md for details)
-
Configure environment variables in
.envfile (copy from.env.dist) -
Run the CLI to initialize the system:
python cli.py ping # Should return "pong"
Available Commands
ping: Basic connectivity testenrich: Load and process documents from the data directory into vector storagechat: Start an interactive chat session with the RAG system
Development Conventions
Logging
- Use
logurufor all logging - Log to both file (
logs/dev.log) with rotation and stdout - Use appropriate log levels (DEBUG, INFO, WARNING, ERROR)
Environment Variables
CHAT_STRATEGY: Strategy for chat models ("ollama" or "openai")EMBEDDING_STRATEGY: Strategy for embedding models ("ollama" or "openai")OLLAMA_EMBEDDING_MODEL: Name of the Ollama model to use for embeddingsOLLAMA_CHAT_MODEL: Name of the Ollama model to use for chat functionalityOPENAI_CHAT_URL: URL for OpenAI-compatible chat API (when using OpenAI strategy)OPENAI_CHAT_KEY: API key for OpenAI-compatible chat API (when using OpenAI strategy)OPENAI_EMBEDDING_MODEL: Name of the OpenAI embedding model (when using OpenAI strategy)OPENAI_EMBEDDING_BASE_URL: Base URL for OpenAI-compatible embedding API (when using OpenAI strategy)OPENAI_EMBEDDING_API_KEY: API key for OpenAI-compatible embedding API (when using OpenAI strategy)
Document Processing
- Support multiple file formats based on EXTENSIONS.md
- Use text splitters appropriate for each document type
- Store metadata (filename, page, section, paragraph) with embeddings
- Track processed documents to avoid re-processing (using SQLite if needed)
- Proper encoding handling for Russian/Cyrillic text during loading and retrieval
Vector Storage
- Collection name: "documents_llamaindex"
- Initialize automatically if not exists
- Support for Ollama embeddings by default
- Optional OpenAI embedding support via OpenRouter (commented out)
Project Phases
Phase 1: CLI Entry Point
- Virtual environment setup
- CLI creation with
clicklibrary - Basic "ping" command implementation
Phase 2: Framework Installation
- LlamaIndex installation
- Data folder analysis and EXTENSIONS.md creation
- Required loader libraries installation
Phase 3: Vector Storage Setup
- Qdrant library installation
- Vector storage initialization module
- Collection creation strategy for "documents_llamaindex"
- Ollama embedding model configuration
- Optional OpenAI embedding via OpenRouter (commented)
Phase 4: Document Enrichment
- Document loading module with appropriate loaders
- Text splitting strategies implementation
- Document tracking mechanism
- CLI command for enrichment
- Russian language/Cyrillic text encoding support during document loading
Phase 5: Retrieval Feature
- Retrieval module configuration
- Query processing with metadata retrieval
- Russian language/Cyrillic text encoding support
Phase 6: Model Strategy
- Add
CHAT_STRATEGYandEMBEDDING_STRATEGYenvironment variables - Add OpenAI configuration options to .env files
- Create reusable model configuration function
- Update all modules to use the new configuration system
- Ensure proper .env loading across all modules
Phase 7: Enhanced Logging and Progress Tracking
- Added progress bar using tqdm to show processing progress
- Added logging to show total files and processed count during document enrichment
- Enhanced user feedback during document processing with percentage and counts
Phase 8: Chat Agent
- Agent module with Ollama integration
- Integration with retrieval module
- CLI command for chat functionality
File Structure
llamaindex/
├── venv/ # Python virtual environment
├── cli.py # CLI entry point
├── config.py # Configuration module for model strategies
├── vector_storage.py # Vector storage configuration
├── enrichment.py # Document loading and processing
├── retrieval.py # Search and retrieval functionality
├── agent.py # Chat agent implementation (to be created)
├── EXTENSIONS.md # Supported file extensions and loaders
├── .env.dist # Environment variable template
├── .env # Local environment variables
├── logs/ # Log files directory
│ └── dev.log # Main log file with rotation
└── PLANNING.md # Project planning document
Data Directory
The system expects documents to be placed in ./../../../data relative to the project root. The system will analyze this directory to determine supported file types and appropriate loaders.
Testing
- Unit tests for individual modules
- Integration tests for end-to-end functionality
- CLI command tests
Troubleshooting
- Ensure Ollama is running on port 11434
- Verify Qdrant is accessible on ports 6333 (REST) and 6334 (gRPC)
- Check that the data directory contains supported file types
- Review logs in
logs/dev.logfor detailed error information - For Russian/Cyrillic text issues, ensure proper encoding handling is configured in both enrichment and retrieval modules
Important Notes
- Do not test long-running or heavy system scripts during development as they can consume significant system resources and take hours to complete
- The enrich command processes all files in the data directory and may require substantial memory and processing time