Qgelm

Sorgfältiger als ChatGPT: Embeddings mit Azure OpenAI, Qdrant und Rust

Originalartikel

Backup

<html> <header class=„article-header“><h1 class=„articleheading“>Sorgf&#228;ltiger als ChatGPT: Embeddings mit Azure OpenAI, Qdrant und Rust</h1><div class=„publish-info“> Rainer Stropek</div></header><figure class=„aufmacherbild“><img src=„https://heise.cloudimg.io/width/700/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/shutterstock_1352756288-267a814378743fb8.jpeg“ srcset=„https://heise.cloudimg.io/width/700/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/shutterstock_1352756288-267a814378743fb8.jpeg 700w, https://heise.cloudimg.io/width/1050/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/shutterstock_1352756288-267a814378743fb8.jpeg 1050w, https://heise.cloudimg.io/width/1500/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/shutterstock_1352756288-267a814378743fb8.jpeg 1500w, https://heise.cloudimg.io/width/2300/q75.png-lossy-75.webp-lossy-75.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/shutterstock_1352756288-267a814378743fb8.jpeg 2300w“ alt=„“ class=„img-responsive“ referrerpolicy=„no-referrer“ /><figcaption class=„akwa-caption“>(Bild:&#160;Shutterstock.com/calimedia)</figcaption></figure><p><strong>Embeddings dienen dazu, die Essenz von Inhalten als Vektoren darzustellen. Vektordatenbanken helfen unter anderem dabei, &#228;hnliche Inhalte effizient zu finden.</strong></p><p>Wenn Menschen zum ersten Mal mit Large Language Models (kurz LLM) in Kontakt kommen, versteckt meist eine Benutzerschnittstelle die technischen Details der jeweiligen Umsetzung. Jemand gibt eine Frage in nat&#252;rlicher Sprache ein und erh&#228;lt als Ergebnis typischerweise eine Antwort in Textform oder ein generiertes Bild. Bei ChatGPT von OpenAI erm&#246;glicht das LLM sogar das F&#252;hren eines Dialogs, bei dem der Computer den Chatverlauf kennt und bei Folgefragen ber&#252;cksichtigt.</p><h3 class=„subheading“ id=„nav_hinter_den0“>Hinter den Kulissen</h3><p>Hinter der Fassade repr&#228;sentieren bei Sprachmodellen wie denen von OpenAI Zahlen die sprachlichen Zusammenh&#228;nge. Dabei spielt das Konzept der Embeddings eine entscheidende Rolle. Embedding-Vektoren stehen im Bereich der K&#252;nstlichen Intelligenz f&#252;r die Zahlen-Repr&#228;sentationen des Inhalts wie Text, Bilder oder Musik. Technisch gesehen handelt es sich um Vektoren im n-dimensionalen Raum. Das Geheimnis der Qualit&#228;t von Systemen wie ChatGPT ist, dass es ihnen &#228;u&#223;erst gut gelingt, nicht nur die W&#246;rter eines Textes oder einer Frage, sondern den Sinnzusammenhang in Vektoren umzuwandeln. Texte, deren Sinnzusammenh&#228;nge sich &#228;hneln, f&#252;hren zu Vektoren, die &#228;hnlich sind. Texte, die nichts miteinander zu tun haben, resultieren in deutlich unterschiedlichen Vektoren.</p><p>Menschen k&#246;nnen sich recht gut Vektoren im dreidimensionalen Raum vorstellen. Wenn die LLMs von OpenAI mit drei Dimensionen ausk&#228;men, was bei Weitem nicht der Fall ist, entst&#252;nden aus zwei Texten mit &#228;hnlichem Inhalt zwei Vektoren, die in etwa an der gleichen Stelle im Raum enden. Das l&#228;sst sich beim Entwickeln von KI-Anwendungen nutzen. Anwendungen k&#246;nnen Vektoren vergleichen, gruppieren oder sortieren, um beispielsweise Duplikate, Anomalien oder relevante Texte auf Basis von Fragen zu finden.</p><p>Im Folgenden dient eine praxisnahe Problemstellung dazu, das Konzept der Embeddings n&#228;her zu erl&#228;utern. Der skizzierte L&#246;sungsansatz basiert auf den Sprachmodellen von OpenAI. Die entsprechenden Web-APIs holt sich die Anwendung nicht direkt bei OpenAI, sondern verwendet die <a href=„https://azure.microsoft.com/en-us/blog/general-availability-of-azure-openai-service-expands-access-to-large-advanced-ai-models-with-added-enterprise-benefits/“ rel=„external noopener“ target=„_blank“><strong>im Januar 2023 vorgestellten Azure OpenAI Services [1]</strong></a>, die speziell im Unternehmenseinsatz einige Vorteile haben. Unter anderem k&#246;nnen Unternehmen den Ort der Datenverarbeitung ausw&#228;hlen (ein Rechenzentrum in der EU steht zur Verf&#252;gung) und die Anwendung in Enterprise-Netzwerkstrukturen einbinden &#8211; beispielsweise &#252;ber Private Endpoints in virtuellen Netzwerken. Au&#223;erdem erfolgt die Abrechnung &#252;ber bestehende Azure-Vertr&#228;ge und -Guthaben. Zum Speichern und Suchen der Embeddings nutzt das Anwendungsbeispiel die Open-Source-Vektordatenbank Qdrant der Berliner Firma Qdrant Solutions.</p><h3 class=„subheading“ id=„nav_gute1“>Gute Textgeneratoren mit Schw&#228;chen</h3><p>Modelle wie ChatGPT haben bewiesen, dass sie Texte gut generieren und sogar Fragen beantworten k&#246;nnen. Bei den Antworten zeigen sie jedoch Schw&#228;chen, da sie von Natur aus Textgeneratoren sind und daher nicht selten Dinge erfinden, die dank ihrer hoch entwickelten Generatorf&#228;higkeiten sogar plausibel klingen. Ihre zweite Schw&#228;che besteht darin, dass sie nicht allwissend sind. Erstens sind in das Training der Sprachmodelle naturgem&#228;&#223; keine Daten eingeflossen, die Firmen geheim halten, und zweitens haben die LLMs sogenannte Cut-off Dates. Darunter versteht man den Zeitpunkt, zu dem das jeweilige Modell trainiert wurde. Informationen, die erst sp&#228;ter &#246;ffentlich geworden sind, k&#246;nnte das System nur mit Plug-ins ber&#252;cksichtigen, die ChatGPT in die Lage versetzen, Internetsuchen durchzuf&#252;hren oder auf externe Web APIs zuzugreifen.</p><p>Zur n&#228;heren Untersuchung von Embeddings dient im Folgenden eine fiktive KI-Anwendung, die beide Nachteile weitgehend ausgleichen oder zumindest abmindern soll. Ziel ist es, auf Basis einer Frage in nat&#252;rlicher Sprache die relevantesten Eintr&#228;ge in einer Wissensdatenbank zu finden. Anschlie&#223;end <a href=„https://platform.openai.com/docs/guides/completion/prompt-design“ rel=„external noopener“ target=„_blank“><strong>dient Prompt Design dazu [2]</strong></a>, die KI &#252;ber ein LLM dazu zu bringen, die Frage anhand der Wissensdatenbank zu beantworten. Das Konzept, mithilfe eines vortrainierten LLM relevante Dokumente aus einer Datenbasis zu identifizieren und anschlie&#223;end die Informationen als Kontext zum Beantworten einer Frage zu verwenden, wird oft als Retrieval-Augmented Generation (kurz RAG) bezeichnet. Der technische Aufbau sieht folgenderma&#223;en aus:</p><figure class=„a-inline-image a-u-inline“><div><img alt=„“ class=„legacy-img“ height=„378“ src=„https://heise.cloudimg.io/width/696/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/01_diagram-f49aedd51d45eeac.png“ srcset=„https://heise.cloudimg.io/width/336/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/01_diagram-f49aedd51d45eeac.png 336w, https://heise.cloudimg.io/width/1008/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/01_diagram-f49aedd51d45eeac.png 1008w, https://heise.cloudimg.io/width/1392/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/01_diagram-f49aedd51d45eeac.png 2x“ width=„696“ referrerpolicy=„no-referrer“ /></div><figcaption class=„a-caption“>Die Anwendung verwendet Azure OpenAI Embeddings und die Vektordatenbank Qdrant (Abb. 1).</figcaption></figure><p>Die Anwendung soll Embeddings f&#252;r Textabschnitte aus einer Wissensdatenbank berechnen und in einer Vektordatenbank speichern. Zu Testzwecken dienen Ausschnitte aus dem Stanford Question Answering Dataset (SQuAD). Die Daten des <a href=„https://huggingface.co/datasets/squad“ rel=„external noopener“ target=„_blank“><strong>Datensatzes finden sich bei Hugging Face [3]</strong></a>. SQuAD enth&#228;lt eine umfangreiche Auswahl an Passagen aus Wikipedia-Artikeln mit jeweils zugeh&#246;rigen Fragen und Antworten.</p><p>Unternehmen k&#246;nnen f&#252;r ihre Anwendung stattdessen eine firmenintern aufgebaute Wissensdatenbank verwenden. Der Autor hat dem SQuAD-Dataset Informationen &#252;ber ein fiktives, chemisches Element namens Froxium hinzugef&#252;gt, weil das ChatGPT-LLM Fragen, die sich auf Wikipedia-Artikel beziehen, von Haus aus gut beantworten kann. Da Froxium frei erfunden ist, kann das LLM keine Informationen dazu haben. Der Testaufbau simuliert ein Szenario mit firmeninternen, nicht im Internet verf&#252;gbaren Informationen.</p><p>Folgenden Text hat das Sprachmodell dazu beispielhaft erzeugt, wohlgemerkt ohne die Angabe, dass die Eigenschaften sinnvoll sein m&#252;ssen:</p><p class=„indent rteabs–indent“>„Froxium is a member of the sideron family, a hypothetical group of super-heavy elements theorized to reside beyond the existing periodic table. Froxium exhibits a vibrant, iridescent hue that changes depending on the observer's emotional state. While it is a solid at room temperature, its melting point lies at a remarkable -42.7&#176;C, which subsequently turns it into a shimmering, pearlescent liquid.“</p><p>Nach dem Ermitteln der Embeddings f&#252;r die Wissensdatenbank k&#246;nnen User ihre Fragen eingeben. Die Anwendung gibt die Fragen jedoch nicht einfach unver&#228;ndert an ein LLM wie ChatGPT. Stattdessen ermittelt sie den Embedding-Vektor f&#252;r die Frage und sucht anhand eines Vektorvergleichs jene Eintr&#228;ge aus der Wissensdatenbank, die der Frage am &#228;hnlichsten sind und daher aller Wahrscheinlichkeit nach die Antwort auf die Frage enthalten.</p><p>Den Textabschnitt aus der Wissensdatenbank gibt die Anwendung gemeinsam mit der eingegebenen Frage &#252;ber Prompt Design an OpenAIs j&#252;ngstes, aktuell in der Preview-Phase befindliches Text-Completion-Modell GPT-4 weiter, um eine Antwort zu finden. Falls das LLM die Antwort nicht von den Fakten ableiten kann, soll das Modell keine Antwort geben.</p><p>Abbildung 2 zeigt das Prinzip der Abfrage mit Prompt Design im Azure OpenAI Studio. Aus der Abbildung geht hervor, dass das Modell-Deployment in den USA erfolgt. Der Grund daf&#252;r ist, dass das GPT-4-Modell in der aktuellen Preview-Phase nur dort zum Testen bereitsteht. Die produktiv verf&#252;gbaren Modelle sind dagegen ebenfalls im Azure-Rechenzentrum „West Europe“ verwendbar.</p><figure class=„a-inline-image a-u-inline“><div><img alt=„“ class=„legacy-img“ height=„455“ src=„https://heise.cloudimg.io/width/696/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/02_prompt-engineering-6693b34b05f95cd3.png“ srcset=„https://heise.cloudimg.io/width/336/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/02_prompt-engineering-6693b34b05f95cd3.png 336w, https://heise.cloudimg.io/width/1008/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/02_prompt-engineering-6693b34b05f95cd3.png 1008w, https://heise.cloudimg.io/width/1392/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/02_prompt-engineering-6693b34b05f95cd3.png 2x“ width=„696“ referrerpolicy=„no-referrer“ /></div><figcaption class=„a-caption“>Das Prompt Design erfolgt mit dem Azure OpenAI-Modell „gpt-4“ (Abb. 2).</figcaption></figure><p>Im gegebenen Textabschnitt sind Informationen &#252;ber Froxium enthalten. Fragt man das LLM nach einem Faktum &#252;ber das fiktive Element, das nicht im Text enthalten ist, antwortet es korrekt mit „I don't know“:</p><figure class=„a-inline-image a-u-inline“><div><img alt=„“ class=„legacy-img“ height=„438“ src=„https://heise.cloudimg.io/width/540/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/03_dont-know-e7d39cb89e34f816.png“ srcset=„https://heise.cloudimg.io/width/336/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/03_dont-know-e7d39cb89e34f816.png 336w, https://heise.cloudimg.io/width/1008/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/03_dont-know-e7d39cb89e34f816.png 1008w, https://heise.cloudimg.io/width/1080/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/03_dont-know-e7d39cb89e34f816.png 2x“ width=„540“ referrerpolicy=„no-referrer“ /></div><figcaption class=„a-caption“>Das LLM antwortet korrekt, wenn es keine Antwort von den Fakten ableiten kann (Abb. 3).</figcaption></figure><p>Die Einschr&#228;nkung auf vorgegebene Informationen sollen das Erfinden vermeintlicher Fakten und den Missbrauch des Abfragesystems verhindern. Das Konzept, LLMs bei der Beantwortung von Fragen auf vorgegebene Informationsquellen zu beschr&#228;nken, wird oft als Response Grounding bezeichnet. In einem echten Projekt w&#228;ren umfangreiche Tests erforderlich, um die Abfrageparameter zu optimieren. Um solche Tests zu erleichtern, integriert Microsoft unter anderem strukturierte und automatisierte Prompt-Tests <a href=„https://techcommunity.microsoft.com/t5/ai-machine-learning-blog/harness-the-power-of-large-language-models-with-azure-machine/ba-p/3828459“ rel=„external noopener“ target=„_blank“><strong>in kommende KI-Produkte wie Prompt Flow [4]</strong></a>.</p><h3 class=„subheading“ id=„nav_ermitteln_der2“>Ermitteln der Embeddings in Azure</h3><p>Im ersten Schritt ermittelt die Beispielanwendung die Embeddings f&#252;r die Textabschnitte aus dem SQuAD-Dataset. OpenAI empfiehlt derzeit f&#252;r Embeddings <a href=„https://openai.com/blog/new-and-improved-embedding-model“ rel=„external noopener“ target=„_blank“><strong>das LLM „text-embedding-ada-002“ [5]</strong></a>. Daneben stellt das Unternehmen <a href=„https://platform.openai.com/docs/api-reference/embeddings/create“ rel=„external noopener“ target=„_blank“><strong>die API Create Embeddings bereit [6]</strong></a>, um Embeddings automatisch zu generieren.</p><p>Die in der Beispielanwendung genutzten Azure-OpenAI-Dienste sind funktional identisch mit den Web-APIs von OpenAI. Um Erstere statt Letztere zu verwenden, ist lediglich eine Anpassung eines Teils der URL erforderlich. Die konkrete Azure-URL findet sich im Azure-Portal. <a href=„https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference“ rel=„external noopener“ target=„_blank“><strong>In der Azure-Dokumentation [7]</strong></a> beschreibt Microsoft, wie die APIs zu verwenden sind.</p><p>Auch preislich existiert bez&#252;glich des „text-embedding-ada-002“-Modells zum Generieren von Embeddings praktisch keinen Unterschied. Der Preis pro 1000 Token lag beim Schreiben dieses Artikels bei 0,000363 Euro. Der oben gezeigte Artikelausschnitt &#252;ber das chemische Element Froxium ben&#246;tigt etwa 170 Token, um einen Embedding-Vektor zu erzeugen und k&#228;me somit auf 0,006171 Cent. F&#252;r eine Wissensdatenbank mit 10.000 solcher Textabschnitte l&#228;gen die Kosten zum Generieren der Embeddings bei rund 62 Cent. Das ist vernachl&#228;ssigbar gering: Da die Anwendung die Embeddings in einer Vektordatenbank speichert, fallen die Kosten nur einmalig an.</p><p>Damit die OpenAI-Embeddings-API in Azure bereitstehen, ist es erforderlich, das gew&#252;nschte LLM in Azure auszurollen.</p><figure class=„a-inline-image a-u-inline“><div><img alt=„“ class=„legacy-img“ height=„376“ src=„https://heise.cloudimg.io/width/696/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/azure-model-deployments-f370250f90033054.png“ srcset=„https://heise.cloudimg.io/width/336/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/azure-model-deployments-f370250f90033054.png 336w, https://heise.cloudimg.io/width/1008/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/azure-model-deployments-f370250f90033054.png 1008w, https://heise.cloudimg.io/width/1392/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/1/9/4/5/2/1/azure-model-deployments-f370250f90033054.png 2x“ width=„696“ referrerpolicy=„no-referrer“ /></div><figcaption class=„a-caption“>Der Screenshot zeigt exemplarisch die Model Deployments des „text-embedding-ada-002“-Modells und des Text-Completion-Modells „gpt-4“ im Azure-Portal (Abb. 4).</figcaption></figure><p>Anschlie&#223;end steht in Azure ein Playground zur Verf&#252;gung, der dem von OpenAI entspricht. Microsoft nennt ihn Azure OpenAI Studio.</p><h3 class=„subheading“ id=„nav_embedding_vektor3“>Embedding-Vektoren mit vielen Dimensionen</h3><p>Die vom „text-embedding-ada-002“-Modell erzeugten Embedding-Vektoren haben 1.536 Dimensionen. Sie sind von Haus aus normalisiert, haben also immer eine L&#228;nge von 1. Das ist f&#252;r den Vergleich von Embedding-Vektoren wichtig. Die &#196;hnlichkeit von Vektoren ergibt sich in der Regel &#252;ber <a href=„https://de.wikipedia.org/wiki/Kosinus-%C3%84hnlichkeit“ rel=„external noopener“ target=„_blank“><strong>die Kosinus-&#196;hnlichkeit [8]</strong></a> (Cosine Similarity) beziehungsweise der Kosinus-Distanz (Cosine Distance). Da die vom OpenAI-LLM erzeugten Embeddings normalisiert sind, entspricht die Kosinus-&#196;hnlichkeit dem Standardskalarprodukt (Dot Product). Das vereinfacht und beschleunigt das Berechnen der Distanz.</p><p>Zur Veranschaulichung soll ein Codebeispiel zum Berechnen der Kosinusdistanz der Embedding-Vektoren zweier Texte (

input1

und

input2

) in Rust dienen. Die Methode

generate_embeddings

dient dazu, die Embeddings mit der Azure-OpenAI-Web-API zu berechnen. Da sie nur einen simplen Web-Request durchf&#252;hrt, fehlt die Methode im folgenden Codeausschnitt:</p><pre class=„rtetx–listing listing“><code>async fn get_distance(input1: String, input2: String, model: String) -&gt; Result&lt;()&gt; { Generate the embeddings for both input strings in parallel let (r1, r2) = join!( generate_embeddings(input1, model.clone()), generate_embeddings(input2, model) ); Extract embedding vectors from API results let d1 = &amp;r1?.data[0].embedding; let d2 = &amp;r2?.data[0].embedding; Definition of cosine distance - see https://en.wikipedia.org/wiki/Cosine_similarity Embeddings from OpenAI are always normalized to length of 1. Therefore, the cosine similarity is equal to the dot product. let dot_prod = d1 .into_iter() .enumerate() .map(|(ix, v)| v * d2[ix]) .sum::&lt;f32&gt;(); Cosine distance is 1 - cosine similiarity. println!(„{}“, 1f32 - dot_prod); Ok1)}</code></pre><p>Der Code dient lediglich zur Veranschaulichung des Prinzips und nicht als Vorlage f&#252;r den Praxiseinsatz. Es gibt <a href=„https://crates.io/crates/nalgebra“ rel=„external noopener“ target=„_blank“><strong>Bibliotheken wie nalgebra [9]</strong></a>, die die entsprechende Logik eingebaut haben. Sie sind bedeutend schneller als diese naive Umsetzung, da sie SIMD (Single instruction, multiple data) einsetzen. F&#252;r das Beispiel ist es allerdings nicht erforderlich, die Distanz manuell zu berechnen: Das &#252;bernimmt die Vektordatenbank Qdrant.</p><h3 class=„subheading“ id=„nav_datenbanken_zum4“>Datenbanken zum Speichern von Vektordaten</h3><p>F&#252;r das Beispiel lohnt es sich schon aus Kostengr&#252;nden, die aus den Eintr&#228;gen der Wissensdatenbank erstellten Embeddings zu speichern. Sie bei jeder Anfrage neu zu generieren, w&#252;rde viel zu lange dauern und hohe Kosten verursachen. Theoretisch ist es m&#246;glich, die Vektoren in einer relationalen Datenbank, einer NoSQL-Datenbank oder in einfachen Dateien zu speichern. Um anhand eines Embedding-Vektors &#228;hnliche Eintr&#228;ge zu suchen, m&#252;sste eine Anwendung jedoch die Distanzen des Vektors zu allen gespeicherten Embeddings ausrechnen und die Ergebnisse nach der Distanz sortieren. Bei mehr als 1500-dimensionalen Vektoren und zahlreichen Eintr&#228;gen in der Wissensdatenbank entsteht eine Menge Rechenarbeit. Erforderlich ist ein spezialisiertes System, das zum einen Vektordistanzen effizient berechnen kann und zum anderen &#252;ber Indexfunktionen verf&#252;gt, um performantes Suchen &#252;ber gro&#223;e Sammlungen von Vektoren durchzuf&#252;hren.</p><p>Dabei helfen spezialisierte Vektordatenbanken oder auf Vektorsuche spezialisierte Erweiterungen bestehender Datenbanksysteme wie das auf der Microsoft Build 23 <a href=„https://www.heise.de/news/Build-2023-Micrsoft-baut-sein-KI-Portfolio-fuer-Azure-aus-9063215.html“ rel=„external noopener“ target=„_blank“><strong>angek&#252;ndigte Vector Search in Azure CosmosDB [10]</strong></a>. Vektordatenbanken sind darauf optimiert, vieldimensionale Vektoren zu speichern und bieten optimierte Suchfunktionen an. OpenAI <a href=„https://platform.openai.com/docs/guides/embeddings/how-can-i-retrieve-k-nearest-embedding-vectors-quickly“ rel=„external noopener“ target=„_blank“><strong>f&#252;hrt auf seiner Webseite einige Vektordatenbanken auf [11]</strong></a>, darunter die aus Deutschland stammende Qdrant. Sie bietet sich f&#252;r die Integration in das Beispielprojekt an. Qdrant ist eine in Rust programmierte Open-Source-Vektordatenbank, die Unternehmen lokal betreiben oder als verwaltetes Cloud-Service von Qdrant beziehen k&#246;nnen. Im Februar 2023 erschien <a href=„https://github.com/qdrant/qdrant/releases/tag/v1.0.0“ rel=„external noopener“ target=„_blank“><strong>das erste Major Release 1.0 [12]</strong></a> von Qdrant, und kurz darauf erhielt das Berliner <a href=„https://www.heise.de/news/KI-Vektordatenbank-Start-up-Qdrant-erhaelt-7-5-Million-US-Dollar-Investorengeld-8974828.html“><strong>Start-up eine Seed-Finanzierung [13]</strong></a>. Die Qdrant Cloud befindet sich jedoch noch in der Betaphase.</p><p>In der Cloud-Variante ist die geografische Region zum Speichern der Daten w&#228;hlbar. Unter anderem steht ein Rechenzentrum in der EU zur Auswahl. Beim Verfassen dieses Artikels hat Qdrant nur Hosting in der AWS-Cloud von Amazon angeboten, aber <a href=„https://qdrant.tech/documentation/cloud/cloud-quick-start/#create-cluster“ rel=„external noopener“ target=„_blank“><strong>Azure und die Google Cloud Platform sollen bald folgen [14]</strong></a>. Zum Lernen und f&#252;r Prototypen bietet Qdrant <a href=„https://qdrant.tech/documentation/cloud/cloud-quick-start/#free-tier“ rel=„external noopener“ target=„_blank“><strong>eine kostenlose Variante des Cloud-Angebots [15]</strong></a> an, die Einschr&#228;nkungen bez&#252;glich der zu speichernden und zu verarbeiteten Daten mitbringt. Wer Qdrant im eigenen Rechenzentrum betreiben m&#246;chte, greift am besten <a href=„https://hub.docker.com/r/qdrant/qdrant“ rel=„external noopener“ target=„_blank“><strong>auf das passende Docker Image [16]</strong></a> zur&#252;ck.</p><p>Eine vollst&#228;ndige Erl&#228;uterung aller Funktionen von Qdrant stellt der Hersteller in einer <a href=„https://qdrant.tech/documentation/“ rel=„external noopener“ target=„_blank“><strong>umfangreichen Dokumentation [17]</strong></a> zur Verf&#252;gung. F&#252;r das flexible Entwickeln von Software mit Qdrant existieren neben einer REST- und einer gRPC-API spezielle Bibliotheken f&#252;r die Programmiersprachen Python, Rust und Go. Bei den Tests und Recherchen hat sich ergeben, dass der Python-Client am weitesten fortgeschritten ist.</p><p>Wer Qdrant in Kombination mit OpenAI in Python programmieren m&#246;chte, findet gute Einstiegsbeispiele im zugeh&#246;rigen Abschnitt der <a href=„https://github.com/openai/openai-cookbook/tree/main/examples/vector_databases/qdrant“ rel=„external noopener“ target=„_blank“><strong>Beispielsammlung OpenAI Cookbook [18]</strong></a>. Der Beispielcode f&#252;r diesen Artikel ist prim&#228;r in Rust geschrieben, und der Rust-Client von Qdrant funktionierte reibungslos. Leider gibt es daf&#252;r momentan lediglich eine sp&#228;rliche Dokumentation und weit weniger Codebeispiele als f&#252;r den Python-Client.</p><p>Qdrant gruppiert Embeddings in Collections. Alle Vektoren in einer Collection m&#252;ssen dieselbe Dimensionalit&#228;t aufweisen und ben&#246;tigen die Angabe des zu verwendenden Distanzermittlungsalgorithmus. F&#252;r das Zusammenspiel mit dem LLM von OpenAI gen&#252;gt „Dot Product“, da es aufgrund der normalisierten Vektoren mit der L&#228;nge 1 der „Cosine Distance“ entspricht. Qdrant kennt vor allem f&#252;r das Indizieren der Vektoren eine Vielzahl weiterer Einstellungen. Die Beschreibung der Einstellungen <a href=„https://qdrant.tech/documentation/collections/#create-collection“ rel=„external noopener“ target=„_blank“><strong>findet sich in der Dokumentation [19]</strong></a>.</p><p>Zu jedem Embedding-Vektor lassen sich in Qdrant ein Prim&#228;rschl&#252;ssel (Zahlenwert oder UUID) und Key-Value-Paare als Metadaten speichern. Der Prim&#228;rschl&#252;ssel ist wichtig, um sp&#228;ter Bez&#252;ge zwischen dem Vektor und externen Datenbanken wie der Wissensdatenbank im Beispiel herstellen zu k&#246;nnen. Anwendungen k&#246;nnen die Metadaten bei Abfragen <a href=„https://qdrant.tech/documentation/search/#search-api“ rel=„external noopener“ target=„_blank“><strong>der Vektordatenbank zum Filtern verwenden [20]</strong></a>.</p><p>Folgender Codeausschnitt importiert einen Abschnitt aus der JSON-Datei des SQuAD-Datensatzes in Qdrant:</p><pre class=„rtetx–listing listing“><code>async fn import_embeddings( file: String, collection_name: String, section: String, model: String,) -&gt; Result&lt;()&gt; { Read one section of the SQuAD dataset JSON file let file = File::open(file)?; let reader = BufReader::new(file); let records: Root = serde_json::from_reader(reader)?; let section = records .data .iter() .enumerate() .filter(|(_, r)| r.title == section) .collect::&lt;Vec&lt;_&gt;&gt;()[0]; Create Qdrant client let client = create_qdrant_client().await?; Iterate through all the knowledge base entries. Each entry from the SQuAD dataset contains a section of a Wikipedia article. for (ix, r) in section.1.paragraphs.iter().enumerate() { Build the payload that is stored together with the embedding vector. The payload can consist of a number of key/value pairs. For the values, Qdrant supports a number of data types including strings, numeric values, structured data types, and lists. let payload: Payload = vec![ („section“, section.1.title.as_str().into()), („ix“, Value::from(ix as i64)), ] .into_iter() .collect::&lt;HashMap&lt;_, Value&gt;&gt;() .into(); Generate the embedding vector using Azure OpenAI services. Technically, this is a simple HTTP request. let res = generate_embeddings(r.context, model.clone()).await?; Add the embedding vector to Qdrant. let vector = res.data[0].embedding.clone(); let points = vec![PointStruct::new( Build a primary key with which we can correlate the entry in the SQuAD dataset and our embedding vector. (section.0 * 1000 + ix) as u64, vector, payload, )]; client.upsert_points(collection_name.as_str(), points, None).await?; } Ok2)}async fn create_qdrant_client() -&gt; Result&lt;QdrantClient&gt; { let mut config = QdrantClientConfig::from_url( env::var(„QDRANT_URL“)?.as_str() ); config.set_api_key(env::var(„QDRANT_PAT“)?.as_str()); QdrantClient::new(Some(config)).await}</code></pre><p>In der Praxis ist es m&#246;glich, den Code zu optimieren, da Qdrant f&#252;r gr&#246;&#223;ere Importprozesse <a href=„https://qdrant.tech/documentation/points/#upload-points“ rel=„external noopener“ target=„_blank“><strong>mehrere Embeddings pro API Call hochladen kann [21]</strong></a>.</p><h3 class=„subheading“ id=„nav_die_passende5“>Die passende Antwort</h3><p>Nachdem die Beispielanwendung die Embeddings der Wissensdatenbankeintr&#228;ge inklusive zugeh&#246;riger Metadaten in die Vektordatenbank importiert, ist der n&#228;chste Schritt die Suchfunktion. Wenn die Anwendung eine Frage erh&#228;lt, ermittelt sie dazu den Embedding-Vektor und sucht auf Basis der Vektordistanzen mithilfe von Qdrant jene Wissensdatenbankartikel, die inhaltlich am besten zu der Frage passen.</p><p>Das Suchen mit Qdrant ist komfortabel: Man ruft die <a href=„https://qdrant.tech/documentation/search/#similarity-search“ rel=„external noopener“ target=„_blank“><strong>Suchfunktion des Qdrant-Clients [22]</strong></a> mit dem Embedding-Vektor der Frage plus eventueller Filterkriterien f&#252;r die Metadaten auf. Beispielsweise l&#228;sst sich dar&#252;ber festlegen, dass Qdrant nur die mit einem bestimmten Schlagwort versehenen Wissensdatenbankeintr&#228;ge ber&#252;cksichtigt. Bei der Abfrage akzeptiert die Datenbank weitere Parameter wie die gew&#252;nschte Anzahl der Vektoren im Ergebnis. Das Resultat der Abfrage ist eine absteigend sortierte Liste von Embeddings mit ihren Prim&#228;rschl&#252;sseln und Metadaten, die dem gegebenen Embedding-Vektor am &#228;hnlichsten sind. Die Beispielanwendung verwendet den Prim&#228;rschl&#252;ssel der Ergebnis-Embeddings, um den Bezug zur Wissensdatenbank herzustellen und von dort die Textabschnitte zum Generieren der Antwort zu holen.</p><p>Es w&#228;re in der Praxis m&#246;glich, der KI nicht nur den &#228;hnlichsten Wissensdatenbankartikel zur Analyse zu &#252;bergeben, sondern mehrere zu verwenden. Neue LLMs wie GPT-4 sind f&#252;r diese Vorgehensweise besonders geeignet, da sie lange Texte als Eingabe erlauben. Das Standardmodell von GPT 4 erlaubt 8.000 Token. Daneben steht ein erweitertes Modell mit 32.000 Token zur Verf&#252;gung. Bei langen zu analysierenden Texten gilt es die h&#246;heren Kosten zu ber&#252;cksichtigen, da Azure OpenAI nach Token-Anzahl abrechnet.</p><p>Der letzte Schritt in der Beispielanwendung ist das Generieren der Antwort. Das hat nichts mehr mit Embeddings zu tun. Stattdessen kommt die regul&#228;re Text-Completion-API von OpenAI zum Einsatz (siehe Abbildung 5). Beim Schreiben des Artikels war das fortgeschrittenste in Produktion befindliche LLM daf&#252;r „text-davinci-003“. Das j&#252;ngste LLM „gpt-4“ ist in der Preview-Phase.</p><p>Eine Abfrage von „text-davinci-003“ &#252;ber die Azure OpenAI Services kostet aktuell 1,8111 Cent pro 1000 Token. Die oben dargestellte Beispielabfrage nach dem Schmelzpunkt des fiktiven Elements Froxium verbraucht rund 150 Token, kostet daher in etwa 0,27 ct. „text-davinci-003“ ist jedoch nicht in der Lage, die Frage „Given the above facts, at what temperature does Froxium change from a solid to a liquid?“ zu beantworten. Erst wenn man explizit nach dem im Text erw&#228;hnten Schmelzpunkt („melting point“) fragt, erh&#228;lt man eine Antwort.</p><p>Das *gpt-35-turbo* Modell und das neueste GPT-4-Modell beantworten auch die urspr&#252;ngliche Frage ohne explizit erw&#228;hnten Schmelzpunkt korrekt. „gpt-35-turbo“ ist mit 0,19 Cent pro 1000 Token kosteng&#252;nstig. GPT-4-Abfragen sind deutlich teurer. Unsere Beispielabfrage verursacht dabei Kosten von rund 3 bis 4 Cent. In der Praxis m&#252;ssen Unternehmen auf Projektbasis eine gute Balance von Kosten und geforderter Funktionsweise finden.</p><h3 class=„subheading“ id=„nav_das_herz_von6“>Das Herz von KI-Systemen</h3><p>Vieldimensionale Vektoren, sogenannte Embeddings, sind das Herz moderner, generativer KI-Systeme. Entscheidend f&#252;r die Qualit&#228;t dieser Systeme ist, die Sinnzusammenh&#228;nge der zu analysierenden Objekte wie Texte, Fragen oder Bilder in Embedding-Vektoren zusammenzufassen.</p><p>F&#252;r gewerbliche Anwendungen bietet Microsoft die OpenAI-Dienste Azure OpenAI Services an. Vektordatenbanken wie Qdrant helfen dabei, gr&#246;&#223;ere Mengen an Embeddings zu speichern und effizient zu durchsuchen. Ein wichtiger Aspekt f&#252;r Anwendungen mit generativen KI-Systemen ist das Prompt Design, um die Antworten, die das KI-Modell erstellt, auf die gew&#252;nschten Fakten einzuschr&#228;nken.</p><p>Entwicklerinnen und Entwickler, die sich auf den Einsatz von Embeddings verstehen, k&#246;nnen innovative Software mit KI entwickeln, ohne tief in Data Science einzusteigen. Dazu m&#252;ssen sie sich aber neue Fertigkeiten aneignen: Sie m&#252;ssen mit Vektoren umgehen k&#246;nnen und die zugeh&#246;rigen Algorithmen und Rechenlogiken beherrschen.</p><p>Zus&#228;tzlich ist es n&#246;tig, dass sie den Umgang mit einer neuen Kategorie von Datenbanken lernen: den Vektordatenbanken. Prompt Design und bei komplexeren Anwendungen zus&#228;tzlich das Erstellen von Fine-Tuned Models sind in Zukunft wichtige Grundkenntnisse. Letztlich ist in der Praxis zumindest solides Basiswissen &#252;ber Python notwendig, da diese Sprache in der Welt der KI die gr&#246;&#223;te Verbreitung hat und zahlreiche Anleitungen und Beispiele auf Python setzen.</p><p><em>Rainer Stropekist seit 2008 Mitbegr&#252;nder und CEO der Firma software architects. Zudem leitet Rainer die &#246;sterreichische Niederlassung des Beratung- und Schulungsunternehmens IT-Visions. Er hat zahlreiche B&#252;cher und Artikel &#252;ber C#, Datenbankentwicklung, Microsoft Azure, XAML und Webentwicklung geschrieben. Au&#223;erdem h&#228;lt er regelm&#228;&#223;ig Vortr&#228;ge auf Konferenzen, Workshops und Schulungen in Europa und den USA.</em></p><p>() </p><p><strong>URL dieses Artikels:</strong><small><code>https://www.heise.de/-9066795</code></small></p><p><strong>Links in diesem Artikel:</strong><small><code><strong>[1]</strong>&#160;https://azure.microsoft.com/en-us/blog/general-availability-of-azure-openai-service-expands-access-to-large-advanced-ai-models-with-added-enterprise-benefits/</code></small><small><code><strong>[2]</strong>&#160;https://platform.openai.com/docs/guides/completion/prompt-design</code></small><small><code><strong>[3]</strong>&#160;https://huggingface.co/datasets/squad</code></small><small><code><strong>[4]</strong>&#160;https://techcommunity.microsoft.com/t5/ai-machine-learning-blog/harness-the-power-of-large-language-models-with-azure-machine/ba-p/3828459</code></small><small><code><strong>[5]</strong>&#160;https://openai.com/blog/new-and-improved-embedding-model</code></small><small><code><strong>[6]</strong>&#160;https://platform.openai.com/docs/api-reference/embeddings/create</code></small><small><code><strong>[7]</strong>&#160;https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference</code></small><small><code><strong>[8]</strong>&#160;https://de.wikipedia.org/wiki/Kosinus-%C3%84hnlichkeit</code></small><small><code><strong>[9]</strong>&#160;https://crates.io/crates/nalgebra</code></small><small><code><strong>[10]</strong>&#160;https://www.heise.de/news/Build-2023-Micrsoft-baut-sein-KI-Portfolio-fuer-Azure-aus-9063215.html</code></small><small><code><strong>[11]</strong>&#160;https://platform.openai.com/docs/guides/embeddings/how-can-i-retrieve-k-nearest-embedding-vectors-quickly</code></small><small><code><strong>[12]</strong>&#160;https://github.com/qdrant/qdrant/releases/tag/v1.0.0</code></small><small><code><strong>[13]</strong>&#160;https://www.heise.de/news/KI-Vektordatenbank-Start-up-Qdrant-erhaelt-7-5-Million-US-Dollar-Investorengeld-8974828.html</code></small><small><code><strong>[14]</strong>&#160;https://qdrant.tech/documentation/cloud/cloud-quick-start/#create-cluster</code></small><small><code><strong>[15]</strong>&#160;https://qdrant.tech/documentation/cloud/cloud-quick-start/#free-tier</code></small><small><code><strong>[16]</strong>&#160;https://hub.docker.com/r/qdrant/qdrant</code></small><small><code><strong>[17]</strong>&#160;https://qdrant.tech/documentation/</code></small><small><code><strong>[18]</strong>&#160;https://github.com/openai/openai-cookbook/tree/main/examples/vector_databases/qdrant</code></small><small><code><strong>[19]</strong>&#160;https://qdrant.tech/documentation/collections/#create-collection</code></small><small><code><strong>[20]</strong>&#160;https://qdrant.tech/documentation/search/#search-api</code></small><small><code><strong>[21]</strong>&#160;https://qdrant.tech/documentation/points/#upload-points</code></small><small><code><strong>[22]</strong>&#160;https://qdrant.tech/documentation/search/#similarity-search</code></small><small><code><strong>[23]</strong>&#160;mailto:rme@ix.de</code></small></p><p class=„printversion__copyright“><em>Copyright &#169; 2023 Heise Medien</em></p> </html>

1) , 2)
Cookies helfen bei der Bereitstellung von Inhalten. Diese Website verwendet Cookies. Mit der Nutzung der Website erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Computer gespeichert werden. Außerdem bestätigen Sie, dass Sie unsere Datenschutzerklärung gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information