亚马逊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等聊天机器人服务,预计将提高用户可用性并提供更好的服务。