Amazon LEX هي خدمة إدارية كاملة منظمة العفو الدولية تستخدم نماذج اللغة الطبيعية لتصميم واختبار واختبار وتوزيع الواجهة التفاعلية للتطبيقات. وبالتالي ، يمكن لـ chatbot المصنوعة من Amazon Lex تحديد النوايا حتى تتمكن من إرسال وتلقي محادثة مستمرة ، حتى تتمكن من عرض المعلومات التي تحتاجها لتحقيق نواياك. بالإضافة إلى ذلك ، يمكن استخدام Amazon Kendra للإجابة على النوايا التي لم يتم تحديدها في Amazon LEX. وبالمثل ، باستخدام واجهة برمجة تطبيقات الطرف الثالث المفتوح ، يمكنك الحصول على تأثيرات مماثلة. في نوفمبر 2022 ، تم إصدار Chatgpt ، حيث أظهر قدرة على المحادثة الممتازة ، مما يجعل من الممكن استخدام ChatGPT كأواجهة واجهة برهصة مفتوحة وكذلك Kendra. في هذا المنشور ، أود أن أشرح كيفية تنفيذ chatbot التفاعلية التي تستخدم chatgpt كأوpوع مفتوحة للإجابة على النوايا التي لم يتم تعريفها مسبقًا.
الهندسة المعمارية التي تنفذها هنا هي كما يلي. باستخدام Amazon CloudFront ، نقدم صفحة ويب للدردشة. تستخدم رسالة الدردشة التي أدخلتها من قبل المستخدم بوابة Amazon API و AWS Lambda للإجابة على القصد في LEX. ومع ذلك ، إذا كانت هناك نية لم يتم التعرف عليها في LEX ، فسيتم استخدام وظيفة Lambda للاستعلام في ChatGPT ، ويتم عرض النتيجة في نافذة الدردشة. يتم إنشاء البنية التحتية لتكوين مثل هذا chatbot التفاعلية وإدارتها باستخدام AWS CDK. نظرًا لأن جميع البنية التحتية مكونة من الخادم (بدون خادم) ، فمن الممكن تشغيل النظام بشكل ثابت من خلال التحجيم التلقائي حتى في حركة المرور الفعالة والمتقلب في سطح الصيانة.

انظر أدناه للحصول على العملية التفصيلية.
الخطوة 1: يحاول المستخدم الاتصال بصفحة ويب chatbot بمجال من CloudFront وتحميل HTML و CSS و JavaScript المخزنة في S3.
الخطوة 2: أدخل رسالة دردشة على صفحة الويب. في هذا الوقت ، سيطلب مورد "/الدردشة" رسالة نصية بتنسيق JSON في مورد "/chat".
الخطوة 3: يرسل CloudFront طلبًا إلى API Gateway.
الخطوة 4: تدعو بوابة API وظيفة 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 ، تم إصدار واجهة برمجة تطبيقات Chatgpt الرسمية المفتوحة. مسار API الجديد هو "/v1/chat/exmentions" ويستخدم نموذج "GPT-3.5-TURBO". يمكن استخدام هذا النموذج بتكلفة أقل بنسبة 90 ٪ مقارنة بالنموذج الحالي "Text-Davinci-003" ، ولكن لا يمكن القيام به للبحث في الطقس في ChatGPT. هنا ، سنصف كيفية استخدام نموذج "Text-Davinci-003" الذي يدعم البحث أثناء الدردشة مع API الرسمية ChatGPT.
يتم تقديم الطلب من قبل API ChatGPT المقدمة من Openai ، "V1/Chat/Expliveions" إلى Post HTTPS. للقيام بذلك ، نستخدم الجلب هنا. في هذا الوقت ، يجب أن يتضمن رأس طلب تسليمه إلى chatgpt الترخيص ونوع المحتوى كما هو موضح أدناه. يتم إصدار مفتاح API المطلوب للترخيص بواسطة Openai: API Key وتخزينه كمتغير للبيئة. عند طلب رسالة ، يمكن تحديد الدور على أنه "مستخدم" أو "نظام" أو "مساعد" وفقًا لدليل انتقال 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. في هذه الحالة ، يجب أن تتضمن SessionState الحوار والنية ، ويجب استخراج اسم النية من المدخلات. بالإضافة إلى ذلك ، يتم وضع رسالة استجابة 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 ,
}
]
}
} يستخدم طراز "Text-Davinci-003" "V1/Expections" وفقًا لـ API 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 في البيئة. هنا ، نستخدم chatbot باللغة الكورية ، لذلك نحدد "KO_KR" كما هو موضح أدناه. يجب أن تحتوي وظيفة 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 لتلقيه من خلال طريقة 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 ، حدد [إنشاء بيئة] وأدخل الاسم كما هو موضح أدناه. هنا ، أدخلت "chatbot". بعد ذلك ، يتم الحفاظ على الباقي وتحديد [إنشاء].

عند إنشاء Cloud9 ، [فتح] ثم قم بإعداد المحطة كما هو موضح أدناه.

قم بتنزيل المصدر كما هو موضح أدناه.
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 لأول مرة ، فيجب عليك تشغيل bootstrap كما هو موضح أدناه. حيث يعني معرف الحساب هنا رقم الحساب المكون من 12 رقمًا. يمكنك التحقق من شاشة AWS Console أو عن طريق التحقق من أمر "AWS STS Get-Caller-HideTity-Idp Quicer-Odpput Text".
cdk bootstrap aws : //account-id/ap-northeast-2إنشاء Bot HelloWorld وفقًا لـ Hello World Bot في ورشة Amazon Lex Korean chatbot Build. "Hello World Bot" هو روبوت تحية بسيط يسأل ويتحقق من الاسم.
بعد الانتهاء من إنشاء "Hello World Bot" ، الوصول إلى وحدة التحكم في BOT وحدد "HelloWorldBot". يمكنك أن ترى أن Botid هو "BSZQXD0ABN" كما هو موضح أدناه.

إذا قمت بتحديد [الاسم المستعار] من "HelloWorldBot" ، فيمكنك معرفة الأسماء المستعارة كما هو موضح أدناه. حدد "Testbotoalias" هنا.

يمكنك أن ترى أن botaliasid هو "tstaliasid" كما هو موضح أدناه.

ارجع إلى Cloud9 وافتح "التفاعلية-lex-lex-to-chtgpt/cdk-lex/lib/lix-lex-sack.ts" في مستكشف الملف الأيسر وفتح "lambda for lex" تحديث botaliasid. حيث يحافظ SessionId على القيمة الحالية أو أدخل أي قيمة.

بالإضافة إلى ذلك ، أدخل "Openai_api_key" في بيئة "Lambda for ChatGPT". إذا لم يكن لديك مفتاح مسبقًا مسبقًا ، فسيتم إصداره من Openai: API Key.

الآن إنشاء بنية تحتية كاملة مع CDK.
cdk deployعندما يتم تثبيته بشكل طبيعي ، يتم عرض "الإخراج" التالي. هنا ، Distributomainname هو "D3NDV6LHZE8YC5.CLOUDFRONT.NET" و Weburl هو "https://d3ndv6lhze8yc5.cloudfront.net/chat.html".

حدد "HellowWorldBot" من وحدة التحكم AWS LEX وحدد [اللغات] في "الاسم المستعار" واختر [كوريا (كوريا الجنوبية)] كما هو موضح أدناه.

حدد "Lambda-Chatgpt" كـ [Soucet] ، و [إصدار وظيفة Lambda أو الاسم المستعار] حدد "$ الأخير" وحدد [حفظ].

ثم حدد [FackBackIntent] كما هو موضح أدناه في [intents] من "HellowWorldBot".

قم بالتمرير لأسفل وحدد [الخيارات المتقدمة] من fullfillment وتمكين [استخدام وظيفة lambda لتحقيق] من pop -up أدناه.

حدد [بناء] في الجزء العلوي من الشاشة لتطبيق المحتويات التي تم تغييرها.

يتم توصيل "https://d3ndv6lhze8yc5 لم يتم تسجيل مسألة "LEX" ، وهو السؤال بعد عملية القصد ، كقصد. اعتمادًا على إعدادات المتصفح ، قد لا تتمكن من تلقي بعض الاستجابة لـ ChatGPT.

إذا لم تعد تستخدم البنية التحتية ، فيمكنك حذف جميع الموارد كما هو موضح أدناه.
cdk destroy لقد قمت بتطبيق chatbot التفاعلية باستخدام Amazon Lex و ChatGpt ، وشرحت كيفية استخدام AWS CDK لتطوير وتشغيل البنية التحتية بشكل فعال. باستخدام ChatGPT ، يمكنك أيضًا تحسين قابلية الاستخدام الخاصة بك من خلال منح المستخدمين مع الاستجابة المناسبة للنوايا التي لم يتم التعرف عليها في LEX. لقد أثبتت ChatGPT بالفعل قدرتها الممتازة على محادثة ، ويتم الإعلان حاليًا من نماذج GPT المختلفة. لذلك ، من خلال تقديم نماذج الذكاء الاصطناعي هذه في خدمات chatbot مثل LEX ، من المتوقع أن تحسن قابلية استخدام المستخدم وتوفير خدمة أفضل.