Startseite / Artikel / Ein Chatbot für Fragen zu Behördenregeln, der Quellen nennt, statt zu raten

Ein Chatbot für Fragen zu Behördenregeln, der Quellen nennt, statt zu raten

Wie ein RAG-Chatbot mit LangChain, pgvector und Express Bürgerfragen aus offiziellen Dokumenten beantwortet, mit Quellenangaben und einer Konfidenzschwelle.

1144 Wörter

Ein Chatbot, der Fragen zu staatlichen Regelungen beantwortet, ist leicht gebaut und schwer zu vertrauen. Flüssiger Text ist hier nicht das Ziel. Das Ziel ist eine Antwort, die ein Bürger mit einem offiziellen Dokument abgleichen kann. Das Projekt policy-qa-system, ein Open-Source-RAG-Chatbot, ist um genau diese eine Idee herum gebaut.

Öffentlich, aber unlesbar

Behörden veröffentlichen riesige Mengen an Regelwerken: Leistungssätze, Antragsvoraussetzungen, Anspruchsregeln. Formal ist all das online. Praktisch ist kaum etwas davon für einen normalen Menschen brauchbar. Wer nur wissen will, was ihm zusteht oder welche Unterlagen er mitbringen muss, steht vor einem 30-seitigen Text, geschrieben für Sachbearbeiter.

Was dann passiert, ist vorhersehbar. Die Leute rufen bei einer Hotline an und fragen nach etwas, das längst veröffentlicht ist, oder sie geben auf und raten. In großen, dokumentenlastigen öffentlichen Diensten taucht diese Lücke ständig auf. Die Information existiert. Was fehlt, ist eine Möglichkeit, ihr eine Frage zu stellen.

Das System schließt diese Lücke mit Retrieval-Augmented Generation. Menschen stellen Alltagsfragen in einfacher Sprache und bekommen eine Antwort, die auf einem echten Quelldokument beruht, mit beigefügter Quellenangabe. Es ist kein allgemeiner Chatbot, der über Regelungen improvisiert. Er spricht nur auf Grundlage der Dokumente, die man ihm gegeben hat.

Finden, lesen, antworten, belegen

Jede Frage durchläuft vier Schritte:

  1. Die indexierten Dokumente nach den Passagen durchsuchen, die am besten zur Frage passen.
  2. Diese Passagen zusammen mit der Frage lesen.
  3. Eine Antwort in Alltagssprache statt im Behördenjargon schreiben.
  4. Die genaue Quelle anhängen, damit man die Antwort prüfen kann und sie nicht bloß glauben muss.

Die meisten Chatbot-Projekte lassen den letzten Schritt weg, und hier ist er am wichtigsten. Eine Antwort zu Ansprüchen nützt nur, wenn jemand sie bestätigen kann. Deshalb trägt jede Antwort einen Verweis, und wenn nichts Relevantes auftaucht, sagt das System, dass es unsicher ist, statt zu raten.

Ein Beispiel in einfacher Sprache

Nehmen wir die Frage „Wie hoch ist die wöchentliche Zahlung für zwei Kinder?“ Die Antwort sieht so aus:

For 2 children: first child gets the standard rate, second child
gets the additional-child rate (combined weekly and yearly totals
shown together). An income-based charge may apply above a set
household income threshold.
Source: Official rates document, section on child payments

Die Zahlen hängen davon ab, welche Dokumente welchen Landes indexiert sind, denn nichts im System ist an ein bestimmtes Regelwerk gebunden. Es ist ein Muster für Bürgerfragen, kein fester Datensatz.

Tech-Stack

  • Frontend: React 18, TypeScript und Tailwind CSS
  • Backend: Node.js mit Express
  • KI und RAG: LangChain und LangGraph
  • Vektorspeicher: PostgreSQL mit pgvector
  • Deployment: Docker

Nichts Exotisches. Ein Team, das es ernsthaft einsetzt, würde die Beispieldokumente durch seine eigenen offiziellen Regelwerke ersetzen, während Retrieval, Quellenangaben und die Generierung in einfacher Sprache bleiben, wie sie sind.

Architektur

Eine Anfrage läuft von der Frage des Nutzers über die React-Oberfläche zur Express-API, die sie an die Retrieval-Kette weitergibt. So ist es aufgebaut:

User question
      │
      ▼
 React UI ──► Express API
      │
      ▼
 LangChain retrieval ──► PostgreSQL + pgvector (indexed policy docs)
      │
      ▼
 LLM answer generation (grounded in retrieved sections)
      │
      ▼
 Answer + citation + confidence score

Der Konfidenzwert verdient so viel Aufmerksamkeit wie die Antwort selbst. Findet das Retrieval nichts, was der Frage nahe genug kommt, meldet das System genau das, und das Modell bekommt keine Gelegenheit, die Lücke mit etwas Plausiblem zu füllen.

Der entscheidende Code

Erstens erzeugt die Kette nicht einfach freien Text. Sie muss zusammen mit der Antwort eine Quelle zurückgeben:

const response = await chain.invoke({
  question,
  context: retrievedChunks,
});
return {
  answer: response.answer,
  sources: retrievedChunks.map(c => ({
    document: c.metadata.document,
    section: c.metadata.section,
  })),
  confidence: response.confidence,
};

Zweitens entscheidet eine Konfidenzschwelle, ob geantwortet oder zugegeben wird, dass nichts gefunden wurde:

if (topMatchScore < CONFIDENCE_THRESHOLD) {
  return {
    answer: "I couldn't find a reliable answer to that in the indexed documents.",
    sources: [],
  };
}

Diese Prüfung ist winzig, trennt aber einen Chatbot, auf den man sich verlassen kann, von einem, der nur selbstsicher klingt.

Was funktioniert hat

  • Pflicht-Quellenangaben haben das Retrieval von Anfang an verbessert. Ein vager Treffer fällt sofort auf, wenn man zeigen muss, woher er stammt.
  • Schon eine grobe Konfidenzschwelle hat falsche, aber selbstsicher vorgetragene Antworten stark reduziert. Es sah nach einer kleinen Funktion aus und hatte eine der größten Wirkungen auf das Vertrauen.
  • Weil die Dokumentenmenge austauschbar ist, kann dasselbe System ganz unterschiedliche Politikbereiche bedienen, man muss nur neu indexieren.

Was schwierig war

  • Vereinfachen, ohne zu verfälschen. Die Formulierungen in Regelwerken sind aus gutem Grund präzise, und sie verständlicher zu machen, ohne eine Bedingung wie eine Einkommensgrenze oder eine Anspruchsregel zu verlieren, erfordert echte Sorgfalt. Ganz gelöst ist das nicht.
  • Wissen, wann man „Ich weiß es nicht“ sagt. Ist die Schwelle zu niedrig, beantwortet das System Dinge, die es nicht beantworten sollte, ist sie zu hoch, lehnt es Fragen ab, die es gut beantworten könnte. Die praktische Lösung war, sie von Hand an einer kleinen Sammlung echter Fragen abzustimmen.
  • Reife. Das ist eine Grundlage zum Weiterbauen und kein einsatzfertiges Produkt. Bevor echte Nutzer es zu sehen bekommen, braucht es eine ordentliche Ingestion-Pipeline, eine fortlaufende Prüfung von Beispielantworten und Tests mit Grenzfällen.

Wo es hingehört

Es gehört zu einer kleinen Familie von Open-Source-KI-Projekten rund um LLM-Orchestrierung mit LangChain und LangGraph: ein Frage-Antwort-System für Dokumente, ein Code-Review-Agent und ein Tool, das Sprachnotizen in Agile-User-Stories verwandelt. Die gemeinsame Ausrichtung zielt auf Antworten, die sich prüfen lassen, nicht auf Antworten, die bloß richtig klingen.

Ausprobieren

Das Repository lässt sich schnell lokal starten:

git clone https://github.com/Srameshgitnow/policy-qa-system.git
cd policy-qa-system
npm install
npm run dev

Die README erklärt Konfiguration, Umgebungsvariablen und wie man eigene Dokumente indexiert. Lücken in der Quellenlogik und Ideen zur Konfidenzschwelle sind als Issues oder Pull Requests willkommen.