Startseite / Artikel / Produktions-RAG auf Azure: Chunking, hybride Suche, Filter und Zitate

Produktions-RAG auf Azure: Chunking, hybride Suche, Filter und Zitate

Für die Unternehmensdatenabrufung sind strukturbewusste Datenblöcke, hybride Suchverfahren, ACL-Filter, Neubewertung der Ergebnisse, fundierte Anfragen sowie eine Bewertungsmethode erforderlich – nicht nur eine PDF-Demo.

1350 Wörter

RAG-Demos wirken einfach: PDF → Abschnitte → Embeddings → Vektor-Datenbank → Anfrage an das Modell. Dann kommen fünftausend Dokumente herein und jemand fragt nach den Regeln für die Erstattung von Reisekosten im Ausland. Der schwierige Teil ist die zuverlässige Einbringung der richtigen Belege in das Modell.

1. Beginnen Sie mit den Daten, nicht mit dem LLM

Überprüfen Sie vor der Auswahl eines Chat-Modells die Quellen, den Zugriffskontrollmechanismus, die Aktualität sowie die Formate. Schlechte Datensätze führen zu fehlerhaften, aber flüssig klingenden Antworten.

2. Teilung in Abschnitte: Teilen Sie nicht blind alle N Zeichen auf

Ziehen Sie Teilungen unter Berücksichtigung der Struktur vor (Überschriften, Seiten, Tabellen) mit Überschneidungen. Gebührentabellen und Vertragsklauseln leiden unter naiven Zeichensegmenten.

3. Erstellung von Embeddings

Wählen Sie eine feste Implementierung für die Erstellung von Embeddings aus; notieren Sie bei jeder Indexierung Dimension und Modell-ID. Das Mischen verschiedener Modelle beeinträchtigt heimlich die Genauigkeit der Ergebnisse.

document = {
   "document_id": "HR-2026-001",
   "title": "Employee Benefits Policy",
   "department": "HR",
   "country": "India",
   "version": "2026.1",
   "effective_date": "2026-01-01",
   "source": "HR Portal"
}
def chunk_text(text, size=1000):
   return [
     text[i:i + size]
     for i in range(0, len(text), size)
]
def chunk_by_sections(document):
  chunks = []
  for section in document.sections:
    chunks.append({
      "title": section.title,
      "content": section.text,
      "document_id": document.id
    })
  return chunks
pip install openai azure-identity
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
  DefaultAzureCredential(),
  "https://ai.azure.com/.default"
)

client = OpenAI(
  base_url="https://YOUR-RESOURCE.openai.azure.com/openai/v1/",
  api_key=token_provider
)

response = client.embeddings.create(
  model="text-embedding-3-small",
  input="Employees are eligible after completing 12 months of service."
)
vector = response.data[0].embedding
{
  "id": "HR-2026-001-004",
  "document_id": "HR-2026-001",
  "title": "Employee Benefits Policy",
  "content": "...",
  "country": "India",
  "version": "2026.1",
  "content_vector": embedding
}
from azure.search.documents import SearchClient
from azure.search.documents.models import VectorizedQuery

query = "Can I work remotely from another country?"

query_vector = client.embeddings.create(
  model="text-embedding-3-small",
  input=query
).data[0].embedding

vector_query = VectorizedQuery(
  vector=query_vector,
  k_nearest_neighbors=10,
  fields="content_vector"
)

results = search_client.search(
  search_text=query,
  vector_queries=[vector_query],
  top=5,
  select=["title", "content", "document_id", "country"]
)
results = search_client.search(
  search_text=query,
  vector_queries=[vector_query],
  filter="country eq 'India'",
  top=5
)
context = "\n\n".join(
  f"Source: {r['title']}\n{r['content']}"
  for r in results
)
prompt = f"""
You are an enterprise policy assistant.
Answer the user's question using only the provided evidence.
If the evidence does not contain the answer, say that you don't have enough information.
Do not invent policies.
Evidence: {context}
Question: {query}
"""
{
  "document_id": "HR-2026-001",
  "page": 14,
  "section": "Eligibility",
  "content": "..."
}
def answer_question(question):

  # 1. Embed the question
  vector = embed(question)

  # 2. Hybrid retrieval
  candidates = search(
    query=question,
    vector=vector,
    top=20
  )

  # 3. Apply metadata/business filters
  candidates = apply_filters(candidates)

  # 4. Rerank
  ranked = rerank(question, candidates)

  # 5. Keep only useful evidence
  evidence = ranked[:5]

  # 6. Build grounded prompt
  prompt = build_prompt(
    question,
    evidence
  )

  # 7. Generate answer
  response = generate(prompt)

  # 8. Return answer + citations
  return {
    "answer": response,
    "sources": extract_sources(evidence)
  }
test_cases = [
  {
    "question": "What is the India travel allowance?",
    "expected_source": "travel-policy-india.pdf"
  },
  {
    "question": "How long is parental leave?",
    "expected_source": "leave-policy-2026.pdf"
  }
]

4. Speichern Sie Embeddings in Azure AI Search

Speichern Sie Texte, Vektoren sowie filterbares Metadaten (Doc-ID, Produkt, Lokalisation, ACL-Gruppe, updated_at).

5. Hybride Suche ist für die meisten Unternehmen besser als reine Vektor-Suche

Kombinieren Sie dichte Ähnlichkeitsbetrachtung mit BM25/Schlüsselwörtern für IDs, Codes und seltene Eigennamen.

6. Filtern Sie vor dem Verwenden des Kontexts

wenden Sie Sicherheits- und Mietfilter in der Abfrage an – nicht erst, nachdem das Modell bereits verbotene Abschnitte gesehen hat.

7. Die Abfrageergebnisse sind kein endgültiger Kontext

Rangieren Sie die Ergebnisse neu, entfernen Sie Duplikate und begrenzen Sie die Anzahl der Tokens. Mehr Abschnitte bedeuten nicht automatisch bessere Antworten.

8. Erstellen Sie die Anfrage anhand von Belegen

Die Anweisungen sollten nur Antworten aus den bereitgestellten Abschnitten erfordern und angeben, wenn Beweise fehlen.

9. Begründungen mit Zitaten

Geben Sie die IDs der Abschnitte/Seiten an, damit die Nutzer nachprüfen können. Flüssiges Schreiben ohne Zitate ist ein Nachteil.

10. Ein Pipeline-System, das bereit für die Verwendung ist

Eingabe → Aufteilung in Blöcke → Einbetten → Indizierung → hybride Suche → Filtern → Neubewertung → Anfrage stellen → Erstellung → Zitieren → Bewertung.

11. Was in der Regel schiefgeht

Schlechte Aufteilung in Blöcke; mangelhafte Metadaten; Suche ausschließlich mit Vektoren; zu großer Kontextumfang; kein Bewertungssatz; keine Zitate; fehlende ACL-Einstellungen; stille Änderungen der Einbettungsmodelle; keine Angabe zur Aktualität.

Fazit

Produktionsreife RAG-Systeme sind Informationssuchsysteme mit einem angehängten LLM-Endpunkt – und nicht umgekehrt. Investieren Sie in die Aufteilung in Blöcke, hybride Suchverfahren, Filter, Zitate und Bewertungen; das Chat-Modell ist nur der letzte Schritt.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Bewahren Sie für jeden Domainbereich ein „goldenes“ Fragepaket auf: Abfragen nach exakten IDs, Paraphrasierungsfragen sowie ACL-negative Fälle. Automatisieren Sie diese Prozesse im CI, sobald sich die Einstellungen zur Aufteilung in Blöcke oder zum Einbetten ändern.

Die Bewertung sollte im selben Repository wie die Konfiguration für das Chunking liegen: Wenn jemand die Überschneidungen nur leicht anpasst, sollte das „Golden Pack“ bereits vor dem Zeitpunkt versagen, an dem die Nutzer es bemerken.

Die hybride Suche benötigt weiterhin gute Analysewerkzeuge sowie Synonymlisten für Fachbegriffe aus dem jeweiligen Bereich; allein Embeddings können keinen fehlerhaft eingegebenen Policy-Code retten.

Dokumentieren Sie den Vertrag bezüglich des ACL-Feldes auf einer Seite, damit jede neue Eingabearbeitung genau die Angaben enthält, die der Abruffilter erwartet.

Die Bewertung sollte im selben Repository wie die Konfiguration für das Chunking liegen: Wenn jemand die Überschneidungen nur leicht anpasst, sollte das „Golden Pack“ bereits vor dem Zeitpunkt versagen, an dem die Nutzer es bemerken.