Fusão:
- fuse_rankings() extrai a fusão RRF e aplica MAX_KEYWORD_ONLY (padrão 2):
quantas posições podem ser ocupadas por trechos que só o BM25 achou. O que os
dois lados confirmam nunca conta contra a cota.
- O controle é por cota de posições, não por piso de nota. Medido: a razão da
nota BM25 não separa acerto de ruído — para 'como posso perdoar quem me
feriu?', Deuteronômio 28:27 pontua 1,000 do topo e o correto Lucas 7:47 fica
em 0,716 (rank 12). Um piso cortaria o certo e manteria o errado.
- Ponderar o RRF também não resolve: com peso 0,5 no BM25 os achados só-lexicais
caem abaixo do 6º vetorial (0,5/61 < 1/66) e somem, levando junto Jó 3:13 e
Joel 3:14, os melhores resultados medidos.
Portão off-topic:
- MIN_SIMILARITY não consegue implementar 'sem evidência'. Medido no índice
completo: 0/6 perguntas off-topic bloqueadas em qualquer limiar de 0,30 a
0,50 ('bolo de chocolate' bate 0,544 em Lv 7:14; 'cotação do dólar' 0,494).
A recusa passa a ser instruída no SYSTEM_PROMPT e o limiar fica documentado
como filtro de ruído.
98 lines
2.7 KiB
YAML
98 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}
|
|
MAX_KEYWORD_ONLY: ${MAX_KEYWORD_ONLY:-2}
|
|
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
|