Amazon Lex ist ein vollständiger Management -KI -Dienst, der natürliche Sprachmodelle zum Entwerfen, Erstellen, Testen und Verteilen der interaktiven Schnittstelle für Anwendungen verwendet. Daher kann der Chatbot von Amazon Lex Absichten identifizieren, damit Sie eine kontinuierliche Konversation senden und erhalten können, damit Sie die Informationen anzeigen können, die Sie benötigen, um Ihre Absichten zu erfüllen. Darüber hinaus kann Amazon Kendra verwendet werden, um die Absichten zu beantworten, die nicht in Amazon Lex identifiziert werden. In ähnlicher Weise können Sie mit der Drittanbieter -Open -API ähnliche Effekte erzielen. Im November 2022 wurde Chatgpt veröffentlicht und zeigte hervorragende Konversationsfähigkeit und ermöglichte es, Chatgpt als offene API sowie Kendra zu verwenden. In diesem Beitrag möchte ich erklären, wie Sie einen interaktiven Chatbot implementieren, der ChatGPT als offene API verwendet, um Absichten zu beantworten, die nicht im Voraus definiert sind.
Die Architektur, die Sie hier implementieren, lautet wie folgt. Mit Amazon Cloudfront bieten wir eine Webseite für den Chat an. Die von dem Benutzer eingegebene Chat -Nachricht verwendet das Amazon API Gateway und AWS Lambda, um die Absicht in Lex zu beantworten. Wenn es jedoch eine Absicht gibt, die in Lex nicht erkannt wird, wird die Lambda -Funktion verwendet, um im ChatGPT abfragen, und das Ergebnis wird im Chat -Fenster angezeigt. Die Infrastruktur zur Konfiguration eines solchen interaktiven Chatbots wird mit AWS -CDK erstellt und verwaltet. Da alle Infrastrukturen aus serverloser (serverlos) bestehen, ist es möglich, das System stabil zu bedienen, indem er auch in effizientem und schwankendem Verkehr auf der Wartungsfläche automatisch skaliert wird.

Weitere Informationen finden Sie im Folgenden.
Schritt 1: Der Benutzer versucht mit einer Domäne von CloudFront eine Verbindung zur Chatbot -Webseite und lädt HTML, CSS und JavaScript, das in S3 gespeichert ist.
Schritt 2: Geben Sie eine Chat -Nachricht auf der Webseite ein. Zu diesem Zeitpunkt fordert die "/Chat" -Ressource eine Textnachricht im JSON -Format in der Ressource "/Chat" an.
Schritt 3: Cloudfront sendet eine Anfrage an das API -Gateway.
Schritt 4: API Gateway ruft die mit der /Chat -Ressource verbundene Lambda -Funktion auf.
Schritt 5: Lambda -Funktionen übergeben die Chat -Nachricht mit der Lex V2 -API an Lex.
Schritt 6: Lex führt das entsprechende Verhalten aus, wenn eine Absicht definiert ist. Wenn Sie Ihre Absichten nicht erkennen können, senden Sie eine Anfrage, um Chatgpt zu kontaktieren.
Schritt 7: Wenn Sie in ChatGPT antworten, wird die Antwort in die umgekehrte Reihenfolge der vorherigen Stufe geliefert und dem Benutzer geliefert.
Die Region Seoul unterstützt Lex V1 nicht, sondern nur Lex V2 -Unterstützung. Daher wird der Erkenntnis des Lex V2 verwendet, um die Eingabe des Benutzers an die Nachricht an die Nachricht zu senden. Der Lex -Laufzeit -V2 -Client definiert wie folgt.
import { LexRuntimeV2Client , RecognizeTextCommand } from "@aws-sdk/client-lex-runtime-v2" ; Die Lambda -Funktion ist vom Ereignis getrennt und liefert die Meldung mithilfe der unten gezeigten Botaliasid oder Botid und extrahiert und gibt die Nachricht aus der von Lex gelieferten Antwort aus.
const text = event . text ;
let lexParams = {
botAliasId : process . env . botAliasId ,
botId : process . env . botId ,
localeId : process . env . localeId ,
text : text ,
sessionId : process . env . sessionId ,
};
const lexClient = new LexRuntimeV2Client ();
const command = new RecognizeTextCommand ( lexParams );
const data = await lexClient . send ( command );
return {
statusCode : 200 ,
msg : data [ 'messages' ][ 0 ]. content ,
};Im März 2023 wurde Chatgpts offizielle Open -API veröffentlicht. Der Pfad der neuen API ist "/v1/chat/comentions" und verwendet das Modell "GPT-3.5-Turbo". Dieses Modell kann zu einem niedrigeren Preis von 90% im Vergleich zum vorhandenen Modell "Text-Davinci-003" verwendet werden. Es kann jedoch nicht getan werden, um das Wetter in Chatgpt zu durchsuchen. Hier werden wir beschreiben, wie Sie das Modell "Text-Davinci-003" verwenden, das die Suche während des Chat mit der offiziellen API von ChatGPT unterstützt.
Die Anfrage erfolgt von der Chatgpt -API von OpenAI, "V1/CHAT/Fertigstellungen" zum HTTPS -Post. Dazu verwenden wir hier Fetch. Zu diesem Zeitpunkt muss der Header der Anfrage, die an den ChatGPT geliefert werden soll, die Autorisierung und den inhaltlichen Typ enthalten, wie unten gezeigt. Der für die Autorisierung erforderliche API -Schlüssel wird von OpenAI: API -Schlüssel ausgestellt und als Umgebungsvariable gespeichert. Bei Anfrage einer Nachricht kann die Rolle gemäß dem ChatGPT -API -Übergangshandbuch als "Benutzer", "System" oder "Assistant" angegeben werden. Detaillierter Code finden Sie hier (index.mjs).
import fetch from 'node-fetch' ;
const apiKey = process . env . OPENAI_API_KEY
let msg = "" ;
const res = await fetch ( 'https://api.openai.com/v1/chat/completions' ,{
method : "POST" ,
headers : {
"Authorization" : "Bearer " + apiKey ,
"Content-Type" : "application/json" ,
},
body : JSON . stringify ({
"model" : "gpt-3.5-turbo" ,
"messages" : [
{ "role" : "user" , "content" : prompt },
],
}),
});Wenn Sie die von ChatGPT gesendete Antwortnachricht senden, müssen Sie sie beim Senden an Lex an das folgende Format senden. In diesem Fall sollte der SessionState Dialogaktion und Absicht enthalten, und der Absichtsname muss aus der Eingabe extrahiert werden. Darüber hinaus wird die Antwortmeldung von ChatGPT in "Inhalt" von "Nachrichten" eingegeben und wie folgt geliefert.
if ( res . ok ) {
const data = await res . json ();
console . log ( "output: " , data . choices [ 0 ]);
msg = `[ ChatGPT ] $ { data . choices [ 0 ]. message . content }`;
console . log ( "msg: " + msg );
const intentName = event . interpretations [ 0 ]. intent . name ; // intent name
response = {
"sessionState" : {
"dialogAction" : {
"type" : "Close"
},
"intent" : {
"confirmationState" : "Confirmed" ,
"name" : intentName ,
"state" : "Fulfilled" ,
},
},
"messages" : [
{
"contentType" : "PlainText" ,
"content" : msg ,
}
]
}
} Das Modell "Text-Davinci-003" verwendet "V1/Fertigstellungen" gemäß der Abschluss-API. Hier werden Sie mithilfe der OpenAI Node.js -Bibliothek implementiert. Hier finden Sie einen detaillierten Code (Index-Davinch.mjs).
import { Configuration , OpenAIApi } from " openai ";
const configuration = new Configuration({
apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
const models = ['text-davinci-003','code-davinci-002'];
const frequency_penalty = 0.5;
const max_tokens = 2000;
const presence_penalty = 0.1;
const temperature = 0;
const top_p = 1;
const model_name = models[0];
const prompt = event.text;
const params = {
model: model_name,
prompt: prompt,
temperature: temperature,
max_tokens: max_tokens,
top_p: top_p,
frequency_penalty: frequency_penalty,
presence_penalty: presence_penalty,
};
const result = await openai.createCompletion(params);
const choices = result.data.choices;
return {
statusCode: 200,
id: result.data.id,
msg: choices[0].text,
}; Der Client überträgt die Chat -Nachricht wie unten im Chat -Server gezeigt und zeigt sie in der Empfangs -Chat -Blase an, wenn die Antwort kommt. Die Adresse des Chat -Servers hier ist die Domäne von Cloudfront. Der detaillierte Code wird hier bestätigt (CHAT.JS).
function sendRequest ( text ) {
const uri = "/chat" ;
const xhr = new XMLHttpRequest ();
xhr . open ( "POST" , uri , true );
xhr . onreadystatechange = () => {
if ( xhr . readyState === 4 && xhr . status === 200 ) {
response = JSON . parse ( xhr . responseText );
console . log ( "response: " + JSON . stringify ( response ));
addReceivedMessage ( response . msg )
}
};
var requestObj = { "text" : text }
console . log ( "request: " + JSON . stringify ( requestObj ));
var blob = new Blob ([ JSON . stringify ( requestObj )], { type : 'application/json' });
xhr . send ( blob );
}Hier können Sie AWS -CDK mithilfe von TypeScript konfigurieren. Hier finden Sie einen detaillierten Code (CDK-Chatbot-Sack.ts).
Die Lambda -Funktion für Lex ist wie unten definiert. Es sollte botid und botaliasid in der Umgebung enthalten. Hier verwenden wir Chatbot auf Koreanisch, also geben wir "ko_kr" als Lokalid an, wie unten gezeigt. Diese Lambda -Funktion muss Berechtigungen für Lex und API Gateway haben.
// Lambda for lex
const lambdaLex = new lambda . Function ( this , 'lambda-function-lex' , {
description : 'lambda for chat' ,
functionName : 'lambda-function-lex' ,
handler : 'index.handler' ,
runtime : lambda . Runtime . NODEJS_18_X ,
code : lambda . Code . fromAsset ( path . join ( __dirname , '../../lambda-lex' )),
timeout : cdk . Duration . seconds ( 120 ),
environment : {
botId : "BSZQXD0ABN" ,
botAliasId : "TSTALIASID" ,
localeId : "ko_KR" , // en_US
sessionId : "mysession-01" ,
}
});
const lexPolicy = new iam . PolicyStatement ({
actions : [ 'lex:*' ],
resources : [ '*' ],
});
lambdaLex . role ?. attachInlinePolicy (
new iam . Policy ( this , 'rekognition-policy' , {
statements : [ lexPolicy ],
}),
);
// permission for api Gateway
lambdaLex . grantInvoke ( new iam . ServicePrincipal ( 'apigateway.amazonaws.com' )); Die Eingabe von LEX wird so eingestellt, dass sie über die Post -Methode mit der Ressource "/chat" empfangen wird, wie unten mit dem API -Gateway gezeigt.
const api = new apiGateway . RestApi ( this , 'api-chatbot' , {
description : 'API Gateway for chatbot' ,
endpointTypes : [ apiGateway . EndpointType . REGIONAL ],
deployOptions : {
stageName : stage ,
},
});
const chat = api . root . addResource ( 'chat' );
chat . addMethod ( 'POST' , new apiGateway . LambdaIntegration ( lambdaLex , {
passthroughBehavior : apiGateway . PassthroughBehavior . WHEN_NO_TEMPLATES ,
credentialsRole : role ,
integrationResponses : [{
statusCode : '200' ,
}],
proxy : false ,
}), {
methodResponses : [
{
statusCode : '200' ,
responseModels : {
'application/json' : apiGateway . Model . EMPTY_MODEL ,
},
}
]
}); Um die CORs zu umgehen, registrieren Sie das Verhalten für die unten gezeigte "/Chat" -Ressource.
distribution . addBehavior ( "/chat" , new origins . RestApiOrigin ( api ), {
cachePolicy : cloudFront . CachePolicy . CACHING_DISABLED ,
allowedMethods : cloudFront . AllowedMethods . ALLOW_ALL ,
viewerProtocolPolicy : cloudFront . ViewerProtocolPolicy . REDIRECT_TO_HTTPS ,
});Senden Sie den Text an den Chatgpt und bereiten Sie die Lambda -Funktion vor, die die Antwort empfängt. Wobei openai_api_key ein von OpenAI ausgegebener API -Schlüssel ist.
const lambdachat = new lambda . Function ( this , 'lambda-chatgpt' , {
description : 'lambda for chatgpt' ,
functionName : 'lambda-chatgpt' ,
handler : 'index.handler' ,
runtime : lambda . Runtime . NODEJS_18_X ,
code : lambda . Code . fromAsset ( path . join ( __dirname , '../../lambda-chatgpt' )),
timeout : cdk . Duration . seconds ( 120 ),
environment : {
OPENAI_API_KEY : "123456" ,
}
}); Zur Bequemlichkeit erstellen wir die Verteilung mit Cloud9 in der Region Seoul. Cloud9 bietet eine bequeme Umgebung zum Erstellen, Ausführen und Debuggencodes im Browser. Geben Sie Cloud9 -Konsole ein, wählen Sie [Umgebung erstellen] und geben Sie den Namen wie unten gezeigt ein. Hier habe ich "Chatbot" eingegeben. Danach wird der Rest gepflegt und auswählt [erstellen].

Wenn Cloud9 erstellt wird, [offen] und dann das Terminal wie unten gezeigt vorbereiten.

Laden Sie die Quelle wie unten gezeigt herunter.
git clone https : //github.com/kyopark2014/interactive-chat-using-Lex-and-ChatGPTGehen Sie zum CDK -Ordner und installieren Sie die erforderlichen Bibliotheken. Die AWS-CDK-Lib ist eine CDK 2.0-Bibliothek.
cd interactive - chat - using - Lex - and - ChatGPT / cdk - chatbot && npm installWenn Sie zum ersten Mal CDK verwenden, müssen Sie die Bootstrap wie unten gezeigt ausführen. Wo das Konto hier eine 12-stellige Kontonummer bedeutet. Sie können den Befehl "AWS STS STS-Get-Caller-Identitäts-Query-Query-Account-ID-Ausgabe" überprüfen.
cdk bootstrap aws : //account-id/ap-northeast-2Erstellen Sie HelloWorld Bot nach dem Hello World Bot in Amazon Lex Korean Chatbot Build Workshop. "Hello World Bot" ist ein einfacher Begrüßungsbot, der den Namen fragt und überprüft.
Greifen Sie nach Abschluss der Erstellung von "Hello World Bot" auf die Bot -Konsole zu und wählen Sie "HelloWorldBot" aus. Sie können sehen, dass das Botid "BSZQXD0ABN" ist, wie unten gezeigt.

Wenn Sie [Aliase] von "helloWorldbot" auswählen, können Sie Aliase wie unten gezeigt kennen. Wählen Sie hier "TestBotoalias".

Sie können sehen, dass Botaliasid "Tstaliasid" ist, wie unten gezeigt.

Kehren Sie zu Cloud9 zurück und öffnen Sie "Interactive-Chat-Use-lex-to-Chtgpt/CDK-lex/lib/lix-lex-sack.ts" im linken Datei-Explorer und öffnen Sie "Lambda für Lex". Botaliasid aktualisieren. Wobei die SessionID den aktuellen Wert verwaltet oder einen beliebigen Wert eingegeben hat.

Geben Sie außerdem "openai_api_key" in die Umgebung von "Lambda for Chatgpt" ein. Wenn Sie keinen vorgefertigten Schlüssel haben, werden Sie von OpenAI: API -Schlüssel ausgestellt.

Erstellen Sie nun eine vollständige Infrastruktur mit CDK.
cdk deployWenn es normal installiert ist, wird die folgende "Ausgabe" angezeigt. Hier ist DistributionDomAinName "D3ndv6lhze8yc5.cloudfront.net" und Weburl ist "https://d3ndv6lhze8yc5.cloudfront.net/chat.html".

Wählen Sie "Hellowworldbot" aus AWS Lex Console und wählen Sie [Sprachen] in "Aliase" und wählen Sie [Korean (Südkorea)], wie unten gezeigt.

Wählen Sie "lambda-chatgpt" als [Soucet] und [Lambda-Funktionsversion oder Alias] aus "$ letztes" und wählen Sie [Speichern].

Wählen Sie dann [FallbackIntent] wie unten in [Absichten] von "HellowworldBot" gezeigt.

Scrollen Sie nach unten und wählen Sie [erweiterte Optionen] aus der Fülle aus und ermöglicht [eine Lambda -Funktion zur Erfüllung] der folgenden Pop -U -up.

Wählen Sie oben auf dem Bildschirm [Build] aus, um den geänderten Inhalt anzuwenden.

Weburls "" https://d3ndv6lhze8yc5.cloudfront.net/chat.html "ist mit dem Chat -Bildschirm im Browser verbunden. Sie können mit Lex im Webbrowser wie unten gezeigt chatten. Die Frage von "Lex", die die Frage nach der Absichtsoperation ist, wurde nicht als Absicht registriert. Abhängig von den Einstellungen des Browsers können Sie möglicherweise keinen Teil der Antwort auf ChatGPT erhalten.

Wenn Sie die Infrastruktur nicht mehr verwenden, können Sie alle Ressourcen wie unten gezeigt löschen.
cdk destroy Ich habe interaktive Chatbot mit Amazon Lex und ChatGPT implementiert und erklärt, wie AWS -CDK verwendet wird, um die Infrastruktur effektiv zu entwickeln und zu betreiben. Durch die Verwendung von ChatGPT können Sie Ihre Benutzerfreundlichkeit auch verbessern, indem Sie den Benutzern die entsprechende Reaktion auf die in Lex nicht erkannten Absichten geben. Chatgpt hat bereits seine hervorragenden Gesprächsfähigkeit bewiesen, und derzeit werden verschiedene GPT -Modelle bekannt gegeben. Durch die Einführung dieser Modelle für künstliche Intelligenz in Chatbot -Dienste wie LEX wird erwartet, dass die Benutzerfreundlichkeit der Benutzer verbessert und einen besseren Service bietet.