suchen
HeimBackend-EntwicklungPython-TutorialAufbau eines schnellen und effizienten semantischen Suchsystems mit OpenVINO und Postgres

Building a Fast and Efficient Semantic Search System Using OpenVINO and Postgres

Foto von real-napster auf Pixabay

In einem meiner letzten Projekte musste ich ein semantisches Suchsystem aufbauen, das mit hoher Leistung skalierbar ist und Echtzeit-Antworten für Berichtssuchen liefert. Um dies zu erreichen, haben wir PostgreSQL mit pgvector auf AWS RDS in Kombination mit AWS Lambda verwendet. Die Herausforderung bestand darin, den Benutzern die Suche mit Abfragen in natürlicher Sprache zu ermöglichen, anstatt sich auf starre Schlüsselwörter zu verlassen, und gleichzeitig sicherzustellen, dass die Antworten weniger als 1–2 Sekunden oder sogar weniger dauerten und nur CPU-Ressourcen nutzen konnten.

In diesem Beitrag werde ich die Schritte durchgehen, die ich zum Aufbau dieses Suchsystems unternommen habe, vom Abrufen bis zum Neuranking, und die Optimierungen, die mit OpenVINO und intelligentem Batching für die Tokenisierung vorgenommen wurden.

Überblick über die semantische Suche: Abrufen und Neuranking

Moderne, hochmoderne Suchsysteme bestehen in der Regel aus zwei Hauptschritten: Retrieval und Reranking.

1) Abruf: Der erste Schritt besteht darin, eine Teilmenge relevanter Dokumente basierend auf der Benutzerabfrage abzurufen. Dies kann mithilfe vorab trainierter Einbettungsmodelle erfolgen, z. B. der kleinen und großen Einbettungen von OpenAI, der Einbettungsmodelle von Cohere oder der mxbai-Einbettungen von Mixbread. Der Abruf konzentriert sich auf die Eingrenzung des Dokumentenpools durch Messung ihrer Ähnlichkeit mit der Abfrage.

Hier ist ein vereinfachtes Beispiel, bei dem die Satztransformatoren-Bibliothek von Huggingface zum Abrufen verwendet wird, eine meiner Lieblingsbibliotheken hierfür:

from sentence_transformers import SentenceTransformer
import numpy as np

# Load a pre-trained sentence transformer model
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")

# Sample query and documents (vectorize the query and the documents)
query = "How do I fix a broken landing gear?"
documents = ["Report 1 on landing gear failure", "Report 2 on engine problems"]

# Get embeddings for query and documents
query_embedding = model.encode(query)
document_embeddings = model.encode(documents)

# Calculate cosine similarity between query and documents
similarities = np.dot(document_embeddings, query_embedding)

# Retrieve top-k most relevant documents
top_k = np.argsort(similarities)[-5:]
print("Top 5 documents:", [documents[i] for i in top_k])

2) Neues Ranking: Sobald die relevantesten Dokumente abgerufen wurden, verbessern wir das Ranking dieser Dokumente mithilfe eines Cross-Encoder-Modells weiter. In diesem Schritt wird jedes Dokument in Bezug auf die Abfrage noch genauer bewertet, wobei der Schwerpunkt auf einem tieferen Kontextverständnis liegt.
Eine Neubewertung ist von Vorteil, da sie eine zusätzliche Verfeinerungsebene hinzufügt, indem die Relevanz jedes Dokuments genauer bewertet wird.

Hier ist ein Codebeispiel für das Reranking mit Cross-Encoder/ms-marco-TinyBERT-L-2-v2, einem leichten Cross-Encoder:

from sentence_transformers import CrossEncoder

# Load the cross-encoder model
cross_encoder = CrossEncoder("cross-encoder/ms-marco-TinyBERT-L-2-v2")

# Use the cross-encoder to rerank top-k retrieved documents
query_document_pairs = [(query, doc) for doc in documents]
scores = cross_encoder.predict(query_document_pairs)

# Rank documents based on the new scores
top_k_reranked = np.argsort(scores)[-5:]
print("Top 5 reranked documents:", [documents[i] for i in top_k_reranked])

Engpässe identifizieren: Die Kosten der Tokenisierung und Vorhersage

Während der Entwicklung habe ich festgestellt, dass die Tokenisierungs- und Vorhersagephasen ziemlich lange dauerten, wenn 1.000 Berichte mit Standardeinstellungen für Satztransformatoren verarbeitet wurden. Dies führte zu einem Leistungsengpass, insbesondere da wir Antworten in Echtzeit anstrebten.

Unten habe ich meinen Code mit SnakeViz profiliert, um die Leistungen zu visualisieren:

Building a Fast and Efficient Semantic Search System Using OpenVINO and Postgres

Wie Sie sehen, sind die Tokenisierungs- und Vorhersageschritte unverhältnismäßig langsam, was zu erheblichen Verzögerungen bei der Bereitstellung von Suchergebnissen führt. Insgesamt dauerte es durchschnittlich 4-5 Sekunden. Dies liegt daran, dass es zwischen den Tokenisierungs- und Vorhersageschritten Blockierungsoperationen gibt. Wenn wir auch andere Vorgänge wie Datenbankaufrufe, Filter usw. zusammenzählen, kamen wir locker auf insgesamt 8-9 Sekunden.

Leistungsoptimierung mit OpenVINO

Die Frage, mit der ich konfrontiert wurde, war: Können wir es schneller machen? Die Antwort lautet: Ja, indem wir OpenVINO nutzen, ein optimiertes Backend für CPU-Inferenz. OpenVINO trägt dazu bei, die Deep-Learning-Modellinferenz auf Intel-Hardware zu beschleunigen, die wir auf AWS Lambda verwenden.

Codebeispiel für OpenVINO-Optimierung
So habe ich OpenVINO in das Suchsystem integriert, um die Inferenz zu beschleunigen:

from sentence_transformers import SentenceTransformer
import numpy as np

# Load a pre-trained sentence transformer model
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")

# Sample query and documents (vectorize the query and the documents)
query = "How do I fix a broken landing gear?"
documents = ["Report 1 on landing gear failure", "Report 2 on engine problems"]

# Get embeddings for query and documents
query_embedding = model.encode(query)
document_embeddings = model.encode(documents)

# Calculate cosine similarity between query and documents
similarities = np.dot(document_embeddings, query_embedding)

# Retrieve top-k most relevant documents
top_k = np.argsort(similarities)[-5:]
print("Top 5 documents:", [documents[i] for i in top_k])

Mit diesem Ansatz könnten wir eine 2-3-fache Beschleunigung erreichen und die ursprünglichen 4-5 Sekunden auf 1-2 Sekunden reduzieren. Der vollständige Arbeitscode ist auf Github.

Feinabstimmung für Geschwindigkeit: Batch-Größe und Tokenisierung

Ein weiterer entscheidender Faktor zur Verbesserung der Leistung war die Optimierung des Tokenisierungsvorgangs und die Anpassung der Stapelgröße und der Token-Länge. Durch Erhöhen der Batch-Größe (batch_size=16) und Reduzieren der Token-Länge (max_length=512) konnten wir die Tokenisierung parallelisieren und den Overhead sich wiederholender Vorgänge reduzieren. In unseren Experimenten haben wir herausgefunden, dass eine Batchgröße zwischen 16 und 64 gut funktioniert, wobei alles, was größer ist, die Leistung beeinträchtigt. Ebenso haben wir uns für eine maximale Länge von 128 entschieden, was sinnvoll ist, wenn die durchschnittliche Länge Ihrer Berichte relativ kurz ist. Mit diesen Änderungen haben wir insgesamt eine 8-fache Beschleunigung erreicht und die Reranking-Zeit auf unter 1 Sekunde reduziert, selbst auf der CPU.

In der Praxis bedeutete dies, mit verschiedenen Stapelgrößen und Token-Längen zu experimentieren, um das richtige Gleichgewicht zwischen Geschwindigkeit und Genauigkeit für Ihre Daten zu finden. Dadurch konnten wir deutliche Verbesserungen der Reaktionszeiten feststellen, sodass das Suchsystem auch bei 1.000 Berichten skalierbar ist.

Abschluss

Durch die Verwendung von OpenVINO und die Optimierung der Tokenisierung und Stapelverarbeitung konnten wir ein leistungsstarkes semantisches Suchsystem aufbauen, das Echtzeitanforderungen in einem reinen CPU-Setup erfüllt. Tatsächlich haben wir insgesamt eine 8-fache Beschleunigung erlebt. Die Kombination aus Retrieval mithilfe von Satztransformatoren und Reranking mit einem Cross-Encoder-Modell schafft ein leistungsstarkes, benutzerfreundliches Sucherlebnis.

Wenn Sie ähnliche Systeme mit Einschränkungen hinsichtlich Reaktionszeit und Rechenressourcen erstellen, empfehle ich Ihnen dringend, OpenVINO und intelligentes Batching auszuprobieren, um eine bessere Leistung zu erzielen.

Hoffentlich hat Ihnen dieser Artikel gefallen. Wenn Sie diesen Artikel nützlich fanden, geben Sie mir ein „Gefällt mir“, damit auch andere ihn finden und ihn mit Ihren Freunden teilen können. Folgen Sie mir auf Linkedin, um über meine Arbeit auf dem Laufenden zu bleiben. Danke fürs Lesen!

Das obige ist der detaillierte Inhalt vonAufbau eines schnellen und effizienten semantischen Suchsystems mit OpenVINO und Postgres. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Der Hauptzweck von Python: Flexibilität und BenutzerfreundlichkeitDer Hauptzweck von Python: Flexibilität und BenutzerfreundlichkeitApr 17, 2025 am 12:14 AM

Die Flexibilität von Python spiegelt sich in Multi-Paradigm-Unterstützung und dynamischen Typsystemen wider, während eine einfache Syntax und eine reichhaltige Standardbibliothek stammt. 1. Flexibilität: Unterstützt objektorientierte, funktionale und prozedurale Programmierung und dynamische Typsysteme verbessern die Entwicklungseffizienz. 2. Benutzerfreundlichkeit: Die Grammatik liegt nahe an der natürlichen Sprache, die Standardbibliothek deckt eine breite Palette von Funktionen ab und vereinfacht den Entwicklungsprozess.

Python: Die Kraft der vielseitigen ProgrammierungPython: Die Kraft der vielseitigen ProgrammierungApr 17, 2025 am 12:09 AM

Python ist für seine Einfachheit und Kraft sehr beliebt, geeignet für alle Anforderungen von Anfängern bis hin zu fortgeschrittenen Entwicklern. Seine Vielseitigkeit spiegelt sich in: 1) leicht zu erlernen und benutzten, einfachen Syntax; 2) Reiche Bibliotheken und Frameworks wie Numpy, Pandas usw.; 3) plattformübergreifende Unterstützung, die auf einer Vielzahl von Betriebssystemen betrieben werden kann; 4) Geeignet für Skript- und Automatisierungsaufgaben zur Verbesserung der Arbeitseffizienz.

Python in 2 Stunden am Tag lernen: Ein praktischer LeitfadenPython in 2 Stunden am Tag lernen: Ein praktischer LeitfadenApr 17, 2025 am 12:05 AM

Ja, lernen Sie Python in zwei Stunden am Tag. 1. Entwickeln Sie einen angemessenen Studienplan, 2. Wählen Sie die richtigen Lernressourcen aus, 3. Konsolidieren Sie das durch die Praxis erlernte Wissen. Diese Schritte können Ihnen helfen, Python in kurzer Zeit zu meistern.

Python gegen C: Vor- und Nachteile für EntwicklerPython gegen C: Vor- und Nachteile für EntwicklerApr 17, 2025 am 12:04 AM

Python eignet sich für eine schnelle Entwicklung und Datenverarbeitung, während C für hohe Leistung und zugrunde liegende Kontrolle geeignet ist. 1) Python ist einfach zu bedienen, mit prägnanter Syntax, und eignet sich für Datenwissenschaft und Webentwicklung. 2) C hat eine hohe Leistung und eine genaue Kontrolle und wird häufig bei der Programmierung von Spielen und Systemen verwendet.

Python: zeitliches Engagement und LerntempoPython: zeitliches Engagement und LerntempoApr 17, 2025 am 12:03 AM

Die Zeit, die zum Erlernen von Python erforderlich ist, variiert von Person zu Person, hauptsächlich von früheren Programmiererfahrungen, Lernmotivation, Lernressourcen und -methoden und Lernrhythmus. Setzen Sie realistische Lernziele und lernen Sie durch praktische Projekte am besten.

Python: Automatisierung, Skript- und AufgabenverwaltungPython: Automatisierung, Skript- und AufgabenverwaltungApr 16, 2025 am 12:14 AM

Python zeichnet sich in Automatisierung, Skript und Aufgabenverwaltung aus. 1) Automatisierung: Die Sicherungssicherung wird durch Standardbibliotheken wie OS und Shutil realisiert. 2) Skriptschreiben: Verwenden Sie die PSUTIL -Bibliothek, um die Systemressourcen zu überwachen. 3) Aufgabenverwaltung: Verwenden Sie die Zeitplanbibliothek, um Aufgaben zu planen. Die Benutzerfreundlichkeit von Python und die Unterstützung der reichhaltigen Bibliothek machen es zum bevorzugten Werkzeug in diesen Bereichen.

Python und Zeit: Machen Sie das Beste aus Ihrer StudienzeitPython und Zeit: Machen Sie das Beste aus Ihrer StudienzeitApr 14, 2025 am 12:02 AM

Um die Effizienz des Lernens von Python in einer begrenzten Zeit zu maximieren, können Sie Pythons DateTime-, Zeit- und Zeitplanmodule verwenden. 1. Das DateTime -Modul wird verwendet, um die Lernzeit aufzuzeichnen und zu planen. 2. Das Zeitmodul hilft, die Studie zu setzen und Zeit zu ruhen. 3. Das Zeitplanmodul arrangiert automatisch wöchentliche Lernaufgaben.

Python: Spiele, GUIs und mehrPython: Spiele, GUIs und mehrApr 13, 2025 am 12:14 AM

Python zeichnet sich in Gaming und GUI -Entwicklung aus. 1) Spielentwicklung verwendet Pygame, die Zeichnungen, Audio- und andere Funktionen bereitstellt, die für die Erstellung von 2D -Spielen geeignet sind. 2) Die GUI -Entwicklung kann Tkinter oder Pyqt auswählen. Tkinter ist einfach und einfach zu bedienen. PYQT hat reichhaltige Funktionen und ist für die berufliche Entwicklung geeignet.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

EditPlus chinesische Crack-Version

EditPlus chinesische Crack-Version

Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools

Sicherer Prüfungsbrowser

Sicherer Prüfungsbrowser

Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

SublimeText3 Englische Version

SublimeText3 Englische Version

Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung