Amazon Lex - это полная служба управления искусственным интеллектом, которая использует модели естественного языка для проектирования, создания, тестирования и распространения интерактивного интерфейса для приложений. Таким образом, чат -бот из Amazon Lex может идентифицировать намерения, чтобы вы могли отправлять и получать постоянный разговор, чтобы вы могли отобразить информацию, необходимую для выполнения своих намерений. Кроме того, Amazon Kendra можно использовать для ответа на намерения, которые не идентифицированы в Amazon Lex. Точно так же, используя API Open с третьей стороной, вы можете получить аналогичные эффекты. В ноябре 2022 года был выпущен CHATGPT, демонстрируя отличную способность разговора, что позволило использовать CHATGPT в качестве открытого API, а также Kendra. В этом посте я хотел бы объяснить, как реализовать интерактивный чат -бот, который использует CHATGPT в качестве открытого API, чтобы ответить на намерения, которые не определены заранее.
Архитектура, которую вы реализуете здесь, заключается в следующем. Используя Amazon Cloudfront, мы предоставляем веб -страницу для чата. Сообщение в чате, в которое вы ввели пользователь, использует Amazon API Gateway и AWS Lambda, чтобы ответить на намерение в LEX. Однако, если есть намерение, которое не будет признано в LEX, функция Lambda будет использоваться для запроса в CHATGPT, и результат отображается в окне чата. Инфраструктура для настройки такого интерактивного чата создается и управляется с помощью AWS CDK. Поскольку вся инфраструктура состоит из без сервера (без сервера), можно стабильно управлять системой посредством автоматического масштабирования даже при эффективном и колеблющемся трафике на поверхности технического обслуживания.

Смотрите ниже для подробной работы.
Шаг 1: Пользователь пытается подключиться к веб -странице Chatbot с доменом CloudFront и загружает HTML, CSS и JavaScript, хранящиеся в S3.
Шаг 2: Введите сообщение чата на веб -странице. В настоящее время ресурс «/чат» запросит текстовое сообщение в формате JSON в ресурсе «/чат».
Шаг 3: CloudFront отправляет запрос в API Gateway.
Шаг 4: API Gateway вызывает функцию Lambda, подключенную к ресурсу /чат.
Шаг 5: Функции Lambda передают сообщение чата в LEX, используя API LEX V2.
Шаг 6: Lex выполняет соответствующее поведение, если есть намерение определено. Если вы не можете распознать свои намерения, отправьте запрос, чтобы связаться с CHATGPT.
Шаг 7: Если вы отвечаете в CHATGPT, ответ доставляется в обратный порядок предыдущего этапа и доставляется пользователю.
Регион Сеула не поддерживает LEX V1, но только LEX V2 поддерживает. Следовательно, распознавание LEX V2 используется для отправки ввода пользователя в сообщение в сообщение. Клиент Lex Runtime 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 года был выпущен официальный Open API Chatgpt. Путь нового API-«/v1/чат/завершение» и использует модель «GPT-3.5-Turbo». Эта модель может использоваться при более низкой стоимости на 90% по сравнению с существующей моделью «Text-Davinci-003», но это не может быть сделано для поиска погоды в CHATGPT. Здесь мы опишем, как использовать модель «Text-Davinci-003», которая поддерживает поиск во время чата с официальным API CHATGPT.
Запрос сделан с помощью API CHATGPT, предоставленного OpenAI, «v1/чат/завершение» в Post HTTPS. Для этого мы используем здесь. В настоящее время заголовок запроса, который будет доставлен в CHATGPT, должен включать авторизацию и тип контента, как показано ниже. Ключ API, необходимый для авторизации, выдается OpenAI: API -ключом и хранится в качестве переменной среды. При запросе сообщения роль может быть указана как «Пользователь», «Система» или «Помощник» в соответствии с Руководством по переходу API CHATGPT. Подробный код можно найти здесь (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. В этом случае штат сеанса должен включать диалог и намерения, и имя намерения должно быть извлечено с ввода. Кроме того, ответное сообщение CATGPT помещается в «контент» «сообщений» и доставляется следующим образом.
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 ,
}
]
}
} Модель «Text-Davinci-003» использует «v1/завершения» в соответствии с API завершения. Здесь вы реализованы с помощью библиотеки 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 );
}Здесь вы можете настроить AWS CDK с помощью TypeScript. Подробный код можно найти здесь (cdk-chatbot-sack.ts).
Функция Lambda для LEX определяется, как показано ниже. Он должен включать в себя Botid и Botaliasid в окружающую среду. Здесь мы используем чат -бот на корейском языке, поэтому мы указываем «ko_kr» как Localid, как показано ниже. Эта функция Lambda должна иметь разрешения для Lex и API Gateway.
// 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 установлен для получения метода POST с ресурсом «/чат», как показано ниже, с использованием шлюза 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 - это ключ API, выпущенный OpenAI.
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 Console, выберите [Создать среду] и введите имя, как показано ниже. Здесь я ввел «Чатбот». После этого остальное сохраняется и выберите [Создать].

Когда Cloud9 создается, [Open], а затем подготовьте терминал, как показано ниже.

Загрузите источник, как показано ниже.
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 в первый раз, вы должны запустить начальную загрузку, как показано ниже. Где идентификатор учетной записи здесь означает 12-значный номер счета. Вы можете проверить на экране консоли AWS или проверив команду «AWS STS Get-Caller-Identity-Query-ID-выпуск» текста ».
cdk bootstrap aws : //account-id/ap-northeast-2Создайте бот Helloworld в соответствии с семинаром Hello World Bot в Amazon Lex Corean Chatbot. «Hello World Bot» - это простой поздравительный бот, который спрашивает и проверяет имя.
После завершения создания «Hello World Bot», получите доступ к консоли бота и выберите «Helloworldbot». Вы можете видеть, что Botid - это "bsqxd0abn", как показано ниже.

Если вы выберете [псевдонимы] из «helloworldbot», вы можете знать псевдонимы, как показано ниже. Выберите «Testbotoalias» здесь.

Вы можете видеть, что BotaliasId - это «tstaliasId», как показано ниже.

Вернитесь в Cloud9 и откройте "интерактивную чат-use-lex-to-chtgpt/cdk-lex/lib/lix-lex-sack.ts" в левом исследователе и открыть "Lambda для lex" Обновление BotaliasId. Где SessionId поддерживает текущее значение или вводило любое значение.

Кроме того, введите «openai_api_key» в среде «Lambda для чатгпта». Если у вас нет предварительного ключа, вы будете выданы от OpenAI: API -ключа.

Теперь создайте полную инфраструктуру с CDK.
cdk deployКогда он установлен нормально, отображается следующий «выход». Здесь DistributionDomainName - это "d3ndv6lhze8yc5.cloudfront.net", а weburl "https://d3ndv6lhze8yc5.cloudfront.net/chat.html".

Выберите «Hellowworldbot» из консоли AWS Lex и выберите [языки] в «псевдониме» и выберите [Корея (Южная Корея)], как показано ниже.

Выберите «Lambda-Chatgpt» как [Soucet], и [версия функции Lambda или псевдоним] выберите «$ последнее» и выберите [Сохранить].

Затем выберите [SwarkbackIntent], как показано ниже в [намерениях] «Hellowworldbot».

Прокрутите вниз и выберите [расширенные параметры] из полного заполнения и позволяет [использовать функцию лямбды для выполнения] приведенного ниже.

Выберите [Build] в верхней части экрана, чтобы применить измененное содержимое.

«Https://d3ndv6lhze8yc5.cloudfront.net/chat.html» подключено к экрану чата в браузере. Вопрос о «Лексе», который является вопросом после операции намерения, не был зарегистрирован в качестве намерения. В зависимости от настройки браузера, вы, возможно, не сможете получить часть ответа на Chatgpt.

Если вы больше не используете инфраструктуру, вы можете удалить все ресурсы, как показано ниже.
cdk destroy Я внедрил интерактивный чат -бот с использованием Amazon Lex и CHATGPT и объяснил, как использовать AWS CDK для эффективной разработки и эксплуатации инфраструктуры. Используя CHATGPT, вы также можете улучшить удобство использования, предоставив пользователям соответствующий ответ на намерения, которые не распознаются в LEX. CHATGPT уже доказал свою превосходную способность разговора, и в настоящее время объявляются различные модели GPT. Следовательно, внедрив эти модели искусственного интеллекта в услуги чат -ботов, такие как LEX, ожидается, что он улучшит удобство использования пользователя и обеспечит лучшие услуги.