laloop

Wir bringen generative KI in den Produktivbetrieb, auf Ihrer Infrastruktur.

laloop konzipiert und betreibt selbst gehostete RAG- und LLM-Systeme. Unten sehen Sie den Assistenten, der Teilnehmende von Se Liga na SKY auf WhatsApp betreut: Embeddings, Vektorsuche, Reranker und lokales Modell, jede Antwort bis zur Quelle nachvollziehbar.

Se Liga Supportonline

    Worker-Trace

    1. querywartet auf Nachricht
    2. embed
    3. pgvector
    4. rerank
    5. Schwelle
    6. Antwort

    Unterhaltung aus dem brasilianischen Portugiesisch übersetzt; Scores sind beispielhaft. Die Parameter entsprechen dem Produktivcode.

    Ausgewählte Projekte

    Der Assistent oben ist ein Fall. Vier weitere, jeweils mit Architektur, den entscheidenden Entscheidungen und dem aktuellen Stand. Die Fallstudien sind auf Englisch.

    Architektur

    Fünf Container in einem docker-compose. Die API reiht nur ein; der Worker serialisiert den Zugriff auf die GPU. Das Wissen liegt in einem separaten Repository und wird ohne Image-Rebuild neu indexiert.

    Architektur des laloop-Assistenten Der Kanal sendet die Nachricht an die FastAPI-API, die sie in Redis einreiht. Der Worker verarbeitet die Queue, liest den Sitzungsverlauf aus Postgres und führt build_context aus: Embedding mit BGE-M3, HNSW-Suche in pgvector, Reranking mit BGE-reranker-v2-m3 und Schwellenwert. Oberhalb der Schwelle ruft er Qwen2.5 14B über Ollama auf der GPU auf; darunter liefert er eine feste Antwort, ohne das LLM aufzurufen. Parallel werden Markdown-Skills und mit docling konvertierte Dokumente in Chunks zerlegt und in pgvector indexiert, das zusätzlich über einen MCP-Server bereitgestellt wird. KanalWhatsApp · web FastAPIPOST /chat → 202 job_id Redis 7Queue · TTL 1 h Workerein Job zur Zeit auf der 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 Schwelleskill ≥ .65 · doc ≥ .55 Ollama · Qwen2.5 14BNVIDIA GPU Feste AntwortLLM wird nicht aufgerufen ja nein Inhalte und Ingestion · außerhalb des Images, als Volume eingebunden seliga-rag-contentskills/*/SKILL.md DokumentePDF · DOCX · PPTX → docling Ingestionchunks 800/120 → BGE-M3 MCP-Servergleicher Index für Claude, Cursor

    Zweistufiges Retrieval

    Die Vektorsuche liefert günstigen Recall; der Cross-Encoder entscheidet. Skills und Dokumente laufen auf getrennten Spuren mit eigenen Cut-offs und Schwellenwerten.

    Stufe Skills Dokumente
    Vektorsuche (Kosinus, HNSW) 5 Kandidaten 20 chunks
    Cross-Encoder-Reranker 1 behalten 3 behalten
    Mindestscore nach Reranking (Sigmoid) 0,65 0,55
    Was eingebettet wird name + description Chunk mit 800 Zeichen, 120 Überlappung

    Kontextbudget 12.000 Zeichen im System-Prompt; ein längerer Skill wird auf die Hälfte gekürzt.

    Verlauf letzte 4 Nachrichten pro session_id in Postgres, Ablauf nach 30 Minuten Inaktivität.

    Query aktuelle Nachricht, verkettet mit der vorherigen Nachricht des Nutzers.

    Ausgabe sources: [{type, name, chunk, score}] bei jeder Antwort.

    Entscheidungen aus dem Produktivbetrieb

    Schwelle bei 0,55, nicht 0,50

    Der Reranker liefert sigmoid(logit). Erkennt er weder Bezug noch Widerspruch, liegt der Logit nahe null und der Score bei etwa 0,50. Mit einem Cut-off von 0,50 kam „Was ist die Hauptstadt Brasiliens?“ mit irrelevantem Kontext durch, und das Modell erfand eine Antwort. Bei 0,55 landet die Frage im deterministischen Pfad.

    Ablehnung im Code entschieden

    Überschreitet kein Skill und kein Dokument die Schwelle, gilt grounded=False und die Antwort ist ein fester String. Das LLM wird gar nicht aufgerufen: Die Garantie hängt nicht davon ab, dass das Modell dem Prompt folgt, und themenfremde Fragen kosten keine GPU-Zeit.

    Query-Augmentation mit dem vorherigen Turn

    „Es heißt, mein Passwort sei falsch, aber ich weiß es nicht mehr“ ist für sich allein keinem Skill ähnlich genug. Verkettet mit „Ich komme nicht ins Portal“ trifft es login-bloqueado. Ohne konversationelle Suche und ohne Query-Rewriting per LLM.

    Redis-Queue und ein einzelner Worker

    Die GPU bearbeitet eine Generierung nach der anderen. Die API antwortet sofort mit 202 und einer job_id, der Kanal pollt; der Worker arbeitet die Queue seriell ab und fährt bei SIGTERM sauber herunter. Mehr Durchsatz heißt mehr Worker auf mehr GPUs.

    Validierung über den Prompt

    Der System-Prompt legt Domäne und Umfang des Programms ausdrücklich fest, damit das Modell keine fremden Bedeutungen aus Markennamen übernimmt; Fragen außerhalb des Umfangs werden klar abgelehnt statt geraten.

    Wissen in einem eigenen Repository

    Skills ändern sich mit dem Betrieb, nicht mit dem Code. Sie liegen in seliga-rag-content und werden als Volume eingebunden; make ingest-skills indexiert neu, und die nächste Anfrage nutzt bereits den neuen Vektor. Beschreibungen bleiben auf Portugiesisch, weil genau sie eingebettet werden.

    Ein Skill

    Das Frontmatter steuert das Retrieval; der Inhalt wird zur Anweisung für das Modell. Die description enthält die Wörter, die Teilnehmende tatsächlich tippen. Auf Portugiesisch, wie im Produktivbetrieb.

    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.
    ...

    Die API

    Asynchron, authentifiziert per X-API-Key. Der Kanal blockiert nie, während er auf die GPU wartet.

    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

    SchichtWahlWarum
    EmbeddingsBAAI/bge-m3Mehrsprachig und stark im Portugiesischen, 1024 Dimensionen, läuft lokal über sentence-transformers.
    RerankerBAAI/bge-reranker-v2-m3Cross-Encoder aus derselben Familie; bewertet das Paar aus Frage und Passage, nicht nur die Distanz.
    VektorenPostgres 16 + pgvector, HNSWEine Datenbank für Vektoren, Sitzungen und Metadaten. Kein zusätzlicher Dienst im Betrieb.
    LLMQwen2.5 14B · OllamaBefolgt Anweisungen deutlich besser als 4B-Modelle; OpenAI-kompatible API, ein Modellwechsel ist eine Variable.
    QueueRedis 7Serialisiert den GPU-Zugriff; Jobs laufen nach einer Stunde ab.
    APIFastAPI + UvicornKleiner Vertrag, OpenAPI-Dokumentation unter /docs.
    Ingestiondocling, markitdownPDF, DOCX, PPTX und XLSX werden vor dem Chunking zu Markdown, mit Cache nach mtime.
    IntegrationMCP server (FastMCP)Derselbe Index, abfragbar aus Claude, Cursor und anderen MCP-Clients.
    DeployDocker ComposeDasselbe Compose auf dem Mac (LM Studio) und auf dem Server; die GPU kommt über eine Override-Datei dazu.

    Im Einsatz: Se Liga na SKY

    Ein Anreiz- und Punkteprogramm für Mitarbeitende. Fragen kommen über WhatsApp direkt an die API: Portalzugang, fehlende Punkte, Einlöseoptionen und Fristen, Prepaid-Karten, Rechnungszahlungen.

    Die Skills entstanden aus echten Supportgesprächen, mit dem Ton der menschlichen Mitarbeiterin als Vorbild. Das Betriebsteam liest Berichte auf Basis der sources-Spur: welche Skills am häufigsten greifen, welche nie, wo die Ablehnungsquote hoch ist.

    Was die Berichte zuerst zeigten: Zugang ist das Thema derer, die draußen stehen. Gesperrte Logins und vergessene Passwörter kommen genau von denen, die nicht hineinkommen, und daraus wurde ein neuer Skill für den Erstzugang.

    Was laloop liefert

    Festpreisprojekte oder Einsatz nach Umfang. Vom Prototyp bis zum überwachten System im Produktivbetrieb, mit Code und Dokumentation für Ihr Team.

    RAG-Assistenten
    Kundensupport, interne Wissensdatenbanken, Betriebsunterstützung. Retrieval mit Reranking, an echten Daten kalibrierte Schwellen und Ablehnung, wenn es keine Quelle gibt.
    Selbst gehostete LLMs
    Modell und Quantisierung passend zu Ihrer Hardware, Ollama oder vLLM auf GPU, OpenAI-kompatible API. Für den Fall, dass Daten das Unternehmen nicht verlassen dürfen.
    Evaluation und Observability
    Quellen- und Score-Spur pro Antwort, Abdeckungsberichte, Testsets zur Kalibrierung der Schwellen, bevor Sie Modell oder Prompt ändern.
    Infrastruktur und SRE für KI
    Docker, Kubernetes, Terraform, GCP und AWS. Queues, Worker, Deployments ohne Ausfallzeit und Runbooks, mit denen Ihr Team den Betrieb übernimmt.
    Agenten-Integration über MCP
    Interne Wissensbestände und Systeme als Werkzeuge für Claude, Cursor und andere Clients bereitstellen, mit demselben Index und denselben Berechtigungen.

    Steckt Ihr KI-Projekt im Prototyp fest?

    Schildern Sie das Problem, die Daten und wo es laufen soll. Wir antworten mit einem Vorschlag für Architektur und Umfang.

    E-Mail an contato@laloop.ai