Это приложение демонстрирует интеграцию Spring Boot 3, Spring AI для работы с локальной LLM моделью Gemma 3 4B (через Ollama) и векторной базы данных PostgreSQL с расширением pgvector для хранения эмбеддингов.
- Java 21
- Spring Boot 3.2+
- Spring AI (Ollama, PostgreSQL Vector)
- Ollama (для запуска локальной LLM
gemma3:4b-it-q4_K_M) - PostgreSQL + расширение
pgvector - Docker & Docker Compose
- Docker и Docker Compose установленные в системе.
- Java 21 (рекомендуется использовать SDKMAN! для управления версиями).
- Не менее 8 ГБ оперативной памяти для комфортной работы моделей и БД.
Все необходимые сервисы запускаются одной командой:
docker-compose up -dЭта команда запустит:
- Ollama на порту
11431 - PostgreSQL с
pgvectorна порту5432
Примечание: При первом запуске Ollama автоматически скачает модель
gemma3:4b-it-q4_K_M. Это может занять несколько минут в зависимости от скорости вашего интернета. Прогресс загрузки можно посмотреть в логах:docker-compose logs -f ollama.
Убедитесь, что модель загружена и отвечает:
# Проверить список загруженных моделей
curl http://localhost:11434/api/tags
# Протестировать модель напрямую
curl http://localhost:11434/api/generate -d '{
"model": "gemma2:4b-it-q4_K_M",
"prompt": "Почему небо голубое?",
"stream": false
}'Основные настройки (уже настроены для docker-compose):
spring:
# Spring AI Ollama
ai:
ollama:
base-url: http://localhost:11431
chat:
model: gemma3:4b-it-q4_K_M
# PostgreSQL
datasource:
url: jdbc:postgresql://localhost:5432/ragdb
username: postgres
password: postgresСоберите и запустите Spring Boot приложение:
./mvnw spring-boot:run
# Или соберите JAR и запустите
./mvnw clean package
java -jar target/your-app-name.jarПриложение будет доступно по адресу: http://localhost:8080
src/main/java/com/yourapp/
└──SpringAiAppApplication.java # Главный класс приложения
Если модель работает медленно или падает:
- Убедитесь, что у вас достаточно RAM
- Попробуйте использовать меньшую модель в
docker-compose.yml:ollama pull gemma3:2b-it-q4_K_M
Для полноты картины, вот пример docker-compose.yml, который предполагается в README:
services:
postgres:
image: ankane/pgvector:v0.5.0
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=ragdb
- PGPASSWORD=postgres
logging:
options:
max-size: 10m
max-file: "3"
ports:
- "5432:5432"
volumes:
- ./postgres/data:/var/lib/postgresql/data
- ./postgres/scripts:/docker-entrypoint-initdb.d
healthcheck:
test: "pg_isready -U postgres -d ragdb"
interval: 2s
timeout: 20s
retries: 10
pgadmin:
container_name: pgadmin_container
image: dpage/pgadmin4
environment:
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-pgadmin4@pgadmin.org}
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-admin}
volumes:
- ./servers.json:/pgadmin4/servers.json
ports:
- "${PGADMIN_PORT:-5050}:80"
ollama:
image: ollama/ollama
container_name: ollama
ports:
- "11431:11434"
volumes:
- ./ollama:/root/.ollama
entrypoint: >
/bin/sh -c "
ollama serve &
sleep 2 &&
ollama pull gemma3:4b-it-q4_K_M &&
ollama pull mxbai-embed-large &&
wait
"
restart: unless-stopped