
Bitte lesen Sie die vollständige Blog -Serie "RAGS to Riches":
https://dev.to/aws-hheroes/rags-to-riches-part-1-generative-ai-retrieval-4pd7
Diese OpenAI -basierte Lappen -Chat -Anwendung, mit der Sie über KI -Abrufmuster erfahren können. Die Technologien hier sind anfängerfreundlich und einfach für AWS Lambda eingesetzt. Wenn Ihre Bedürfnisse wachsen, können Sie diese Anwendung mit robusteren Komponenten produzieren. Was ist ein Lappen? Aus IBM Research:
RAG ist ein KI-Rahmen zum Abrufen von Fakten von einer externen Wissensbasis zu Großsprachmodellen (LLMs) auf den genauesten, aktuellsten Informationen und um den Benutzern Einblick in den Generativprozess von LLMs zu geben.


Sie müssen einen OpenAI -API -Schlüssel haben, um diese Anwendung auszuführen. Sie können eine kostenlos mit diesem kostenlos erhalten. Wo finde ich meinen geheimen API -Schlüssel? Führung. Sobald Sie Ihren OpenAI -Schlüssel haben, erstellen Sie eine .env.development.local -Datei zum Stamm dieses Projekts durch Folgendes und ersetzen Sie sk... durch Ihren Schlüssel:
OPENAI_API_KEY=sk...
Dieses Projekt unterstützt Entwicklungscontainer, sodass Sie VS -Code verwenden können, um diesen Ordner in einem Container zu öffnen, und Ihre Entwicklungsumgebung wird für Sie erstellt. Führen Sie die folgenden Befehle in Ihrem integrierten Terminal oder auf Ihrem lokalen Computer aus, sofern Sie den Knoten installiert haben.
./bin/setup
./bin/serverDer Serverbefehl startet sowohl einen Vorder- als auch einen Back -End -Entwicklungsserver. Verwenden Sie diese URL, um auf Ihre Anwendung zuzugreifen. http: // localhost: 5173
Diese Demo-Anwendung verwendet eine Split-Stack-Architektur. Das heißt, es gibt ein ausgeprägtes Front-End und ein Back-End. Das Front-End ist eine Vue.js-Anwendung mit? Pinia für Staat und ⚡️ vite für die Entwicklung. Das Front-End verwendet auch? Rückenwind -CSS zusammen mit? Daisyui zum Styling. Das Back-End ist ein? Node.js Anwendung, die ❎ Express für das HTTP -Framework verwendet, und? Sqlite3 vSS zusammen mit? Besser-sqlite3 für Vektorspeicher und -Suche.
Während des gesamten Beitrags werden wir verschiedene Technologien genauer untersuchen und wie sie uns helfen, eine Lag -Anwendung aufzubauen und gleichzeitig die Grundlagen von KI -angetriebenen Integrationen und schnellem Engineering zu lernen. Dies ist so ein lustiger Raum. Ich hoffe, es gefällt Ihnen genauso wie ich!
Beginnen wir also mit dem Ende. Unsere Lambdarag -Demo läuft vor Ort, um es einfach zu entwickeln und zu lernen. Irgendwann möchten Sie es vielleicht an die Produktion versenden oder Ihre Arbeit mit anderen teilen. Warum also in Lambda einsetzen und welche Vorteile bietet diese Bereitstellungsoption? Ein paar Gedanken:
Von all dem denke ich, dass das Reaktionsstroming das mächtigste ist. Als relativ neue Funktion für Lambda ermöglicht dies unserem Lappen, den Text wie Chatgpt an den Web -Client zurückzustream. Außerdem kann Lambda die 6 -MB -Antwortnutzlast und das Zeitüberschreitungslimit von 30ern unterbrechen. Diese wenigen Zeilen in der template.yaml des Projekts. Yaml zusammen mit dem Lambda -Webadapter ermöglichen es alles.
FunctionUrlConfig :
AuthType : NONE
InvokeMode : RESPONSE_STREAM Bevor Sie zum ersten Mal ./bin/deploy laufen. Stellen Sie sicher, dass Sie sich bei der AWS -Konsole anmelden und zuerst zum SSM -Parameterspeicher navigieren. Erstellen Sie von dort einen geheimen String-Parameter mit dem Pfad /lambda-rag/OPENAI_API_KEY und fügen Sie Ihre OpenAI-API-Taste ein.
Unser Backend verfügt über ein sehr einfaches src/utils/openai.js -Modul. Dies exportiert einen OpenAI -Client sowie eine Helferfunktion, um Einbettungen zu erstellen. Wir behandeln Einbettungspunkte kurz im grundlegenden Architektenabschnitt des ersten Teils dieser Serie. Diese Funktion verwandelt einfach die Abfrage eines Benutzers in eine Vektoreinbettung, die später gegen unsere SQLite -Datenbank abgefragt wird. Es gibt zahlreiche Möglichkeiten, Einbettungen zu erstellen und abzufragen. Im Moment werden wir es einfach halten und das OpenAi-Modell für text-embedding-ada-002 verwenden, das 1536 dimensionale Einbettungen ausgibt.
import { OpenAI } from "openai" ;
export const openai = new OpenAI ( {
apiKey : process . env . OPENAI_API_KEY ,
} ) ;
export const createEmbedding = async ( query ) => {
const response = await openai . embeddings . create ( {
model : "text-embedding-ada-002" ,
input : query ,
} ) ;
return JSON . stringify ( response . data [ 0 ] . embedding ) ;
} ;Wie funktioniert die API von OpenAI, um eine Chat -Oberfläche zu erstellen, und wie kommt das Kontextfenster, das in Teil eins diskutiert wird, ins Spiel? Betrachten Sie den folgenden Screenshot, bei dem ich Lambdarag meinen Namen sage, und fragen Sie dann, ob er sich erinnert.
Chatgpt ist staatslos, wie die meisten Webanwendungen. Es hat keine Sitzung für das LLM -Modell. Jedes Mal, wenn Sie eine Nachricht senden, müssen Sie alle vorherigen Nachrichten (Kontext) an den Endpunkt der Fertigstellung senden. Deshalb verwenden wir? Pinia für das kundenseitige Staatsmanagement. Aus API -Sicht würde es so ungefähr so aussehen.
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
messages : [
{ role : "user" , content : "Hello my name is Ken Collins." } ,
{ role : "assistant" , content : "Hello Ken Collins! How can I..." } ,
{ role : "user" , content : "Do you remember my name?" } ,
]
} ) ; Haben Sie bemerkt, wie der Assistent nicht nur mit meinem Namen reagierte, sondern auch wusste, dass es hier war, um uns mit Luxuskleidung zu helfen? Dies ist eine Technik, die als Rollenaufforderung bezeichnet wird. Wir tun dies in der Lambdarag-Demo, indem wir diese Rolle mit der ersten Nachricht des Benutzers in der Datei src-frontend/utils/roleprompt.js vorbereiten.
Sie haben vielleicht bemerkt, dass die Lambdarag -Demo vollständig in geschrieben ist? JavaScript gegen Python. Wenn Sie mehr über das Erstellen von AI -Anwendungen erfahren, müssen Sie möglicherweise sowohl Python als auch fortschrittlichere Frameworks wie ️ lernen? Langchain oder umarmt das Gesicht? Transformers.js. Alle haben JavaScript -Versionen. Ich hoffe, dieser Trend, JavaScript -Clients bereitzustellen, wird fortgesetzt. Es fühlt sich wie eine zugängliche Sprache an.
Im nächsten Abschnitt werden wir mit Ihren Daten und Abfragen nach Dokumenten mit der neuen VSS -Erweiterung von SQLite einbettet.
Eute Die Lambdarag-Demo-Anwendung enthält eine SQLite-Datenbank mit ~ 5.000 Produkten aus dem Luxusbekleidungsdatensatz auf Kaggle. Es hat auch Vektor-Einbettungen vorbereitet und bereit zu verwenden!
Bevor wir uns in SQLite-VSS eingraben, möchte ich erklären, warum ich denke, dass diese Erweiterung so erstaunlich ist. Bisher habe ich SQLite-VSS am einfachsten und schnellsten gefunden, um Vektoreinbettungen zu erkunden. Viele Genai -Projekte verwenden Supabase, was großartig erscheint, aber schwer vor Ort zu laufen ist. Das Ziel hier ist es zu lernen!
Wenn Ihre Anwendung wächst, empfehle ich dringend, Amazon OpenSearch serverless zu betrachten. Es handelt sich um einen voll verwalteten, hochskalierbaren und kostengünstigen Service, der die Vektor-Ähnlichkeitssuche unterstützt. Es unterstützt sogar die Vorfilterung mit Faiss.
Schauen wir uns SQLite-VSS ein bisschen näher an. Dieser Artikel Eine SQLite -Erweiterung für die Vektorsuche leistet einen erstaunlichen Job für die Erstellung von Standardtabellen sowie virtuelle Tabellen für Einbettungen und die Frage, wie sie beide abfragen. Die Lambdarag -Demo folgt all diese Muster genau in unserer Datei db/create.js . Unser resultierendes Schema ist:
CREATE TABLE products (
id INTEGER PRIMARY KEY ,
name TEXT ,
category TEXT ,
subCategory TEXT ,
description TEXT ,
embedding BLOB
);
CREATE TABLE IF NOT EXISTS " vss_products_index " (rowid integer primary key autoincrement, idx);
CREATE TABLE sqlite_sequence (name,seq);
CREATE TABLE IF NOT EXISTS " vss_products_data " (rowid integer primary key autoincrement, _);
CREATE VIRTUAL TABLE vss_products using vss0 (
embedding( 1536 )
); Wenn Sie die SQLite-Datenbank neu erstellen oder einen benutzerdefinierten Datensatz erstellen möchten, können Sie dies tun, indem Sie die db/create.js ändern und npm run db:create . Dadurch wird die vorhandene Datenbank fallen und sie mit Daten aus allen CSV-Dateien, unterstützendem Schema oder dem Prozess, den Sie zu codieren, neu erstellt werden.
> npm run db:create
> [email protected] db:create
> rm -rf db/lambdarag.db && node db/create.js
Using sqlite-vss version: v0.1.1
Inserting product data...
██████████████████████████████████░░░░░░ 84% | ETA: 2s | 4242/5001 Anschließend müssten Sie das npm run db:embeddings -Skript ausführen, das die OpenAI -API verwendet, um Einbettungen für jedes Produkt zu erstellen. Dies dauert einige Minuten, um alle API -Anrufe abzuschließen. Die Aufgabe enthält einen lokalen Cache, um es schneller zu machen. Zuletzt gibt es ein npm run db:clean -Skript, das ein VACUUM auf der DB aufruft, um verschwendeten Platz für die virtuellen Tabellen zu entfernen. Auch dies ist nur erforderlich, wenn Sie die Datenbank neu erstellen oder einen benutzerdefinierten Datensatz erstellen möchten. Es gibt ein ./bin/setup-db , das all diese Schritte für Sie ausführt.
OK, wir haben also eine Datenbank mit Produkten und ihre passenden Vektoreinbettungen für die semantische Suche. Wie können wir vom Chat zum Abrufen von Elementen aus der Datenbank codieren? OpenAI hat diese erstaunliche Funktion namens Function Calling. In unserer Demo ermöglicht es dem LLM, nach Produkten zu suchen und Ihnen die Ergebnisse zu beschreiben.
Aber woher weiß es? Sie beschreiben einfach eine Reihe von Funktionen, die Ihre Anwendungsausgabe und während eines API -Anrufs bei Chat -Abschluss. OpenAI wird 1) automatisch eine Bestimmung vornehmen. Eine Funktion sollte aufgerufen werden 2) den Namen der Funktion mit den erforderlichen Parametern zurückgeben. Ihre Anfrage sieht ungefähr so aus.
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
functions : '[{"search_products":{"parameters": {"query": "string"}}}]' ,
messages : [
{ role : "user" , content : "I need a cool trucker hat." }
]
} ) ; Wenn eine Funktion ausgewählt wurde, enthält die Antwort den Namen der Funktion und die Parameter. In Ihrer Verantwortung ist es, dies zu überprüfen und dann den Code Ihrer Anwendung auf die Funktion und die Parameter zu rufen. Für Lambdagpt wird die Datenbank abfragt und alle übereinstimmenden Zeilen zurückgegeben. Wir tun dies in unserer Datei src/models/products.js .
Damit Openai mit den Ergebnissen antworten kann, senden wir ihm eine weitere Anfrage, die jetzt zwei zusätzliche Nachrichten enthalten. Der erste ist vom Typ "Funktion" und enthält den Namen und die Parameter der Funktion, die Sie anrufen sollten. Der zweite ist vom Typ "Benutzer", der die JSON -Daten der Produkte enthält, die aus unserem Abrufprozess zurückgegeben wurden. OpenAI wird jetzt so reagieren, als hätte es das ganze Zeit über dieses Wissen!
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
functions : '[{"search_products":{"parameters": {"query": "string"}}}]' ,
messages : [
{ role : "user" , content : "I need a cool trucker hat." } ,
{ role : "function" , name : "search_products" , content : '{"query":"trucker hats"}' } ,
{ role : "user" , content : '[{"id":3582,"name":"Mens Patagonia Logo Trucker Hat..."}]' } ,
]
} ) ; Da alle Nachrichten im Client-Side-Status verwaltet werden, können Sie sie mit einer ordentlichen Debug-Technik sehen. Öffnen Sie die Datei src-frontend/components/Message.vue und führen Sie die folgende Änderung vor.
'border-b-base-300': true,
'bg-base-200': data.role === 'user',
- 'hidden': data.hidden,
+ 'hidden': false,Sie können jetzt alle Status des Nachrichtens in der Benutzeroberfläche sehen. Dies ist eine großartige Möglichkeit, Ihre Bewerbung zu debuggen und zu sehen, was passiert.
Ich hoffe, Sie haben diesen schnellen Überblick darüber gefunden, wie OpenAIs Chat -Abschlüsse für das Abrufen von Wissen erweitert werden können. Es gibt so viel mehr zu erforschen und zu tun. Hier sind einige Ideen, um Ihnen den Einstieg zu erleichtern:
fetchResponse im src-frontend/stores/messages.js Pinia Store erledigt hier alle Arbeiten und verwaltet die Client-Seite.src/utils/functions.json abzusetzen. Zum Beispiel eine ID -Methode find_style , die die Datenbank direkt abfragt.❤️ Ich hoffe, Sie haben diese Beiträge genossen und finden die Lambdarag -Demo -Anwendung nützlich, um zu lernen, wie Sie KI zum Abrufen von Wissen verwenden. Fühlen Sie sich frei, Fragen zu stellen und Ihre Gedanken zu diesem Beitrag zu teilen. Danke schön!