RAG-система для анализа документов — загружай PDF, задавай вопросы, получай точные ответы с цитатами из документа.
- 📄 Загрузка PDF — автоматическое разбиение на чанки с перекрытием
- 🔍 Векторный поиск — PostgreSQL + pgvector, cosine similarity
- 🤖 AI ответы — Llama 3.3 70B через OpenRouter
- 💬 Telegram бот — удобный интерфейс с inline-кнопками
- 📊 Streamlit Dashboard — красивая веб-админка
- 🎯 Честность — если ответа нет в документе, бот так и скажет
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Telegram Bot │────▶│ FastAPI Backend │────▶│ PostgreSQL │
│ (aiogram) │ │ + RAG Pipeline │ │ + pgvector │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌──────────────────┐
│ Streamlit │ │ OpenRouter API │
│ Dashboard │ │ (LLM + Embed) │
└─────────────────┘ └──────────────────┘
| Компонент | Технология |
|---|---|
| Backend | FastAPI, SQLAlchemy, asyncpg |
| Database | PostgreSQL 16 + pgvector |
| Cache | Redis (кэш ответов /rag/query по хэшу запроса, TTL 1 час) |
| LLM | Llama 3.3 70B (OpenRouter) |
| Embeddings | OpenAI text-embedding-3-small |
| Telegram | aiogram 3.x |
| Dashboard | Streamlit |
| Containerization | Docker Compose |
git clone https://github.com/mivlabs/ai-document-platform.git
cd ai-document-platformdocker-compose up postgres redis -dcd backend
python -m venv venv
venv\Scripts\activate # Windows
# или source venv/bin/activate # Linux/Mac
pip install -r requirements.txtСоздай .env в корне проекта:
OPENROUTER_API_KEY=your_key_here
TELEGRAM_BOT_TOKEN=your_bot_token_here
DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/documents
REDIS_URL=redis://localhost:6379cd backend
uvicorn app.main:app --reloadpython bot.pycd dashboard
pip install streamlit httpx
streamlit run app.py- Найди бота в Telegram
- Отправь PDF файл (до 20 MB)
- Задай вопрос — получи ответ с цитатами
Открой http://localhost:8501 — загружай документы, задавай вопросы, управляй базой.
Открой http://localhost:8000/docs — интерактивная Swagger документация.
ai-document-platform/
├── backend/
│ ├── app/
│ │ ├── routers/
│ │ │ ├── documents.py # Загрузка и список документов
│ │ │ └── rag.py # RAG pipeline
│ │ ├── models/
│ │ │ └── document.py # SQLAlchemy модели
│ │ ├── services/
│ │ │ ├── embeddings.py # OpenAI embeddings
│ │ │ └── pdf_parser.py # Парсинг PDF + chunking
│ │ ├── database.py # DB connection
│ │ └── main.py # FastAPI app
│ └── requirements.txt
├── dashboard/
│ └── app.py # Streamlit UI
├── bot.py # Telegram bot
├── docker-compose.yml
├── .env
└── README.md
- Chunking — PDF разбивается на чанки по 1000 токенов с перекрытием 200
- Embeddings — каждый чанк превращается в вектор (1536 dim)
- Vector Search — pgvector ищет ближайшие чанки по cosine distance
- LLM Generation — Llama 3.3 70B генерирует ответ на основе контекста
- Relevance Filter — если max relevance < 0.10, бот честно говорит "нет информации"
- Telegram-бот хранит список загруженных document_id в памяти процесса, по chat_id
- RAG-запрос можно ограничить конкретными
document_ids - Важно: это не изоляция пользователей на уровне бэкенда — в API нет аутентификации,
и любой клиент, знающий
document_id, может обратиться к нему напрямую через/rag/query. Разделение "видит только свои документы" сейчас существует только в клиентском состоянии Telegram-бота, а не как гарантия сервера. Для реальной multi-user изоляции нужна аутентификация +owner_idв таблицеdocuments— это в Roadmap.
- Поддержка DOCX, TXT файлов
- OCR для сканов PDF
- Hybrid search (BM25 + vector)
- Аутентификация пользователей + owner_id на документах (см. предупреждение выше про multi-user)
- Деплой на VPS
- CI/CD через GitHub Actions
- pytest (SQL-инъекция в
/rag/query, upload/list/delete документов, кэш)
docker-compose up -d postgres redis
cd backend
pip install -r requirements.txt -r requirements-dev.txt
pytest -vТесты создают/дропают таблицы на каждый тест (нужен Postgres с расширением
vector — обычный postgres:16 не подойдёт, используется образ
pgvector/pgvector:pg16, как и в docker-compose.yml). LLM и embeddings
в тестах замоканы — реальных вызовов к OpenRouter не происходит, OPENROUTER_API_KEY
не нужен.
MIT