[ad_1]
Autor:Luca Wintergerst
In einem aktuellen Blogbeitrag haben wir darüber gesprochen, wie chatgpt und Elasticsearch® zusammenarbeiten, um die Verwaltung proprietärer Daten effektiver zu gestalten. Durch die Nutzung der Suchfunktionen von Elasticsearch und des Kontextverständnisses von ChatGPT zeigen wir, wie die Ergebnisse verbessert werden können.
In diesem Beitrag diskutieren wir, wie wir das Benutzererlebnis durch das Hinzufügen von Facetten, Filtern und zusätzlichem Kontext weiter verbessern können. Indem Sie Tools wie ChatGPT zusätzlichen Kontext geben, erhöhen Sie die Wahrscheinlichkeit, genauere Ergebnisse zu erhalten. Erfahren Sie, wie Benutzer mit dem Facettierungs- und Filter-Framework von Elasticsearch ihre Suche verfeinern und die Kosten für die Verwendung von ChatGPT senken können.
Um das Benutzererlebnis der Beispielanwendung zu verbessern, haben wir eine Funktion hinzugefügt, um die Originalergebnisse neben den von ChatGPT erstellten Antworten anzuzeigen. Dadurch können Benutzer besser verstehen, wie ChatGPT funktioniert.
Da unser Quelldatensatz nur durchforstet werden kann, ist die Struktur der Dokumentation für Menschen schwer lesbar. Um diesen Unterschied und den Wert zu verdeutlichen, den ChatGPT bieten kann, haben wir den von GPT erstellten Antworten Rohergebnisse hinzugefügt.
Derzeit gibt diese Beispielanwendung nur ein einziges Ergebnis zurück. Selbst wenn wir die Vektorsuche und BM25 für die gemischte Bewertung verwenden, ist dieses Ergebnis möglicherweise nicht perfekt. Wenn wir dieses unvollständige Ergebnis an ChatGPT übergeben, wird die Antwort, die wir erhalten, höchstwahrscheinlich ebenfalls nicht gut sein, da wichtige Informationen im Kontext fehlen.
Im Idealfall würden wir einfach mehr Kontext an ChatGPT übergeben, aber das aktuelle GPT 3.5-Turbo-Modell ist auf 4.096 Token begrenzt (dies schließt die Antworten ein, die Sie erwarten würden, daher ist die tatsächliche Grenze viel niedriger). Zukünftige Modelle mögen stärkere Einschränkungen haben, aber das hat seinen Preis.
Derzeit kostet GPT-3.5-turbo 0,002 $/1.000 Token, während das kommende GPT-4 mit 32.000 Kontext 0,06 $/1.000 Token kostet – das ist mehr als das 30-fache. Auch wenn in den nächsten Jahren leistungsstärkere Modelle auf den Markt kommen, ist dies möglicherweise nicht für alle Anwendungsfälle wirtschaftlich sinnvoll.
Daher werden wir GPT-4 vorerst nicht verwenden, sondern das maximale Token-Limit von GPT-3.5 lösen, indem wir mehrere gleichzeitige Anfragen senden und Benutzern flexiblere Filterergebnisse bieten.
Um dieser Einschränkung zu begegnen, ist eine der größten Stärken von Elasticsearch das leistungsstarke Facettierungs- und Filter-Framework. Wenn Benutzer nach etwas suchen, können sie zusätzliche Präferenzen oder Kontext angeben, um die Wahrscheinlichkeit, das richtige Ergebnis zu erhalten, erheblich zu erhöhen. Durch die Nutzung des Facettierungs- und Filter-Frameworks von Elasticsearch können wir Benutzern ermöglichen, die Suche auf der Grundlage verschiedener Parameter wie Datum, Ort oder anderer relevanter Kriterien zu verfeinern.
Es ist auch wichtig zu beachten, dass sich viele Benutzer daran gewöhnt haben, bei der Suche nach bestimmten Inhalten die Facettenfilteroption zu verwenden. Schauen wir uns ein Beispiel an.
Die Suche nach „Wie kann ich eine Nachricht mit Grok analysieren?“ führt dazu, dass als oberstes Ergebnis die Dokumentation für die Aufnahmepipeline zurückgegeben wird. Daran ist nichts auszusetzen, da Aufnahmepipelines auch Grok-Ausdrücke unterstützen. Was aber, wenn ein Benutzer daran interessiert ist, seine Daten mit Logstash zu analysieren?
Mithilfe einer einfachen Begriffsaggregation im Rahmen der Trefferabfrage können wir eine Liste der Top-10-Produktkategorien erhalten und diese als Filteroptionen für den Benutzer bereitstellen.
Wählt der Nutzer nun links „Logstash“ aus, werden alle Ergebnisse nach Logstash gefiltert. Es ist erwähnenswert, dass dies alles erreicht werden kann, während immer noch dasselbe hybride Abfragemodell verwendet wird, das wir im vorherigen Blog besprochen haben. Wir verwenden immer noch eine Kombination aus BM25- und kNN-Suche, um unsere Dokumente abzugleichen.
Das maximale Token-Limit haben wir bereits kurz erwähnt. Kurz gesagt: Die Eingabeaufforderung und ihre Antwort, die Sie an die API senden, dürfen 4.096 Token nicht überschreiten. Bei der Suche nach Ihren proprietären Daten möchten Sie so viel spezifischen Kontext wie möglich bereitstellen, damit das Modell Ihnen die beste Antwort liefern kann. Allerdings sind 4.096 Token nicht viel, insbesondere wenn man Dinge wie Codeschnipsel einbezieht.
Ein sehr einfacher erster Schritt, um die Einschränkung zu mildern, besteht darin, mehrmals parallel zu fragen, jedes Mal in einem anderen Kontext. Mit unserem Elasticsearch-Ansatz können wir die Anwendung so ändern, dass sie die Top-10-Treffer lädt und dann Fragen mit dem entsprechenden Kontext stellt, anstatt nur das Top-1-Ergebnis abzurufen und an OpenAI zu senden.
Dies liefert 10 einzigartige Antworten auf unsere Frage und erhöht unsere Chancen, Endbenutzern relevante Antworten zu geben, erheblich. Wir erhöhen zwar den Aufwand für die Benutzer, Ergebnisse anzuzeigen, geben ihnen aber dennoch mehr Flexibilität.
Stellen Sie sich das so vor: Wenn Sie versuchen, ein Problem zu beheben und google nach einer Ausnahme zu durchsuchen, können Sie schnell die Liste der vier oder fünf Ergebnisse durchsuchen, die Google am häufigsten anzeigt, und auf das Ergebnis klicken, das am besten zu Ihnen passt für Ihr Problem. Ähnlich verhält es sich, dem Benutzer mehrere Antworten auf eine Frage anzuzeigen.
Während es ideal ist, eine richtige Antwort zu haben, ist es auch ein guter Anfang, zunächst mehrere Antworten zur Auswahl zu haben. Wie bereits erwähnt, kann es günstiger sein als die Verwendung teurerer Modelle wie GPT-4.
Wir können auch mit Hinweisen kreativer werden und ChatGPT bitten, uns eine spezifische Antwort zu senden, wenn eine Frage im bereitgestellten Kontext nicht beantwortet werden kann. Dadurch können wir die Ergebnisse später aus der Benutzeroberfläche entfernen.
Ein Hinweis, der in unserem Anwendungsfall gut funktioniert hat, ist:
prompt = f"Answer this question: {query}\n. Don’t give information not mentioned in the CONTEXT INFORMATION. If the CONTEXT INFORMATION contains code or API requests, your response should include code snippets. If the context does not contain relevant information, answer 'The provided page does not answer the question': \n {body}"
Da wir nun mehrere Antworten auf die Frage haben, können wir versuchen, diese in einer Antwort zusammenzufassen. Dazu folgen wir größtenteils dem gleichen Ansatz wie zuvor, aber anstatt Elasticsearch nach Kontext zu durchsuchen, verketten wir die einzelnen Antworten, die wir bisher erhalten haben, und schließen dabei alle Stellen aus, an denen das Modell zwar geantwortet hat, aber nicht beantwortet werden konnte basierend auf dem bereitgestellten Kontext.
Beachten Sie, dass sich die Eingabeaufforderungen für diesen Lauf geringfügig von den vorherigen unterscheiden, sodass das Modell den Kontext etwas anders behandelt. Die hier vorgestellten Tipps sind nicht perfekt und müssen auf der Grundlage der Daten noch weiter optimiert und optimiert werden.
concatResult = ""
for resultObject in results:
if resultObject['choices'][0]["message"]["content"] != "The provided page does not answer the question.":
concatResult += resultObject['choices'][0]["message"]["content"]
if st.session_state['summarizeResults']['state']:
results = [None] * 1
tasks = []
prompt = f"I will give you {numberOfResults} answers to this question.: \"{query}\"\n. They are ordered by their likelyhood to be correct. Come up with the best answer to the original question, using only the context I will provide you here. If the provided context contains code snippets or API requests, half of your response must be code snippets or API requests. \n {concatResult}"
element = None
with st.session_state['topResult']:
with st.container():
st.markdown(f"**Summary of all results:**")
element = st.empty()
with elasticapm.capture_span("top-result", "openai"):
task = loop.create_task(achat_gpt(prompt, results, counter, element))
tasks.append(task)
loop.set_exception_handler(handle_exception)
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
Mit dieser zusätzlichen „Reduzierungsphase“ wird unsere Anwendung nun:
- Durchsuchen Sie die Top-10-Hits in Elasticsearch
- Bitten Sie OpenAI, Fragen zehnmal parallel zu beantworten, jedes Mal mit einem anderen Kontext
- Verketten Sie die Antwort von OpenAI und bitten Sie OpenAI, die Frage erneut zu beantworten
Mit diesem Setup können wir fast 40.000 Kontext-Tokens verwenden und zahlen nur für das recht günstige GPT-3.5-Modell. In einem anderen Blogbeitrag werden wir die Kosten genauer untersuchen und Elastic APM verwenden, um unter anderem unsere Ausgaben zu verfolgen.
Es ist zu beachten, dass GPT-4 möglicherweise immer noch eine viel bessere Leistung als die oben genannten Methoden erbringt. Verwenden Sie daher die Methode, die für Sie und Ihren erwarteten Datenverkehr am besten geeignet ist.
Elasticsearch und ChatGPT – Suchzusammenfassung, eingefrorener Index
Einer der Nachteile großer Sprachmodelle (LLMs) ist Selbstüberschätzung und die Neigung zu Halluzinationen. Sie stellen Fragen und erhalten Antworten. Ob die Antwort richtig ist, liegt bei Ihnen. Das Modell gibt selten zu, dass es etwas nicht weiß. Die Bereitstellung von Kontext und die Aufforderung, mit einer bestimmten Antwort zu antworten, wie wir es oben getan haben, trägt dazu bei, dies etwas zu mildern.
Der bereitgestellte Kontext und die Anerkennung des Modells, dass es die Frage nicht beantworten kann, ermöglichen es uns jedoch auch, genauere Zitate für die Antwort bereitzustellen.
Im vorherigen Abschnitt haben wir die 10 Antworten in einer globalen Antwort zusammengefasst. Zusätzlich zur Bereitstellung dieser globalen Antwort können wir auch eine Liste aller Quelldokumentationsseiten bereitstellen, die zum Kompilieren der Ergebnisse verwendet wurden – im Grunde alle, auf die das Modell nicht mit der Seite „Die bereitgestellte Seite beantwortet die Frage nicht“ geantwortet hat.
In diesem Screenshot sehen Sie eine zusammenfassende Antwort von Elasticsearch für einen Satz von 10 Ergebnissen. Obwohl wir 10 Ergebnisse überprüft haben, zeigen wir nur drei Links zu Dokumenten an, die für die Beantwortung der Frage tatsächlich relevant sind. In diesem Fall beziehen sich die anderen sieben von Elasticsearch zurückgegebenen Dokumente auf Dokumente oder Indizes, sprechen jedoch nicht speziell darüber, wie etwas indiziert wird.
Wir haben in einem früheren Blogbeitrag erwähnt, dass die Verwendung von Elasticsearch und OpenAI zur Suche nach proprietären Daten großartig ist. Wir verwenden jedoch Webcrawler, um öffentliche Dokumente zu crawlen. Das mag vielleicht kontraintuitiv erscheinen, aber Sie haben Recht, wenn Sie darüber nachdenken! OpenAI trainiert das GPT-Modell anhand von Webdaten, daher gehen wir davon aus, dass es unsere Dokumente bereits kennt. Warum brauchen wir neben diesen Daten noch Elasticsearch? Funktioniert diese Einstellung tatsächlich mit nicht öffentlichen Daten? Das stimmt – beweisen wir es.
Mit dem bestehenden Setup werden wir ein einzelnes streng geheimes Dokument über ein internes Projekt in unseren Index einfügen.
PUT search-elastic-docs/_doc/1?pipeline=search-elastic-docs@ml-inference
{
"title": "Project LfQg832p6Jx040809WZc",
"product_name": "SuperSecret",
"url": "https://www.example.com",
"body_content": """What is Project LfQg832p6Jx040809WZc? Project LfQg832p6Jx040809WZc is an internal project that's not public information. This is the plan for the project: Step 1 is writing a blog post about OpenAi and Elasticsearch for private data. Step 2 is noticing that we didn't actually include any private data. Step 3 is including an example about private data
We also have some super secret API requests as part of this project:
PUT project/_doc/hello-world
{
"secret": "don't share this with anyone!"
}
"""
}
Als nächstes gehen wir zu unserer Bewerbung und suchen nach „Was sind die Schritte für das interne Projekt?“
Elasticsearch und ChatGPT – internes Projekt durchsuchen
Zusammenfassend lässt sich sagen, dass wir für bestimmte Anwendungsfälle Facettierung und Filterung verwenden, um den Umfang der für die Interaktion mit ChatGPT erforderlichen kontextbezogenen Kennzeichnung zu reduzieren. Durch die Bereitstellung von zusätzlichem Kontext zum Zeitpunkt der Abfrage zeigen wir, dass auch die Genauigkeit der Suchergebnisse verbessert werden kann.
Erfahren Sie mehr über die Möglichkeiten von Elasticsearch und KI.
In diesem Blogbeitrag haben wir möglicherweise Tools für generative künstliche Intelligenz von Drittanbietern verwendet, die ihren jeweiligen Eigentümern gehören und von diesen betrieben werden. Elastic hat keine Kontrolle über Tools von Drittanbietern und wir sind weder für deren Inhalt, Betrieb oder Nutzung verantwortlich, noch haften wir für Verluste oder Schäden, die aus der Nutzung solcher Tools durch Sie entstehen können. Seien Sie vorsichtig, wenn Sie Tools der künstlichen Intelligenz mit persönlichen, sensiblen oder vertraulichen Informationen verwenden. Alle von Ihnen übermittelten Daten können für Schulungen zur künstlichen Intelligenz oder für andere Zwecke verwendet werden. Es kann nicht garantiert werden, dass die von Ihnen bereitgestellten Informationen sicher oder vertraulich sind. Sie sollten sich mit den Datenschutzpraktiken und Nutzungsbedingungen jedes Tools für generative künstliche Intelligenz vertraut machen, bevor Sie es verwenden.
Die in diesem Artikel genannten Kosten basieren auf den aktuellen OpenAI-API-Preisen und darauf, wie oft wir sie beim Laden der Beispielanwendung aufrufen.
Elastic, Elasticsearch und verwandte Marken sind Marken, Logos oder eingetragene Marken von Elasticsearch NV in den USA und anderen Ländern. Alle anderen Firmen- und Produktnamen sind Marken, Logos oder eingetragene Marken ihrer jeweiligen Eigentümer.
[ad_2]