laloop

Colocamos IA generativa em produção, na sua infraestrutura.

A laloop projeta e opera sistemas de RAG e LLM self-hosted. Abaixo, o assistente que atende o Se Liga na SKY no WhatsApp: embeddings, busca vetorial, reranker e modelo local, com cada resposta rastreável até a fonte.

Se Liga Atendimentoonline

    Trace do worker

    1. queryaguardando mensagem
    2. embed
    3. pgvector
    4. rerank
    5. limiar
    6. resposta

    Conversa e notas ilustrativas. Os parâmetros são os do código em produção.

    Arquitetura

    Cinco containers num docker-compose. A API só enfileira; o worker serializa o acesso à GPU. O conhecimento vive num repositório separado e é reindexado sem rebuild de imagem.

    Arquitetura do assistente laloop O canal envia a mensagem para a API FastAPI, que enfileira no Redis. O worker consome a fila, lê o histórico no Postgres e executa o build_context: embedding com BGE-M3, busca HNSW no pgvector, reranking com BGE-reranker-v2-m3 e limiar. Acima do limiar, chama o Qwen2.5 14B via Ollama na GPU; abaixo, devolve resposta fixa sem chamar o LLM. Em paralelo, skills em markdown e documentos convertidos pelo docling são fragmentados e indexados no pgvector, que também é exposto por um servidor MCP. CanalWhatsApp · web FastAPIPOST /chat → 202 job_id Redis 7fila · TTL 1h Worker1 job por vez na GPU Postgres 16sessions · 4 msgs · 30 min GET /chat/status · polling 1–2 s build_context() · chat.py BGE-M3embedding 1024d pgvector · HNSW5 skills · 20 chunks BGE-reranker-v2-m3cross-encoder → 1 · 3 Limiarskill ≥ .65 · doc ≥ .55 Ollama · Qwen2.5 14BNVIDIA GPU Resposta fixaLLM não é chamado sim não Conteúdo e ingestão · fora da imagem, montado como volume seliga-rag-contentskills/*/SKILL.md DocumentosPDF · DOCX · PPTX → docling Ingestãochunks 800/120 → BGE-M3 Servidor MCPmesmo índice p/ Claude, Cursor

    Retrieval em duas fases

    A busca vetorial garante recall barato; o cross-encoder decide. Skills e documentos seguem trilhas separadas, com cortes e limiares próprios.

    Etapa Skills Documentos
    Busca vetorial (cosine, HNSW) 5 candidatas 20 chunks
    Reranker cross-encoder 1 mantida 3 mantidos
    Nota mínima pós-rerank (sigmoid) 0,65 0,55
    O que entra no embedding name + description chunk de 800 caracteres, overlap 120

    Contexto máximo 12 000 caracteres no system prompt; skill truncada na metade se passar disso.

    Histórico últimas 4 mensagens por session_id, no Postgres, expiram após 30 min sem atividade.

    Query mensagem atual concatenada à última mensagem do usuário.

    Saída sources: [{type, name, chunk, score}] em toda resposta.

    Decisões que vieram da produção

    Limiar em 0,55, não 0,50

    O reranker devolve sigmoid(logit). Quando não vê nem relação nem contradição, o logit fica perto de zero e a nota em ~0,50. Com corte em 0,50, "qual a capital do Brasil?" passava com contexto irrelevante e o modelo inventava. Em 0,55, cai no caminho determinístico.

    Recusa decidida em código

    Se nenhuma skill ou documento passa o limiar, grounded=False e a resposta é uma string fixa. O LLM nem é chamado: a garantia não depende de o modelo obedecer ao prompt, e a pergunta fora de escopo não gasta GPU.

    Query augmentation com o turno anterior

    "Diz que a senha está errada mas não lembro mais qual é" não tem similaridade suficiente com nenhuma skill. Concatenada a "não consigo entrar no portal", cai em login-bloqueado. Resolveu sem busca conversacional nem reescrita de query por LLM.

    Fila Redis e worker único

    A GPU atende uma geração por vez. A API responde 202 com job_id na hora e o canal faz polling; o worker consome a fila em série, com shutdown gracioso no SIGTERM. Mais throughput é mais workers, com mais GPUs.

    "Não é telecom" no system prompt

    O modelo associava SKY à operadora de TV e sugeria Oi, Claro e TIM em perguntas de login. O prompt passou a dizer, em caixa alta, que se trata de um programa de incentivo e pontuação.

    Conhecimento em outro repositório

    Skills mudam com a operação, não com o código. Ficam em seliga-rag-content, montadas como volume; make ingest-skills reindexa e a próxima consulta já usa o vetor novo. Descriptions sempre em português, porque é o que vira embedding.

    Uma skill

    Frontmatter decide o retrieval; o corpo vira instrução para o modelo. A description carrega as palavras que o participante digita.

    skills/antecipar-boleto/SKILL.md
    ---
    name: antecipar-boleto
    description: Use quando o participante quer
      antecipar, adiantar ou mudar a data de
      pagamento de um boleto agendado.
    ---
    # Antecipar boleto
    
    ## Quando usar
    - "quero pagar antes", "adiantar o boleto"
    
    ## Procedimento
    1. Pedido até 3 dias úteis antes
       do vencimento, antes das 12h.
    ...

    A API

    Assíncrona, autenticada por X-API-Key. O canal não fica preso esperando a GPU.

    POST /chat
    { "session_id": "c1f4…", "message": "esqueci a senha" }
    202 { "job_id": "550e…", "status": "queued" }
    
    GET /chat/status/550e…
    200 {
      "status": "done",
      "answer": "Sem problema! Na tela…",
      "sources": [
        { "type": "skill",
          "name": "login-bloqueado",
          "score": 0.91 }
      ]
    }
    
    DELETE /chat/{session_id}   204
    GET /health                  200

    Stack

    CamadaEscolhaPor quê
    EmbeddingsBAAI/bge-m3Multilíngue, forte em português, 1024 dimensões, roda local via sentence-transformers.
    RerankerBAAI/bge-reranker-v2-m3Cross-encoder da mesma família; pontua o par pergunta–trecho, não só a distância.
    VetoresPostgres 16 + pgvector, HNSWUm banco só para vetores, sessões e metadados. Nada de serviço extra para operar.
    LLMQwen2.5 14B · OllamaSegue instrução melhor que modelos 4B; API compatível com OpenAI, troca de modelo é uma variável.
    FilaRedis 7Serializa o acesso à GPU; jobs expiram em 1 hora.
    APIFastAPI + UvicornContrato pequeno, documentação OpenAPI em /docs.
    Ingestãodocling, markitdownPDF, DOCX, PPTX e XLSX viram markdown com cache por mtime antes do chunking.
    IntegraçãoMCP server (FastMCP)O mesmo índice consultável por Claude, Cursor e outros clientes MCP.
    DeployDocker ComposeMesmo compose no Mac (LM Studio) e no servidor; GPU entra por um arquivo de override.

    Em produção: Se Liga na SKY

    Programa de incentivo e pontuação para colaboradores. As dúvidas chegam pelo WhatsApp e vão direto para a API: acesso ao portal, pontos não creditados, prazos e opções de resgate, cartão pré-pago, pagamento de contas.

    As skills foram escritas a partir de atendimentos reais da equipe, com o tom da atendente humana como referência. A operação lê os relatórios pela trilha de sources: quais skills mais disparam, quais nunca dispararam, onde a recusa está alta.

    O que o relatório mostrou primeiro: acesso é o tema de quem está fora. Login bloqueado e senha esquecida vêm justamente de quem não consegue entrar, e isso virou uma skill nova de primeiro acesso.

    O que a laloop entrega

    Projetos fechados ou alocação por escopo. Do protótipo ao sistema rodando com monitoramento, com o código e a documentação entregues ao seu time.

    Assistentes com RAG
    Atendimento, base de conhecimento interna, suporte a operação. Retrieval com reranking, limiares calibrados com dados reais e recusa quando não há fonte.
    LLM self-hosted
    Escolha de modelo e quantização para o seu hardware, Ollama ou vLLM em GPU, API compatível com OpenAI. Para quando os dados não podem sair da empresa.
    Avaliação e observabilidade
    Trilha de fontes e notas por resposta, relatórios de cobertura, conjuntos de teste para calibrar limiares antes de mudar o modelo ou o prompt.
    Infra e SRE para IA
    Docker, Kubernetes, Terraform, GCP e AWS. Filas, workers, deploy sem downtime e runbooks para o seu time operar depois.
    Integração com agentes via MCP
    Expor bases e sistemas internos como ferramentas para Claude, Cursor e outros clientes, com o mesmo índice e as mesmas permissões.

    Tem um projeto de IA para tirar do protótipo?

    Conte o problema, os dados e onde precisa rodar. Respondemos com uma proposta de arquitetura e escopo.

    Escrever para contato@laloop.ai