هوش داده افلاطون
جستجوی عمودی و هوش مصنوعی

تعاملات یک به یک مشتری را تغییر دهید: با AWS و هوش مصنوعی مولد، عوامل پردازش سفارش با قابلیت گفتار بسازید | خدمات وب آمازون

تاریخ:

در چشم‌انداز امروزی تعاملات یک به یک مشتری برای سفارش‌گذاری، رویه رایج همچنان به متصدیان انسانی تکیه می‌کند، حتی در محیط‌هایی مانند کافی‌شاپ‌ها و موسسات فست‌فود. این رویکرد سنتی چندین چالش را ایجاد می‌کند: به شدت به فرآیندهای دستی بستگی دارد، تلاش می‌کند تا با افزایش تقاضای مشتری مقیاس کارآمدی داشته باشد، احتمال خطاهای انسانی را معرفی می‌کند، و در ساعات مشخصی پس از در دسترس بودن عمل می‌کند. علاوه بر این، در بازارهای رقابتی، کسب و کارهایی که صرفاً به فرآیندهای دستی پایبند هستند، ممکن است ارائه خدمات کارآمد و رقابتی را چالش برانگیز بدانند. با وجود پیشرفت های تکنولوژیکی، مدل انسان محور عمیقاً در پردازش سفارش ریشه دوانده است که منجر به این محدودیت ها می شود.

مدتی است که چشم انداز استفاده از فناوری برای کمک پردازش سفارش یک به یک در دسترس بوده است. با این حال، راه‌حل‌های موجود اغلب می‌توانند به دو دسته تقسیم شوند: سیستم‌های مبتنی بر قانون که زمان و تلاش قابل‌توجهی را برای راه‌اندازی و نگهداری می‌طلبند، یا سیستم‌های سفت و سخت که فاقد انعطاف‌پذیری لازم برای تعاملات انسان‌مانند با مشتریان هستند. در نتیجه، کسب‌وکارها و سازمان‌ها در اجرای سریع و کارآمد چنین راهکارهایی با چالش‌هایی مواجه هستند. خوشبختانه با ظهور هوش مصنوعی مولد و مدل های زبان بزرگ (LLM)، اکنون می توان سیستم های خودکاری ایجاد کرد که بتوانند زبان طبیعی را به طور کارآمد و با یک جدول زمانی تسریع شده روی ramping اداره کنند.

بستر آمازون یک سرویس کاملاً مدیریت شده است که انتخابی از مدل‌های پایه (FM) با کارایی بالا را از شرکت‌های پیشرو هوش مصنوعی مانند AI21 Labs، Anthropic، Cohere، Meta، Stability AI، و Amazon از طریق یک API به همراه مجموعه وسیعی از قابلیت‌های شما ارائه می‌کند. نیاز به ساخت برنامه های هوش مصنوعی مولد با امنیت، حریم خصوصی و هوش مصنوعی مسئول. علاوه بر Amazon Bedrock، می توانید از سایر خدمات AWS مانند استفاده کنید Amazon SageMaker JumpStart و آمازون لکس برای ایجاد عوامل پردازش سفارش AI مولد کاملاً خودکار و به راحتی قابل انطباق.

در این پست، ما به شما نشان می دهیم که چگونه با استفاده از آمازون لکس، آمازون بستر و آمازون، یک عامل پردازش سفارش با قابلیت گفتار بسازید. AWS لامبدا.

بررسی اجمالی راه حل

نمودار زیر معماری راه حل ما را نشان می دهد.

گردش کار شامل مراحل زیر است:

  1. مشتری با استفاده از آمازون لکس سفارش را ارسال می کند.
  2. ربات آمازون لکس، مقاصد مشتری را تفسیر می‌کند و a DialogCodeHook.
  3. یک تابع لامبدا الگوی درخواستی مناسب را از لایه لامبدا می کشد و با افزودن ورودی مشتری در الگوی اعلان مرتبط، درخواست های مدل را قالب بندی می کند.
  4. La RequestValidation prompt سفارش را با آیتم منو تأیید می کند و به مشتری از طریق آمازون Lex اطلاع می دهد که آیا چیزی وجود دارد که می خواهند سفارش دهند که بخشی از منو نیست و توصیه هایی را ارائه می دهد. درخواست همچنین یک اعتبار سنجی اولیه برای کامل بودن سفارش انجام می دهد.
  5. La ObjectCreator prompt درخواست های زبان طبیعی را به یک ساختار داده (فرمت JSON) تبدیل می کند.
  6. عملکرد Lambda اعتبار سنجی مشتری ویژگی های مورد نیاز سفارش را تأیید می کند و تأیید می کند که آیا تمام اطلاعات لازم برای پردازش سفارش وجود دارد یا خیر.
  7. تابع Lambda مشتری ساختار داده را به عنوان ورودی برای پردازش سفارش می گیرد و کل سفارش را به تابع لامبدا هماهنگ می کند.
  8. تابع لامبدا هماهنگ کننده، نقطه پایانی Amazon Bedrock LLM را فراخوانی می کند تا خلاصه سفارش نهایی را شامل کل سفارش از سیستم پایگاه داده مشتری تولید کند (به عنوان مثال، آمازون DynamoDB).
  9. خلاصه سفارش از طریق آمازون لکس به مشتری ارسال می شود. پس از تایید سفارش مشتری، سفارش پردازش می شود.

پیش نیازها

این پست فرض می کند که شما یک حساب کاربری AWS فعال دارید و با مفاهیم و خدمات زیر آشنا هستید:

همچنین، برای دسترسی به Amazon Bedrock از توابع Lambda، باید مطمئن شوید که زمان اجرا Lambda دارای کتابخانه های زیر است:

  • boto3>=1.28.57
  • awscli>=1.29.57
  • botocore>=1.31.57

این را می توان با a انجام داد لایه لامبدا یا با استفاده از یک AMI خاص با کتابخانه های مورد نیاز.

علاوه بر این، هنگام فراخوانی Amazon Bedrock API از این کتابخانه ها لازم است Amazon SageMaker Studio. این کار را می توان با اجرای یک سلول با کد زیر انجام داد:

%pip install --no-build-isolation --force-reinstall 
"boto3>=1.28.57" 
"awscli>=1.29.57" 
"botocore>=1.31.57"

در نهایت، خط مشی زیر را ایجاد می‌کنید و بعداً آن را به هر نقشی که به Amazon Bedrock دسترسی دارد متصل می‌کنید:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": "bedrock:*",
            "Resource": "*"
        }
    ]
}

یک جدول DynamoDB ایجاد کنید

در سناریوی خاص خود، ما یک جدول DynamoDB به عنوان سیستم پایگاه داده مشتریان خود ایجاد کرده ایم، اما می توانید از آن نیز استفاده کنید. سرویس پایگاه داده رابطه آمازون (آمازون RDS). مراحل زیر را برای تهیه جدول DynamoDB خود تکمیل کنید (یا تنظیمات را در صورت نیاز برای مورد استفاده خود سفارشی کنید):

  1. در کنسول DynamoDB، را انتخاب کنید جداول در صفحه ناوبری
  2. را انتخاب کنید ایجاد جدول.

  1. برای نام جدول، یک نام وارد کنید (به عنوان مثال، ItemDetails).
  2. برای کلید پارتیشن، یک کلید وارد کنید (برای این پست، ما استفاده می کنیم Item).
  3. برای کلید مرتب سازی، یک کلید وارد کنید (برای این پست، ما استفاده می کنیم Size).
  4. را انتخاب کنید ایجاد جدول.

اکنون می توانید داده ها را در جدول DynamoDB بارگذاری کنید. برای این پست از یک فایل CSV استفاده می کنیم. می توانید داده ها را با استفاده از کد پایتون در یک نوت بوک SageMaker در جدول DynamoDB بارگیری کنید.

ابتدا باید پروفایلی به نام dev راه اندازی کنیم.

  1. یک ترمینال جدید در SageMaker Studio باز کنید و دستور زیر را اجرا کنید:
aws configure --profile dev

این دستور از شما می خواهد که شناسه کلید دسترسی AWS، کلید دسترسی مخفی، منطقه پیش فرض AWS و فرمت خروجی خود را وارد کنید.

  1. به نوت بوک SageMaker برگردید و یک کد پایتون بنویسید تا با استفاده از کتابخانه Boto3 در پایتون اتصال به DynamoDB را تنظیم کنید. این قطعه کد یک جلسه با استفاده از یک نمایه AWS خاص به نام dev ایجاد می کند و سپس یک مشتری DynamoDB با استفاده از آن جلسه ایجاد می کند. نمونه کد زیر برای بارگیری داده ها است:
%pip install boto3
import boto3
import csv

# Create a session using a profile named 'dev'
session = boto3.Session(profile_name='dev')

# Create a DynamoDB resource using the session
dynamodb = session.resource('dynamodb')

# Specify your DynamoDB table name
table_name = 'your_table_name'
table = dynamodb.Table(table_name)

# Specify the path to your CSV file
csv_file_path = 'path/to/your/file.csv'

# Read CSV file and put items into DynamoDB
with open(csv_file_path, 'r', encoding='utf-8-sig') as csvfile:
    csvreader = csv.reader(csvfile)
    
    # Skip the header row
    next(csvreader, None)

    for row in csvreader:
        # Extract values from the CSV row
        item = {
            'Item': row[0],  # Adjust the index based on your CSV structure
            'Size': row[1],
            'Price': row[2]
        }
        
        # Put item into DynamoDB
        response = table.put_item(Item=item)
        
        print(f"Item added: {response}")
print(f"CSV data has been loaded into the DynamoDB table: {table_name}")

متناوبا می توانید از آن استفاده کنید میز کار NoSQL یا ابزارهای دیگر برای بارگیری سریع داده ها در جدول DynamoDB شما.

تصویر زیر پس از درج داده های نمونه در جدول، اسکرین شات است.

با استفاده از API فراخوانی Amazon Bedrock، در یک نوت بوک SageMaker قالب ایجاد کنید

برای ایجاد الگوی سریع خود برای این مورد، ما از Amazon Bedrock استفاده می کنیم. شما می توانید از بستر آمازون دسترسی داشته باشید کنسول مدیریت AWS و از طریق فراخوانی های API. در مورد ما، ما از طریق API به راحتی یک نوت بوک SageMaker Studio به Amazon Bedrock دسترسی پیدا می کنیم تا نه تنها الگوی درخواستی خود، بلکه کد فراخوانی کامل API خود را ایجاد کنیم که بعداً می توانیم در عملکرد Lambda خود استفاده کنیم.

  1. در کنسول SageMaker، به دامنه SageMaker Studio موجود دسترسی داشته باشید یا دامنه جدیدی ایجاد کنید تا از طریق یک نوت بوک SageMaker به Amazon Bedrock دسترسی پیدا کنید.

  1. پس از ایجاد دامنه و کاربر SageMaker، کاربر را انتخاب کرده و انتخاب کنید راه اندازی و استودیو. این یک محیط JupyterLab را باز می کند.
  2. وقتی محیط JupyterLab آماده شد، یک نوت بوک جدید باز کنید و شروع به وارد کردن کتابخانه های لازم کنید.

FM های زیادی از طریق Amazon Bedrock Python SDK در دسترس هستند. در این مورد، ما از Claude V2، یک مدل بنیادی قدرتمند که توسط Anthropic توسعه یافته است، استفاده می کنیم.

عامل پردازش سفارش به چند الگوی مختلف نیاز دارد. این می تواند بسته به مورد استفاده تغییر کند، اما ما یک گردش کار کلی طراحی کرده ایم که می تواند برای چندین تنظیمات اعمال شود. برای این مورد استفاده، قالب Amazon Bedrock LLM موارد زیر را انجام می دهد:

  • هدف مشتری را تأیید کنید
  • درخواست را تأیید کنید
  • ساختار داده سفارش را ایجاد کنید
  • خلاصه ای از سفارش را به مشتری ارسال کنید
  1. برای فراخوانی مدل، یک آبجکت در زمان اجرا از Boto3 ایجاد کنید.

#Model api request parameters
modelId = 'anthropic.claude-v2' # change this to use a different version from the model provider
accept = 'application/json'
contentType = 'application/json'

import boto3
import json
bedrock = boto3.client(service_name='bedrock-runtime')

بیایید با کار بر روی الگوی درخواست اعتباردهنده قصد شروع کنیم. این یک فرآیند تکراری است، اما به لطف راهنمای مهندسی سریع Anthropic، می‌توانید به سرعت یک درخواست ایجاد کنید که بتواند کار را انجام دهد.

  1. اولین الگوی سریع را به همراه یک تابع ابزار ایجاد کنید که به آماده سازی بدن برای فراخوانی های API کمک می کند.

کد زیر برای prompt_template_intent_validator.txt است:

"{"prompt": "Human: I will give you some instructions to complete my request.n<instructions>Given the Conversation between Human and Assistant, you need to identify the intent that the human wants to accomplish and respond appropriately. The valid intents are: Greeting,Place Order, Complain, Speak to Someone. Always put your response to the Human within the Response tags. Also add an XML tag to your output identifying the human intent.nHere are some examples:n<example><Conversation> H: hi there.nnA: Hi, how can I help you today?nnH: Yes. I would like a medium mocha please</Conversation>nnA:<intent>Place Order</intent><Response>nGot it.</Response></example>n<example><Conversation> H: hellonnA: Hi, how can I help you today?nnH: my coffee does not taste well can you please re-make it?</Conversation>nnA:<intent>Complain</intent><Response>nOh, I am sorry to hear that. Let me get someone to help you.</Response></example>n<example><Conversation> H: hinnA: Hi, how can I help you today?nnH: I would like to speak to someone else please</Conversation>nnA:<intent>Speak to Someone</intent><Response>nSure, let me get someone to help you.</Response></example>n<example><Conversation> H: howdynnA: Hi, how can I help you today?nnH:can I get a large americano with sugar and 2 mochas with no whipped cream</Conversation>nnA:<intent>Place Order</intent><Response>nSure thing! Please give me a moment.</Response></example>n<example><Conversation> H: hinn</Conversation>nnA:<intent>Greeting</intent><Response>nHi there, how can I help you today?</Response></example>n</instructions>nnPlease complete this request according to the instructions and examples provided above:<request><Conversation>REPLACEME</Conversation></request>nnAssistant:n", "max_tokens_to_sample": 250, "temperature": 1, "top_k": 250, "top_p": 0.75, "stop_sequences": ["nnHuman:", "nnhuman:", "nnCustomer:", "nncustomer:"]}"


  1. این الگو را در یک فایل ذخیره کنید تا در آمازون S3 آپلود شود و در صورت نیاز از تابع Lambda تماس بگیرید. الگوها را به عنوان رشته های سریالی JSON در یک فایل متنی ذخیره کنید. اسکرین شات قبلی نمونه کد را برای انجام این کار نیز نشان می دهد.
  2. همین مراحل را با سایر قالب ها تکرار کنید.

در زیر تصاویری از سایر الگوها و نتایج هنگام تماس با Amazon Bedrock با برخی از آنها آورده شده است.

کد زیر برای prompt_template_request_validator.txt است:

"{"prompt": "Human: I will give you some instructions to complete my request.n<instructions>Given the context do the following steps: 1. verify that the items in the input are valid. If customer provided an invalid item, recommend replacing it with a valid one. 2. verify that the customer has provided all the information marked as required. If the customer missed a required information, ask the customer for that information. 3. When the order is complete, provide a summary of the order and ask for confirmation always using this phrase: 'is this correct?' 4. If the customer confirms the order, Do not ask for confirmation again, just say the phrase inside the brackets [Great, Give me a moment while I try to process your order]</instructions>n<context>nThe VALID MENU ITEMS are: [latte, frappe, mocha, espresso, cappuccino, romano, americano].nThe VALID OPTIONS are: [splenda, stevia, raw sugar, honey, whipped cream, sugar, oat milk, soy milk, regular milk, skimmed milk, whole milk, 2 percent milk, almond milk].nThe required information is: size. Size can be: small, medium, large.nHere are some examples: <example>H: I would like a medium latte with 1 Splenda and a small romano with no sugar please.nnA: <Validation>:nThe Human is ordering a medium latte with one splenda. Latte is a valid menu item and splenda is a valid option. The Human is also ordering a small romano with no sugar. Romano is a valid menu item.</Validation>n<Response>nOk, I got: nt-Medium Latte with 1 Splenda and.nt-Small Romano with no Sugar.nIs this correct?</Response>nnH: yep.nnA:n<Response>nGreat, Give me a moment while I try to process your order</example>nn<example>H: I would like a cappuccino and a mocha please.nnA: <Validation>:nThe Human is ordering a cappuccino and a mocha. Both are valid menu items. The Human did not provide the size for the cappuccino. The human did not provide the size for the mocha. I will ask the Human for the required missing information.</Validation>n<Response>nSure thing, but can you please let me know the size for the Cappuccino and the size for the Mocha? We have Small, Medium, or Large.</Response></example>nn<example>H: I would like a small cappuccino and a large lemonade please.nnA: <Validation>:nThe Human is ordering a small cappuccino and a large lemonade. Cappuccino is a valid menu item. Lemonade is not a valid menu item. I will suggest the Human a replacement from our valid menu items.</Validation>n<Response>nSorry, we don't have Lemonades, would you like to order something else instead? Perhaps a Frappe or a Latte?</Response></example>nn<example>H: Can I get a medium frappuccino with sugar please?nnA: <Validation>:n The Human is ordering a Frappuccino. Frappuccino is not a valid menu item. I will suggest a replacement from the valid menu items in my context.</Validation>n<Response>nI am so sorry, but Frappuccino is not in our menu, do you want a frappe or a cappuccino instead? perhaps something else?</Response></example>nn<example>H: I want two large americanos and a small latte please.nnA: <Validation>:n The Human is ordering 2 Large Americanos, and a Small Latte. Americano is a valid menu item. Latte is a valid menu item.</Validation>n<Response>nOk, I got: nt-2 Large Americanos and.nt-Small Latte.nIs this correct?</Response>nnH: looks correct, yes.nnA:n<Response>nGreat, Give me a moment while I try to process your order.</Response></example>nn</Context>nnPlease complete this request according to the instructions and examples provided above:<request>REPLACEME</request>nnAssistant:n", "max_tokens_to_sample": 250, "temperature": 0.3, "top_k": 250, "top_p": 0.75, "stop_sequences": ["nnHuman:", "nnhuman:", "nnCustomer:", "nncustomer:"]}"

در زیر پاسخ ما از Amazon Bedrock با استفاده از این الگو است.

کد زیر برای prompt_template_object_creator.txt:

"{"prompt": "Human: I will give you some instructions to complete my request.n<instructions>Given the Conversation between Human and Assistant, you need to create a json object in Response with the appropriate attributes.nHere are some examples:n<example><Conversation> H: I want a latte.nnA:nCan I have the size?nnH: Medium.nnA: So, a medium latte.nIs this Correct?nnH: Yes.</Conversation>nnA:<Response>{"1":{"item":"latte","size":"medium","addOns":[]}}</Response></example>n<example><Conversation> H: I want a large frappe and 2 small americanos with sugar.nnA: Okay, let me confirm:nn1 large frappenn2 small americanos with sugarnnIs this correct?nnH: Yes.</Conversation>nnA:<Response>{"1":{"item":"frappe","size":"large","addOns":[]},"2":{"item":"americano","size":"small","addOns":["sugar"]},"3":{"item":"americano","size":"small","addOns":["sugar"]}}</Response>n</example>n<example><Conversation> H: I want a medium americano.nnA: Okay, let me confirm:nn1 medium americanonnIs this correct?nnH: Yes.</Conversation>nnA:<Response>{"1":{"item":"americano","size":"medium","addOns":[]}}</Response></example>n<example><Conversation> H: I want a large latte with oatmilk.nnA: Okay, let me confirm:nnLarge latte with oatmilknnIs this correct?nnH: Yes.</Conversation>nnA:<Response>{"1":{"item":"latte","size":"large","addOns":["oatmilk"]}}</Response></example>n<example><Conversation> H: I want a small mocha with no whipped cream please.nnA: Okay, let me confirm:nnSmall mocha with no whipped creamnnIs this correct?nnH: Yes.</Conversation>nnA:<Response>{"1":{"item":"mocha","size":"small","addOns":["no whipped cream"]}}</Response>nn</example></instructions>nnPlease complete this request according to the instructions and examples provided above:<request><Conversation>REPLACEME</Conversation></request>nnAssistant:n", "max_tokens_to_sample": 250, "temperature": 0.3, "top_k": 250, "top_p": 0.75, "stop_sequences": ["nnHuman:", "nnhuman:", "nnCustomer:", "nncustomer:"]}"


کد زیر برای prompt_template_order_summary.txt است:

"{"prompt": "Human: I will give you some instructions to complete my request.n<instructions>Given the Conversation between Human and Assistant, you need to create a summary of the order with bullet points and include the order total.nHere are some examples:n<example><Conversation> H: I want a large frappe and 2 small americanos with sugar.nnA: Okay, let me confirm:nn1 large frappenn2 small americanos with sugarnnIs this correct?nnH: Yes.</Conversation>nn<OrderTotal>10.50</OrderTotal>nnA:<Response>nHere is a summary of your order along with the total:nn1 large frappenn2 small americanos with sugar.nYour Order total is $10.50</Response></example>n<example><Conversation> H: I want a medium americano.nnA: Okay, let me confirm:nn1 medium americanonnIs this correct?nnH: Yes.</Conversation>nn<OrderTotal>3.50</OrderTotal>nnA:<Response>nHere is a summary of your order along with the total:nn1 medium americano.nYour Order total is $3.50</Response></example>n<example><Conversation> H: I want a large latte with oat milk.nnA: Okay, let me confirm:nnLarge latte with oat milknnIs this correct?nnH: Yes.</Conversation>nn<OrderTotal>6.75</OrderTotal>nnA:<Response>nHere is a summary of your order along with the total:nnLarge latte with oat milk.nYour Order total is $6.75</Response></example>n<example><Conversation> H: I want a small mocha with no whipped cream please.nnA: Okay, let me confirm:nnSmall mocha with no whipped creamnnIs this correct?nnH: Yes.</Conversation>nn<OrderTotal>4.25</OrderTotal>nnA:<Response>nHere is a summary of your order along with the total:nnSmall mocha with no whipped cream.nYour Order total is $6.75</Response>nn</example>n</instructions>nnPlease complete this request according to the instructions and examples provided above:<request><Conversation>REPLACEME</Conversation>nn<OrderTotal>REPLACETOTAL</OrderTotal></request>nnAssistant:n", "max_tokens_to_sample": 250, "temperature": 0.3, "top_k": 250, "top_p": 0.75, "stop_sequences": ["nnHuman:", "nnhuman:", "nnCustomer:", "nncustomer:", "[Conversation]"]}"


همانطور که می بینید، ما از الگوهای سریع خود برای اعتبارسنجی موارد منو، شناسایی اطلاعات مورد نیاز، ایجاد یک ساختار داده و خلاصه کردن سفارش استفاده کرده ایم. مدل‌های پایه موجود در Amazon Bedrock بسیار قدرتمند هستند، بنابراین می‌توانید کارهای بیشتری را از طریق این قالب‌ها انجام دهید.

شما مهندسی اعلان ها را تکمیل کرده اید و الگوها را در فایل های متنی ذخیره کرده اید. اکنون می توانید شروع به ایجاد ربات Amazon Lex و توابع لامبدا کنید.

یک لایه Lambda با الگوهای اعلان ایجاد کنید

مراحل زیر را برای ایجاد لایه Lambda خود انجام دهید:

  1. در SageMaker Studio، یک پوشه جدید با یک زیرپوشه به نام ایجاد کنید python.
  2. فایل های درخواستی خود را در python پوشه.

  1. با اجرای دستور زیر می توانید کتابخانه ZIP را به نمونه نوت بوک خود اضافه کنید.
!conda install -y -c conda-forge zip

  1. اکنون دستور زیر را اجرا کنید تا فایل ZIP برای آپلود در لایه Lambda ایجاد شود.
!zip -r prompt_templates_layer.zip prompt_templates_layer/.

  1. پس از ایجاد فایل ZIP، می توانید فایل را دانلود کنید. به Lambda بروید، با آپلود مستقیم فایل یا ابتدا با آپلود در Amazon S3، یک لایه جدید ایجاد کنید.
  2. سپس این لایه جدید را به تابع لامبدا ارکستراسیون وصل کنید.

اکنون فایل‌های الگوی درخواستی شما به صورت محلی در محیط اجرای Lambda شما ذخیره می‌شوند. این روند در طول اجرای ربات شما سرعت می بخشد.

یک لایه Lambda با کتابخانه های مورد نیاز ایجاد کنید

مراحل زیر را برای ایجاد لایه Lambda خود با کتابخانه های مورد نیاز انجام دهید:

  1. باز کردن یک AWS Cloud9 محیط نمونه، یک پوشه با یک زیر پوشه به نام ایجاد کنید python.
  2. یک ترمینال را در داخل باز کنید python پوشه.
  3. دستورات زیر را از ترمینال اجرا کنید:
pip install “boto3>=1.28.57” -t .
pip install “awscli>=1.29.57" -t .
pip install “botocore>=1.31.57” -t .

  1. دویدن cd .. و خود را در داخل پوشه جدید خود قرار دهید، جایی که آن را نیز دارید python زیر پوشه
  2. دستور زیر را اجرا کنید:
zip -r lambda-layer.zip

  1. پس از ایجاد فایل ZIP، می توانید فایل را دانلود کنید. به Lambda بروید، با آپلود مستقیم فایل یا ابتدا با آپلود در Amazon S3، یک لایه جدید ایجاد کنید.
  2. سپس این لایه جدید را به تابع لامبدا ارکستراسیون وصل کنید.

ربات را در Amazon Lex v2 ایجاد کنید

برای این مورد استفاده، ما یک ربات آمازون Lex می‌سازیم که می‌تواند یک رابط ورودی/خروجی برای معماری فراهم کند تا با استفاده از صدا یا متن از هر رابط، Amazon Bedrock را فراخوانی کند. از آنجایی که LLM قطعه مکالمه این عامل پردازش سفارش را مدیریت می کند و Lambda گردش کار را هماهنگ می کند، می توانید یک ربات با سه هدف و بدون اسلات ایجاد کنید.

  1. در کنسول آمازون لکس، یک ربات جدید با روش ایجاد کنید یک ربات خالی ایجاد کنید.

اکنون می توانید یک intent با هر گفته اولیه مناسب برای کاربران نهایی اضافه کنید تا مکالمه را با ربات شروع کنند. ما از سلام های ساده استفاده می کنیم و یک پاسخ اولیه ربات را اضافه می کنیم تا کاربران نهایی بتوانند درخواست های خود را ارائه دهند. هنگام ایجاد ربات، مطمئن شوید که از یک قلاب کد Lambda با هدف استفاده کنید. این یک تابع Lambda را راه اندازی می کند که گردش کار بین مشتری، آمازون لکس و LLM را هماهنگ می کند.

  1. اولین هدف خود را اضافه کنید، که گردش کار را آغاز می کند و از الگوی درخواست اعتبار سنجی قصد برای فراخوانی Amazon Bedrock و شناسایی آنچه مشتری در تلاش است تا انجام دهد استفاده می کند. برای شروع مکالمه، چند جمله ساده را برای کاربران نهایی اضافه کنید.

شما نیازی به استفاده از اسلات یا خواندن اولیه در هیچ یک از اهداف ربات ندارید. در واقع شما نیازی به اضافه کردن جملات به قصد دوم یا سوم ندارید. به این دلیل است که LLM لامبدا را در طول فرآیند هدایت می کند.

  1. یک درخواست تأیید اضافه کنید. بعداً می‌توانید این پیام را در تابع Lambda سفارشی کنید.

  1. تحت قلاب کد، انتخاب کنید از تابع Lambda برای مقداردهی اولیه و اعتبار سنجی استفاده کنید.

  1. یک قصد دوم بدون بیان و بدون پاسخ اولیه ایجاد کنید. این است PlaceOrder قصد

هنگامی که LLM تشخیص می دهد که مشتری در حال تلاش برای سفارش است، تابع Lambda این هدف را فعال می کند و درخواست مشتری را در منو تایید می کند و مطمئن می شود که هیچ اطلاعات مورد نیازی وجود ندارد. به یاد داشته باشید که همه این موارد در قالب‌های درخواستی وجود دارد، بنابراین می‌توانید با تغییر الگوهای درخواستی، این گردش کار را برای هر موردی تطبیق دهید.

  1. هیچ شکافی اضافه نکنید، اما یک درخواست تأیید اضافه کنید و پاسخ را رد کنید.

  1. انتخاب کنید از تابع Lambda برای مقداردهی اولیه و اعتبار سنجی استفاده کنید.

  1. یک هدف سوم با نام ایجاد کنید ProcessOrder بدون بیان نمونه و بدون شکاف.
  2. یک پاسخ اولیه، یک درخواست تأیید و یک پاسخ رد اضافه کنید.

پس از اینکه LLM درخواست مشتری را تأیید کرد، تابع Lambda سومین و آخرین هدف را برای پردازش سفارش فعال می کند. در اینجا، لامبدا از الگوی ایجادکننده شی استفاده می‌کند تا ساختار داده JSON سفارش را برای جستجو در جدول DynamoDB ایجاد کند، و سپس از الگوی خلاصه سفارش برای خلاصه کردن کل سفارش همراه با کل استفاده می‌کند تا آمازون لکس بتواند آن را به مشتری ارسال کند.

  1. انتخاب کنید از تابع Lambda برای مقداردهی اولیه و اعتبار سنجی استفاده کنید. این می تواند از هر تابع Lambda برای پردازش سفارش پس از تایید نهایی مشتری استفاده کند.

  1. پس از ایجاد هر سه intent، به Visual builder بروید ValidateIntent، یک مرحله intent go-to اضافه کنید و خروجی تایید مثبت را به آن مرحله وصل کنید.
  2. پس از افزودن intent go-to، آن را ویرایش کنید و intent PlaceOrder را به عنوان نام intent انتخاب کنید.

  1. به طور مشابه، برای رفتن به ساز ویژوال برای PlaceOrder قصد داشته باشید و خروجی تاییدیه مثبت را به ProcessOrder قصد رفتن هیچ ویرایشی برای ProcessOrder قصد
  2. اکنون باید تابع Lambda را ایجاد کنید که آمازون Lex را هماهنگ می کند و جدول DynamoDB را فراخوانی می کند، همانطور که در بخش زیر توضیح داده شده است.

یک تابع Lambda برای هماهنگ کردن ربات آمازون Lex ایجاد کنید

اکنون می توانید تابع Lambda را بسازید که ربات آمازون Lex و گردش کار را هماهنگ می کند. مراحل زیر را کامل کنید:

  1. یک تابع Lambda با خط مشی اجرای استاندارد ایجاد کنید و اجازه دهید Lambda یک نقش برای شما ایجاد کند.
  2. در پنجره کد تابع خود، چند توابع کاربردی اضافه کنید که به شما کمک می کند: فرمت درخواست ها با افزودن زمینه lex به الگو، فراخوانی Amazon Bedrock LLM API، استخراج متن مورد نظر از پاسخ ها، و موارد دیگر. کد زیر را ببینید:
import json
import re
import boto3
import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

bedrock = boto3.client(service_name='bedrock-runtime')
def CreatingCustomPromptFromLambdaLayer(object_key,replace_items):
   
    folder_path = '/opt/order_processing_agent_prompt_templates/python/'
    try:
        file_path = folder_path + object_key
        with open(file_path, "r") as file1:
            raw_template = file1.read()
            # Modify the template with the custom input prompt
            #template['inputs'][0].insert(1, {"role": "user", "content": '### Input:n' + user_request})
            for key,value in replace_items.items():
                value = json.dumps(json.dumps(value).replace('"','')).replace('"','')
                raw_template = raw_template.replace(key,value)
            modified_prompt = raw_template

            return modified_prompt
    except Exception as e:
        return {
            'statusCode': 500,
            'body': f'An error occurred: {str(e)}'
        }
def CreatingCustomPrompt(object_key,replace_items):
    logger.debug('replace_items is: {}'.format(replace_items))
    #retrieve user request from intent_request
    #we first propmt the model with current order
    
    bucket_name = 'your-bucket-name'
    
    #object_key = 'prompt_template_order_processing.txt'
    try:
        s3 = boto3.client('s3')
        # Retrieve the existing template from S3
        response = s3.get_object(Bucket=bucket_name, Key=object_key)
        raw_template = response['Body'].read().decode('utf-8')
        raw_template = json.loads(raw_template)
        logger.debug('raw template is {}'.format(raw_template))
        #template_json = json.loads(raw_template)
        #logger.debug('template_json is {}'.format(template_json))
        #template = json.dumps(template_json)
        #logger.debug('template is {}'.format(template))

        # Modify the template with the custom input prompt
        #template['inputs'][0].insert(1, {"role": "user", "content": '### Input:n' + user_request})
        for key,value in replace_items.items():
            raw_template = raw_template.replace(key,value)
            logger.debug("Replacing: {} nwith: {}".format(key,value))
        modified_prompt = json.dumps(raw_template)
        logger.debug("Modified template: {}".format(modified_prompt))
        logger.debug("Modified template type is: {}".format(print(type(modified_prompt))))
        
        #modified_template_json = json.loads(modified_prompt)
        #logger.debug("Modified template json: {}".format(modified_template_json))
        
        return modified_prompt
    except Exception as e:
        return {
            'statusCode': 500,
            'body': f'An error occurred: {str(e)}'
        }
    
def validate_intent(intent_request):
    logger.debug('starting validate_intent: {}'.format(intent_request))
    #retrieve user request from intent_request
    user_request = 'Human: ' + intent_request['inputTranscript'].lower()
    #getting current context variable
    current_session_attributes =  intent_request['sessionState']['sessionAttributes']
    if len(current_session_attributes) > 0:
        full_context = current_session_attributes['fullContext'] + 'nn' + user_request
        dialog_context = current_session_attributes['dialogContext'] + 'nn' + user_request
    else:
        full_context = user_request
        dialog_context = user_request
    #Preparing validation prompt by adding context to prompt template
    object_key = 'prompt_template_intent_validator.txt'
    #replace_items = {"REPLACEME":full_context}
    #replace_items = {"REPLACEME":dialog_context}
    replace_items = {"REPLACEME":dialog_context}
    #validation_prompt = CreatingCustomPrompt(object_key,replace_items)
    validation_prompt = CreatingCustomPromptFromLambdaLayer(object_key,replace_items)

    #Prompting model for request validation
    intent_validation_completion = prompt_bedrock(validation_prompt)
    intent_validation_completion = re.sub(r'["]','',intent_validation_completion)

    #extracting response from response completion and removing some special characters
    validation_response = extract_response(intent_validation_completion)
    validation_intent = extract_intent(intent_validation_completion)
    
    

    #business logic depending on intents
    if validation_intent == 'Place Order':
        return validate_request(intent_request)
    elif validation_intent in ['Complain','Speak to Someone']:
        ##adding session attributes to keep current context
        full_context = full_context + 'nn' + intent_validation_completion
        dialog_context = dialog_context + 'nnAssistant: ' + validation_response
        intent_request['sessionState']['sessionAttributes']['fullContext'] = full_context
        intent_request['sessionState']['sessionAttributes']['dialogContext'] = dialog_context
        intent_request['sessionState']['sessionAttributes']['customerIntent'] = validation_intent
        return close(intent_request['sessionState']['sessionAttributes'],intent_request['sessionState']['intent']['name'],'Fulfilled','Close',validation_response)
    if validation_intent == 'Greeting':
        ##adding session attributes to keep current context
        full_context = full_context + 'nn' + intent_validation_completion
        dialog_context = dialog_context + 'nnAssistant: ' + validation_response
        intent_request['sessionState']['sessionAttributes']['fullContext'] = full_context
        intent_request['sessionState']['sessionAttributes']['dialogContext'] = dialog_context
        intent_request['sessionState']['sessionAttributes']['customerIntent'] = validation_intent
        return close(intent_request['sessionState']['sessionAttributes'],intent_request['sessionState']['intent']['name'],'InProgress','ConfirmIntent',validation_response)

def validate_request(intent_request):
    logger.debug('starting validate_request: {}'.format(intent_request))
    #retrieve user request from intent_request
    user_request = 'Human: ' + intent_request['inputTranscript'].lower()
    #getting current context variable
    current_session_attributes =  intent_request['sessionState']['sessionAttributes']
    if len(current_session_attributes) > 0:
        full_context = current_session_attributes['fullContext'] + 'nn' + user_request
        dialog_context = current_session_attributes['dialogContext'] + 'nn' + user_request
    else:
        full_context = user_request
        dialog_context = user_request
   
    #Preparing validation prompt by adding context to prompt template
    object_key = 'prompt_template_request_validator.txt'
    replace_items = {"REPLACEME":dialog_context}
    #validation_prompt = CreatingCustomPrompt(object_key,replace_items)
    validation_prompt = CreatingCustomPromptFromLambdaLayer(object_key,replace_items)

    #Prompting model for request validation
    request_validation_completion = prompt_bedrock(validation_prompt)
    request_validation_completion = re.sub(r'["]','',request_validation_completion)

    #extracting response from response completion and removing some special characters
    validation_response = extract_response(request_validation_completion)

    ##adding session attributes to keep current context
    full_context = full_context + 'nn' + request_validation_completion
    dialog_context = dialog_context + 'nnAssistant: ' + validation_response
    intent_request['sessionState']['sessionAttributes']['fullContext'] = full_context
    intent_request['sessionState']['sessionAttributes']['dialogContext'] = dialog_context
    
    return close(intent_request['sessionState']['sessionAttributes'],'PlaceOrder','InProgress','ConfirmIntent',validation_response)
    
def process_order(intent_request):
    logger.debug('starting process_order: {}'.format(intent_request))

     #retrieve user request from intent_request
    user_request = 'Human: ' + intent_request['inputTranscript'].lower()
    #getting current context variable
    current_session_attributes =  intent_request['sessionState']['sessionAttributes']
    if len(current_session_attributes) > 0:
        full_context = current_session_attributes['fullContext'] + 'nn' + user_request
        dialog_context = current_session_attributes['dialogContext'] + 'nn' + user_request
    else:
        full_context = user_request
        dialog_context = user_request
    #   Preparing object creator prompt by adding context to prompt template
    object_key = 'prompt_template_object_creator.txt'
    replace_items = {"REPLACEME":dialog_context}
    #object_creator_prompt = CreatingCustomPrompt(object_key,replace_items)
    object_creator_prompt = CreatingCustomPromptFromLambdaLayer(object_key,replace_items)
    #Prompting model for object creation
    object_creation_completion = prompt_bedrock(object_creator_prompt)
    #extracting response from response completion
    object_creation_response = extract_response(object_creation_completion)
    inputParams = json.loads(object_creation_response)
    inputParams = json.dumps(json.dumps(inputParams))
    logger.debug('inputParams is: {}'.format(inputParams))
    client = boto3.client('lambda')
    response = client.invoke(FunctionName = 'arn:aws:lambda:us-east-1:<AccountNumber>:function:aws-blog-order-validator',InvocationType = 'RequestResponse',Payload = inputParams)
    responseFromChild = json.load(response['Payload'])
    validationResult = responseFromChild['statusCode']
    if validationResult == 205:
        order_validation_error = responseFromChild['validator_response']
        return close(intent_request['sessionState']['sessionAttributes'],'PlaceOrder','InProgress','ConfirmIntent',order_validation_error)
    #invokes Order Processing lambda to query DynamoDB table and returns order total
    response = client.invoke(FunctionName = 'arn:aws:lambda:us-east-1: <AccountNumber>:function:aws-blog-order-processing',InvocationType = 'RequestResponse',Payload = inputParams)
    responseFromChild = json.load(response['Payload'])
    orderTotal = responseFromChild['body']
    ###Prompting the model to summarize the order along with order total
    object_key = 'prompt_template_order_summary.txt'
    replace_items = {"REPLACEME":dialog_context,"REPLACETOTAL":orderTotal}
    #order_summary_prompt = CreatingCustomPrompt(object_key,replace_items)
    order_summary_prompt = CreatingCustomPromptFromLambdaLayer(object_key,replace_items)
    order_summary_completion = prompt_bedrock(order_summary_prompt)
    #extracting response from response completion
    order_summary_response = extract_response(order_summary_completion)  
    order_summary_response = order_summary_response + '. Shall I finalize processing your order?'
    ##adding session attributes to keep current context
    full_context = full_context + 'nn' + order_summary_completion
    dialog_context = dialog_context + 'nnAssistant: ' + order_summary_response
    intent_request['sessionState']['sessionAttributes']['fullContext'] = full_context
    intent_request['sessionState']['sessionAttributes']['dialogContext'] = dialog_context
    return close(intent_request['sessionState']['sessionAttributes'],'ProcessOrder','InProgress','ConfirmIntent',order_summary_response)
    

""" --- Main handler and Workflow functions --- """

def lambda_handler(event, context):
    """
    Route the incoming request based on intent.
    The JSON body of the request is provided in the event slot.
    """
    logger.debug('event is: {}'.format(event))

    return dispatch(event)

def dispatch(intent_request):
    """
    Called when the user specifies an intent for this bot. If intent is not valid then returns error name
    """
    logger.debug('intent_request is: {}'.format(intent_request))
    intent_name = intent_request['sessionState']['intent']['name']
    confirmation_state = intent_request['sessionState']['intent']['confirmationState']
    # Dispatch to your bot's intent handlers
    if intent_name == 'ValidateIntent' and confirmation_state == 'None':
        return validate_intent(intent_request)
    if intent_name == 'PlaceOrder' and confirmation_state == 'None':
        return validate_request(intent_request)
    elif intent_name == 'PlaceOrder' and confirmation_state == 'Confirmed':
        return process_order(intent_request)
    elif intent_name == 'PlaceOrder' and confirmation_state == 'Denied':
        return close(intent_request['sessionState']['sessionAttributes'],intent_request['sessionState']['intent']['name'],'Fulfilled','Close','Got it. Let me know if I can help you with something else.')
    elif intent_name == 'PlaceOrder' and confirmation_state not in ['Denied','Confirmed','None']:
        return close(intent_request['sessionState']['sessionAttributes'],intent_request['sessionState']['intent']['name'],'Fulfilled','Close','Sorry. I am having trouble completing the request. Let me get someone to help you.')
        logger.debug('exiting intent {} here'.format(intent_request['sessionState']['intent']['name']))
    elif intent_name == 'ProcessOrder' and confirmation_state == 'None':
        return validate_request(intent_request)
    elif intent_name == 'ProcessOrder' and confirmation_state == 'Confirmed':
        return close(intent_request['sessionState']['sessionAttributes'],intent_request['sessionState']['intent']['name'],'Fulfilled','Close','Perfect! Your order has been processed. Please proceed to payment.')
    elif intent_name == 'ProcessOrder' and confirmation_state == 'Denied':
        return close(intent_request['sessionState']['sessionAttributes'],intent_request['sessionState']['intent']['name'],'Fulfilled','Close','Got it. Let me know if I can help you with something else.')
    elif intent_name == 'ProcessOrder' and confirmation_state not in ['Denied','Confirmed','None']:
        return close(intent_request['sessionState']['sessionAttributes'],intent_request['sessionState']['intent']['name'],'Fulfilled','Close','Sorry. I am having trouble completing the request. Let me get someone to help you.')
        logger.debug('exiting intent {} here'.format(intent_request['sessionState']['intent']['name']))
    raise Exception('Intent with name ' + intent_name + ' not supported')
    
def prompt_bedrock(formatted_template):
    logger.debug('prompt bedrock input is:'.format(formatted_template))
    body = json.loads(formatted_template)

    modelId = 'anthropic.claude-v2' # change this to use a different version from the model provider
    accept = 'application/json'
    contentType = 'application/json'

    response = bedrock.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)
    response_body = json.loads(response.get('body').read())
    response_completion = response_body.get('completion')
    logger.debug('response is: {}'.format(response_completion))

    #print_ww(response_body.get('completion'))
    #print(response_body.get('results')[0].get('outputText'))
    return response_completion

#function to extract text between the <Response> and </Response> tags within model completion
def extract_response(response_completion):
    
    if '<Response>' in response_completion:
        customer_response = response_completion.replace('<Response>','||').replace('</Response>','').split('||')[1]
        
        logger.debug('modified response is: {}'.format(response_completion))

        return customer_response
    else:
        
        logger.debug('modified response is: {}'.format(response_completion))

        return response_completion
        
#function to extract text between the <Response> and </Response> tags within model completion
def extract_intent(response_completion):
    if '<intent>' in response_completion:
        customer_intent = response_completion.replace('<intent>','||').replace('</intent>','||').split('||')[1]
        return customer_intent
    else:
        return customer_intent
        
def close(session_attributes, intent, fulfillment_state, action_type, message):
    #This function prepares the response in the appropiate format for Lex V2

    response = {
        "sessionState": {
            "sessionAttributes":session_attributes,
            "dialogAction": {
                "type": action_type
            },
            "intent": {
                "name":intent,
                "state":fulfillment_state
                
            },
            
            },
        "messages":
            [{
                "contentType":"PlainText",
                "content":message,
            }]
            ,
        
    }
    return response

  1. لایه Lambda که قبلا ایجاد کردید را به این تابع وصل کنید.
  2. علاوه بر این، لایه را به قالب های درخواستی که ایجاد کرده اید وصل کنید.
  3. در نقش اجرای Lambda، خط مشی دسترسی به Amazon Bedrock را که قبلا ایجاد شده بود، پیوست کنید.

نقش اجرای Lambda باید دارای مجوزهای زیر باشد.

تابع Orchestration Lambda را به ربات Amazon Lex متصل کنید

  1. پس از ایجاد تابع در بخش قبل، به کنسول آمازون لکس برگردید و به ربات خود بروید.
  2. تحت زبان ها در قسمت ناوبری، را انتخاب کنید انگلیسی.
  3. برای منبع، ربات پردازش سفارش خود را انتخاب کنید.
  4. برای نسخه یا نام مستعار تابع لامبدا، انتخاب کنید آخرین $.
  5. را انتخاب کنید ذخیره.

توابع کمکی Lambda را ایجاد کنید

مراحل زیر را برای ایجاد توابع Lambda اضافی تکمیل کنید:

  1. یک تابع Lambda برای پرس و جو کردن جدول DynamoDB که قبلا ایجاد کردید ایجاد کنید:
import json
import boto3
import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# Initialize the DynamoDB client
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('your-table-name')

def calculate_grand_total(input_data):
    # Initialize the total price
    total_price = 0
    
    try:
        # Loop through each item in the input JSON
        for item_id, item_data in input_data.items():
            item_name = item_data['item'].lower()  # Convert item name to lowercase
            item_size = item_data['size'].lower()  # Convert item size to lowercase
            
            # Query the DynamoDB table for the item based on Item and Size
            response = table.get_item(
                Key={'Item': item_name,
                    'Size': item_size}
            )
            
            # Check if the item was found in the table
            if 'Item' in response:
                item = response['Item']
                price = float(item['Price'])
                total_price += price  # Add the item's price to the total
    
        return total_price
    except Exception as e:
        raise Exception('An error occurred: {}'.format(str(e)))

def lambda_handler(event, context):
    try:
       
        # Parse the input JSON from the Lambda event
        input_json = json.loads(event)

        # Calculate the grand total
        grand_total = calculate_grand_total(input_json)
    
        # Return the grand total in the response
        return {'statusCode': 200,'body': json.dumps(grand_total)}
    except Exception as e:
        return {
            'statusCode': 500,
            'body': json.dumps('An error occurred: {}'.format(str(e)))

  1. حرکت به پیکر بندی در تابع Lambda برگه و انتخاب کنید ویرایش.
  2. یک بیانیه خط مشی مبتنی بر منبع را ضمیمه کنید که به تابع Lambda پردازش سفارش اجازه می دهد تا این تابع را فراخوانی کند.

  1. به نقش اجرای IAM برای این تابع Lambda بروید و یک خط مشی برای دسترسی به جدول DynamoDB اضافه کنید.

  1. یک تابع لامبدا دیگر ایجاد کنید تا بررسی کنید که آیا تمام ویژگی های مورد نیاز از مشتری ارسال شده است یا خیر. در مثال زیر، اگر ویژگی اندازه برای یک سفارش گرفته شده باشد، اعتبارسنجی می کنیم:
import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

def lambda_handler(event, context):
    # Define customer orders from the input event
    customer_orders = json.loads(event)

    # Initialize a list to collect error messages
    order_errors = {}
    missing_size = []
    error_messages = []
    # Iterate through each order in customer_orders
    for order_id, order in customer_orders.items():
        if "size" not in order or order["size"] == "":
            missing_size.append(order['item'])
            order_errors['size'] = missing_size
    if order_errors:
        items_missing_size = order_errors['size']
        error_message = f"could you please provide the size for the following items: {', '.join(items_missing_size)}?"
        error_messages.append(error_message)

    # Prepare the response message
    if error_messages:
        response_message = "n".join(error_messages)
        return {
        'statusCode': 205,
        'validator_response': response_message
            }   
    else:
        response_message = "Order is validated successfully"
        return {
        'statusCode': 200,
        'validator_response': response_message
        }

  1. حرکت به پیکر بندی در تابع Lambda برگه و انتخاب کنید ویرایش.
  2. یک بیانیه خط مشی مبتنی بر منبع را ضمیمه کنید که به تابع Lambda پردازش سفارش اجازه می دهد تا این تابع را فراخوانی کند.

محلول را تست کنید

اکنون می‌توانیم راه‌حل را با نمونه‌ای از سفارش‌هایی که مشتریان از طریق آمازون Lex انجام می‌دهند، آزمایش کنیم.

برای مثال اول، مشتری درخواست فراپوچینو کرد که در منو نیست. این مدل با کمک الگوی اعتبارسنجی سفارش اعتبارسنجی می‌کند و توصیه‌هایی را بر اساس منو پیشنهاد می‌کند. پس از تایید سفارش مشتری، مجموع سفارش و خلاصه سفارش به وی اطلاع داده می شود. سفارش بر اساس تایید نهایی مشتری پردازش خواهد شد.

در مثال بعدی، مشتری در حال سفارش کاپوچینوی بزرگ است و سپس اندازه آن را از بزرگ به متوسط ​​تغییر می‌دهد. مدل تمام تغییرات لازم را ثبت می کند و از مشتری درخواست می کند تا سفارش را تأیید کند. مدل کل سفارش و خلاصه سفارش را ارائه می‌کند و سفارش را بر اساس تایید نهایی مشتری پردازش می‌کند.

برای مثال نهایی ما، مشتری برای چندین مورد سفارش داد و اندازه برای چند مورد وجود ندارد. مدل و تابع Lambda بررسی می‌کنند که آیا تمام ویژگی‌های مورد نیاز برای پردازش سفارش وجود دارد یا خیر و سپس از مشتری می‌خواهد اطلاعات گمشده را ارائه دهد. پس از اینکه مشتری اطلاعات گمشده (در این مورد، اندازه قهوه) را ارائه کرد، کل سفارش و خلاصه سفارش به او نشان داده می شود. سفارش بر اساس تایید نهایی مشتری پردازش خواهد شد.

محدودیت های LLM

خروجی‌های LLM ذاتاً تصادفی هستند، به این معنی که نتایج LLM ما می‌تواند در قالب یا حتی به شکل محتوای غیرواقعی (توهم) متفاوت باشد. بنابراین، توسعه‌دهندگان برای مدیریت این سناریوها و اجتناب از تجربه کاربر نهایی باید به منطق مدیریت خطای خوب در سراسر کد خود تکیه کنند.

پاک کردن

اگر دیگر به این راه حل نیاز ندارید، می توانید منابع زیر را حذف کنید:

  • توابع لامبدا
  • جعبه آمازون لکس
  • جدول DynamoDB
  • سطل S3

علاوه بر این، اگر دیگر به برنامه مورد نیاز نیست، نمونه SageMaker Studio را خاموش کنید.

ارزیابی هزینه

برای اطلاع از قیمت خدمات اصلی مورد استفاده توسط این راه حل، به موارد زیر مراجعه کنید:

توجه داشته باشید که می توانید بدون نیاز به تهیه از Claude v2 استفاده کنید، بنابراین هزینه های کلی به حداقل می رسد. برای کاهش بیشتر هزینه ها، می توانید جدول DynamoDB را با تنظیمات درخواستی پیکربندی کنید.

نتیجه

این پست نشان داد که چگونه با استفاده از آمازون لکس، آمازون بستر و سایر خدمات AWS، یک عامل پردازش سفارش هوش مصنوعی با قابلیت گفتار بسازید. ما نشان دادیم که چگونه مهندسی سریع با یک مدل هوش مصنوعی مولد قدرتمند مانند کلود می‌تواند درک زبان طبیعی قوی و جریان‌های مکالمه را برای پردازش سفارش بدون نیاز به داده‌های آموزشی گسترده فعال کند.

معماری راه حل از مولفه های بدون سرور مانند Lambda، Amazon S3 و DynamoDB برای فعال کردن یک پیاده سازی انعطاف پذیر و مقیاس پذیر استفاده می کند. ذخیره سازی الگوهای سریع در آمازون S3 به شما امکان می دهد راه حل را برای موارد استفاده مختلف سفارشی کنید.

گام‌های بعدی می‌تواند شامل گسترش قابلیت‌های نماینده برای رسیدگی به طیف وسیع‌تری از درخواست‌های مشتری و موارد لبه باشد. الگوهای سریع راهی برای بهبود مکرر مهارت های عامل ارائه می دهند. سفارشی سازی های اضافی می تواند شامل یکپارچه سازی داده های سفارش با سیستم های پشتیبان مانند موجودی، CRM یا POS باشد. در نهایت، با استفاده از قابلیت‌های چند کانالی Amazon Lex، این عامل می‌تواند در نقاط مختلف مشتری مانند برنامه‌های تلفن همراه، درایو، کیوسک‌ها و موارد دیگر در دسترس قرار گیرد.

برای کسب اطلاعات بیشتر به منابع مرتبط زیر مراجعه کنید:

  • استقرار و مدیریت ربات های چند کاناله:
  • مهندسی سریع برای کلود و سایر مدل ها:
  • الگوهای معماری بدون سرور برای دستیاران هوش مصنوعی مقیاس پذیر:

درباره نویسنده

مومیتا دوتا یک معمار راه حل شریک در خدمات وب آمازون است. در نقش خود، او با شرکای خود برای توسعه دارایی های مقیاس پذیر و قابل استفاده مجدد که استقرار ابر را ساده می کند و کارایی عملیاتی را افزایش می دهد، همکاری نزدیکی دارد. او عضو جامعه AI/ML و متخصص هوش مصنوعی در AWS است. او در اوقات فراغت از باغبانی و دوچرخه سواری لذت می برد.

فرناندو لاموگلیا یک معمار راه حل های شریک در خدمات وب آمازون است که از نزدیک با شرکای AWS در پیشروی توسعه و پذیرش راه حل های هوش مصنوعی پیشرفته در واحدهای تجاری همکاری می کند. یک رهبر استراتژیک با تخصص در معماری ابر، هوش مصنوعی مولد، یادگیری ماشین و تجزیه و تحلیل داده ها. او در اجرای استراتژی‌های ورود به بازار و ارائه راه‌حل‌های تاثیرگذار هوش مصنوعی همسو با اهداف سازمانی تخصص دارد. در اوقات فراغت خود دوست دارد با خانواده خود وقت بگذراند و به کشورهای دیگر سفر کند.

میتول پاتل یک معمار ارشد راه حل در خدمات وب آمازون است. او در نقش خود به‌عنوان یک فعال‌کننده فناوری ابری، با مشتریان برای درک اهداف و چالش‌های آن‌ها کار می‌کند و راهنمایی‌های تجویزی برای دستیابی به هدفشان با پیشنهادات AWS ارائه می‌کند. او یکی از اعضای جامعه AI/ML و سفیر هوش مصنوعی در AWS است. در اوقات فراغت از پیاده روی و فوتبال لذت می برد.

نقطه_img

جدیدترین اطلاعات

نقطه_img

چت با ما

سلام! چگونه می توانم به شما کمک کنم؟