Plataforma de perguntas e respostas com RAG (Retrieval-Augmented Generation) para farmacovigilância. Chat inteligente com reescrita de queries, reranking semântico, comparação de LLM vs SLM (local), e avaliação automática.
Este repositório é composto por:
api/: FastAPI com autenticação JWT, chat com streaming, RAG com múltiplos provedores (OpenAI, Gemini, Ollama).web/: Next.js com login, histórico de conversas e interface de chat em tempo real.docker-compose.yml: ambiente local comdb,pgadmin,api,web,ingest-workereollama.
Fluxo principal:
- Usuario autentica por email/senha ou Google.
- Frontend cria ou seleciona uma conversa.
- Frontend envia pergunta para
POST /chat(via rotas proxy emweb/app/api/*). - API consulta historico, monta contexto RAG e retorna resposta em streaming.
- Mensagens sao persistidas no PostgreSQL.
Browser (Next.js UI)
|
| HTTP (rotas app/api/*)
v
Web Container (Next.js)
|
| HTTP interno
v
API Container (FastAPI)
|\
| \__ PostgreSQL (usuarios, conversas, mensagens)
|
\____ OpenAI + Pinecone (RAG)
\___ Google tokeninfo (login Google)
Ingestao assincrona (servico separado): ingest-worker
- Backend: Python 3.11, FastAPI, SQLAlchemy, LangChain, Pinecone, OpenAI, Gemini, Ollama (local).
- Frontend: Next.js 16, React 19, TypeScript, Tailwind CSS, shadcn/ui.
- Banco: PostgreSQL 16.
- LLM Locais: Ollama (Docker) com suporte a GPU NVIDIA.
- Avaliação: RAGAS com múltiplos juízes (GPT-4o-mini, Gemini, Claude Haiku, Ollama).
- Infra: Docker Compose.
- Auth: JWT + Google Identity Services.
- Docker e Docker Compose.
- Chaves de API (obrigatórias): OpenAI, Gemini (ou ambas conforme config), Pinecone.
- OAuth Client ID do Google (opcional, recomendado para login social).
- GPU NVIDIA (opcional, para acelerar Ollama local).
- Criar o arquivo de ambiente na raiz:
cp .env.example .env-
Preencher no
.envapenas as variáveis obrigatórias:OPENAI_API_KEY(ouGEMINI_API_KEYconformeREWRITE_PROVIDER/ANSWER_PROVIDER)PINECONE_API_KEYJWT_SECRET_KEYGOOGLE_CLIENT_ID
Todas as outras variáveis já têm valores sensatos no
.env.example. -
Subir os serviços:
docker compose build --no-cache
docker compose up -d- Acessar:
- Web:
http://localhost:3000 - API Swagger:
http://localhost:8000/docs - pgAdmin:
http://localhost:5050 - Ollama (local):
http://localhost:11434
Nota: O arquivo api/config.yaml é deprecated. Use apenas .env para configuração.
A indexacao RAG roda no servico ingest-worker, separado da API.
- Intervalo padrao:
INGEST_INTERVAL_SECONDS=7200(2h). - Logs em tempo real:
docker compose logs -f ingest-worker- Execucao manual:
docker compose run --rm ingest-worker python ingestion/ingest_documents.pyObservacoes importantes:
- A origem padrao da ingestao e
api/docs. - A ingestao processa todos os arquivos
.pdfdessa pasta (incluindo subpastas). - Auditorias e manifestos sao salvos em
api/logs/.
Arquivo: .env
DATABASE_URL: conexao com PostgreSQL usada pela API e pelo worker.JWT_SECRET_KEY: segredo de assinatura JWT.GOOGLE_CLIENT_ID: client id OAuth consumido pela API e injetado no build do web.
No Google Cloud Console:
- Adicionar
http://localhost:3000emAuthorized JavaScript origins. - Usar o mesmo client id em
GOOGLE_CLIENT_ID.
A suite conta com 81 testes distribuídos em 6 arquivos, com cobertura total de ~77%, sem depender do Docker (banco substituído por SQLite em memória via monkeypatch).
| Arquivo | Tipo | Testes | O que cobre |
|---|---|---|---|
test_auth.py |
Integração | 11 | Registro, login, tokens, validação de campos |
test_conversations.py |
Integração | 10 | CRUD de conversas, isolamento por usuário |
test_chat.py |
Integração | 9 | Fluxo de chat, HyDE on/off, streaming, avaliação |
test_auth_utils.py |
Unitário | 6 | Hash de senha, JWT (create/decode/tampered/empty) |
test_chat_response_service.py |
Unitário | 17 | should_hide_sources, select_sources, format_sources_block |
test_rag_service_unit.py |
Unitário | 23 | Sanitize, dedup, history_str, process_docs, chunks, título |
Rodar a suite completa com relatório de cobertura:
cd api
pytestO pytest.ini já configura --cov=app --cov-report=term-missing --cov-fail-under=60. O relatório HTML fica em api/htmlcov/index.html.
Para rodar apenas os testes unitários (sem banco, sem fixtures de integração):
cd api
pytest tests/test_auth_utils.py tests/test_chat_response_service.py tests/test_rag_service_unit.py -vcd web
pnpm lint
pnpm build- Backend:
api/README.md - Frontend:
web/README.md - Operacao de ingestao:
api/docs/ingest-instruction.md - Análise de incidente:
INCIDENT_ANALYSIS.md— falha silenciosa no pipeline de ingestão RAG (base vetorial desatualizada sem alertas), diagnóstico e resolução.
Desenvolvimento local:
- Swagger UI (interativo):
http://localhost:8000/docs - Documentação estática:
api/docs/api-doc.md
Produção (Render):
- Swagger UI:
https://allercheck-api.onrender.com/docs
POST /chat: Chat em streaming com histórico.POST /evaluate/detailed: Análise detalhada com reescrita de query, reranking semântico e LLM provider.POST /evaluate/comparison: Compara LLM vs SLM (Ollama local) lado a lado com métricas de latência e custo.POST /evaluate/chunks: Retorna chunks recuperados pelo RAG sem gerar resposta.
Altere REWRITE_PROVIDER e ANSWER_PROVIDER em .env:
gemini: Gemini 2.5 Flash (padrão, recomendado)openai: GPT-4o-mini ou GPT-4oollama: Modelos locais (Mistral, Qwen, etc.)
-
Erro
Google authentication is not configured: ConfirmeGOOGLE_CLIENT_IDno.enve refaçadocker compose up -d --build web api. -
Erro de conexão com banco: Confirme
DATABASE_URLe status do serviçodbcomdocker compose ps. -
Sem respostas RAG: Valide
OPENAI_API_KEY,PINECONE_API_KEY,INDEX_NAMEe os logs doingest-workercomdocker compose logs ingest-worker. -
Ollama não responde: Verifique se está em
http://localhost:11434(local) ouhttp://ollama:11434(Docker). Teste comcurl http://localhost:11434/api/tags. -
Variável de ambiente faltando (KeyError): Copie
.env.examplepara.enve preencha todos os campos marcados como OBRIGATÓRIOS:REWRITE_TEMPERATURE=0.1 ANSWER_TEMPERATURE=0.2 EVALUATOR_TEMPERATURE=0 BENCHMARK_TEMPERATURE=0.2 -
Inconsistência na base vetorial: Se copiou o projeto de outra máquina, remova os logs antigos:
rm -rf api/logs/*.json api/logs/*.jsonl api/logs/*.txt docker compose down -v docker compose up -d --build