Amazon Lex adalah layanan AI manajemen lengkap yang menggunakan model bahasa alami untuk merancang, membangun, menguji, dan mendistribusikan antarmuka interaktif untuk aplikasi. Dengan demikian, chatbot yang terbuat dari Amazon Lex dapat mengidentifikasi niat sehingga Anda dapat mengirim dan menerima percakapan yang berkelanjutan, sehingga Anda dapat menampilkan informasi yang Anda butuhkan untuk memenuhi niat Anda. Selain itu, Amazon Kendra dapat digunakan untuk menjawab niat yang tidak diidentifikasi di Amazon Lex. Demikian pula, menggunakan API Open Pihak ke -3, Anda bisa mendapatkan efek serupa. Pada bulan November 2022, ChatGPT dirilis, menunjukkan kemampuan percakapan yang sangat baik, memungkinkan untuk menggunakan chatgpt sebagai API terbuka serta Kendra. Dalam posting ini, saya ingin menjelaskan cara menerapkan chatbot interaktif yang menggunakan chatgpt sebagai API terbuka untuk menjawab niat yang tidak ditentukan sebelumnya.
Arsitektur yang Anda terapkan di sini adalah sebagai berikut. Menggunakan Amazon Cloudfront, kami menyediakan halaman web untuk obrolan. Pesan obrolan yang Anda masukkan oleh pengguna menggunakan Amazon API Gateway dan AWS Lambda untuk menjawab niat di Lex. Namun, jika ada niat yang tidak dikenali di LEX, fungsi Lambda akan digunakan untuk menanyakan chatgpt, dan hasilnya ditampilkan di jendela obrolan. Infrastruktur untuk mengkonfigurasi chatbot interaktif tersebut dibuat dan dikelola menggunakan AWS CDK. Karena semua infrastruktur terdiri dari serverless (serverless), dimungkinkan untuk mengoperasikan sistem secara stabil melalui penskalaan otomatis bahkan dalam lalu lintas yang efisien dan berfluktuasi di permukaan pemeliharaan.

Lihat di bawah untuk operasi terperinci.
Langkah 1: Pengguna mencoba untuk terhubung ke halaman web Chatbot dengan domain CloudFront dan memuat HTML, CSS, dan JavaScript yang disimpan di S3.
Langkah 2: Masukkan pesan obrolan di halaman web. Pada saat ini, sumber daya "/obrolan" akan meminta pesan teks dalam format JSON di sumber daya "/obrolan".
Langkah 3: CloudFront mengirimkan permintaan ke API Gateway.
Langkah 4: API Gateway memanggil fungsi Lambda yang terhubung ke sumber daya /obrolan.
Langkah 5: Fungsi Lambda Lulus pesan obrolan ke Lex menggunakan LEX V2 API.
Langkah 6: Lex melakukan perilaku yang sesuai jika ada niat yang ditentukan. Jika Anda tidak dapat mengenali niat Anda, kirim permintaan untuk menghubungi Chatgpt.
Langkah 7: Jika Anda menjawab di ChatGPT, respons dikirim ke urutan terbalik dari tahap sebelumnya dan dikirimkan kepada pengguna.
Wilayah Seoul tidak mendukung Lex V1, tetapi hanya dukungan Lex V2. Oleh karena itu, pengenalan Lex V2 digunakan untuk mengirim input pengguna ke pesan ke pesan. Klien Lex Runtime V2 mendefinisikan sebagai berikut.
import { LexRuntimeV2Client , RecognizeTextCommand } from "@aws-sdk/client-lex-runtime-v2" ; Fungsi Lambda dipisahkan dari acara dan menyampaikan pesan menggunakan Botaliasid atau Botid seperti yang ditunjukkan di bawah ini, dan mengekstrak dan menyampaikan pesan dari respons yang dikirim dari 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 ,
};Pada bulan Maret 2023, API resmi Open ChatGPT dirilis. Jalur API baru adalah "/v1/chat/penyelesaian" dan menggunakan model "GPT-3.5-turbo". Model ini dapat digunakan dengan biaya 90% lebih rendah dibandingkan dengan model yang ada "Text-Davinci-003", tetapi tidak dapat dilakukan untuk mencari cuaca di ChatGPT. Di sini, kami akan menjelaskan cara menggunakan model "Text-Davinci-003" yang mendukung pencarian selama obrolan dengan API resmi ChatGPT.
Permintaan dibuat oleh API ChatGPT yang disediakan oleh OpenAi, "V1/Chat/Completions" ke HTTPS Post. Untuk melakukan ini, kami menggunakan Fetch di sini. Pada saat ini, header permintaan yang akan dikirimkan ke chatgpt harus menyertakan otorisasi dan tipe konten seperti yang ditunjukkan di bawah ini. Kunci API yang diperlukan untuk otorisasi dikeluarkan oleh OpenAI: Kunci API dan disimpan sebagai variabel lingkungan. Saat meminta pesan, peran dapat ditentukan sebagai "pengguna", "sistem", atau "asisten" sesuai dengan panduan transisi API chatgpt. Kode terperinci dapat ditemukan di sini (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 },
],
}),
});Saat Anda mengirim pesan respons yang dikirim oleh ChatGPT, Anda harus mengirimkannya ke format di bawah ini saat mengirimnya ke Lex. Dalam hal ini, Sesi Sesi harus mencakup dialogaksi dan niat, dan nama niat harus diekstraksi dari input. Selain itu, pesan respons chatgpt dimasukkan ke dalam "konten" dari "pesan" dan dikirimkan sebagai berikut.
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 ,
}
]
}
} Model "Text-Davinci-003" menggunakan "V1/Penyelesaian" menurut API penyelesaian. Di sini Anda diimplementasikan menggunakan pustaka OpenAi Node.js. Kode terperinci dapat ditemukan di sini (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,
}; Klien mengirimkan pesan obrolan seperti yang ditunjukkan di bawah ini di server obrolan dan menampilkannya di gelembung obrolan penerima saat respons datang. Alamat server obrolan di sini adalah domain CloudFront. Kode terperinci dikonfirmasi di sini (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 );
}Di sini Anda dapat mengonfigurasi AWS CDK menggunakan TypeScript. Kode terperinci dapat ditemukan di sini (CDK-chatbot-sack.ts).
Fungsi lambda untuk Lex didefinisikan seperti di bawah ini. Ini harus mencakup botid dan botaliasid di lingkungan. Di sini, kami menggunakan chatbot dalam bahasa Korea, jadi kami menentukan "ko_kr" sebagai localid seperti yang ditunjukkan di bawah ini. Fungsi Lambda ini harus memiliki izin untuk Lex dan 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' )); Input LEX diatur untuk menerima melalui metode POST dengan sumber daya "/chat" seperti yang ditunjukkan di bawah ini menggunakan gateway 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 ,
},
}
]
}); Untuk memotong CORS, daftarkan perilaku untuk sumber daya "/obrolan" seperti yang ditunjukkan di bawah ini.
distribution . addBehavior ( "/chat" , new origins . RestApiOrigin ( api ), {
cachePolicy : cloudFront . CachePolicy . CACHING_DISABLED ,
allowedMethods : cloudFront . AllowedMethods . ALLOW_ALL ,
viewerProtocolPolicy : cloudFront . ViewerProtocolPolicy . REDIRECT_TO_HTTPS ,
});Kirim teks ke chatgpt dan siapkan fungsi lambda yang menerima respons. Di mana openai_api_key adalah kunci API yang dikeluarkan oleh 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" ,
}
}); Untuk kenyamanan, kami menyiapkan distribusi menggunakan cloud9 di wilayah Seoul. Cloud9 menyediakan lingkungan yang nyaman untuk membuat, menjalankan, dan men -debug kode di browser. Masukkan Cloud9 Console, pilih [Buat Lingkungan] dan masukkan nama seperti yang ditunjukkan di bawah ini. Di sini, saya memasukkan "chatbot". Setelah itu, sisanya dipertahankan dan pilih [Buat].

Ketika cloud9 dibuat, [buka] dan kemudian siapkan terminal seperti yang ditunjukkan di bawah ini.

Unduh sumber seperti yang ditunjukkan di bawah ini.
git clone https : //github.com/kyopark2014/interactive-chat-using-Lex-and-ChatGPTBuka folder CDK dan instal perpustakaan yang diperlukan. AWS-CDK-LIB adalah perpustakaan CDK 2.0.
cd interactive - chat - using - Lex - and - ChatGPT / cdk - chatbot && npm installJika Anda menggunakan CDK untuk pertama kalinya, Anda harus menjalankan bootstrap seperti yang ditunjukkan di bawah ini. Di mana akun-ID di sini berarti nomor akun 12 digit. Anda dapat memeriksa di layar AWS Console atau dengan memeriksa perintah "AWS STS Get-Caller-Identity-Query Account-ID-output Text".
cdk bootstrap aws : //account-id/ap-northeast-2Buat bot HelloWorld Menurut Hello World Bot di Amazon Lex Korea Chatbot Build Workshop. "Hello World Bot" adalah bot ucapan sederhana yang meminta dan memeriksa namanya.
Setelah menyelesaikan penciptaan "Hello World Bot", akses Bot Console dan pilih "HelloWorldBot". Anda dapat melihat bahwa botid adalah "bszqxd0abn" seperti yang ditunjukkan di bawah ini.

Jika Anda memilih [alias] dari "HelloWorldbot", Anda dapat mengetahui alias seperti yang ditunjukkan di bawah ini. Pilih "TestBotoalias" di sini.

Anda dapat melihat bahwa Botaliasid adalah "tstaliasid" seperti yang ditunjukkan di bawah ini.

Kembali ke cloud9 dan buka "interaktif-chat-use-lex-to-chtgpt/cdk-lex/lib/lix-lex-sack.ts" di penjelajah file kiri dan buka "lambda untuk lex" Perbarui Botaliasid. Di mana sessionID mempertahankan nilai saat ini atau memasukkan nilai apa pun.

Selain itu, masukkan "openai_api_key" di lingkungan "Lambda for Chatgpt". Jika Anda tidak memiliki kunci yang telah ditentukan sebelumnya, Anda akan dikeluarkan dari OpenAI: API Key.

Sekarang buat infrastruktur lengkap dengan CDK.
cdk deployKetika dipasang secara normal, "output" berikut ditampilkan. Di sini, DistributionDomainName adalah "D3ndv6lhze8yc5.cloudfront.net" dan WebUrl adalah "https://d3ndv6lhze8yc5.cloudfront.net/chat.html".

Pilih "HelloWworldBot" dari AWS Lex Console dan pilih [Bahasa] di "Aliases" dan pilih [Korea (Korea Selatan)] seperti yang ditunjukkan di bawah ini.

Pilih "Lambda-Chatgpt" sebagai [Soucet], dan [Versi Fungsi Lambda atau Alias] Pilih "$ terbaru" dan pilih [Simpan].

Kemudian pilih [FallbackIntent] seperti yang ditunjukkan di bawah ini dalam [Intents] dari "HelloWworldBot".

Gulir ke bawah dan pilih [Opsi Lanjutan] dari FullFillment dan memungkinkan [Gunakan fungsi Lambda untuk pemenuhan] dari pop -up di bawah ini.

Pilih [Build] di bagian atas layar untuk menerapkan konten yang diubah.

WebUrl's "" https://d3ndv6lhze8yc5.cloudfront.net/chat.html "terhubung ke layar obrolan di browser. Anda dapat mengobrol dengan Lex di browser web seperti yang ditunjukkan di bawah ini. Pertanyaan "Lex", yang merupakan pertanyaan setelah operasi niat, tidak terdaftar sebagai niat. Bergantung pada pengaturan browser, Anda mungkin tidak dapat menerima beberapa respons terhadap chatgpt.

Jika Anda tidak menggunakan infrastruktur lagi, Anda dapat menghapus semua sumber daya seperti yang ditunjukkan di bawah ini.
cdk destroy Saya menerapkan chatbot interaktif menggunakan Amazon Lex dan ChatGPT, dan menjelaskan cara menggunakan AWS CDK untuk secara efektif mengembangkan dan mengoperasikan infrastruktur. Dengan menggunakan ChatGPT, Anda juga dapat meningkatkan kegunaan Anda dengan memberi pengguna dengan respons yang sesuai terhadap niat yang tidak dikenali di Lex. ChatGPT telah membuktikan kemampuan percakapannya yang sangat baik, dan berbagai model GPT saat ini sedang diumumkan. Oleh karena itu, dengan memperkenalkan model kecerdasan buatan ini ke dalam layanan chatbot seperti Lex, diharapkan untuk meningkatkan kegunaan pengguna dan memberikan layanan yang lebih baik.