Chatbot RAG (Retrieval-Augmented Generation) que responde perguntas baseando-se estritamente nos meus resumos de estudo sincronizados do Notion.
- Java 21 + Spring Boot 3.5
- LangChain4J 1.13.1
- Anthropic Claude (
claude-haiku-4-5) como modelo de chat - Cohere
contextRetrievalService-multilingual-light-v3.0como modelo de embeddings - PostgreSQL + pgvector como banco vetorial (
PgVectorEmbeddingStore) - Docker para o banco de dados
Ingestão (sync diário com Notion — @Scheduled, meia-noite)
NotionClient.buscarPaginas() → processarEmParalelo (CompletableFuture, pool=3)
→ deduplicação por lastEditedTime → NotionClient.buscarBlocos(pageId) → NotionBlockExtractor.extract()
→ DocumentByParagraphSplitter(1500, 200)
→ CohereEmbeddingModel (search_document) → PgVectorEmbeddingStore + PostgreSQL (metadados)
→ falhas → backoff 1s → retentativa única
Consulta (streaming SSE apenas)
POST /query/stream → ContextRetrievalService.buildContext()
→ CohereEmbeddingModel (search_query) → EmbeddingStore.search(maxResults=4)
→ StreamingChatAssistant.chat() → TokenStream → SseEmitter (meta / token / done / error)
- Java 21+
- Maven
- Docker
- Chave de API da Anthropic
- Chave de API da Cohere
- Chave de API do Notion
export ANTHROPIC_API_KEY=sua_chave_aqui
export COHERE_API_KEY=sua_chave_aqui
export NOTION_API_KEY=sua_chave_aqui
export NOTION_DATA_SOURCE_ID=id_do_banco_cursos
export DB_USER_PGVECTOR=seu_usuario
export DB_PASSWORD=sua_senhanotion.sync.pool-size=3 # threads paralelas no sync (respeita rate limit da Notion API)docker compose up -dmvn spring-boot:runA aplicação sobe em http://localhost:8080. O sync com o Notion ocorre automaticamente todo dia à meia-noite.
Retorna os documentos indexados (paginado).
Remove um documento pelo ID. Retorna 204 No Content.
Streaming SSE de respostas em tempo real. Requer header X-Session-Id (opcional; gerado automaticamente se não fornecido).
// Requisição
{ "query": "O que é o Mockito?" }
// Resposta (eventos SSE)
data: {"meta":{"matchesCount":4,"sources":[{"index":1,"titulo":"Mockito - Introdução","notionUrl":"https://notion.so/abc123"},{"index":2,"titulo":"Testes com Spring","notionUrl":"https://notion.so/def456"}]}}
data: {"token":"Mockito"}
data: {"token":" é"}
data: {"token":" uma"}
...
data: {"done":true}Retorna estatísticas das últimas 100 consultas (tempo de execução, estágios de falha, etc.).
Retorna contagem total e estatísticas dos documentos indexados.