Комплексная демонстрация современной RAG системы на PHP с векторными эмбеддингами и локальными AI моделями для интеллектуального поиска товаров.
💡 Для кого этот проект? Для PHP разработчиков, которые хотят понять, как работает RAG архитектура и интегрировать AI в свои проекты без использования внешних API.
- 🔍 Семантический поиск - понимает смысл запросов на русском и английском
- 🤖 AI анализ запросов - Llama 3.2 обрабатывает естественную речь
- 💬 Интерактивный чат - можно общаться как с консультантом в магазине
- 🚀 Оптимизация памяти - работает с большими каталогами через генераторы
- 💰 Без затрат на API - все работает локально, никаких счетов за токены
- 🏗️ Production-ready - Docker, CI/CD, статический анализ
┌─────────────────────┐ ┌────────────────────┐ ┌─────────────────────┐
│ 🧠 Анализ запроса │ => │ 🔍 Векторный поиск │ => │ ✨ Генерация ответа │
│ │ │ │ │ │
│ • Обработка LLM │ │ • Поиск в Qdrant │ │ • Только найденное │
│ • Оптимизация │ │ • Косинусное │ │ • Без "галлюцинаций"│
│ • Векторизация │ │ сходство │ │ • Факты + контекст │
└─────────────────────┘ └────────────────────┘ └─────────────────────┘
- Бэкенд: PHP 8.3 + Symfony 7.3 (MicroKernelTrait)
- Векторная БД: Qdrant (поиск по косинусному сходству)
- Эмбеддинги: Transformers PHP (onnx-community/Qwen3-Embedding-0.6B-ONNX, 384 измерения)
- LLM: Ollama + Llama 3.2:1b (локальная инференция)
- Инфраструктура: Docker + Docker Compose
- Docker и Docker Compose
- PHP 8.3+ с Composer
- Make (опционально, для удобных команд)
# Клонируем репозиторий
git clone https://github.com/yourusername/rag-vectors-presentation.git
cd rag-vectors-presentation
# Автоматическая настройка (рекомендуется)
make setup
# ИЛИ ручная настройка
chmod +x scripts/setup.sh && ./scripts/setup.shСкрипт сам:
- Установит PHP зависимости
- Запустит Qdrant и Ollama в Docker
- Скачает модель Llama 3.2 (~1.3ГБ)
- Проиндексирует тестовые товары
- Проверит работоспособность всех сервисов
# Ставим зависимости
composer install
# Запускаем сервисы
docker-compose up -d
# Ждём запуска и скачиваем модели
sleep 15
docker-compose exec ollama ollama pull llama3.2:1b
# Индексируем товары
php bin/console products:vectorize# 🆕 Главное RAG демо (рекомендуется)
make demo
# ИЛИ: php bin/console rag:demo --interactive
# 💬 Чат с AI консультантом
make chat
# ИЛИ: php bin/console products:chat
# 🔍 Разовый поиск
make search QUERY="игровой ноутбук для разработки AI"
# ИЛИ: php bin/console products:search "игровой ноутбук"# Семантический поиск на английском
php bin/console products:search "powerful AMD processor for gaming"
# Поддержка русского языка
php bin/console products:search "мощный игровой ноутбук"
# Естественные запросы с AI
php bin/console rag:demo --query "найди процессор для машинного обучения"
# Сложные запросы
php bin/console products:chat
> "Посоветуй видеокарту для разработки нейросетей до 100 тысяч рублей"rag-vectors-presentation/
├── src/
│ ├── Command/ # Консольные команды для демо
│ ├── Service/ # Основная бизнес-логика
│ │ ├── RAGService.php # Главная RAG реализация
│ │ ├── EmbeddingConfigService.php # Векторные эмбеддинги
│ │ └── LlamaService.php # Интеграция с LLM
│ ├── DTO/ # Объекты передачи данных
│ └── Exception/ # Кастомные исключения
├── config/ # Конфигурация Symfony
├── data/
│ └── products.json # Каталог товаров для демо
├── scripts/
│ └── setup.sh # Скрипт автоматической настройки
├── docker-compose.yml # Оркестрация сервисов
├── Makefile # Команды для разработки
└── README.md # Этот файл
Проект использует Transformers PHP для генерации эмбеддингов. По умолчанию установлена модель onnx-community/Qwen3-Embedding-0.6B-ONNX, но вы можете выбрать любую другую модель:
Все модели можно найти на 🤗 Hugging Face с тегом transformers.js:
// Примеры популярных embedding моделей:
// Компактные модели (быстрые, меньше памяти)
'onnx-community/all-MiniLM-L6-v2' // 384 измерения, универсальная
'onnx-community/all-MiniLM-L12-v2' // 384 измерения, лучше качество
// Мультиязычные модели (поддержка русского)
'onnx-community/paraphrase-multilingual-MiniLM-L12-v2' // 384 измерения
'onnx-community/Qwen3-Embedding-0.6B-ONNX' // 384 измерения (используется по умолчанию)
// Мощные модели (больше точность, больше ресурсов)
'onnx-community/bge-base-en-v1.5' // 768 измерений, высокое качество
'onnx-community/e5-large-v2' // 1024 измерения, топовая точностьЧтобы использовать другую модель, измените её в файле:
- src/Service/EmbeddingConfigService.php (константа EMBEDDING_MODEL)
// В src/Service/EmbeddingConfigService.php заменить:
private const string EMBEDDING_MODEL = 'onnx-community/Qwen3-Embedding-0.6B-ONNX';
// На выбранную модель:
private const string EMBEDDING_MODEL = 'onnx-community/all-MiniLM-L6-v2';
⚠️ Важно: При смене модели нужно заново проиндексировать товары командойphp bin/console products:vectorize
# Запустить все проверки
make check
# Исправить стиль кода
make fix
# Отдельные инструменты
composer phpstan # Статический анализ
composer cs-check # Проверка стиля
composer cs-fix # Автоисправление стиляmake start # Запустить все сервисы
make stop # Остановить все сервисы
make restart # Перезапустить сервисы
make logs # Посмотреть логи всех сервисов
make logs-qdrant # Логи только Qdrant
make logs-ollama # Логи только Ollama
make clean # Очистить Docker ресурсыmake test-qdrant # Проверить Qdrant API
make test-ollama # Проверить Ollama API
# Ручная проверка
curl http://localhost:6333/health
curl http://localhost:11434/api/tags- Панель Qdrant: http://localhost:6333/dashboard
- API Ollama: http://localhost:11434
// Прямое использование сервиса
$ragService = $container->get(RAGService::class);
$result = $ragService->searchWithContext("мощная видеокарта для игр", "session_id");
echo "Исходный запрос: " . $result->originalQuery . "\n";
echo "Оптимизированный запрос: " . $result->optimizedQuery . "\n";
echo "AI Ответ: " . $result->aiResponse . "\n";
foreach ($result->documents as $doc) {
echo "- {$doc['payload']['name']} (релевантность: " . round($doc['score'] * 100, 1) . "%)\n";
}use App\Service\RAGService;
use App\DTO\RAGSearchResult;
class MyCustomRAGService extends RAGService
{
public function searchWithContext(string $userQuery, string $sessionId): RAGSearchResult
{
// Ваша кастомная логика RAG здесь
return parent::searchWithContext($userQuery, $sessionId);
}
}# Собрать образ приложения
docker build -t my-rag-app .
# Продакшен docker-compose
docker-compose -f docker-compose.prod.yml up -dСкопируйте .env.example в .env и настройте:
# Конфигурация Qdrant
QDRANT_HOST=localhost
QDRANT_PORT=6333
# Конфигурация Ollama
OLLAMA_HOST=localhost
OLLAMA_PORT=11434
OLLAMA_MODEL=llama3.2:1b
# Настройки векторов
VECTOR_DIMENSION=384
SIMILARITY_THRESHOLD=0.7- Пользовательский запрос анализируется Llama 3.2
- Запрос оптимизируется для лучших результатов поиска
- Текст преобразуется в 384-мерный вектор с помощью Qwen3-Embedding-0.6B-ONNX
- Семантический поиск в векторной базе Qdrant
- Сравнение по косинусному сходству с настраиваемым порогом
- Извлечение топ-K наиболее релевантных товаров
- LLM генерирует ответ ТОЛЬКО на основе найденных товаров
- Никаких "галлюцинаций" - строго фактический контент
- Контекстные рекомендации с деталями товаров
В отличие от типичных RAG систем, наша реализация гарантирует, что LLM никогда не выдумывает информацию. Модель работает только с реальными результатами поиска, обеспечивая надёжные, основанные на фактах рекомендации.
- Генерация эмбеддингов: ~50мс на запрос (локально)
- Векторный поиск: ~5мс для 10К товаров
- Генерация LLM: ~2-3 секунды (локальная Llama 3.2:1b)
- Полный пайплайн: ~3-4 секунды от начала до конца
- Форкните репозиторий
- Создайте ветку фичи:
git checkout -b новая-фича - Внесите изменения и убедитесь, что тесты проходят:
make check - Закоммитьте изменения:
git commit -m "feat: описание" - Отправьте PR
Этот проект показывает:
- ✅ Как интегрировать AI в PHP приложения без внешних API
- ✅ Правильную архитектуру RAG систем
- ✅ Работу с векторными базами данных
- ✅ Локальные LLM для продакшена
- ✅ Семантический поиск на русском языке
- ✅ Production-ready DevOps практики
Проект распространяется под MIT лицензией - используйте свободно в своих проектах.
- 🐛 Баги и предложения: GitHub Issues
- 📚 Документация: Смотрите папку
/docs - 💬 Обсуждения: GitHub Discussions
Если проект оказался полезным:
- ⭐ Поставьте звезду на GitHub
- 🔄 Поделитесь с коллегами
Готовы погрузиться в мир современных RAG систем? Начните с make setup, а затем make demo для полного опыта! 🚀
💡 Совет: После установки попробуйте команду
php bin/console products:chatи спросите: "Посоветуй мощный процессор для разработки на PHP"