Files
pastor-online/docker-compose.yml
T
omp 957c73b09e feat: busca híbrida (vetorial + BM25 com fusão RRF) e janela de contexto
Recuperação:
- keyword.py: tokenizador PT (acentos, stopwords, dígitos), BM25 Okapi com
  índice invertido, e reciprocal_rank_fusion com desempate determinístico
- retrieval.py: VectorRetriever e HybridRetriever; fusão por posição, não por
  nota (cosseno 0..1 e BM25 sem teto são escalas incomparáveis)
- identidade de fusão é a coordenada (arquivo,livro,capítulo,versículo): o mesmo
  versículo chega das duas buscas com distance diferente e o dataclass nunca os
  igualaria, então o RRF não premiaria o que ambas confirmam
- ChatService recebe retriever injetado; referência explícita mantém precedência

Contexto:
- VerseChunk ganha context (janela de CONTEXT_WINDOW vizinhos por lado, dentro
  do livro, atravessando capítulos) e embedding_text
- store grava a janela como documento e o versículo em verse_text; a UI mostra o
  versículo citado e o modelo recebe a janela
- snapshot() nos dois stores: o BM25 é em memória e o Chroma persiste, então o
  arranque precisa reconstruir o índice lexical ou a busca degrada em silêncio

Motivação medida em 5703 versículos reais: a busca vetorial não liga 'estou com
medo do futuro' a 'não temas' (0,19, nível de par sem relação), e e5-small tem
faixa de similaridade de só 0,02 — inutilizaria o piso de evidência.
2026-11-02 11:57:19 -03:00

97 lines
2.7 KiB
YAML

services:
backend:
build:
context: ./backend
dockerfile: Dockerfile
image: pastor-online-backend:latest
container_name: pastor-online-backend
restart: unless-stopped
environment:
CORPUS_DIR: /data/corpus
VECTOR_DB_DIR: /data/vector_db
LLM_PROVIDER: ${LLM_PROVIDER:-ollama}
OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-http://ollama:11434}
OLLAMA_MODEL: ${OLLAMA_MODEL:-qwen2.5:1.5b}
OPENAI_BASE_URL: ${OPENAI_BASE_URL:-https://api.openai.com/v1}
OPENAI_MODEL: ${OPENAI_MODEL:-gpt-4o-mini}
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
GROQ_BASE_URL: ${GROQ_BASE_URL:-https://api.groq.com/openai/v1}
GROQ_MODEL: ${GROQ_MODEL:-llama-3.3-70b-versatile}
GROQ_API_KEY: ${GROQ_API_KEY:-}
ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL:-https://api.anthropic.com}
ANTHROPIC_MODEL: ${ANTHROPIC_MODEL:-claude-sonnet-4-5}
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
EMBEDDING_MODEL: ${EMBEDDING_MODEL:-paraphrase-multilingual-MiniLM-L12-v2}
TOP_K: ${TOP_K:-6}
MIN_SIMILARITY: ${MIN_SIMILARITY:-0.35}
INDEX_BATCH_SIZE: ${INDEX_BATCH_SIZE:-512}
CONTEXT_WINDOW: ${CONTEXT_WINDOW:-2}
CORS_ORIGINS: ${CORS_ORIGINS:-http://localhost:8080,http://127.0.0.1:8080}
REINDEX_TOKEN: ${REINDEX_TOKEN:-}
AUTO_INDEX: ${AUTO_INDEX:-true}
HF_HOME: /data/models
volumes:
- ./corpus:/data/corpus:ro
- vector_db:/data/vector_db
networks:
- pastor
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:8000/api/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 30s
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
image: pastor-online-frontend:latest
container_name: pastor-online-frontend
restart: unless-stopped
depends_on:
backend:
condition: service_started
ports:
- "${FRONTEND_PORT:-8080}:80"
networks:
- pastor
ollama:
image: ollama/ollama:latest
container_name: pastor-online-ollama
restart: unless-stopped
profiles: ["local"]
volumes:
- ollama:/root/.ollama
networks:
- pastor
ollama-pull:
image: ollama/ollama:latest
container_name: pastor-online-ollama-pull
profiles: ["local"]
depends_on:
- ollama
environment:
OLLAMA_HOST: http://ollama:11434
OLLAMA_MODEL: ${OLLAMA_MODEL:-qwen2.5:1.5b}
entrypoint: ["/bin/sh", "-c"]
command:
- |
until ollama list >/dev/null 2>&1; do
echo "aguardando o Ollama..."
sleep 3
done
ollama pull "$${OLLAMA_MODEL}"
networks:
- pastor
volumes:
vector_db:
ollama:
networks:
pastor:
driver: bridge