Zephyrnet Logosu

Bire bir müşteri etkileşimlerini dönüştürün: AWS ve üretken yapay zeka ile konuşma yeteneğine sahip sipariş işleme aracıları oluşturun | Amazon Web Hizmetleri

Tarih:

Sipariş vermek için birebir müşteri etkileşimlerinin olduğu günümüz ortamında, arabaya servis yapan kahvehaneler ve fast food restoranları gibi ortamlarda bile hakim uygulama, insan görevlilere güvenmeye devam ediyor. Bu geleneksel yaklaşım birçok zorluğu beraberinde getiriyor: ağırlıklı olarak manuel süreçlere dayanıyor, artan müşteri taleplerine göre verimli bir şekilde ölçeklendirme çabası gösteriyor, insan hatası potansiyelini ortaya çıkarıyor ve belirli kullanılabilirlik saatleri içinde çalışıyor. Ek olarak, rekabetçi pazarlarda, yalnızca manuel süreçlere bağlı kalan işletmeler, verimli ve rekabetçi hizmet sunma konusunda zorluk yaşayabilir. Teknolojik gelişmelere rağmen insan merkezli model, sipariş işlemede derin bir şekilde yerleşmiş durumda ve bu da bu sınırlamalara yol açıyor.

Bire bir sipariş işleme desteği için teknolojiden yararlanma olanağı bir süredir mevcuttur. Ancak mevcut çözümler genellikle iki kategoriye ayrılabilir: kurulum ve bakım için önemli miktarda zaman ve çaba gerektiren kural tabanlı sistemler veya müşterilerle insan benzeri etkileşimler için gereken esnekliğe sahip olmayan katı sistemler. Sonuç olarak işletmeler ve kuruluşlar bu tür çözümleri hızlı ve verimli bir şekilde uygulama konusunda zorluklarla karşı karşıya kalıyor. Neyse ki, gelişiyle üretken yapay zeka ve büyük dil modelleri (LLM'ler)sayesinde artık doğal dili verimli bir şekilde ve hızlandırılmış bir zaman çizelgesiyle işleyebilen otomatik sistemler oluşturmak mümkün.

Amazon Ana Kayası AI21 Labs, Anthropic, Cohere, Meta, Stability AI ve Amazon gibi önde gelen AI şirketlerinin yüksek performanslı temel modelleri (FM'ler) seçeneklerini tek bir API aracılığıyla ve sizin için kullanabileceğiniz geniş bir yetenek seti sunan, tam olarak yönetilen bir hizmettir. güvenlik, gizlilik ve sorumlu yapay zeka ile üretken yapay zeka uygulamaları oluşturmamız gerekiyor. Amazon Bedrock'a ek olarak aşağıdaki gibi diğer AWS hizmetlerini de kullanabilirsiniz: Amazon SageMaker Hızlı Başlangıç ve Amazon Lex'i tamamen otomatik ve kolayca uyarlanabilen üretken yapay zeka sipariş işleme aracıları oluşturmak.

Bu yazıda size Amazon Lex, Amazon Bedrock ve Amazon Lex'i kullanarak konuşma yeteneğine sahip bir sipariş işleme aracısının nasıl oluşturulacağını göstereceğiz. AWS Lambda.

Çözüme genel bakış

Aşağıdaki şema çözüm mimarimizi göstermektedir.

İş akışı aşağıdaki adımlardan oluşur:

  1. Bir müşteri siparişi Amazon Lex'i kullanarak verir.
  2. Amazon Lex botu müşterinin niyetini yorumluyor ve bir DialogCodeHook.
  3. Bir Lambda işlevi, Lambda katmanından uygun bilgi istemi şablonunu çeker ve ilgili bilgi istemi şablonuna müşteri girişini ekleyerek model bilgi istemlerini biçimlendirir.
  4. The RequestValidation istem, siparişi menü öğesiyle doğrular ve müşterinin, menünün parçası olmayan bir sipariş vermek isteyip istemediğini Amazon Lex aracılığıyla bilmesini sağlar ve önerilerde bulunur. İstem aynı zamanda siparişin eksiksizliği için bir ön doğrulama da gerçekleştirir.
  5. The ObjectCreator istemi, doğal dil isteklerini bir veri yapısına (JSON formatı) dönüştürür.
  6. Müşteri doğrulayıcı Lambda işlevi, sipariş için gerekli özellikleri doğrular ve siparişi işlemek için gerekli tüm bilgilerin mevcut olup olmadığını teyit eder.
  7. Bir müşteri Lambda işlevi, veri yapısını siparişi işlemek için bir girdi olarak alır ve sipariş toplamını düzenleyen Lambda işlevine geri iletir.
  8. Düzenleme Lambda işlevi, müşteri veritabanı sistemindeki sipariş toplamını içeren nihai sipariş özeti oluşturmak için Amazon Bedrock LLM uç noktasını çağırır (örneğin, Amazon DinamoDB).
  9. Sipariş özeti müşteriye Amazon Lex aracılığıyla iletilir. Müşteri siparişi onayladıktan sonra sipariş işleme alınacaktır.

Önkoşullar

Bu gönderide aktif bir AWS hesabınızın olduğu ve aşağıdaki kavram ve hizmetlere aşina olduğunuz varsayılmaktadır:

Ayrıca Amazon Bedrock'a Lambda işlevlerinden erişmek için Lambda çalışma zamanının aşağıdaki kitaplıklara sahip olduğundan emin olmanız gerekir:

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

Bu bir ile yapılabilir Lambda katmanı veya gerekli kütüphanelerle birlikte belirli bir AMI kullanarak.

Ayrıca Amazon Bedrock API'sini şu adresten çağırırken bu kitaplıklar gereklidir: Amazon SageMaker Stüdyosu. Bu, bir hücreyi aşağıdaki kodla çalıştırarak yapılabilir:

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

Son olarak aşağıdaki politikayı oluşturursunuz ve daha sonra bunu Amazon Bedrock'a erişen herhangi bir role eklersiniz:

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

DynamoDB tablosu oluşturun

Özel senaryomuzda, müşteri veritabanı sistemimiz olarak bir DynamoDB tablosu oluşturduk, ancak siz bunu da kullanabilirsiniz. Amazon İlişkisel Veritabanı Hizmeti (Amazon RDS'dir). DynamoDB tablonuzu hazırlamak (veya ayarları kullanım durumunuza göre özelleştirmek) için aşağıdaki adımları tamamlayın:

  1. DynamoDB konsolunda, tablolar Gezinti bölmesinde.
  2. Klinik Tablo oluştur.

  1. İçin Tablo ismi, bir ad girin (örneğin, ItemDetails).
  2. İçin Bölüm anahtarı, bir anahtar girin (bu yazı için şunu kullanıyoruz: Item).
  3. İçin Sıralama anahtarı, bir anahtar girin (bu yazı için şunu kullanıyoruz: Size).
  4. Klinik Tablo oluştur.

Artık verileri DynamoDB tablosuna yükleyebilirsiniz. Bu yazı için bir CSV dosyası kullanıyoruz. SageMaker not defterindeki Python kodunu kullanarak verileri DynamoDB tablosuna yükleyebilirsiniz.

Öncelikle dev adında bir profil oluşturmamız gerekiyor.

  1. SageMaker Studio'da yeni bir terminal açın ve aşağıdaki komutu çalıştırın:
aws configure --profile dev

Bu komut sizden AWS erişim anahtarı kimliğinizi, gizli erişim anahtarınızı, varsayılan AWS Bölgenizi ve çıktı biçiminizi girmenizi isteyecektir.

  1. SageMaker not defterine dönün ve Python'daki Boto3 kitaplığını kullanarak DynamoDB'ye bağlantı kurmak için bir Python kodu yazın. Bu kod parçacığı, dev adlı belirli bir AWS profilini kullanarak bir oturum oluşturur ve ardından bu oturumu kullanarak bir DynamoDB istemcisi oluşturur. Verileri yüklemek için kod örneği aşağıdadır:
%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}")

Alternatif olarak, kullanabilirsiniz NoSQL Çalışma Tezgahı veya verileri DynamoDB tablonuza hızlı bir şekilde yüklemek için diğer araçları kullanın.

Örnek veriler tabloya eklendikten sonraki ekran görüntüsü aşağıdadır.

Amazon Bedrock çağırma API'sini kullanarak SageMaker not defterinde şablonlar oluşturun

Bu kullanım senaryosuna yönelik bilgi istemi şablonumuzu oluşturmak için Amazon Bedrock'u kullanıyoruz. Amazon Bedrock'a şu adresten erişebilirsiniz: AWS Yönetim Konsolu ve API çağrıları aracılığıyla. Bizim durumumuzda, yalnızca istem şablonumuzu değil aynı zamanda daha sonra Lambda işlevimizde kullanabileceğimiz tam API çağırma kodunu oluşturmak için SageMaker Studio not defterinin rahatlığından API aracılığıyla Amazon Bedrock'a erişiyoruz.

  1. SageMaker konsolunda mevcut bir SageMaker Studio etki alanına erişin veya bir SageMaker dizüstü bilgisayardan Amazon Bedrock'a erişmek için yeni bir alan oluşturun.

  1. SageMaker etki alanını ve kullanıcısını oluşturduktan sonra kullanıcıyı seçin ve Başlatmak ve Stüdyo. Bu bir JupyterLab ortamı açacaktır.
  2. JupyterLab ortamı hazır olduğunda yeni bir not defteri açın ve gerekli kitaplıkları içe aktarmaya başlayın.

Amazon Bedrock Python SDK'sında pek çok FM mevcuttur. Bu durumda Anthropic tarafından geliştirilen güçlü bir temel model olan Claude V2'yi kullanıyoruz.

Sipariş işleme temsilcisinin birkaç farklı şablona ihtiyacı vardır. Bu, kullanım durumuna göre değişebilir ancak birden fazla ayara uygulanabilecek genel bir iş akışı tasarladık. Bu kullanım örneği için Amazon Bedrock LLM şablonu aşağıdakileri gerçekleştirecektir:

  • Müşteri amacını doğrulama
  • İsteği doğrula
  • Sipariş veri yapısını oluşturun
  • Siparişin özetini müşteriye iletin
  1. Modeli çağırmak için Boto3'ten bir temel çalışma zamanı nesnesi oluşturun.

#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')

Niyet doğrulayıcı bilgi istemi şablonu üzerinde çalışarak başlayalım. Bu yinelenen bir süreçtir, ancak Anthropic'in hızlı mühendislik kılavuzu sayesinde, görevi gerçekleştirebilecek bir istemi hızlı bir şekilde oluşturabilirsiniz.

  1. Gövdeyi API çağrıları için hazırlamaya yardımcı olacak bir yardımcı program işleviyle birlikte ilk bilgi istemi şablonunu oluşturun.

Prompt_template_intent_validator.txt'nin kodu aşağıdadır:

"{"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. Amazon S3'e yüklemek ve gerektiğinde Lambda işlevinden çağrı yapmak için bu şablonu bir dosyaya kaydedin. Şablonları bir metin dosyasına JSON serileştirilmiş dizeleri olarak kaydedin. Önceki ekran görüntüsünde bunu başarmak için kod örneği de gösterilmektedir.
  2. Aynı adımları diğer şablonlarla tekrarlayın.

Aşağıda diğer şablonların bazı ekran görüntüleri ve bunlardan bazılarıyla Amazon Bedrock çağrıldığında elde edilen sonuçlar yer almaktadır.

Prompt_template_request_validator.txt'nin kodu aşağıdadır:

"{"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:"]}"

Bu şablonu kullanarak Amazon Bedrock'tan aldığımız yanıt aşağıdadır.

Aşağıdaki kod 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'nin kodu aşağıdadır:

"{"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]"]}"


Gördüğünüz gibi menü öğelerini doğrulamak, eksik gerekli bilgileri belirlemek, bir veri yapısı oluşturmak ve siparişi özetlemek için bilgi istemi şablonlarımızı kullandık. Amazon Bedrock'ta bulunan temel modeller çok güçlü olduğundan, bu şablonlar aracılığıyla daha da fazla görevi gerçekleştirebilirsiniz.

Bilgi istemlerinin mühendisliğini tamamladınız ve şablonları metin dosyalarına kaydettiniz. Artık Amazon Lex botunu ve ilgili Lambda işlevlerini oluşturmaya başlayabilirsiniz.

Bilgi istemi şablonlarıyla bir Lambda katmanı oluşturun

Lambda katmanınızı oluşturmak için aşağıdaki adımları tamamlayın:

  1. SageMaker Studio'da, adlı alt klasöre sahip yeni bir klasör oluşturun. python.
  2. İstem dosyalarınızı şuraya kopyalayın: python klasör.

  1. Aşağıdaki komutu çalıştırarak ZIP kitaplığını not defteri örneğinize ekleyebilirsiniz.
!conda install -y -c conda-forge zip

  1. Şimdi Lambda katmanına yüklemek üzere ZIP dosyasını oluşturmak için aşağıdaki komutu çalıştırın.
!zip -r prompt_templates_layer.zip prompt_templates_layer/.

  1. ZIP dosyasını oluşturduktan sonra dosyayı indirebilirsiniz. Lambda'ya gidin, dosyayı doğrudan yükleyerek veya önce Amazon S3'e yükleyerek yeni bir katman oluşturun.
  2. Daha sonra bu yeni katmanı orkestrasyon Lambda işlevine ekleyin.

Artık bilgi istemi şablonu dosyalarınız Lambda çalışma zamanı ortamınızda yerel olarak depolanıyor. Bu, bot çalıştırmalarınız sırasında süreci hızlandıracaktır.

Gerekli kitaplıklarla bir Lambda katmanı oluşturun

Gerekli kitaplıklarla Lambda katmanınızı oluşturmak için aşağıdaki adımları tamamlayın:

  1. Bir açın AWS Bulut9 örnek ortamında, adı verilen bir alt klasöre sahip bir klasör oluşturun. python.
  2. İçinde bir terminal açın python klasör.
  3. Terminalden aşağıdaki komutları çalıştırın:
pip install “boto3>=1.28.57” -t .
pip install “awscli>=1.29.57" -t .
pip install “botocore>=1.31.57” -t .

  1. koşmak cd .. ve kendinizi aynı zamanda yeni klasörünüzün içinde konumlandırın. python alt klasör.
  2. Aşağıdaki komutu çalıştırın:
zip -r lambda-layer.zip

  1. ZIP dosyasını oluşturduktan sonra dosyayı indirebilirsiniz. Lambda'ya gidin, dosyayı doğrudan yükleyerek veya önce Amazon S3'e yükleyerek yeni bir katman oluşturun.
  2. Daha sonra bu yeni katmanı orkestrasyon Lambda işlevine ekleyin.

Botu Amazon Lex v2'de oluşturun

Bu kullanım örneği için, herhangi bir arayüzden ses veya metin kullanarak Amazon Bedrock'u çağırmak amacıyla mimari için bir giriş/çıkış arayüzü sağlayabilen bir Amazon Lex botu oluşturuyoruz. LLM, bu sipariş işleme aracısının konuşma parçasını yöneteceği ve Lambda iş akışını düzenleyeceği için, üç amacı olan ve yuvası olmayan bir bot oluşturabilirsiniz.

  1. Amazon Lex konsolunda bu yöntemle yeni bir bot oluşturun Boş bir bot oluştur.

Artık son kullanıcıların botla konuşmayı başlatması için herhangi bir uygun ilk ifadeyle bir amaç ekleyebilirsiniz. Son kullanıcıların isteklerini yerine getirebilmesi için basit selamlamalar kullanıyoruz ve bir ilk bot yanıtı ekliyoruz. Botu oluştururken amaçlarla bir Lambda kod kancası kullandığınızdan emin olun; bu, müşteri, Amazon Lex ve LLM arasındaki iş akışını düzenleyecek bir Lambda işlevini tetikleyecektir.

  1. İş akışını tetikleyen ve Amazon Bedrock'u çağırmak ve müşterinin neyi başarmaya çalıştığını belirlemek için amaç doğrulama istemi şablonunu kullanan ilk amacınızı ekleyin. Son kullanıcıların konuşmayı başlatması için birkaç basit ifade ekleyin.

Bot amaçlarının hiçbirinde herhangi bir yuva veya ilk okuma kullanmanıza gerek yoktur. Aslında ikinci veya üçüncü niyetlere ifadeler eklemenize gerek yok. Bunun nedeni LLM'nin Lambda'ya süreç boyunca rehberlik etmesidir.

  1. Bir onay istemi ekleyin. Bu mesajı daha sonra Lambda işlevinde özelleştirebilirsiniz.

  1. Altında Kod kancalarıseçin Başlatma ve doğrulama için bir Lambda işlevi kullanın.

  1. Hiçbir söz söylemeden ve ilk tepkiyi vermeden ikinci bir niyet oluşturun. Bu PlaceOrder niyet.

LLM, müşterinin sipariş vermeye çalıştığını tespit ettiğinde Lambda işlevi bu amacı tetikleyecek ve müşteri isteğini menüye göre doğrulayacak ve gerekli hiçbir bilginin eksik olmadığından emin olacaktır. Tüm bunların bilgi istemi şablonlarında olduğunu unutmayın; böylece bilgi istemi şablonlarını değiştirerek bu iş akışını herhangi bir kullanım durumuna uyarlayabilirsiniz.

  1. Herhangi bir aralık eklemeyin, ancak bir onay istemi ve reddetme yanıtı ekleyin.

  1. seç Başlatma ve doğrulama için bir Lambda işlevi kullanın.

  1. Adlı üçüncü bir amaç oluşturun ProcessOrder örnek ifadeler ve boşluklar olmadan.
  2. Bir ilk yanıt, bir onay istemi ve bir reddetme yanıtı ekleyin.

LLM müşteri talebini doğruladıktan sonra Lambda işlevi, siparişi işlemek için üçüncü ve son amacı tetikler. Burada Lambda, DynamoDB tablosunu sorgulamak amacıyla sipariş JSON veri yapısını oluşturmak için nesne oluşturucu şablonunu kullanacak ve ardından Amazon Lex'in müşteriye iletebilmesi için siparişin tamamını toplamla birlikte özetlemek üzere sipariş özeti şablonunu kullanacak.

  1. seç Başlatma ve doğrulama için bir Lambda işlevi kullanın. Bu, müşteri son onayı verdikten sonra siparişi işlemek için herhangi bir Lambda işlevini kullanabilir.

  1. Üç amacı da oluşturduktan sonra Görsel oluşturucuya gidin. ValidateIntent, bir hedef adımı ekleyin ve olumlu onayın çıktısını bu adıma bağlayın.
  2. Hedef amacı ekledikten sonra düzenleyin ve amaç adı olarak PlaceOrder amacını seçin.

  1. Benzer şekilde, Görsel oluşturucuya gitmek için PlaceOrder niyet edin ve olumlu onayın çıktısını ProcessOrder niyete git. için herhangi bir düzenlemeye gerek yoktur. ProcessOrder niyet.
  2. Artık Amazon Lex'i düzenleyen ve aşağıdaki bölümde ayrıntılı olarak açıklandığı gibi DynamoDB tablosunu çağıran Lambda işlevini oluşturmanız gerekiyor.

Amazon Lex botunu düzenlemek için bir Lambda işlevi oluşturun

Artık Amazon Lex botunu ve iş akışını düzenleyen Lambda işlevini oluşturabilirsiniz. Aşağıdaki adımları tamamlayın:

  1. Standart yürütme ilkesiyle bir Lambda işlevi oluşturun ve Lambda'nın sizin için bir rol oluşturmasına izin verin.
  2. İşlevinizin kod penceresine yardımcı olacak birkaç yardımcı program işlevi ekleyin: şablona lex bağlamını ekleyerek istemleri biçimlendirin, Amazon Bedrock LLM API'sini çağırın, yanıtlardan istenen metni çıkarın ve daha fazlasını yapın. Aşağıdaki koda bakın:
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. Daha önce oluşturduğunuz Lambda katmanını bu fonksiyona ekleyin.
  2. Ayrıca katmanı, oluşturduğunuz bilgi istemi şablonlarına ekleyin.
  3. Lambda yürütme rolünde, daha önce oluşturulan Amazon Bedrock'a erişim ilkesini ekleyin.

Lambda yürütme rolü aşağıdaki izinlere sahip olmalıdır.

Orkestrasyon Lambda işlevini Amazon Lex botuna ekleyin

  1. Önceki bölümde işlevi oluşturduktan sonra Amazon Lex konsoluna dönün ve botunuza gidin.
  2. Altında Diller gezinme bölmesinde öğesini seçin. İngilizce.
  3. İçin Kaynak, sipariş işleme botunuzu seçin.
  4. İçin Lambda işlevi sürümü veya takma adı, seçmek $SON.
  5. Klinik İndirim.

Yardımcı Lambda işlevleri oluşturun

Ek Lambda işlevleri oluşturmak için aşağıdaki adımları tamamlayın:

  1. Daha önce oluşturduğunuz DynamoDB tablosunu sorgulamak için bir Lambda işlevi oluşturun:
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. gidin yapılandırma Lambda işlevindeki sekmeyi seçin ve İzinler.
  2. Sipariş işleme Lambda işlevinin bu işlevi çağırmasına izin veren kaynak tabanlı bir politika bildirimi ekleyin.

  1. Bu Lambda işlevi için IAM yürütme rolüne gidin ve DynamoDB tablosuna erişmek için bir politika ekleyin.

  1. Gerekli tüm özelliklerin müşteriden aktarılıp aktarılmadığını doğrulamak için başka bir Lambda işlevi oluşturun. Aşağıdaki örnekte, bir sipariş için beden özelliğinin yakalanıp yakalanmadığını doğruluyoruz:
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. gidin yapılandırma Lambda işlevindeki sekmeyi seçin ve İzinler.
  2. Sipariş işleme Lambda işlevinin bu işlevi çağırmasına izin veren kaynak tabanlı bir politika bildirimi ekleyin.

Çözümü test edin

Artık çözümü müşterilerin Amazon Lex üzerinden verdikleri örnek siparişlerle test edebiliriz.

İlk örneğimizde müşteri menüde olmayan frappuccino istedi. Model, sipariş doğrulayıcı şablonunun yardımıyla doğrulama yapar ve menüye dayalı olarak bazı öneriler önerir. Müşteri siparişini onayladıktan sonra sipariş toplamı ve sipariş özeti kendisine bildirilir. Sipariş, müşterinin nihai onayına göre işleme alınacaktır.

Bir sonraki örneğimizde, müşteri büyük kapuçino sipariş ediyor ve ardından boyutu büyükten orta boyuta değiştiriyor. Model gerekli tüm değişiklikleri yakalar ve müşteriden siparişi onaylamasını ister. Model, sipariş toplamını ve sipariş özetini sunar ve siparişi müşterinin nihai onayına göre işler.

Son örneğimiz için, müşteri birden fazla ürün için sipariş verdi ve birkaç ürünün bedeni eksik. Model ve Lambda işlevi, siparişi işlemek için gerekli tüm özelliklerin mevcut olup olmadığını doğrulayacak ve ardından müşteriden eksik bilgileri sağlamasını isteyecektir. Müşteri eksik bilgileri (bu durumda kahvenin boyutu) sağladıktan sonra kendisine sipariş toplamı ve sipariş özeti gösterilir. Sipariş, müşterinin nihai onayına göre işleme alınacaktır.

Yüksek Lisans sınırlamaları

LLM çıktıları doğası gereği stokastiktir; bu, LLM'mizden elde edilen sonuçların formatta ve hatta gerçek dışı içerik (halüsinasyonlar) biçiminde farklılık gösterebileceği anlamına gelir. Bu nedenle, geliştiricilerin bu senaryoları ele almak ve son kullanıcı deneyiminin kötüleşmesini önlemek için kodlarının tamamında iyi bir hata işleme mantığına güvenmeleri gerekir.

Temizlemek

Artık bu çözüme ihtiyacınız yoksa aşağıdaki kaynakları silebilirsiniz:

  • Lambda işlevleri
  • Amazon Lex kutusu
  • DynamoDB tablosu
  • S3 kepçe

Ayrıca, uygulamaya artık ihtiyaç duyulmuyorsa SageMaker Studio örneğini kapatın.

Maliyet değerlendirmesi

Bu çözüm tarafından kullanılan ana hizmetlerin fiyatlandırma bilgileri için aşağıdakilere bakın:

Claude v2'yi temel hazırlık gerekmeden kullanabileceğinizi, dolayısıyla genel maliyetlerin minimumda kalacağını unutmayın. Maliyetleri daha da azaltmak için DynamoDB tablosunu isteğe bağlı ayarla yapılandırabilirsiniz.

Sonuç

Bu gönderi, Amazon Lex, Amazon Bedrock ve diğer AWS hizmetlerini kullanarak konuşma özellikli bir AI sipariş işleme aracısının nasıl oluşturulacağını gösterdi. Claude gibi güçlü bir üretken yapay zeka modeliyle hızlı mühendisliğin, kapsamlı eğitim verilerine ihtiyaç duymadan sipariş işleme için güçlü doğal dil anlayışını ve konuşma akışlarını nasıl mümkün kılabileceğini gösterdik.

Çözüm mimarisi, esnek ve ölçeklenebilir bir uygulamaya olanak sağlamak için Lambda, Amazon S3 ve DynamoDB gibi sunucusuz bileşenleri kullanıyor. Bilgi istemi şablonlarını Amazon S3'te saklamak, çözümü farklı kullanım örneklerine göre özelleştirmenize olanak tanır.

Sonraki adımlar, daha geniş bir yelpazedeki müşteri taleplerini ve uç durumları ele alacak şekilde aracının yeteneklerinin genişletilmesini içerebilir. Bilgi istemi şablonları, aracının becerilerini yinelemeli olarak geliştirmenin bir yolunu sağlar. Ek özelleştirmeler, sipariş verilerinin envanter, CRM veya POS gibi arka uç sistemlerle entegre edilmesini içerebilir. Son olarak, Amazon Lex'in çok kanallı yetenekleri kullanılarak aracı, mobil uygulamalar, arabaya servis, kiosklar ve daha fazlası gibi çeşitli müşteri temas noktalarında kullanıma sunulabilir.

Daha fazla bilgi edinmek için aşağıdaki ilgili kaynaklara bakın:

  • Çok kanallı botları dağıtma ve yönetme:
  • Claude ve diğer modeller için hızlı mühendislik:
  • Ölçeklenebilir yapay zeka asistanları için sunucusuz mimari modeller:

Yazarlar Hakkında

Mümita Dutta Amazon Web Services'te İş Ortağı Çözüm Mimarıdır. Görevi gereği, bulut dağıtımlarını kolaylaştıran ve operasyonel verimliliği artıran ölçeklenebilir ve yeniden kullanılabilir varlıklar geliştirmek için iş ortaklarıyla yakın işbirliği içinde çalışıyor. AI/ML topluluğunun bir üyesi ve AWS'de Üretken Yapay Zeka uzmanıdır. Boş zamanlarında bahçe işleri yapmaktan ve bisiklete binmekten hoşlanıyor.

Fernando Lammoglia Amazon Web Services'te İş Ortağı Çözüm Mimarıdır ve iş birimleri genelinde son teknoloji yapay zeka çözümlerinin geliştirilmesine ve benimsenmesine öncülük etmek için AWS iş ortaklarıyla yakın işbirliği içinde çalışmaktadır. Bulut mimarisi, üretken yapay zeka, makine öğrenimi ve veri analitiği konularında uzmanlığa sahip stratejik bir lider. Pazara çıkış stratejilerini uygulama ve kurumsal hedeflerle uyumlu etkili yapay zeka çözümleri sunma konusunda uzmandır. Boş zamanlarında ailesiyle vakit geçirmeyi ve başka ülkelere seyahat etmeyi seviyor.

Mitul Patel Amazon Web Services'te Kıdemli Çözüm Mimarıdır. Bulut teknolojisi sağlayıcısı rolünde, müşterilerin hedeflerini ve zorluklarını anlamak için onlarla birlikte çalışıyor ve AWS teklifleriyle hedeflerine ulaşmaları için kuralcı rehberlik sağlıyor. Kendisi AI/ML topluluğunun bir üyesi ve AWS'de Üretken Yapay Zeka elçisidir. Boş zamanlarında yürüyüş yapmaktan ve futbol oynamaktan hoşlanıyor.

spot_img

En Son İstihbarat

spot_img