Pipeline de RAG que transforma as informações da clínica (preços, procedimentos, endereço, protocolos) em embeddings vetoriais, para o agente de IA responder com informação real — não inventada.
🔒 Case anonimizado. Sem nome de cliente, credenciais ou dados reais. (Nomes de tabela/campo são ilustrativos.)
Um LLM sozinho alucina: inventa preço, inventa endereço, promete o que a clínica não faz. Para um negócio, isso é perigoso — gera frustração e quebra de confiança.
O agente precisa responder com base só no que aquela clínica realmente oferece, e cada clínica tem informação diferente.
Um pipeline de Retrieval-Augmented Generation:
- A clínica cadastra suas informações (localização, endereço, procedimentos, contato, descrição).
- Cada registro é vetorizado (embeddings) e guardado no Postgres com
pgvector. - Quando o paciente pergunta algo, o agente faz uma busca semântica e injeta o trecho relevante no prompt.
- A IA responde ancorada na informação real.
flowchart TD
EDIT[✏️ Clínica edita info<br/>no dashboard] -->|trigger| FN[⚡ Edge Function<br/>generate-embedding]
FN -->|monta texto:<br/>endereço, contato, descrição| TXT[Texto canônico]
TXT -->|OpenAI text-embedding-3-small| EMB[Vetor 1536-d]
EMB --> DB[(Postgres + pgvector<br/>knowledge_base)]
subgraph Consulta
Q[❓ Pergunta do paciente] -->|embedding| SEARCH[Busca por similaridade]
DB --> SEARCH
SEARCH -->|trecho relevante| AGENT[🧠 Agente responde<br/>ancorado no dado real]
end
- Uma Edge Function (Deno/Supabase) recebe o
iddo registro e o schema da clínica. - Monta um texto canônico concatenando os campos relevantes (endereço, ponto de referência, contato, site e descrição).
- Gera o embedding com o modelo
text-embedding-3-smallda OpenAI. - Grava o vetor + o texto + metadados (modelo usado, timestamp, tamanho do conteúdo) na tabela.
- Tudo isolado por schema — cada clínica tem o seu, com uma allowlist validando o acesso.
- Multi-tenant por schema: o mesmo pipeline serve N clínicas; o
schemachega na requisição e é validado contra uma allowlist (nada de injeção de schema arbitrário). - Validação rígida de entrada:
recordIdprecisa ser UUID válido, schema precisa estar na allowlist — falha cedo e claro. - Composição inteligente do texto: só os campos preenchidos entram no embedding (campos vazios são filtrados), melhorando a qualidade da busca.
- Metadados versionáveis: cada vetor guarda o modelo e a data de vetorização — permite re-embeddar quando trocar de modelo.
- CORS configurável por variável de ambiente (allowlist de origens).
- Service role isolado: a função usa a service key só no servidor, nunca expõe ao cliente.
| Camada | Tecnologia |
|---|---|
| Vetorização | OpenAI text-embedding-3-small (1536-d) |
| Armazenamento vetorial | Postgres + pgvector (Supabase) |
| Compute | Supabase Edge Function (Deno) |
| Isolamento | Schema-per-tenant + allowlist |
- 🎯 Respostas ancoradas no dado real da clínica — corta a alucinação (preço/endereço inventado).
- 🔄 Clínica nova entra rápido: cadastra a info → o agente já responde sobre ela.
- 📚 Mais dúvidas resolvidas sem escalar pra um humano.
- ai-receptionist-clinics — o agente que consome esta base
- ai-followup-automation — usa esta base ao gerar as mensagens de reativação
- multitenant-clinic-dashboard — onde a clínica edita o conteúdo que vira embedding
Construo automações e agentes de IA sob medida. Bora conversar — me chama.