Zephyrnet-logo

Transformeer één-op-één klantinteracties: bouw spraakgestuurde orderverwerkingsagenten met AWS en generatieve AI | Amazon-webservices

Datum:

In het huidige landschap van één-op-één klantinteracties voor het plaatsen van bestellingen blijft de heersende praktijk afhankelijk van menselijke begeleiders, zelfs in omgevingen als drive-thru coffeeshops en fastfoodrestaurants. Deze traditionele aanpak brengt verschillende uitdagingen met zich mee: het is sterk afhankelijk van handmatige processen, heeft moeite om efficiënt te schalen met de toenemende eisen van klanten, introduceert de kans op menselijke fouten en werkt binnen specifieke uren na beschikbaarheid. Bovendien kan het in concurrerende markten voor bedrijven die zich uitsluitend aan handmatige processen houden, lastig zijn om efficiënte en concurrerende dienstverlening te leveren. Ondanks de technologische vooruitgang blijft het mensgerichte model diepgeworteld in de orderverwerking, wat tot deze beperkingen leidt.

Het vooruitzicht om technologie te gebruiken voor één-op-één assistentie bij orderverwerking is al een tijdje beschikbaar. Bestaande oplossingen kunnen echter vaak in twee categorieën worden ingedeeld: op regels gebaseerde systemen die aanzienlijke tijd en moeite vergen voor het opzetten en onderhouden, of rigide systemen die de flexibiliteit missen die nodig is voor mensachtige interacties met klanten. Als gevolg hiervan worden bedrijven en organisaties geconfronteerd met uitdagingen bij het snel en efficiënt implementeren van dergelijke oplossingen. Gelukkig is er met de komst van generatieve AI en grote taalmodellen (LLM's), is het nu mogelijk om geautomatiseerde systemen te creëren die efficiënt met natuurlijke taal om kunnen gaan, en met een versnelde oplopende tijdlijn.

Amazonebodem is een volledig beheerde service die via één enkele API een keuze biedt uit goed presterende basismodellen (FM's) van toonaangevende AI-bedrijven zoals AI21 Labs, Anthropic, Cohere, Meta, Stability AI en Amazon, samen met een breed scala aan mogelijkheden moeten generatieve AI-toepassingen bouwen met beveiliging, privacy en verantwoorde AI. Naast Amazon Bedrock kun je ook andere AWS-services gebruiken, zoals Amazon SageMaker JumpStart en Amazon-Lex om volledig geautomatiseerde en gemakkelijk aanpasbare generatieve AI-orderverwerkingsagenten te creëren.

In dit bericht laten we u zien hoe u een spraakgestuurde orderverwerkingsagent bouwt met Amazon Lex, Amazon Bedrock en AWS Lambda.

Overzicht oplossingen

Het volgende diagram illustreert onze oplossingsarchitectuur.

De workflow bestaat uit de volgende stappen:

  1. Een klant plaatst de bestelling via Amazon Lex.
  2. De Amazon Lex-bot interpreteert de bedoelingen van de klant en activeert een DialogCodeHook.
  3. Een Lambda-functie haalt de juiste promptsjabloon uit de Lambda-laag en formatteert modelprompts door de invoer van de klant toe te voegen aan de bijbehorende promptsjabloon.
  4. De RequestValidation prompt verifieert de bestelling met het menu-item en laat de klant via Amazon Lex weten of hij iets wil bestellen dat geen deel uitmaakt van het menu, en geeft aanbevelingen. De prompt voert ook een voorlopige validatie uit op de volledigheid van de bestelling.
  5. De ObjectCreator prompt converteert de natuurlijke taalverzoeken naar een datastructuur (JSON-formaat).
  6. De klantvalidator Lambda-functie verifieert de vereiste attributen voor de bestelling en bevestigt of alle benodigde informatie aanwezig is om de bestelling te verwerken.
  7. Een klant-Lambda-functie neemt de datastructuur als invoer voor het verwerken van de bestelling en geeft het ordertotaal terug aan de orkestrerende Lambda-functie.
  8. De orkestrerende Lambda-functie roept het Amazon Bedrock LLM-eindpunt aan om een ​​definitief orderoverzicht te genereren, inclusief het ordertotaal, uit het klantendatabasesysteem (bijvoorbeeld Amazon DynamoDB).
  9. Het besteloverzicht wordt via Amazon Lex teruggestuurd naar de klant. Nadat de klant de bestelling heeft bevestigd, wordt de bestelling verwerkt.

Voorwaarden

In dit bericht wordt ervan uitgegaan dat u een actief AWS-account heeft en bekend bent met de volgende concepten en services:

Om toegang te krijgen tot Amazon Bedrock vanuit de Lambda-functies, moet je er ook voor zorgen dat de Lambda-runtime de volgende bibliotheken heeft:

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

Dit kan gedaan worden met een Lambda laag of door een specifieke AMI te gebruiken met de vereiste bibliotheken.

Bovendien zijn deze bibliotheken vereist bij het aanroepen van de Amazon Bedrock API Amazon SageMaker Studio. Dit kan gedaan worden door een cel uit te voeren met de volgende code:

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

Ten slotte maak je het volgende beleid en koppel je dit later aan elke rol die toegang heeft tot Amazon Bedrock:

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

Maak een DynamoDB-tabel

In ons specifieke scenario hebben we een DynamoDB-tabel gemaakt als ons klantendatabasesysteem, maar u kunt deze ook gebruiken Amazon relationele databaseservice (Amazone RDS). Voer de volgende stappen uit om uw DynamoDB-tabel in te richten (of pas de instellingen indien nodig aan voor uw gebruiksscenario):

  1. Kies op de DynamoDB-console Tafels in het navigatievenster.
  2. Kies Maak een tabel.

  1. Voor Tafel naam, voer een naam in (bijvoorbeeld ItemDetails).
  2. Voor Partitiesleutel, voer een sleutel in (voor dit bericht gebruiken we Item).
  3. Voor Sorteer sleutel, voer een sleutel in (voor dit bericht gebruiken we Size).
  4. Kies Maak een tabel.

Nu kunt u de gegevens in de DynamoDB-tabel laden. Voor dit bericht gebruiken we een CSV-bestand. U kunt de gegevens naar de DynamoDB-tabel laden met behulp van Python-code in een SageMaker-notebook.

Eerst moeten we een profiel instellen met de naam dev.

  1. Open een nieuwe terminal in SageMaker Studio en voer de volgende opdracht uit:
aws configure --profile dev

Met deze opdracht wordt u gevraagd uw AWS-toegangssleutel-ID, geheime toegangssleutel, standaard AWS-regio en uitvoerformaat in te voeren.

  1. Keer terug naar het SageMaker-notebook en schrijf een Python-code om een ​​verbinding met DynamoDB tot stand te brengen met behulp van de Boto3-bibliotheek in Python. Dit codefragment maakt een sessie aan met behulp van een specifiek AWS-profiel met de naam dev en maakt vervolgens een DynamoDB-client aan met behulp van die sessie. Hier volgt het codevoorbeeld om de gegevens te laden:
%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}")

Als alternatief kunt u gebruiken NoSQL-werkbank of andere tools om de gegevens snel naar uw DynamoDB-tabel te laden.

Het volgende is een screenshot nadat de voorbeeldgegevens in de tabel zijn ingevoegd.

Maak sjablonen in een SageMaker-notebook met behulp van de Amazon Bedrock-aanroep-API

Om onze promptsjabloon voor dit gebruiksscenario te maken, gebruiken we Amazon Bedrock. Je hebt toegang tot Amazon Bedrock via de AWS-beheerconsole en via API-aanroepen. In ons geval hebben we toegang tot Amazon Bedrock via API vanuit het gemak van een SageMaker Studio-notebook om niet alleen onze promptsjabloon te maken, maar ook onze volledige API-aanroepcode die we later kunnen gebruiken voor onze Lambda-functie.

  1. Op de SageMaker-console krijgt u toegang tot een bestaand SageMaker Studio-domein of maakt u een nieuw domein om toegang te krijgen tot Amazon Bedrock vanaf een SageMaker-notebook.

  1. Nadat u het SageMaker-domein en de gebruiker hebt aangemaakt, kiest u de gebruiker en kiest u Lancering en studio. Hiermee wordt een JupyterLab-omgeving geopend.
  2. Wanneer de JupyterLab-omgeving gereed is, opent u een nieuw notitieblok en begint u met het importeren van de benodigde bibliotheken.

Er zijn veel FM's beschikbaar via de Amazon Bedrock Python SDK. In dit geval gebruiken we Claude V2, een krachtig basismodel ontwikkeld door Anthropic.

De orderverwerkingsagent heeft een aantal verschillende sjablonen nodig. Dit kan veranderen afhankelijk van de gebruikssituatie, maar we hebben een algemene workflow ontworpen die op meerdere instellingen kan worden toegepast. Voor dit gebruiksscenario zal de Amazon Bedrock LLM-sjabloon het volgende bereiken:

  • Valideer de intentie van de klant
  • Valideer de aanvraag
  • Creëer de ordergegevensstructuur
  • Geef een samenvatting van de bestelling door aan de klant
  1. Om het model aan te roepen, maakt u een bedrock-runtime-object van 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')

Laten we beginnen met het werken aan de intent validator-promptsjabloon. Dit is een iteratief proces, maar dankzij de snelle technische handleiding van Anthropic kunt u snel een prompt maken die de taak kan volbrengen.

  1. Maak de eerste promptsjabloon samen met een hulpprogrammafunctie waarmee u de hoofdtekst kunt voorbereiden op de API-aanroepen.

Het volgende is de code voor 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. Sla deze sjabloon op in een bestand om te uploaden naar Amazon S3 en indien nodig de Lambda-functie aan te roepen. Sla de sjablonen op als geserialiseerde JSON-tekenreeksen in een tekstbestand. De vorige schermafbeelding toont het codevoorbeeld om dit ook te bereiken.
  2. Herhaal dezelfde stappen met de andere sjablonen.

Hieronder volgen enkele schermafbeeldingen van de andere sjablonen en de resultaten wanneer u met sommige daarvan Amazon Bedrock aanroept.

Het volgende is de code voor 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:"]}"

Het volgende is onze reactie van Amazon Bedrock met behulp van deze sjabloon.

Het volgende is de code voor: 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:"]}"


Het volgende is de code voor 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]"]}"


Zoals u kunt zien, hebben we onze promptsjablonen gebruikt om menu-items te valideren, ontbrekende vereiste informatie te identificeren, een datastructuur te creëren en de bestelling samen te vatten. De basismodellen die beschikbaar zijn op Amazon Bedrock zijn zeer krachtig, dus je kunt via deze sjablonen nog meer taken uitvoeren.

U hebt het ontwerp van de aanwijzingen voltooid en de sjablonen in tekstbestanden opgeslagen. U kunt nu beginnen met het maken van de Amazon Lex-bot en de bijbehorende Lambda-functies.

Maak een Lambda-laag met de promptsjablonen

Voer de volgende stappen uit om uw Lambda-laag te maken:

  1. Maak in SageMaker Studio een nieuwe map met een submap met de naam python.
  2. Kopieer uw promptbestanden naar het python map.

  1. U kunt de ZIP-bibliotheek aan uw notebookinstantie toevoegen door de volgende opdracht uit te voeren.
!conda install -y -c conda-forge zip

  1. Voer nu de volgende opdracht uit om het ZIP-bestand te maken voor uploaden naar de Lambda-laag.
!zip -r prompt_templates_layer.zip prompt_templates_layer/.

  1. Nadat u het ZIP-bestand hebt gemaakt, kunt u het bestand downloaden. Ga naar Lambda, maak een nieuwe laag door het bestand rechtstreeks te uploaden of door eerst naar Amazon S3 te uploaden.
  2. Koppel deze nieuwe laag vervolgens aan de orkestratie-Lambda-functie.

Nu worden uw promptsjabloonbestanden lokaal opgeslagen in uw Lambda-runtimeomgeving. Dit versnelt het proces tijdens uw botruns.

Maak een Lambda-laag met de vereiste bibliotheken

Voer de volgende stappen uit om uw Lambda-laag met de vereiste bibliotheken te maken:

  1. Open een AWS-Cloud9 instance-omgeving, maak een map met een submap met de naam python.
  2. Open een terminal in het python map.
  3. Voer de volgende opdrachten uit vanaf de terminal:
pip install “boto3>=1.28.57” -t .
pip install “awscli>=1.29.57" -t .
pip install “botocore>=1.31.57” -t .

  1. lopen cd .. en positioneer jezelf in je nieuwe map waar je ook de python submap.
  2. Voer het volgende commando uit:
zip -r lambda-layer.zip

  1. Nadat u het ZIP-bestand hebt gemaakt, kunt u het bestand downloaden. Ga naar Lambda, maak een nieuwe laag door het bestand rechtstreeks te uploaden of door eerst naar Amazon S3 te uploaden.
  2. Koppel deze nieuwe laag vervolgens aan de orkestratie-Lambda-functie.

Maak de bot in Amazon Lex v2

Voor dit gebruiksscenario bouwen we een Amazon Lex-bot die een invoer-/uitvoerinterface voor de architectuur kan bieden om Amazon Bedrock te bellen met spraak of tekst vanuit elke interface. Omdat de LLM het gespreksonderwerp van deze orderverwerkingsagent zal afhandelen en Lambda de workflow zal orkestreren, kunt u een bot maken met drie intenties en zonder slots.

  1. Maak op de Amazon Lex-console een nieuwe bot met de methode Maak een lege bot.

Nu kunt u een intentie toevoegen met elke passende initiële uiting zodat de eindgebruikers het gesprek met de bot kunnen beginnen. We gebruiken eenvoudige begroetingen en voegen een eerste botreactie toe, zodat eindgebruikers hun verzoeken kunnen indienen. Zorg er bij het maken van de bot voor dat u een Lambda-codehaak gebruikt met de bedoelingen; dit zal een Lambda-functie activeren die de workflow tussen de klant, Amazon Lex, en de LLM zal orkestreren.

  1. Voeg uw eerste intentie toe, die de workflow activeert en de sjabloon voor de intentievalidatieprompt gebruikt om Amazon Bedrock te bellen en te identificeren wat de klant probeert te bereiken. Voeg een paar eenvoudige uitingen toe waarmee eindgebruikers een gesprek kunnen beginnen.

U hoeft geen slots of initiële lezing te gebruiken in een van de botintenties. In feite hoeft u geen uitingen toe te voegen aan de tweede of derde intentie. Dat komt omdat de LLM Lambda door het hele proces zal begeleiden.

  1. Voeg een bevestigingsvraag toe. U kunt dit bericht later aanpassen in de Lambda-functie.

  1. Onder Code hakenselecteer Gebruik een Lambda-functie voor initialisatie en validatie.

  1. Creëer een tweede intentie zonder uiting en zonder eerste reactie. Dit is de PlaceOrder intentie.

Wanneer de LLM vaststelt dat de klant een bestelling probeert te plaatsen, activeert de Lambda-functie deze intentie en valideert het verzoek van de klant aan de hand van het menu, en zorgt ervoor dat er geen vereiste informatie ontbreekt. Houd er rekening mee dat dit allemaal in de promptsjablonen staat, dus u kunt deze workflow voor elk gebruiksscenario aanpassen door de promptsjablonen te wijzigen.

  1. Voeg geen slots toe, maar voeg een bevestigingsvraag toe en weiger de reactie.

  1. kies Gebruik een Lambda-functie voor initialisatie en validatie.

  1. Creëer een derde intentie met de naam ProcessOrder zonder voorbeelduitingen en zonder slots.
  2. Voeg een eerste reactie, een bevestigingsprompt en een afwijzingsreactie toe.

Nadat de LLM het klantverzoek heeft gevalideerd, activeert de Lambda-functie de derde en laatste intentie om de bestelling te verwerken. Hier gebruikt Lambda de sjabloon voor het maken van objecten om de JSON-gegevensstructuur van de bestelling te genereren om de DynamoDB-tabel te doorzoeken, en vervolgens de sjabloon voor de bestelsamenvatting te gebruiken om de hele bestelling samen met het totaal samen te vatten, zodat Amazon Lex deze aan de klant kan doorgeven.

  1. kies Gebruik een Lambda-functie voor initialisatie en validatie. Deze kan elke Lambda-functie gebruiken om de bestelling te verwerken nadat de klant de definitieve bevestiging heeft gegeven.

  1. Nadat u alle drie de intenties hebt gemaakt, gaat u naar de Visuele bouwer voor de ValidateIntent, voeg een go-to-intentiestap toe en verbind de uitvoer van de positieve bevestiging met die stap.
  2. Nadat u de go-to-intentie hebt toegevoegd, bewerkt u deze en kiest u de PlaceOrder-intentie als intentienaam.

  1. Op dezelfde manier kunt u de visuele bouwer voor de PlaceOrder intentie en verbind de uitvoer van de positieve bevestiging met de ProcessOrder go-to-intentie. Er is geen bewerking vereist voor de ProcessOrder intentie.
  2. U moet nu de Lambda-functie maken die Amazon Lex orkestreert en de DynamoDB-tabel aanroept, zoals beschreven in de volgende sectie.

Creëer een Lambda-functie om de Amazon Lex-bot te orkestreren

U kunt nu de Lambda-functie bouwen die de Amazon Lex-bot en workflow orkestreert. Voer de volgende stappen uit:

  1. Creëer een Lambda-functie met het standaard uitvoeringsbeleid en laat Lambda een rol voor u creëren.
  2. Voeg in het codevenster van uw functie een paar hulpprogramma's toe die u zullen helpen: formatteer de aanwijzingen door de lex-context aan de sjabloon toe te voegen, roep de Amazon Bedrock LLM API aan, extraheer de gewenste tekst uit de antwoorden, en meer. Zie de volgende code:
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. Koppel de Lambda-laag die u eerder hebt gemaakt aan deze functie.
  2. Koppel de laag bovendien aan de aanwijzingssjablonen die u hebt gemaakt.
  3. Voeg in de Lambda-uitvoeringsrol het beleid toe voor toegang tot Amazon Bedrock, dat eerder is gemaakt.

De Lambda-uitvoeringsrol moet de volgende machtigingen hebben.

Koppel de Orchestration Lambda-functie aan de Amazon Lex-bot

  1. Nadat u de functie in de vorige sectie hebt gemaakt, keert u terug naar de Amazon Lex-console en navigeert u naar uw bot.
  2. Onder Talen in het navigatievenster, kies Engels.
  3. Voor bron, kies uw orderverwerkingsbot.
  4. Voor Lambda-functieversie of alias, kiezen $LAATSTE.
  5. Kies Bespaar.

Creëer ondersteunende Lambda-functies

Voer de volgende stappen uit om extra Lambda-functies te creëren:

  1. Maak een Lambda-functie om de DynamoDB-tabel op te vragen die u eerder hebt gemaakt:
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. Navigeer naar de Configuratie tabblad in de Lambda-functie en kies machtigingen.
  2. Voeg een op bronnen gebaseerde beleidsverklaring toe waarmee de Lambda-functie voor orderverwerking deze functie kan aanroepen.

  1. Navigeer naar de IAM-uitvoeringsrol voor deze Lambda-functie en voeg een beleid toe om toegang te krijgen tot de DynamoDB-tabel.

  1. Maak nog een Lambda-functie om te valideren of alle vereiste attributen zijn doorgegeven door de klant. In het volgende voorbeeld valideren we of het maatkenmerk is vastgelegd voor een bestelling:
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. Navigeer naar de Configuratie tabblad in de Lambda-functie en kies machtigingen.
  2. Voeg een op bronnen gebaseerde beleidsverklaring toe waarmee de Lambda-functie voor orderverwerking deze functie kan aanroepen.

Test de oplossing

Nu kunnen we de oplossing testen met voorbeeldbestellingen die klanten via Amazon Lex plaatsen.

Voor ons eerste voorbeeld vroeg de klant om een ​​frappuccino, die niet op het menu staat. Het model valideert met behulp van de ordervalidator-sjabloon en doet enkele aanbevelingen op basis van het menu. Nadat de klant zijn bestelling heeft bevestigd, wordt hij op de hoogte gesteld van het ordertotaal en de ordersamenvatting. De bestelling wordt verwerkt op basis van de definitieve bevestiging van de klant.

In ons volgende voorbeeld bestelt de klant een grote cappuccino en wijzigt vervolgens de maat van groot naar medium. Het model legt alle noodzakelijke wijzigingen vast en vraagt ​​de klant om de bestelling te bevestigen. Het model presenteert het ordertotaal en de ordersamenvatting en verwerkt de order op basis van de definitieve bevestiging van de klant.

Voor ons laatste voorbeeld heeft de klant een bestelling geplaatst voor meerdere artikelen en bij een aantal artikelen ontbreekt de maat. Het model en de Lambda-functie verifiëren of alle vereiste attributen aanwezig zijn om de bestelling te verwerken en vragen de klant vervolgens om de ontbrekende informatie aan te vullen. Nadat de klant de ontbrekende informatie heeft opgegeven (in dit geval de grootte van de koffie), krijgt hij het besteltotaal en het besteloverzicht te zien. De bestelling wordt verwerkt op basis van de definitieve bevestiging van de klant.

LLM-beperkingen

LLM-uitvoer is van nature stochastisch, wat betekent dat de resultaten van onze LLM kunnen variëren in formaat, of zelfs in de vorm van onwaarachtige inhoud (hallucinaties). Daarom moeten ontwikkelaars in hun hele code kunnen vertrouwen op een goede foutafhandelingslogica om met deze scenario's om te gaan en een verslechterde eindgebruikerservaring te voorkomen.

Opruimen

Als u deze oplossing niet langer nodig heeft, kunt u de volgende bronnen verwijderen:

  • Lambda-functies
  • Amazon Lex-doos
  • DynamoDB-tafel
  • S3 emmer

Sluit bovendien de SageMaker Studio-instantie af als de toepassing niet langer nodig is.

Kostenraming

Zie het volgende voor prijsinformatie voor de belangrijkste services die door deze oplossing worden gebruikt:

Houd er rekening mee dat u Claude v2 kunt gebruiken zonder dat er voorzieningen nodig zijn, zodat de totale kosten minimaal blijven. Om de kosten verder te verlagen, kunt u de DynamoDB-tabel configureren met de on-demand instelling.

Conclusie

Dit bericht demonstreerde hoe je een spraakgestuurde AI-orderverwerkingsagent kunt bouwen met behulp van Amazon Lex, Amazon Bedrock en andere AWS-services. We hebben laten zien hoe snelle engineering met een krachtig generatief AI-model zoals Claude een robuust begrip van natuurlijke taal en gespreksstromen voor orderverwerking mogelijk kan maken zonder de noodzaak van uitgebreide trainingsgegevens.

De oplossingsarchitectuur maakt gebruik van serverloze componenten zoals Lambda, Amazon S3 en DynamoDB om een ​​flexibele en schaalbare implementatie mogelijk te maken. Door de promptsjablonen in Amazon S3 op te slaan, kunt u de oplossing aanpassen aan verschillende gebruiksscenario's.

Volgende stappen kunnen bestaan ​​uit het uitbreiden van de mogelijkheden van de agent om een ​​breder scala aan klantverzoeken en edge cases af te handelen. De promptsjablonen bieden een manier om de vaardigheden van de agent iteratief te verbeteren. Bijkomende aanpassingen kunnen betrekking hebben op de integratie van de bestelgegevens met backend-systemen zoals voorraad, CRM of POS. Ten slotte zou de agent beschikbaar kunnen worden gemaakt via verschillende klantcontactpunten, zoals mobiele apps, drive-thru, kiosken en meer, met behulp van de multi-channel mogelijkheden van Amazon Lex.

Raadpleeg de volgende gerelateerde bronnen voor meer informatie:

  • Multi-channel bots implementeren en beheren:
  • Snelle engineering voor Claude en andere modellen:
  • Serverloze architectuurpatronen voor schaalbare AI-assistenten:

Over de auteurs

Moumita Dutta is een Partner Solution Architect bij Amazon Web Services. In haar rol werkt ze nauw samen met partners om schaalbare en herbruikbare middelen te ontwikkelen die cloudimplementaties stroomlijnen en de operationele efficiëntie verbeteren. Ze is lid van de AI/ML-gemeenschap en een generatieve AI-expert bij AWS. In haar vrije tijd houdt ze van tuinieren en fietsen.

Fernando Lammoglia is een Partner Solutions Architect bij Amazon Web Services en werkt nauw samen met AWS-partners bij het leiden van de ontwikkeling en adoptie van geavanceerde AI-oplossingen in alle bedrijfseenheden. Een strategische leider met expertise in cloudarchitectuur, generatieve AI, machine learning en data-analyse. Hij is gespecialiseerd in het uitvoeren van go-to-market-strategieën en het leveren van impactvolle AI-oplossingen die zijn afgestemd op de doelstellingen van de organisatie. In zijn vrije tijd brengt hij graag tijd door met zijn gezin en reist hij graag naar andere landen.

Mitul Patel is een Senior Solution Architect bij Amazon Web Services. In zijn rol als cloudtechnologie-enabler werkt hij samen met klanten om hun doelen en uitdagingen te begrijpen, en geeft hij voorgeschreven begeleiding om hun doel te bereiken met AWS-aanbiedingen. Hij is lid van de AI/ML-gemeenschap en een Generative AI-ambassadeur bij AWS. In zijn vrije tijd houdt hij van wandelen en voetballen.

spot_img

Laatste intelligentie

spot_img