亞馬遜LEX是一項完整的管理AI服務,它使用自然語言模型來設計,構建,測試和分發應用程序的交互式界面。因此,由亞馬遜Lex製成的聊天機器人可以識別意圖,以便您可以發送和接收連續的對話,因此您可以顯示滿足意圖所需的信息。此外,亞馬遜肯德拉(Amazon Kendra)可用於回答亞馬遜Lex中未確定的意圖。同樣,使用第三方開放API,您可以獲得類似的效果。 2022年11月,Chatgpt發行了出色的對話能力,使使用Chatgpt作為Open API和Kendra成為可能。在這篇文章中,我想解釋如何實現使用Chatgpt作為開放API的交互式聊天機器人來回答未提前定義的意圖。
您在此處實現的體系結構如下。使用Amazon CloudFront,我們提供一個網頁供聊天。您輸入的聊天消息使用Amazon API網關和AWS Lambda來回答LEX中的意圖。但是,如果LEX中沒有識別的意圖,則Lambda功能將用於查詢Chatgpt,結果顯示在聊天窗口中。使用AWS CDK創建和管理用於配置這種交互式聊天機器人的基礎架構。由於所有基礎架構均由無服務器(無服務器)組成,因此即使在維護表面的有效和波動的流量中,也可以通過自動縮放穩定地操作系統。

有關詳細操作,請參見下文。
步驟1:用戶嘗試使用CloudFront的域連接到聊天機器人網頁,並加載HTML,CSS和JavaScript存儲在S3中。
步驟2:在網頁上輸入聊天消息。目前,“/聊天”資源將在“/聊天”資源中以JSON格式請求短信。
步驟3:CloudFront向API網關發送請求。
步驟4:API網關調用連接到 /聊天資源的lambda函數。
步驟5:Lambda功能使用LEX V2 API將聊天消息傳遞給LEX。
步驟6:如果有意圖定義意圖,LEX會執行相應的行為。如果您無法識別您的意圖,請發送請求與Chatgpt聯繫。
步驟7:如果您在chatgpt中回答,則將響應傳遞到上一個階段的相反順序,並將其交付給用戶。
首爾地區不支持LEX V1,而只支持LEX V2支持。因此,使用LEX V2的識別性將用戶的輸入發送到消息。 LEX運行時V2客戶端定義如下。
import { LexRuntimeV2Client , RecognizeTextCommand } from "@aws-sdk/client-lex-runtime-v2" ; Lambda函數與事件分開,並使用BotaliasId或Botid傳遞消息,如下所示,並從LEX傳遞的響應中提取並傳遞消息。
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 ,
};2023年3月,Chatgpt的官方公開API被釋放。新API的路徑是“/V1/CHAT/完成”,並使用“ GPT-3.5-Turbo”模型。與現有模型“ Text-Davinci-003”相比,該型號的成本可以低90%,但是無法搜索ChatGpt的天氣。在這裡,我們將描述如何使用“ Text-Davinci-003”模型,該模型在與ChatGPT官方API聊天時支持搜索。
該請求由OpenAI提供的chatgpt API,HTTPS帖子提供的“ V1/CHAT/完成”。為此,我們在這裡使用獲取。目前,要交付給chatgpt的請求的標題必須包括授權和內容類型,如下所示。 OpenAI:API密鑰發布了授權所需的API密鑰,並將存儲為環境變量。在請求消息時,根據CHATGPT API過渡指南,可以將角色指定為“用戶”,“系統”或“助手”。可以在此處找到詳細的代碼(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 },
],
}),
});當您發送Chatgpt發送的響應消息時,將其發送到LEX時,必須將其發送到下面的格式。在這種情況下,會議狀態應包括對話和意圖,並且必須從輸入中提取意圖名稱。此外,chatgpt的響應消息放在“消息”的“內容”中,並如下傳遞。
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 ,
}
]
}
} 根據完成API,“ Text-Davinci-003”模型使用“ V1/完成”。在這裡,您將使用OpenAi Node.js庫實現。可以在此處找到詳細的代碼(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,
}; 客戶端傳輸聊天消息,如聊天服務器中所示,並在響應到來時在接收聊天氣泡中顯示。這裡聊天服務器的地址是Cloudfront的域。詳細的代碼在此處確認(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 );
}在這裡,您可以使用Typescript配置AWS CDK。可以在此處找到詳細的代碼(CDK-CHATBOT-SACK.TS)。
LEX的lambda函數定義如下。它應該在環境中包括botid和botaliasid。在這裡,我們在韓語中使用聊天機器人,因此我們將“ KO_KR”指定為本地ID,如下所示。該Lambda功能必須具有LEX和API網關的權限。
// 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' )); LEX的輸入設置為通過郵政方法收到的“/聊天”資源,如下所示,使用API網關。
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 ,
},
}
]
}); 要繞過CORS,請註冊“/聊天”資源的行為,如下所示。
distribution . addBehavior ( "/chat" , new origins . RestApiOrigin ( api ), {
cachePolicy : cloudFront . CachePolicy . CACHING_DISABLED ,
allowedMethods : cloudFront . AllowedMethods . ALLOW_ALL ,
viewerProtocolPolicy : cloudFront . ViewerProtocolPolicy . REDIRECT_TO_HTTPS ,
});將文本發送到chatgpt並準備接收響應的lambda功能。 openai_api_key是OpenAI發出的API密鑰。
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" ,
}
}); 為了方便起見,我們在首爾地區使用Cloud9準備分發。 Cloud9提供了一個方便的環境,用於在瀏覽器中創建,運行和調試代碼。輸入Cloud9控制台,選擇[創建環境],然後輸入名稱,如下所示。在這裡,我輸入了“聊天機器人”。之後,將其餘的維護並選擇[創建]。

創建雲9時,[打開],然後準備終端,如下所示。

下載來源如下所示。
git clone https : //github.com/kyopark2014/interactive-chat-using-Lex-and-ChatGPT轉到CDK文件夾並安裝必要的庫。 AWS-CDK-LIB是CDK 2.0庫。
cd interactive - chat - using - Lex - and - ChatGPT / cdk - chatbot && npm install如果您首次使用CDK,則必須按照下面的方式運行引導程序。這裡的帳戶ID意味著12位帳戶號。您可以在AWS控制台屏幕上檢查或檢查“ AWS STS get-caller-caller-Query-Query-indup-Id-Out-Output Text”命令。
cdk bootstrap aws : //account-id/ap-northeast-2根據Amazon Lex韓國聊天機器人構建研討會的Hello World Bot創建Helloworld Bot。 “ Hello World Bot”是一個簡單的問候機器人,詢問並檢查名稱。
完成“ Hello World Bot”的創建後,訪問機器人控制台並選擇“ Helloworldbot”。您可以看到Botid是“ BSZQXD0ABN”,如下所示。

如果選擇“ Helloworldbot”的[別名],則可以知道別名如下所示。在此處選擇“ testbotoalias”。

您會看到botaliasid是“ tstaliasid”,如下所示。

返回雲9,然後打開“ Interactive-chat-use-lex-to-chtgpt/cdk-lex/lib/lib/lix-lex-sack.ts”中的“左文件資源管理器”,並打開“ lambda for Lex”更新botaliasid。 sessionID維護當前值或輸入任何值的地方。

此外,在“ for Chatgpt”的環境中輸入“ OpenAI_API_KEY”。如果您沒有預接種密鑰,則將從OpenAI:API鍵發出。

現在,使用CDK創建完整的基礎架構。
cdk deploy正常安裝時,顯示以下“輸出”。在這裡,DistributionDomainName為“ D3NDV6LHZE8YC5.CLOUDFRONT.NET”,Weburl為“ https://d3ndv6lhze8yc5.cloudfront.net.net/chat.html”。

從AWS LEX控制台中選擇“ HellowWorldBot”,然後在“ Aliases”中選擇[語言],然後選擇[韓語(韓國)],如下所示。

選擇“ lambda-chatgpt”為[soucet],而[lambda函數版本或別名]選擇“ $最新”,然後選擇[保存]。

然後選擇[HellowWorldBot的[意圖]所示[shurfbackIntent]。

向下滾動並從FullFillment中選擇[高級選項],然後啟用[使用lambda函數以實現 - pop -up。

在屏幕頂部選擇[構建]以應用更改的內容。

Weburl的“” https://d3ndv6lhze8yc5.cloudfront.net/chat.html”已連接到瀏覽器中的聊天屏幕。您可以在Web瀏覽器中與LEX聊天,如下所示。 “ Lex”的問題是意圖操作後的問題,並未註冊為意圖。根據瀏覽器的設置,您可能無法收到對Chatgpt的一些響應。

如果您不再使用基礎架構,則可以刪除所有資源,如下所示。
cdk destroy 我使用Amazon Lex和Chatgpt實施了交互式聊天機器人,並解釋瞭如何使用AWS CDK有效地開發和操作基礎架構。通過使用ChatGpt,您還可以通過為用戶提供適當的響應對LEX中未識別的意圖來提高可用性。 Chatgpt已經證明了其出色的對話能力,目前正在宣佈各種GPT模型。因此,通過將這些人工智能模型引入LEX等聊天機器人服務,預計將提高用戶可用性並提供更好的服務。