Sichere und berechtigungsbewusste RAG-Bereitstellungen gewährleisten
Im schnelllebigen Bereich der künstlichen Intelligenz hat sich Retrieval Augmented Generation (RAG) als leistungsstarker Ansatz herauskristallisiert, um die Fähigkeiten generativer Modelle wie OpenAIs GPT-Serie und Googles Gemini zu erweitern. Doch mit großem Potenzial geht erhebliche Verantwortung einher, insbesondere wenn es darum geht, sensible Daten zu schützen und die Einhaltung von Datenschutzvorschriften sicherzustellen.
Da Unternehmen zunehmend auf KI-gestützte Lösungen setzen, ist es entscheidend, die Sicherheitsimplikationen dieser Technologien zu verstehen. Die Implementierung starker Sicherheitsmaßnahmen, die nicht nur Daten schützen, sondern auch das Vertrauen der Nutzer stärken, ist für produktionsreife RAG-Anwendungen unerlässlich.
Bei einem kürzlich von Zilliz veranstalteten Unstructured Data Meetup hob Oz Wasserman, Mitgründer von Opsin, zentrale Sicherheitsaspekte für RAG-Bereitstellungen hervor und betonte die Bedeutung von Datenanonymisierung, starker Verschlüsselung, Eingabe-/Ausgabevalidierung und robusten Zugriffskontrollen sowie weiteren kritischen Sicherheitsmaßnahmen.
In diesem Blog besprechen wir die wichtigsten Aspekte sicherer und berechtigungsbewusster RAG-Bereitstellungen. Außerdem gehen wir ein Beispiel-Notebook einer RAG-Pipeline durch, die die Milvus vector database und LlamaIndex-Postprozessoren verwendet, die darauf ausgelegt sind, sensible Informationen zu entfernen und so Datenschutz und Compliance sicherzustellen.
RAG-Architekturdiagramm
In seinem Vortrag begann Oz damit, eine grundlegende RAG-Architektur zu erklären, ähnlich der in Abbildung 1 gezeigten. Im Wesentlichen erweitert ein RAG-System ein large language model (LLM), indem es eine von einer vector database unterstützte Wissensdatenbank integriert, die Dokumente speichert, um relevante Inhalte als Antwort auf die Anfrage eines Nutzers abzurufen. Dieser Ansatz verbessert die Genauigkeit, sorgt für größere kontextuelle Relevanz und minimiert Halluzinationen, die häufig in Ausgaben eigenständiger LLMs auftreten.
Diese grundlegende Pipeline verfügt jedoch über keine spezifischen Sicherheitsmaßnahmen, sofern diese nicht in die verschiedenen Phasen integriert werden. Oz hob ein RAG-Workflow-Diagramm (siehe Abbildung 2) von Ken Huang von DistributedApps.ai hervor, in dem Sicherheitskontrollen entlang der gesamten RAG-Pipeline implementiert werden können:
Datenquelle/VectorDB-Phase
Abrufphase
Generierungsphase
Abbildung- Vektordatenbank zur Unterstützung eines RAG-Chatbots.png
Abbildung 1: Grundlegende RAG-Architektur
Abbildung 2- Detaillierte RAG-Architektur (Autor- Ken Huang)
Abbildung 2: Detaillierte RAG-Architektur (Autor: Ken Huang)
Datenquelle/VectorDB-Phase
Vector databases wie Milvus und Zilliz Cloud (das verwaltete Milvus) speichern, indexieren und rufen vector embeddings ab, die aus unstructured data umgewandelt wurden. Sie sind kritische Repositories wertvoller Informationen. Sie können jedoch auch zu Zielen für Datenschutzverletzungen oder unbefugten Zugriff werden, weshalb die Implementierung robuster Schutzstrategien wie Verschlüsselung, Zugriffskontrolle oder Datenanonymisierung erforderlich ist.
Figure 3- Data Source:VectorDB Security Controls.png
Abbildung 3: Datenquelle/VectorDB-Sicherheitskontrollen
Der erste Sicherheitsstrang liegt in der Datenanonymisierung. Daten enthalten sensible personenbezogene Informationen, die gemeinhin als Personally Identifiable Information (PII). Diese Daten müssen anonymisiert werden, um die Privatsphäre einzelner Personen zu schützen. Dieser Schritt ist vor jeder Datenverarbeitung obligatorisch, um sicherzustellen, dass diese Informationen nicht auf bestimmte Personen zurückgeführt werden können.
Sobald die Daten anonymisiert wurden, können sie indexiert und Embeddings generiert werden, um eine semantische Suche zum Abrufen relevanter Inhalte zu ermöglichen. In dieser Phase ist es wichtig zu definieren, wer die Daten in der Vektordatenbank speichern und daraus abrufen kann, mit anderen Worten, wer Zugriff darauf hat. Die Implementierung strenger Zugriffskontrollen ist unerlässlich, um unbefugten Zugriff zu verhindern, der zu Datenmanipulation oder Datenlecks führen könnte.
Die Zugriffskontrolle kann in mehrere Phasen unterteilt werden:
Authentifizierung: Sicherstellen, dass der Benutzer seine Identität verifiziert, typischerweise mithilfe von Methoden wie OAuth 2.0.
Autorisierung: Auf Grundlage der verifizierten Identität werden dem Benutzer spezifische Berechtigungen und Zugriffsrechte gewährt.
Nachverfolgbarkeit: Überwachung des Zugriffs, um sicherzustellen, dass alle Versuche, auf Daten zuzugreifen, protokolliert und nachverfolgt werden können, wodurch ein Audit-Trail für die Einhaltung von Sicherheitsvorschriften bereitgestellt wird.
Diese Maßnahmen tragen dazu bei, die Vektordatenbank zu schützen und sicherzustellen, dass nur autorisierte Benutzer mit sensiblen Daten interagieren können.
Eine weitere Sicherheitsebene kann durch Verschlüsselung hinzugefügt werden, um Daten im Ruhezustand (wenn sie gespeichert sind) oder während der Übertragung (wenn sie übertragen werden) unverständlich zu machen. Traditionelle Verschlüsselung verwendet Verschlüsselungsschlüssel, aber auch fortschrittlichere Techniken wie Differential Privacy oder Dezentralisierung & Sharding werden zunehmend eingesetzt, um die Datensicherheit zu verbessern.
Zilliz Cloud ist ein vollständig verwalteter Vektordatenbankdienst, der von Milvus unterstützt wird. Er bietet all diese wesentlichen Datensicherheitsmaßnahmen. Er kann weitere Lösungen bereitstellen, wie Private Link, um den Zugriff über das öffentliche Internet zu vermeiden, Sicherung und Wiederherstellung, um regelmäßige und sichere Datensicherungen zu gewährleisten, sowie die Wiederherstellung der Wissensbasis im Falle von Datenverlust.
Figure 6- Zilliz Multi-layered Enterprise-grade Security
Abbildung 6: Mehrschichtige Enterprise-grade-Sicherheit von Zilliz (Quelle)
Abrufphase
Die Abrufphase ist ein weiterer kritischer Schritt, bei dem Sicherheitsbedenken berücksichtigt werden müssen. Wie in der vorherigen Phase ist die Kontrolle des Zugriffs auf die Wissensbasis über Abfragen unerlässlich. Darüber hinaus müssen in dieser Phase auch mehrere Sicherheitsrisiken gemindert werden:
Abfragevalidierung: Die Validierung von Abfragen ist entscheidend, um Prompt-Injection-Angriffe zu verhindern. Dieser Ansatz stellt sicher, dass Benutzereingaben keine Systemschwachstellen ausnutzen, die potenziell zu unbefugtem Zugriff oder zur Manipulation der Daten führen könnten.
Risiken der Ähnlichkeitssuche: Es ist außerdem wichtig, die Risiken im Zusammenhang mit Ähnlichkeitssuchen zu steuern. Es sollten geeignete Maßnahmen vorhanden sein, um sicherzustellen, dass die Ähnlichkeitssuche nicht unbeabsichtigt sensible Informationen offenlegt oder unbefugten Zugriff auf eingeschränkte Daten ermöglicht.
Figure 7- Query Validation Step
Abbildung 7: Schritt der Abfragevalidierung
Oz zeigte ein Beispiel (siehe Abbildung 8) für Prompt Injection bei der Präsentation eines internen Modells. Dies ist ein gutes Beispiel für Prompt-Manipulation, bei der der Prompt geändert wird, um Daten abzurufen.
Abbildung 8 – Beispiel für Prompt Injection
Abbildung 8: Beispiel für Prompt Injection
Darüber hinaus besprach Oz mehrere Risiken im Zusammenhang mit Ähnlichkeitssuche, darunter:
Datenleckage: Durch die Manipulation von Ähnlichkeitsabfragen können Angreifer den Suchmechanismus beeinflussen, um sensible Daten indirekt abzurufen.
Manipulation von Suchergebnissen: Angreifer könnten den Suchprozess verändern, um zu beeinflussen, welche Ergebnisse abgerufen werden, was zu einer potenziellen Offenlegung eingeschränkter Informationen führen kann.
Aufklärung und Musteranalyse: Angreifer können Muster in Suchanfragen und Antworten analysieren, um die Struktur der Datenbank zu kartieren und Einblicke in die gespeicherten Daten zu gewinnen.
Ressourcenerschöpfung: Kontinuierliche oder übermäßige Abfragen könnten zu Denial-of-Service-Zuständen führen, Systemressourcen erschöpfen und die Verfügbarkeit für andere Benutzer verringern.
Wir sehen, dass ähnliche Sicherheitstechniken für die Abrufphase implementiert werden müssen, wie Zugriffskontrolle oder Datenvalidierung. Zusätzlich muss Verschlüsselung (bei der Übertragung) berücksichtigt werden, da Daten zwischen Komponenten übertragen werden.
Generierungsphase
Die letzte Phase in der RAG-Pipeline ist die Generierungsphase, in der das Large Language Model (LLM) Antworten auf Grundlage der abgerufenen Inhalte aus der Vektordatenbank generiert. Obwohl das LLM in dieser Phase der zentrale Akteur ist, können Sicherheits- und Compliance-Probleme auftreten, abhängig von der Art der Daten, die zum Trainieren des Modells verwendet wurden. Einige zentrale Risiken sind:
Verstöße gegen den Datenschutz: Das LLM kann versehentlich sensible oder private Informationen offenlegen, wenn es mit Daten trainiert wurde, die personenbezogene Daten (PII) oder andere vertrauliche Inhalte enthalten. Dies könnte zu Verstößen gegen Datenschutzvorschriften wie DSGVO oder HIPAA führen.
Manipulation der Ausgabe: Angreifer könnten die Ausgabe des LLM manipulieren, indem sie die Eingabeabfragen beeinflussen, was zur Generierung bösartiger oder irreführender Inhalte führt. Dies ist besonders bedenklich in Umgebungen, in denen Ausgaben ohne Überprüfung vertraut wird.
Voreingenommenheit und anstößige Inhalte: Wenn die Trainingsdaten voreingenommene oder anstößige Elemente enthalten, könnte das LLM voreingenommene oder anstößige Antworten erzeugen, was insbesondere in Produktionsumgebungen zu rechtlichen Haftungsrisiken führen kann.
Die Bewältigung dieser Risiken erfordert eine sorgfältige Nachbearbeitung der generierten Inhalte, einschließlich Techniken wie:
Inhaltsfilterung: Automatisches Filtern von Ausgaben, um sensible, voreingenommene oder anstößige Inhalte zu erkennen und zu blockieren.
Ausgabevalidierung: Validierung der Antwort des Modells, um sicherzustellen, dass sie den Sicherheitsrichtlinien und regulatorischen Standards entspricht, bevor sie an den Benutzer ausgeliefert wird.
Modell-Feinabstimmung: Sicherstellen, dass das Modell mit regulatorisch konformen Daten feinabgestimmt wird, und Anwenden von Reinforcement-Learning-Strategien, um schädliche Ausgaben zu vermeiden.
Durch die Einbindung dieser Strategien kann die Generierungsphase sicherer und zuverlässiger gestaltet werden und fügt eine Sicherheitsebene hinzu.
Lassen Sie uns nun ein Beispiel für Datenanonymisierung näher betrachten, bei dem verschiedene LlamaIndex-Postprozessoren verglichen und ein Beispiel für Verstöße gegen den Datenschutz gezeigt werden.
Sicheres RAG mit LlamaIndex und Milvus
Das folgende Notebook ist ein Beispiel für eine RAG-Pipeline, die mit LlamaIndex als LLM-Framework, Milvus als Vektordatenbank und drei verschiedenen Modulen erstellt wurde, die auf PII-Maskierung spezialisiert sind: eines mit einem Hugging Face NER-Modell, ein weiteres mit einem LLM (OpenAI) und Presidio, einer Microsoft-Bibliothek.
Du kannst dir auch den vollständigen Code in diesem Colab-Notebook ansehen.
Schritt 1: Umgebungsvariablen einrichten
Wir benötigen einen OpenAI-Schlüssel, um das Modul mit OpenAI-Modellen zu testen.
from google.colab import userdata
import os
os.environ["OPENAI_API_KEY"] = userdata.get('OPENAI_API_KEY')
Schritt 2: Text mit privaten Daten definieren
Zuerst definieren wir einen kurzen Text, der private Informationen wie Kreditkartennummern, Namen oder Geburtsdaten enthält.
from llama_index.core.postprocessor import NERPIINodePostprocessor
from llama_index.core.schema import TextNode, NodeWithScore
text = """
Hi, I'm Sarah Mitchell, and I just got a new credit card with the number 3714-496089-47322.
My personal email is sarah.mitchell@mailbox.com, and I'm currently based in Sydney.
By the way, I tried paying my utility bill with card number 6011-5832-9109-1726, but it didn't work.
For my bank transactions, I use this IBAN: NL91ABNA0417164300.
Also, can you help me with my Wi-Fi issues? I keep getting blocked by IP address 203.0.113.15.
I've shared a family photo on my personal blog at https://www.sarahs-lifediary.org/.
Oh, and my grandfather, George Stone, was born in 1921, while my grandmother, Emily Clarkson, was born in 1925.
Last question--what's the spending limit on my main card, the one ending in 8473?
"""
node = TextNode(text=text)
Schritt 3: NER-Modell für PII-Maskierung: NERPIINodePostprocessor
NERPIINodePostprocessor ist ein Modul aus Llama Index, das diese Informationen mithilfe eines Hugging-Face-Modells maskiert, das auf NER (Named Entity Recognition) spezialisiert ist.
from llama_index.core.postprocessor import NERPIINodePostprocessor
from llama_index.core.schema import TextNode, NodeWithScore
processor = NERPIINodePostprocessor()
new_nodes = processor.postprocess_nodes([NodeWithScore(node=node)])
print(new_nodes[0].node.get_text())
Wir sehen, dass dieses spezifische Modell einige Informationen maskiert, private Daten aber weiterhin sichtbar sind. Die Verwendung dieses Ansatzes würde ein Datenleck darstellen. Daher sollte ein anderes Modell oder ein anderer Ansatz verwendet werden.
"""
Output:
Hi, I'm [PER_9], and I just got a new credit card with the number 3714-496089-47322.
My personal email is sarah.mitchell@mailbox.com, and I'm currently based in [LOC_169].
By the way, I tried paying my utility bill with card number 6011-5832-9109-1726, but it didn't work.
For my bank transactions, I use this IBAN: NL91ABNA0417164300.
Also, can you help me with my Wi-[MISC_374] issues? I keep getting blocked by IP address 203.0.113.15.
I've shared a family photo on my personal blog at https://www.sarahs-lifediary.org/.
Oh, and my grandfather, [PER_545], was born in 1921, while my grandmother, [PER_599], was born in 1925.
Last question--what's the spending limit on my main card, the one ending in 8473?
"""
Schritt 4: LLM für PII-Maskierung: PIINodePostprocessor
PIINodePostprocessor ist ein Modul aus Llama Index, das ein LLM-Modell verwendet, um sensible Informationen zu maskieren. Um die Effizienz dieses Ansatzes zu testen, verwenden wir das standardmäßige OpenAI-Modell.
from llama_index.core.postprocessor import PIINodePostprocessor
from llama_index.core.schema import TextNode, NodeWithScore
from llama_index.llms.openai import OpenAI
processor = PIINodePostprocessor(llm=OpenAI())
new_nodes = processor.postprocess_nodes([NodeWithScore(node=node)])
print(new_nodes[0].node.get_text())
Mit diesem Ansatz kann das Modell alle sensiblen Informationen erkennen und entsprechend maskieren.
"""
Output:
Hallo, ich bin [NAME1] [NAME2], und ich habe gerade eine neue Kreditkarte mit der Nummer [CREDIT_CARD_NUMBER1] bekommen.
Meine persönliche E-Mail-Adresse ist [EMAIL], und ich bin derzeit in [CITY] ansässig.
Übrigens habe ich versucht, meine Stromrechnung mit der Kartennummer [CREDIT_CARD_NUMBER2] zu bezahlen, aber es hat nicht funktioniert.
Für meine Banktransaktionen verwende ich diese IBAN: [IBAN].
Außerdem, kannst du mir bei meinen WLAN-Problemen helfen? Ich werde ständig von der IP-Adresse [IP_ADDRESS] blockiert.
Ich habe ein Familienfoto auf meinem persönlichen Blog unter [URL] geteilt.
Ach ja, mein Großvater, [NAME3] [NAME4], wurde am [DATE1] geboren, während meine Großmutter, [NAME5] [NAME6], am [DATE2] geboren wurde.
Letzte Frage--wie hoch ist das Ausgabenlimit meiner Hauptkarte, derjenigen, die auf [CREDIT_CARD_ENDING] endet.
"""
Schritt 5: Presidio für PII-Maskierung
Schließlich testen wir Presidio, eine Microsoft-Bibliothek, die sensible Informationen mithilfe eines auf NER spezialisierten Spacy-Modells maskiert.
from llama_index.postprocessor.presidio import PresidioPIINodePostprocessor
from llama_index.core.schema import TextNode, NodeWithScore
from llama_index.llms.openai import OpenAI
processor = PresidioPIINodePostprocessor()
new_nodes = processor.postprocess_nodes([NodeWithScore(node=node)])
print(new_nodes[0].node.get_text())
Diesmal sehen wir, dass das Modell alle Informationen maskieren kann, außer der Kreditkartennummer, da sie als Teil davon als Führerschein betrachtet wird. Im nächsten Schritt werden wir mehrere Abfragen mit diesem Modell testen und zeigen, wie Datenschutzverletzungen möglich sind, weil ein Teil der Kreditkartennummer verfügbar ist.
"""
Output:
Hi, I'm <PERSON_3>, and I just got a new credit card with the number 3714-<US_DRIVER_LICENSE_1>-47322.
My personal email is <EMAIL_ADDRESS_1>, and I'm currently based in <LOCATION_1>.
By the way, I tried paying my utility bill with card number <IN_PAN_1>9109-1726, but it didn't work.
For my bank transactions, I use this IBAN: <IBAN_CODE_1>.
Also, can you help me with my Wi-Fi issues? I keep getting blocked by IP address <IP_ADDRESS_1>.
I've shared a family photo on my personal blog at <URL_1>
Oh, and my grandfather, <PERSON_2>, was born in <DATE_TIME_2>, while my grandmother, <PERSON_1>, was born in <DATE_TIME_1>.
Last question--what's the spending limit on my main card, the one ending in 8473?
"""
Schritt 6: Retrieval mit Milvus
Zuerst erstellen wir eine Milvus-Vektordatenbank, um unseren Text zu speichern.
from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.vector_stores.milvus import MilvusVectorStore
vector_store = MilvusVectorStore(
uri="./milvus_demo.db", dim=1536, overwrite=True
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex([n.node for n in new_nodes], storage_context=storage_context)
Als Nächstes testen wir einige Abfragen.
Diese erste Abfrage funktioniert korrekt. Sie liefert uns die richtige Antwort und hält die Informationen maskiert.
response = index.as_query_engine().query(
"What is the name of the person?"
)
print(str(response))
"""
Output:
The name of the person is <PERSON_3>.
"""
Nun versuchen wir, die Kreditkartennummer zu erhalten, und wir sehen, dass wir die vollständige Nummer bekommen, wobei ein Teil davon als Führerschein maskiert ist.
response = index.as_query_engine().query(
"What is the number of the credit card?"
)
print(str(response))
"""
Output:
The number of the credit card is 3714-<US_DRIVER_LICENSE_1>-47322.
"""
Es ist aber auch bekannt, dass alle Kreditkartenaussteller eine zugewiesene IIN (Issuer Identification Number) haben. Die ersten Ziffern definieren den Aussteller. In diesem Fall bedeutet 37 also American Express. Wenn du es nicht weißt, können wir es überprüfen, indem wir das Modell fragen.
response = index.as_query_engine().query(
"What is the issuer of the credit card number?"
)
print(str(response))
The issuer of the credit card number is American Express
Wir sehen also, dass das Modell den Kartenaussteller erkennen kann, obwohl diese Information im Text nicht bereitgestellt wurde. Das bedeutet, dass das Modell mit Kreditkarteninformationen über Aussteller trainiert wurde und die Antwort mit seinem Wissen liefern kann. Dies ist ein Beispiel für Datenschutzverletzungen in der Generierungsphase, wie oben beschrieben.
Fazit
Oz führte uns durch die verschiedenen Phasen einer RAG-Pipeline und hob hervor, wo Sicherheitsbedenken adressiert werden können. Das erste zentrale Anliegen betrifft die Datenanonymisierung, um sicherzustellen, dass sensible Daten nicht von unbefugten Dritten abgerufen werden können. Es ist jedoch wichtig, daran zu denken, dass LLM-Foundation Models mit diesen Daten trainiert worden sein könnten, wodurch die Modelle selbst zu potenziellen Quellen für Datenlecks werden.
Um Datenzugriff und -übertragung zu sichern, sind Zugriffskontrolle und Verschlüsselung entscheidend. Diese Techniken bieten ein hohes Maß an Sicherheit und Kontrolle, aber Bedrohungen wie Prompt Injection und Suchmanipulation stellen weiterhin Risiken für sensible Informationen dar.
Daher ist das Hinzufügen mehrerer Sicherheitsebenen in der gesamten Pipeline unerlässlich, um potenzielle Bedrohungen zu mindern. Eine produktionsreife RAG-Anwendung muss in jeder Phase robuste Sicherheitsmaßnahmen integrieren, um sicherzustellen, dass das System widerstandsfähig gegen Angriffe ist und regulatorischen Standards entspricht.
Weitere Ressourcen
Weiterlesen

Migrating from S3 Vectors to Zilliz Cloud: Unlocking the Power of Tiered Storage
Learn how Zilliz Cloud bridges cost and performance with tiered storage and enterprise-grade features, and how to migrate data from AWS S3 Vectors to Zilliz Cloud.

Zilliz Cloud Update: Tiered Storage, Business Critical Plan, Cross-Region Backup, and Pricing Changes
This release offers a rebuilt tiered storage with lower costs, a new Business Critical plan for enhanced security, and pricing updates, among other features.

What Exactly Are AI Agents? Why OpenAI and LangChain Are Fighting Over Their Definition?
AI agents are software programs powered by AI that can perceive their environment, make decisions, and take actions to achieve a goal—often autonomously.



