Einrichtung mit Facebook AI Similarity Search (FAISS)
Hallo, Technikbegeisterte! Heute begeben wir uns auf eine Reise, um ein Tool zu erkunden, das in der künstlichen Intelligenz hohe Wellen schlägt: Facebooks KI-Ähnlichkeitssuche (FAISS). Angenommen, Sie haben sich schon einmal gefragt, wie Spotify Songs findet, die Ihren Favoriten unheimlich ähnlich klingen, oder wie Google Photos es schafft, Bilder derselben Person zu gruppieren. In diesem Fall werden Sie gleich das Geheimnis lüften.
Ähnlichkeitssuche oder Suche nach nächsten Nachbarn ist ein entscheidender Aspekt vieler KI- und Machine-Learning-Anwendungen. Es geht darum, die Datenpunkte zu finden, die einem gegebenen Abfragepunkt am ähnlichsten sind. Wenn Sie beispielsweise auf Spotify nach einem Song suchen, muss das System die Songs finden, die Ihrer Suchanfrage am „ähnlichsten“ sind – daher eine Ähnlichkeitssuche.
So beeindruckend diese effiziente Ähnlichkeitssuche auch klingt, es gibt einen Haken. Traditionelle Methoden der Ähnlichkeitssuche können bei großen Datenmengen furchtbar langsam werden. Genau hier kommt FAISS ins Spiel und löst die Einschränkungen traditioneller Abfrage-Suchmaschinen. Es ist eine von Facebook AI entwickelte Bibliothek für effiziente Ähnlichkeit, die zuverlässige Lösungen für Probleme der Ähnlichkeitssuche bietet, insbesondere beim Umgang mit Daten in großem Maßstab.
Aber genug geplaudert! Dieser Blogbeitrag führt Sie durch die Einrichtung von FAISS, zeigt Ihnen, wie Sie es zum Laufen bringen, und demonstriert seine Leistungsfähigkeit anhand eines Beispielprogramms zur Ähnlichkeitssuche. Also schnallen Sie sich an, denn wir tauchen gleich tief in die faszinierende Welt der effizienten Ähnlichkeitssuche mit FAISS ein. Das wird eine spaßige Fahrt!
FAISS verstehen (Facebook AI Similarity Search)
Nachdem wir unseren Appetit mit einer kurzen Einführung angeregt haben, lassen Sie uns tiefer in FAISS eintauchen. FAISS, oder Facebook AI Similarity Search, ist eine Bibliothek von Algorithmen für die Vektorähnlichkeitssuche und das Clustering dichter Vektoren. Es ist die Idee des KI-Teams von Facebook, das sie entwickelt hat, um große Datenbanken effizient zu handhaben.
FAISS funktioniert hauptsächlich auf Grundlage des Konzepts der „Vektorähnlichkeit“. Laienhaft ausgedrückt sind Vektoren im Wesentlichen eine Liste von Zahlen, und bei Ähnlichkeit geht es darum, wie ähnlich sich zwei Vektoren sind. Stellen Sie sich vor, Sie versuchen, einen Song zu finden, der zur Stimmung Ihres aktuellen Lieblingssongs passt. Vektoren können beide Songs darstellen, wobei verschiedene Elemente ähnlicher Vektoren unterschiedliche Songmerkmale repräsentieren. Sie können die „Ähnlichkeit“ zwischen diesen Songs vergleichen, indem Sie die Distanz ihrer Vektoren in einem hochdimensionalen Raum vergleichen. Die euklidische Distanz spielt eine entscheidende Rolle bei der Messung dieser Ähnlichkeit zwischen Vektoren.
Hier zeigt FAISS, was es kann. Es bietet eine Möglichkeit, Millionen oder sogar Milliarden dieser Vektoren schnell und genau zu vergleichen. Es ist, als hätten Sie eine hochgerüstete Suchmaschine, die im Handumdrehen eine riesige Musikbibliothek durchsuchen und die Songs ermitteln kann, die Ihrem Lieblingssong am ähnlichsten sind. Indizierte Vektoren sind in diesem Prozess unerlässlich, da sie es dem System ermöglichen, effizient nach den nächsten Übereinstimmungen zu einem gegebenen Abfragevektor zu suchen.
Doch die Magie von FAISS endet nicht bei Musikempfehlungen. Viele Anwendungen nutzen FAISS, von Bilderkennung und Textabruf bis hin zu Clustering und Datenanalyse. Wann immer Sie eine große Datenmenge haben und ähnliche Elemente schnell finden müssen, könnte FAISS Ihr bevorzugtes Tool sein.
FAISS einrichten
Dieser Abschnitt führt Sie durch die Einrichtung von FAISS auf einem Linux-System.
Conda installieren
Bevor Sie FAISS installieren, muss Conda auf Ihrem System installiert sein. Conda ist ein Open-Source-Paket- und Umgebungsverwaltungssystem, das unter Windows, macOS und Linux läuft.
Befolgen Sie diese Schritte, um Conda auf einem Linux-System zu installieren:
Laden Sie den Miniconda-Installer für Linux von der offiziellen Website herunter.
Überprüfen Sie die Hashes Ihres Installers.
Öffnen Sie ein Terminalfenster und führen Sie den folgenden Befehl aus, um die Installation zu starten:
bash Miniconda3-latest-Linux-x86_64.sh
Wenn der Installer startet, wird er Ihnen einige Fragen stellen. Wenn Sie sich bei etwas nicht sicher sind, wählen Sie die Standardoptionen. Sie können die Einstellungen später jederzeit ändern.
Sobald Sie mit der Installation fertig sind, schließen Sie Ihr Terminalfenster und öffnen Sie es erneut. Dadurch wird sichergestellt, dass alle von Ihnen vorgenommenen Änderungen aktiviert werden.
Nun sollten Sie überprüfen, ob alles ordnungsgemäß installiert ist. Geben Sie dazu conda list in Ihr Terminalfenster oder den Anaconda Prompt ein und drücken Sie Enter. Wenn alles richtig funktioniert, sehen Sie eine Liste der installierten Pakete.
FAISS installieren
Sie können FAISS über Conda installieren. Das FAISS-Paket hat zwei Versionen: eine reine CPU-Version (faiss-cpu) und eine Version, die sowohl CPU- als auch GPU-Indizes enthält (faiss-gpu). Je nach Ihren Anforderungen können Sie eine dieser Versionen installieren.
Die empfohlene Methode zur Installation von FAISS ist über den PyTorch Conda-Channel. Hier sind die Befehle zur Installation der neuesten stabilen Version von FAISS.
Für die CPU-Version:
conda install -c pytorch faiss-cpu
Für die GPU-Version:
conda install -c pytorch faiss-gpu
Zusätzlich wird FAISS von conda-forge paketiert, einem Community-getriebenen Paketierungs-Ökosystem für Conda. Sie können FAISS mit den folgenden Befehlen von conda-forge installieren. Für die reine CPU-Version:
conda install -c conda-forge faiss-cpu
Für die GPU-Version:
conda install -c conda-forge faiss-gpu
Beispielcode-Durchgang mit SQuAD
Sie können überprüfen, aus welchem Channel Ihre Conda-Pakete stammen, indem Sie den Befehl conda list verwenden.
Verwenden wir für diese Demonstration das Stanford Question Answering Dataset (SQuAD). SQuAD ist ein beliebter Datensatz für Natural Language Processing (NLP) und eine hervorragende Möglichkeit, zu veranschaulichen, wie FAISS funktioniert. Dieser Datensatz enthält Frage-Antwort-Paare, wobei die Antwort auf jede Frage ein Textabschnitt oder „Span“ aus der entsprechenden Lesepassage ist. Im Suchprozess werden Abfragevektoren verwendet, um die relevantesten Antworten zu finden, indem sie mit dem Datensatz verglichen werden.
Bevor wir in den Code eintauchen, laden wir zunächst den SQuAD-Datensatz herunter und bereiten ihn vor:
SQuAD-Datensatz herunterladen: Sie können den Datensatz von der SQuAD-Website herunterladen. Der Einfachheit halber verwenden wir SQuAD 1.1. Sie können den Datensatz über den folgenden Link herunterladen: SQuAD 1.1 Train. Laden Sie die JSON-Datei (train-v1.1.json) herunter und speichern Sie sie in Ihrem Arbeitsverzeichnis.
JSON-Datei lesen: Nun können Sie die Python JSON-Bibliothek verwenden, um die Daten zu laden:
with open('train-v1.1.json', 'r') as file: squad_data = json.load(file)
Numerische Vektoren sind im FAISS-Index unverzichtbar, da sie effiziente Distanzmessungen und Abfragen innerhalb des IndexFlatL2 ermöglichen.
Erforderliche Bibliotheken importieren
Der erste Schritt besteht darin, alle erforderlichen Bibliotheken zu importieren. Wir benötigen numpy für numerische Operationen, Faiss für unsere Vektorähnlichkeitssuche, JSON zum Laden unseres Datensatzes und nltk, um unseren Text zu tokenisieren.
import numpy as np
import faiss
import json
from nltk.tokenize import word_tokenize
Daten laden und vorverarbeiten
Laden wir den SQuAD-Datensatz. Es handelt sich um eine JSON-Datei, daher können wir die load-Funktion des JSON-Moduls verwenden.
with open('train-v1.1.json', 'r') as file:
squad_data = json.load(file)
Wir gehen davon aus, dass das JSON-Objekt ein Dictionary ist, das einen data-Schlüssel und eine Liste von Dictionaries enthält. Jedes Dictionary in der Liste stellt einen Artikel dar, der einen paragraph-Schlüssel mit einer Liste von Absätzen enthält.
Nun verarbeiten wir die Daten vor. Wir tokenisieren jeden Absatz mit der word_tokenize-Funktion von nltk, die einen Satz in einzelne Wörter aufteilt. Anschließend stellen wir jedes Wort als One-Hot-kodierten Vektor dar.
vocabulary = set(word for article in squad_data['data'] for paragraph in article['paragraphs'] for word in word_tokenize(paragraph['context']))
word_to_index = {word: index for index, word in enumerate(vocabulary)}
def convert_text_to_vector(text):
words = word_tokenize(text)
bow_vector = np.zeros(len(vocabulary))
for word in words:
word in word_to_index:
bow_vector[word_to_index[word]] = 1
return bow_vector
paragraph_vectors = [convert_text_to_vector(paragraph['context']) for article in squad_data['data'] for paragraph in article['paragraphs']]
Erstellen des Index
Jetzt, da wir unsere Daten im richtigen Format haben, können wir unseren FAISS-Index erstellen. Wir verwenden den Indextyp IndexFlatL2, einen einfachen L2-Distanzindex.
dimension = len(vocabulary)
index = faiss.IndexFlatL2(dimension)
# Convert our list of NumPy arrays to a single 2D array
paragraph_vectors = np.stack(paragraph_vectors).astype('float32')
index.add(paragraph_vectors)
Der Typ IndexFlatL2 erfordert, dass wir die Dimension unserer Daten angeben. Da jeder unserer Vektoren One-Hot-codiert ist, entspricht die Dimension der Größe unseres Vokabulars.
Anschließend fügen wir unsere Daten mit der add-Methode zum Index hinzu, die ein 2D-NumPy-Array erfordert.
Durchführen einer FAISS-Vektorsuche
Nachdem unser Index vollständig eingerichtet ist, können wir nun Detektiv spielen und Absätze in unserem Datensatz finden, die am ehesten zu unserer Suchanfrage passen.
Hier ist unsere Suchfunktion:
def search_for_paragraphs(search_term, num_results):
search_vector = convert_text_to_vector(search_term)
search_vector = np.array([search_vector]).astype('float32')
distances, indexes = index.search(search_vector, num_results)
for i, (distance, index) in enumerate(zip(distances[0], indexes[0])):
print(f"Result {i+1}, Distance: {distance}")
print(squad_data['data'][index]['paragraphs'][0]['context'])
print()
Unser Suchbegriff ist "What is the capital of France?" und wir möchten 5 Ergebnisse finden:
search_term = "What is the capital of France?"
search_for_paragraphs(search_term, 5)
search_for_paragraphs() wandelt zuerst unseren Suchbegriff in einen codierten Vektor um. Anschließend verwenden wir diese Vektordarstellung als Suchmethode auf unserem Index. Dafür wird ein 2D-Array benötigt, daher fügen wir unserem Suchvektor eine zusätzliche Dimension hinzu.
Die Ähnlichkeitssuchmethode erfordert außerdem, dass wir angeben, wie viele Ergebnisse wir möchten (dafür ist num_results da). Die search-Methode liefert uns zwei 2D-Arrays: eines für die Distanzen der nächstgelegenen Ergebnisse und eines für ihre Indizes. Wir können diese Indizes verwenden, um die tatsächlichen Absätze in unserem Datensatz zu finden. Dann geben wir die Platzierung, die Ähnlichkeitsdistanz und den Absatztext jedes Ergebnisses aus.
Und da haben Sie es! Dies ist ein einfaches Beispiel dafür, wie man FAISS verwendet, um ähnliche Textdaten zu finden. Natürlich kann FAISS weitaus komplexere Dinge tun, wie die Suche in hochdimensionalen Vektorräumen. Dieses Beispiel sollte Ihnen jedoch einen guten Ausgangspunkt für die Verwendung von FAISS bieten.
Best Practices und Tipps
Haben Sie Ihre Daten? Lernen Sie sie kennen: Bevor Sie FAISS verwenden, nehmen Sie sich einen Moment Zeit, um Ihre Daten kennenzulernen. Stellen Sie Fragen wie diese: Sind sie mit hohen Zahlen gefüllt? Sind sie voller Lücken oder dicht mit Informationen gepackt? Ihre Daten zu kennen, hilft Ihnen, den richtigen Typ von FAISS-Index auszuwählen und den besten Weg zu bestimmen, Ihre Daten vorzubereiten.
Vorverarbeitung ist entscheidend: Wie Sie Ihre Daten vorbereiten, kann erheblich beeinflussen, wie gut FAISS funktioniert. Bei Textdaten sollten Sie darüber nachdenken, intelligentere Methoden zur Umwandlung von Wörtern in Zahlen zu verwenden, wie TF-IDF oder Word2Vec, anstatt nur One-Hot-Encoding. Bei Bildern versuchen Sie, Merkmale aus einem convolutional neural network (CNN) zu verwenden.
Wählen Sie den besten Index für sich: FAISS bietet verschiedene Indextypen, jeder mit besonderen Stärken. Einige eignen sich hervorragend für den Umgang mit Daten mit vielen Dimensionen, andere sind perfekt für binäre Vektoren, und manche sind für die Verarbeitung sehr, sehr großer Datenmengen gemacht. Stellen Sie also sicher, dass Sie denjenigen wählen, der für Ihre Anforderungen am besten geeignet ist.
Bündeln Sie Ihre Abfragen: Wenn Sie zu viele Abfragen gegen Ihren Index ausführen müssen, ist es effizienter, sie zu bündeln und alle auf einmal auszuführen. FAISS ist für die Stapelverarbeitung optimiert.
Stimmen Sie Ihre Parameter ab: FAISS verfügt über mehrere einstellbare Parameter, wie die Anzahl der Cluster in der Indexierungsphase und die Anzahl der Probes in der Phase der Vektorähnlichkeitssuche. Bleiben Sie nicht einfach bei den Standardwerten; experimentieren Sie mit verschiedenen Einstellungen, um herauszufinden, was für Ihre Daten am besten funktioniert.
Vektordatenbanken vs. FAISS
FAISS ist eine großartige Lösung für die ANN-Suche. Darüber hinaus stellt FAISS unterstützenden Code bereit, der zusätzliche Funktionalitäten für Auswertung und Parameterabstimmung im Zusammenhang mit Ähnlichkeitssuche und Clustering dichter Vektoren bietet. Dennoch hat es einige Einschränkungen, wenn Sie zig Millionen Vektoren für Speicherung und Abruf haben und gleichzeitig Echtzeitantworten oder erweiterte Funktionen im Zusammenhang mit Abfragevektoren benötigen.
Im Vergleich zu FAISS können speziell entwickelte Vektordatenbanken wie Milvus und Zilliz Cloud die oben genannten Herausforderungen bewältigen und verfügen über fortschrittlichere Fähigkeiten in den Bereichen:
Grundlegende Funktionalitäten wie CRUD-Unterstützung, Datenkonsistenz und Filtersuche
Systemverfügbarkeit mit starker Datenpersistenz und besserer Notfallwiederherstellung
Systemskalierbarkeit mit Unterstützung für Lastverteilung, einer verteilten Architektur, die Rechenleistung und Speicher trennt, sowie besserer Benutzerfreundlichkeit
RBAC mit Unterstützung für Multi-Tenancy, SDKs verschiedener Programmiersprachen, RESTful API und ein Monitoring-System.
Milvus ist die weltweit erste und beliebteste Open-Source-Vektordatenbank für Ähnlichkeitssuche im Milliardenmaßstab und KI-Anwendungen. Milvus kann über eine Milliarde Vektor-Embeddings speichern, indexieren und verwalten, die von tiefen neuronalen Netzen und anderen Machine-Learning-(ML-)Modellen erzeugt werden. Um Vektordatenbanken für jeden Entwickler und jede Organisation zugänglich zu machen, brachte Zilliz Milvus als Projekt in der Inkubationsphase in die LF AI & Data Foundation ein, und es schloss diese Phase im Juni 2021 erfolgreich ab.
Milvus Lite ist eine leichtgewichtige Version von Milvus, die lokal innerhalb Ihrer Python-Anwendung läuft. Basierend auf der beliebten Open-Source-Vektordatenbank Milvus verwendet Milvus Lite die Kernkomponenten für Vektorindexierung und Abfrageparsing wieder, während Elemente entfernt werden, die für hohe Skalierbarkeit in verteilten Systemen entwickelt wurden. Dieses Design macht es zu einer kompakten und effizienten Lösung, die ideal für Umgebungen mit begrenzten Rechenressourcen ist, wie Laptops, Jupyter Notebooks sowie mobile oder Edge-Geräte.
Zilliz Cloud ist ein vollständig verwalteter Vektordatenbankdienst, der auf Milvus basiert. Mit Zilliz Cloud ist der Vektorabruf zehnmal schneller, und die Bereitstellung und Skalierung von Vektorsuchanwendungen ist einfacher denn je. Zilliz Cloud bietet außerdem eine kostenlose Stufe, die jedem Entwickler Zugang zu dieser Spitzentechnologie ermöglicht, ohne eine finanzielle Verpflichtung einzugehen.
Fazit
Und damit haben Sie es! Gemeinsam haben wir die spannende Welt von Facebook AI Similarity Search, kurz FAISS, durchquert. Vom Verständnis dessen, was es ist und wie es funktioniert, über die Einrichtung auf Ihrem System bis hin zur Durcharbeitung von Beispielcode mit dem SQuAD-Datensatz und dazu, wie es sich von speziell entwickelten Vektordatenbanken unterscheidet, haben wir eine Menge abgedeckt.
Denken Sie daran: FAISS ist ein unglaublich leistungsfähiges Tool, das entwickelt wurde, um die Suche in riesigen Datenmengen nicht nur möglich, sondern auch effizient zu machen. Seine Vielseitigkeit bei der Unterstützung verschiedener Datentypen und -größen ist ein Beleg für sein Design.
Wenn Sie sich nun, ausgestattet mit diesem Wissen, auf den Weg machen, denken Sie an die Best Practices und Tipps, die wir besprochen haben. Ihre Daten zu verstehen, den richtigen Index zu wählen, Ihre Daten effektiv vorzuverarbeiten, Ihre Abfragen zu bündeln und Ihre Parameter abzustimmen – all diese Schritte können Ihre Ergebnisse erheblich verbessern.
Aber hören Sie hier nicht auf. Erkunden, experimentieren und lernen Sie weiter. Ob Sie tiefer in die verschiedenen Indextypen eintauchen, die FAISS bietet, komplexere Datenvorverarbeitungstechniken erkunden oder mit anspruchsvolleren Anwendungsfällen experimentieren – es gibt immer mehr zu lernen.
Dieser Beitrag wurde von Keshav Malik verfasst, einem hochqualifizierten und begeisterten Sicherheitsingenieur. Keshav interessiert sich leidenschaftlich für Automatisierung, Hacking und die Erkundung verschiedener Tools und Technologien. Er liebt es, innovative Lösungen für komplexe Probleme zu finden, und sucht ständig nach neuen Möglichkeiten, um als Fachkraft zu wachsen und sich zu verbessern. Er setzt sich dafür ein, immer einen Schritt voraus zu sein, und ist stets auf der Suche nach den neuesten und besten Tools und Technologien.
Weiterlesen

Build for the Boom: Why AI Agent Startups Should Build Scalable Infrastructure Early
Explore strategies for developing AI agents that can handle rapid growth. Don't let inadequate systems undermine your success during critical breakthrough moments.

Similarity Metrics for Vector Search
Exploring five similarity metrics for vector search: L2 or Euclidean distance, cosine distance, inner product, and hamming distance.

Vector Databases vs. Time Series Databases
Use a vector database for similarity search and semantic relationships; use a time series database for tracking value changes over time.



