Startseite / Artikel / RAG: Vom ersten Prinzip bis zu drei grundlegenden Agenten

RAG: Vom ersten Prinzip bis zu drei grundlegenden Agenten

Warum Gewichte bei privaten Daten versagen, wie Embeddings und Cosine-Abfragen funktionieren, sowie drei fortschreitende Ansätze von verwalteten Wissensbasen bis hin zu selbstverwalteter Dateneingabe.

4464 Wörter

Eingefrorene Grundmodell-Strukturen können allein aufgrund der Gewichte keine Fragen zu internen Geschäftsangelegenheiten beantworten. Beim Training kamen niemals interne HR-Richtlinien, Verträge oder Handbücher zum Einsatz; Zeitpunkte der Einfrorenheit stoppen den Fortschritt; und wenn Fakten fehlen, erzeugt der Generator dennoch flüssige Schätzungen. Das Lehren eines Netzwerks über das Wissen eines Unternehmens wird daher zu einem Systemproblem und nicht nur zu einem Problem mit größeren Checkpoints.

Warum Gewichte allein versagen

Drei strukturelle Einschränkungen behindern Q&A-Systeme in Unternehmen:

  1. Private Datensätze wurden niemals in das Training aufgenommen. Regeln zur Aufbewahrung sowie Vorlagen für Anfragen sind kein öffentlicher Web-Text.
  2. Die Zeit endet bei der Einfrorenheit. Eine letzte rechtliche Überarbeitung vom Vormonat ist für ein eingefrorenes Abbild unsichtbar.
  3. Silenz ist nicht die Standardlösung. Die Vorhersage des nächsten Tokens bevorzugt eine plausible Fortsetzung gegenüber einer ehrlichen Angabe des Unbekannten.

Drei Möglichkeiten, Wissen einzubringen – und welche skalieren

Option 1: Feinabstimmung am Korpus

Weitere Schulung kann Stil oder Fähigkeiten verankern, verwischt jedoch Fakten über verschiedene Parameter ohne Quellenangaben und kann keine benutzerbezogene Sichtbarkeit gewährleisten, da alle dieselben Gewichte teilen. Für Richtlinien-Fragen & Antworten, bei denen Zitate erforderlich sind und der Zugang kontrolliert werden muss, ist die Feinabstimmung das falsche Verfahren.

Option 2: Alles in die Systemanweisung einfügen

Das Eingeben von Text zum Zeitpunkt der Anfrage wandelt das Abrufen in Lesen um – was das richtige Verfahren ist. Für kleine, stabile Datensätze funktioniert es. Es versagt jedoch, wenn die Datenmengen zu groß werden, bei jeder Anfrage für jeden Token Gebühren anfallen, Antworten inmitten von Anfragen beeinträchtigt werden und eine statische Eingabe keine Filterung nach Rollen ermöglicht.

Option 3: Nur das Wichtige einfügen

Bewahren Sie das Verfahren des Lesens zum Zeitpunkt der Anfrage bei und korrigieren Sie die Skalierung. Laden Sie einige relevante Absätze herunter und generieren Sie anschließend den Text. Das ist in einem Satz ausgedrückt die retrieval-augmented Generation.

Was RAG von Anfang bis Ende ist

Im Offline-Modus: Dateien einlesen, in Segmente aufteilen, die Segmente einbetten, Vektoren (und oft lexikalische Indizes) speichern. Im Online-Modus: Die Frage einbetten, die relevantesten Segmente abrufen, diese zusammen mit der Frage in eine Anweisung packen und auf Basis dieser Segmente eine Antwort erzeugen.

Der schwierige Teil ist nicht der letzte Generierungsvorgang – sondern die Gewährleistung, dass das Abrufen präzise, kostengünstig und berechtigungskonform erfolgt.

Vektoren und Embeddings ohne Mystik

Ein Vektor ist hier eine Liste von Zahlen, die einen Textausschnitt in einem Raum platzieren, in dem ähnlich bedeutende Elemente nah beieinander liegen. Ein Embedding-Netzwerk überträgt Texte in diesen Raum. Die Kosinusähnlichkeit vergleicht eher die Richtung als die Länge, weshalb sie bei der Bewertung von Suchergebnissen dominiert. Distanzmessungen, die die Normalisierung ignorieren, funktionieren bei ungleichen Segmentlängen schlechter.

Die Wahl der Dimensionalität sowie des Embedders ist eine produktbezogene Entscheidung: Mehr Dimensionen können Bedeutungen besser voneinander trennen, kosten aber mehr Speicherplatz und verursachen höhere Latenzzeiten; das Mischen von Embeddern zwischen Indexierungszeit und Abfrageszeit untergräbt heimlich die Suche nach dem nächsten Nachbarn.

Aritmetik der Ähnlichkeit

Kosinus ist das Skalarprodukt von Einheitsvektoren. Zwei Abschnitte über Passwort zurücksetzen mit unterschiedlicher Formulierung landen dennoch in der Nähe voneinander, sofern der Embedder die Absicht erfasst hat. Die Schlüsselwortsuche überseht diese Verbindung; die dichte Abfrage erkennt sie – und könnte genaue SKU-Tokens übersehen, es sei denn, eine hybride lexikalische Suche wird hinzugezogen.

Aufbau von drei vollständigen Agenten auf verwalteter Cloud-Inferenz

Der Rest dieses Leitfadens setzt die Ideen in drei schrittweise voneinander abhängige Agenten auf AWS Bedrock-basierten verwalteten Modellen um: eine sorgfältig zusammengestellte Wissensdatenbank, einen LangGraph-Orchestrator sowie ein selbst verwaltetes Eingabepipeline-System. Jeder Eintrag stellt einen vollständigen Entwurf eines Agenten dar – betrachten Sie sie als ausführbare Architekturen und nicht als kurze Auszüge.

Agent 1 – Pfad zur verwalteten Wissensdatenbank

"""
AGENT 1: Managed Knowledge Base. The 30-line version.
Bedrock does the chunking, embedding, indexing and searching. You wire it up.
"""
import boto3
from langchain_aws import AmazonKnowledgeBasesRetriever, ChatBedrockConverse
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableParallel, RunnablePassthrough

REGION = "eu-west-1"
KB_ID = "ABCD1234EF"

retriever = AmazonKnowledgeBasesRetriever(
    knowledge_base_id=KB_ID,
    region_name=REGION,
    retrieval_config={
        "vectorSearchConfiguration": {
            "numberOfResults": 5,
            "overrideSearchType": "HYBRID",
        }
    },
)

llm = ChatBedrockConverse(
    model="eu.anthropic.claude-sonnet-4-5-20250929-v1:0",
    region_name=REGION,
    temperature=0,
    max_tokens=1024,
)

PROMPT = ChatPromptTemplate.from_messages([
    ("system",
     "Answer only from the numbered context. Cite every claim as [n]. "
     "If the context does not contain the answer, say so plainly."),
    ("human", "Context:\n{context}\n\nQuestion: {question}"),
])


def format_docs(docs) -> str:
    return "\n\n".join(
        f"[{i}] source={d.metadata.get('location', {}).get('s3Location', {}).get('uri', '?')}\n"
        f"{d.page_content}"
        for i, d in enumerate(docs, start=1)
    )


chain = (
    RunnableParallel(context=retriever | format_docs, question=RunnablePassthrough())
    | PROMPT
    | llm
    | StrOutputParser()
)

if __name__ == "__main__":
    print(chain.invoke("How fast must we submit a shortlist for a niche engineering role?"))

Dieser Ansatz nutzt eine gehostete Wissensdatenbank: Dokumente werden in der Speicherung abgelegt, ein verwalteter Indexierer erstellt Embeddings, und der Agent antwortet mit durch diesen Dienst bereitgestellten Zitaten. Zu den Vorteilen gehören weniger eigener Indexierungscode; Nachteile sind ein geringerer Kontrollgrad über die Grenzen der Segmente sowie bei der Fusion von Informationen.

Agent 2 – LangGraph-Orchestrierung von Tools

"""
AGENT 2: LangGraph agent that decides WHETHER and WHICH index to search.
Retrieval is a tool. Identity travels in typed context, never in the prompt.
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import Any

import boto3
from langchain.agents import create_agent
from langchain.agents.middleware import ModelCallLimitMiddleware, ToolCallLimitMiddleware
from langchain.tools import ToolRuntime
from langchain_aws import ChatBedrockConverse
from langchain_core.tools import tool

REGION = "eu-west-1"
POLICY_KB = "ABCD1234EF"
ENGINEERING_KB = "WXYZ5678GH"

agent_runtime = boto3.client("bedrock-agent-runtime", region_name=REGION)


@dataclass
class RequestContext:
    """Built from validated JWT claims. The model cannot read or forge it."""
    subject: str
    roles: tuple[str, ...]
    region: str


def _retrieve(kb_id: str, query: str, ctx: RequestContext, k: int = 5) -> str:
    """Bedrock Retrieve API with a server-side metadata filter for tenant + residency."""
    resp = agent_runtime.retrieve(
        knowledgeBaseId=kb_id,
        retrievalQuery={"text": query},
        retrievalConfiguration={
            "vectorSearchConfiguration": {
                "numberOfResults": k,
                "overrideSearchType": "HYBRID",
                "filter": {
                    "andAll": [
                        {"in": {"key": "acl_roles", "value": list(ctx.roles)}},
                        {"in": {"key": "region", "value": [ctx.region, "GLOBAL"]}},
                    ]
                },
            }
        },
    )
    results: list[dict[str, Any]] = resp.get("retrievalResults", [])
    if not results:
        return "NO_AUTHORISED_RESULTS: nothing in this index that you may read."
    return "\n\n".join(
        f"[{i}] score={r.get('score'):.3f} "
        f"source={r.get('location', {}).get('s3Location', {}).get('uri', '?')}\n"
        f"{r['content']['text']}"
        for i, r in enumerate(results, start=1)
    )


@tool
def search_policy_docs(query: str, runtime: ToolRuntime[RequestContext]) -> str:
    """Search HR, compliance and commercial policy.

    Use for shortlist SLAs and service credits, candidate data retention and consent,
    GDPR erasure, statement-of-work approval thresholds, background check rules and
    automated decision governance.
    """
    return _retrieve(POLICY_KB, query, runtime.context)


@tool
def search_engineering_docs(query: str, runtime: ToolRuntime[RequestContext]) -> str:
    """Search platform runbooks and integration documentation.

    Use for the requisition sync service, Workday and SuccessFactors webhooks, Kafka
    topics and event schemas, idempotency and retry behaviour, and vector index refresh.
    """
    return _retrieve(ENGINEERING_KB, query, runtime.context)


agent = create_agent(
    model=ChatBedrockConverse(
        model="eu.anthropic.claude-sonnet-4-5-20250929-v1:0",
        region_name=REGION,
        temperature=0,
    ),
    tools=[search_policy_docs, search_engineering_docs],
    system_prompt=(
        "You are an enterprise knowledge assistant.\n"
        "- Answer only from tool results and cite the [n] markers they return.\n"
        "- If a tool returns NO_AUTHORISED_RESULTS, say you cannot access a source and "
        "name the document owner. Never fill the gap from memory.\n"
        "- For questions spanning policy and platform, call both tools before answering."
    ),
    context_schema=RequestContext,
    middleware=[
        ModelCallLimitMiddleware(thread_limit=8, run_limit=6, exit_behavior="end"),
        ToolCallLimitMiddleware(thread_limit=6, run_limit=5, exit_behavior="end"),
    ],
)

if __name__ == "__main__":
    claims = {"sub": "asha@example.com", "roles": ["recruiter"], "region": "EU"}
    result = agent.invoke(
        {"messages": [{"role": "user", "content": "How is the vector index refreshed?"}]},
        context=RequestContext(
            subject=claims["sub"],
            roles=tuple(claims["roles"]),
            region=claims["region"],
        ),
    )
    print(result["messages"][-1].content)

Hier ist der Ablauffluss ein expliziter Graph: Absicht klassifizieren, Suchwerkzeuge aufrufen, gegebenenfalls einen Menschen befragen und anschließend antworten. Checkpointing und Unterbrechungen verwandeln langlaufende Support-Threads in dauerhafte Sitzungen anstelle von In-Memory-Dictionaries.

Agent 3 – Selbstverwaltete Eingabe- und Abrufprozesse

"""
AGENT 3: Self-managed pipeline: your chunking, your index, your fusion, your rerank.
Chosen when Bedrock KB's fixed options are not enough (custom fusion, per-stage timing,
an abstention gate, or a chunking rule the managed service will not express).
"""
from __future__ import annotations
import time
from typing import Annotated, Any, TypedDict

import boto3
from langchain_aws import BedrockEmbeddings, ChatBedrockConverse
from langchain_core.documents import Document
from langchain_core.prompts import ChatPromptTemplate
from langchain_text_splitters import MarkdownHeaderTextSplitter, RecursiveCharacterTextSplitter
from langgraph.graph import END, START, StateGraph

REGION = "eu-west-1"
CONFIDENCE_FLOOR = 0.34
CANDIDATE_K, CONTEXT_K = 20, 4

embeddings = BedrockEmbeddings(
    model_id="amazon.titan-embed-text-v2:0",
    region_name=REGION,
    model_kwargs={"dimensions": 1024, "normalize": True},
)
llm = ChatBedrockConverse(
    model="eu.anthropic.claude-sonnet-4-5-20250929-v1:0",
    region_name=REGION,
    temperature=0,
)
rerank_client = boto3.client("bedrock-agent-runtime", region_name=REGION)


# ---------------------------------------------------------------- ingest
def chunk_policy_document(markdown: str, source: str, acl: list[str], region: str):
    """Structure-aware first, size-capped second. Headings are the natural unit for
    policy text; the recursive splitter only intervenes on oversized sections."""
    by_heading = MarkdownHeaderTextSplitter(
        headers_to_split_on=[("#", "title"), ("##", "section"), ("###", "clause")]
    ).split_text(markdown)

    capper = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)
    chunks: list[Document] = []
    for part in capper.split_documents(by_heading):
        heading = " > ".join(
            v for k, v in part.metadata.items() if k in ("title", "section", "clause")
        )
        chunks.append(
            Document(
                # contextual retrieval: the chunk carries its own scope
                page_content=f"{heading}\n{part.page_content}",
                metadata={**part.metadata, "source": source, "acl": acl, "region": region},
            )
        )
    return chunks


# ---------------------------------------------------------------- state
class State(TypedDict, total=False):
    question: str
    roles: list[str]
    region: str
    candidates: list[Document]
    context_docs: list[Document]
    confidence: float
    answer: str
    timings: Annotated[dict[str, float], lambda a, b: {**(a or {}), **(b or {})}]


def _ms(name: str, t0: float) -> dict[str, float]:
    return {name: round((time.perf_counter() - t0) * 1000, 1)}


# ---------------------------------------------------------------- nodes
def retrieve(state: State, *, store) -> State:
    """Hybrid search with an ACL pre-filter pushed into the index query."""
    t0 = time.perf_counter()
    docs = store.similarity_search(
        state["question"],
        k=CANDIDATE_K,
        filter={"acl": {"$in": state["roles"]}, "region": {"$in": [state["region"], "GLOBAL"]}},
    )
    return {"candidates": docs, "timings": _ms("retrieve", t0)}


def rerank(state: State) -> State:
    """Bedrock Rerank: a cross-encoder scoring each (query, chunk) pair jointly."""
    t0 = time.perf_counter()
    cands = state["candidates"]
    if not cands:
        return {"context_docs": [], "confidence": 0.0, "timings": _ms("rerank", t0)}

    resp = rerank_client.rerank(
        queries=[{"type": "TEXT", "textQuery": {"text": state["question"]}}],
        sources=[
            {"type": "INLINE", "inlineDocumentSource": {
                "type": "TEXT", "textDocument": {"text": d.page_content}}}
            for d in cands
        ],
        rerankingConfiguration={
            "type": "BEDROCK_RERANKING_MODEL",
            "bedrockRerankingConfiguration": {
                "numberOfResults": CONTEXT_K,
                "modelConfiguration": {
                    "modelArn": f"arn:aws:bedrock:{REGION}::foundation-model/amazon.rerank-v1:0"
                },
            },
        },
    )
    ranked = resp["results"]
    top = [cands[r["index"]] for r in ranked]
    return {
        "context_docs": top,
        "confidence": round(float(ranked[0]["relevanceScore"]), 3),
        "timings": _ms("rerank", t0),
    }


def generate(state: State) -> State:
    """Abstain below the floor rather than answering from weak context."""
    t0 = time.perf_counter()
    if not state["context_docs"] or state["confidence"] < CONFIDENCE_FLOOR:
        return {
            "answer": "I cannot ground an answer for that in a source you are permitted "
                      "to read. Routing to the document owner.",
            "timings": _ms("generate", t0),
        }
    context = "\n\n".join(
        f"[{i}] {d.metadata.get('source')}\n{d.page_content}"
        for i, d in enumerate(state["context_docs"], start=1)
    )
    prompt = ChatPromptTemplate.from_messages([
        ("system", "Answer only from the numbered context and cite each claim as [n]."),
        ("human", "Context:\n{context}\n\nQuestion: {question}"),
    ])
    reply = (prompt | llm).invoke({"context": context, "question": state["question"]})
    return {"answer": reply.content, "timings": _ms("generate", t0)}


def build_graph(store):
    g = StateGraph(State)
    g.add_node("retrieve", lambda s: retrieve(s, store=store))
    g.add_node("rerank", rerank)
    g.add_node("generate", generate)
    g.add_edge(START, "retrieve")
    g.add_edge("retrieve", "rerank")
    g.add_edge("rerank", "generate")
    g.add_edge("generate", END)
    return g.compile()

Diese Variante übernimmt die Aufgaben des Chunkings, der Embedding-Aufrufe, der Vektorlagern sowie der Prompt-Erstellung. Teams wählen sie, wenn Segmentierungsrichtlinien, hybride lexikalische+dichte Fusionen oder Tenant-Filter als erstklassiger Code statt als Konsoleinstellungen erforderlich sind.

Auswahl zwischen den drei Varianten

Wählen Sie die verwaltete Variante, wenn Geschwindigkeit bei der Demonstration wichtig ist und die Korpora von geringer Größe sind. Wechseln Sie zu LangGraph, wenn Verzweigungen, menschliche Überprüfung sowie Gedächtnisübertragung über mehrere Schritte hinweg im Vordergrund stehen. Übernehmen Sie die volle Kontrolle über den Pipeline-Prozess, wenn die Qualität der Suche nach Identifikatoren, ACLs oder Domänensegmentierungen zum entscheidenden Produktmerkmal wird.

Bewertung, die tatsächlich die Qualität verbessert

Track Recall@k und Precision@k auf einem festgelegten Fragepool sowie die Treue der Antworten zu den abgerufenen Segmenten. Verknüpfen Sie jede Änderung der Segmentgröße oder des Embedders mit den vorherigen/nachfolgenden Bewertungen. Lehnen Sie ab, wenn die wichtigsten Segmente schwach sind – kalibriertes Schweigen ist besser als flüssige Erfindungen.

Wann RAG nicht verwendet werden sollte

Überspringen Sie die Abrufung bei Fakten, die das Basismodell bereits kennt, bei rein kreativen Aufgaben, bei ständig wechselnden Zahlen, die besser über APIs abgefragt werden können, sowie bei extrem niedrigen Latenzanforderungen, die keinen Abrufvorgang zulassen. Manchmal reichen bereits bessere Anweisungen oder eine leichte Anpassung des Formats aus.

Fazit

RAG ist wie die Rohrleitungsanlage: saubere Eingabe, ehrliche Abrufvorgänge, präzise Generierungsanweisungen und messbare Kontrollmechanismen. Die drei Agenten veranschaulichen dieselbe Idee auf drei verschiedenen Kontrollebenen. Wählen Sie die Ebene, die Ihren Steuerungsbedürfnissen entspricht – nicht die, die auf einer Präsentation am fortschrittlichsten erscheint.

Betriebskontrollliste: (1) ein Embedder für Index und Abfragen, (2) Metadaten für ACL sowie Datumsangaben ab dem ersten Tag, (3) hybrider Suchmechanismus bei Auftreten von Identifikatoren, (4) Neubewertung der Ergebnisse, wenn Präzision wichtig ist, (5) „Goldene Fragen“ im CI, (6) Auslöser für Neubau des Indexes bei Änderungen der Quellen. Betrachten Sie das Wissenssystem als Produkt mit Verantwortlichen, SLOs und Rollback-Möglichkeiten – nicht als einen Index am Wochenende, der von niemandem überwacht wird. Wenn die Agentengraphen wachsen, messen Sie den Tokenkostenwert neben der Antwortqualität; eine Orchestrierung, die fünfzehnmal so viele Ressourcen verbraucht wie ein einfacher Chat ohne Einbußen in der Genauigkeit, ist eine Regression unter dem Deckmantel von Architektur. Halten Sie Betriebsanleitungen für Fälle leerer Ergebnisse, veralteter Indexe sowie Inkonsistenzen bei den Embeddern bereit, damit die Einsatzkräfte nicht aus Chat-Logs improvisieren müssen.

Dokumentieren Sie jede Quelle des Korpus mit einem Verantwortlichen und einem Aktualisierungsintervall; verwaiste Datensätze führen zu stillschweigendem Verschleiß.

Präferieren Sie frühzeitigen Segmentüberschneidungen; wenden Sie semantische Trenner nur dann an, wenn Bewertungen zeigen, dass feste Fenster versagen.

Protokollieren Sie die Abruf-IDs zusammen mit den Antworten, damit schlechte Antworten als fehlgeschlagene Abrufe oder als Abweichungen bei der Generierung diagnostiziert werden können.

Trennen Sie die Bewertungsrichter möglichst vom Antwortnetzwerk, um einen Selbstpräferenzbias zu verringern.

Budgetieren Sie die API-Kosten für das Indexieren getrennt vom interaktiven Servieren, damit die Finanzabteilung beide Posten sieht.

Platzieren Sie Prompt-Vorlagen für verschiedene Versionen neben den Index-Builds; ein Prompt-Update ohne erneute Bewertung führt oft zu Regressionen.

In Mehr-Mieter-Umgebungen prüfen Sie, ob Filter durch Prompt-Injektionen unter Vortäuschung von Admin-Rechten umgangen werden können.

Behalten Sie einen Notausschalter bei, der die Generierung deaktiviert und nur noch Zitate zurückgibt, wenn die Treueüberwachungssysteme ausfallen.

Überprüfen Sie die hybriden lexikalischen Gewichte immer dann erneut, wenn Produktcodes den Verkehrsmix dominieren.

Bilden Sie das Support-Personal aus, damit es die Zitierungslisten vor dem Einreichen von Tickets wegen eines „falschen Bots“ durchliest.

Dokumentieren Sie jede Korpusquelle mit einem Verantwortlichen sowie dem Aktualisierungsintervall; sonstige Quellen verfallen stillschweigend.

Ziehen Sie frühzeitig Segmentüberschneidungen vor; wenden Sie semantische Trenner nur dann an, wenn Bewertungen zeigen, dass feste Fenster nicht ausreichen.

Protokollieren Sie die Abruf-IDs zusammen mit den Antworten, damit schlechte Antworten als fehlgeschlagene Abrufe oder Abweichungen bei der Generierung diagnostiziert werden können.

Trennen Sie die Bewertungsrichter möglichst vom Antwortnetzwerk, um ein Selbstpräferenz-Bias zu verringern.

Budgetieren Sie die API-Kosten für das Indexieren getrennt von den Kosten für die interaktive Bereitstellung, damit die Finanzabteilung beide Posten sieht.

Fügen Sie Versionstemplates zu den Index-Builds hinzu; ein Prompt-Update ohne erneute Bewertung führt oft zu Regressionen.

In Mehr-Mieter-Umgebungen prüfen Sie, ob Filter durch Prompt-Injektionen unter Vortäuschung von Admin-Rechten umgangen werden können.

Bewahren Sie einen Abschaltmechanismus auf, der die Erstellung deaktiviert und nur noch Zitaten anzeigt, sobald die Präzisionsüberwachung nachlässt.

Überprüfen Sie die hybriden lexikalischen Gewichte immer dann, wenn Produktcodes den Verkehrsanteil dominieren.

Schulen Sie das Support-Personal darin, die Zitatenansichten zu prüfen, bevor sie Tickets wegen eines „falschen Bots“ weiterleiten.

Dokumentieren Sie jede Korpusquelle mit einem Verantwortlichen sowie dem Aktualisierungsintervall; sonstige Quellen verfallen stillschweigend.

Ziehen Sie frühzeitig Segmentüberschneidungen vor; wenden Sie semantische Trenner nur dann an, wenn Bewertungen zeigen, dass feste Zeitfenster nicht ausreichen.

Protokollieren Sie die Abruf-IDs zusammen mit den Antworten, damit schlechte Antworten als fehlgeschlagene Abfragen oder Erstellungsfehler diagnostiziert werden können.

Trennen Sie die Bewertungsrichter möglichst vom Antwortnetzwerk, um einen Bias durch Selbstpräferenz zu verringern.

Budgetieren Sie die API-Kosten für das Indexieren getrennt von den Kosten für die interaktive Bereitstellung, damit die Finanzabteilung beide Posten sieht.

Versionsspezifische Prompt-Vorlagen neben den Index-Builds; ein Prompt-Update ohne Neubewertung ist der Weg, auf dem Regressionen eingeschleust werden.

Für Mehrbenutzerumgebungen prüfen, ob Filter durch Prompt-Injektionen unter Vortäuschung von Admin-Rechten umgangen werden können.

Bewahren Sie einen Abschaltmechanismus auf, der die Generierung deaktiviert und nur noch Zitaten zurückgibt, sobald die Treueüberwachung versagt.

Überprüfen Sie die hybriden lexikalischen Gewichte immer dann, wenn Produktcodes den Traffic-Mix dominieren.

Schulen Sie das Support-Personal darin, die Zitatenansichten zu lesen, bevor sie Tickets wegen eines „falschen Bots“ weiterleiten.

Bewahren Sie paarierte Bewertungen sowie Ablehnungsmetriken zusammen mit der Latenz auf, damit Kosten und Qualität auf derselben Übersicht dargestellt werden.

Bewahren Sie paarierte Bewertungen sowie Ablehnungsmetriken zusammen mit der Latenz auf, damit Kosten und Qualität auf derselben Übersicht dargestellt werden.

Bewahren Sie paarierte Bewertungen sowie Ablehnungsmetriken zusammen mit der Latenz auf, damit Kosten und Qualität auf derselben Übersicht dargestellt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Tabelle angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.

Halten Sie die gepaarten Bewertungen sowie die Ablehnungsmetriken neben der Latenz, damit Kosten und Qualität auf derselben Seite angezeigt werden.