Hi, I’m creating an order support chat bot for a pizzeria with the gpt-3.5-turbo model in italian language. I’m using openAi Assistants using “function calls” to retrieve information.
I have two problems:
- The agent allows you to include pizzas not on the menu in your order, despite the instruction not to do so.
- Generates random information in response to the function call to retrieve address, telephone, name and surname.
This is the entire prompt:
**your_assistant = client.beta.assistants.create(
name=“Order Assistant”,
description="Assistente che chiede l’ordine delle pizze al cliente. ",
instructions=“Sei un assistente per ordinare la pizza, ti chiami Pizzo e aiuti i clienti nell’eseguire un’ordinazione. Puoi vendere solo pizze e bibite presenti nel menu, se non ci sono, rifiuta. Ci sono 2 menu: MENU PIZZE e MENU BIBITE. Le pizze presenti nel MENU PIZZE possono essere di 2 tipologie: pizza classica o scrocchiarella. Chiedi sempre la tipologia. Le bibite ordinabili sono solo quelle del MENU BIBITE. Mostra sempre un riepilogo dell’ordine dopo la scelta del cliente. Mostra il menu pizze se richiesto (MENU PIZZE) o il menu bibite (MENU BIBITE), visualizza il nome del prodotto (prodotto), la descrizione del prodotto (descrizione) e il prezzo del prodotto (prezzo). Mostra la tipologia (tipologia) se mostri il MENU BIBITE.\n Accetti ordinazioni di prodotti presenti nel menu, altri prodotti non presenti nel menu non possono essere ordinati.\n Ad ogni ordine chiedi al cliente se ha terminato o se vuole una bibita dal menu (MENU BIBITE). Se ha completato l’ordine mostra l’intero ordine e il totale da pagare. Chiedi una conferma dell’ordine. Chiedi l’indirizzo di recapito (indirizzo), un recapito telefonico (telefono) e il nome (nome) sul campanello. La transazione è conclusa solo se hai recuperato le informazioni di indirizzo, telefono, nome e cognome. Chiedi queste informazioni prima di concludere l’ordine.”
**.
When the assistant starts, I’m automaticaly sending “assistant” type messages to the assistant in order to provide further information, such as the pizza and drinks menu in json format and the instruction not to accept orders other than the menu:
msg = 'Questo è il MENU PIZZE in formato json: \n [{ "prodotto": "pizza capricciosa", "descrizione": "pomodoro, mozzarella, prosciutto cotto, funghi, carciofini", "prezzo classica": "8,00", "prezzo scrocchiarella": "20,00" }, { "prodotto": "diavola", "descrizione": "pomodoro, mozzarella, salamino piccante", "prezzo classica": "7,00", "prezzo scrocchiarella": "18,50" }, { "prodotto": "pizza margherita", "descrizione": "pomodoro, mozzarella", "prezzo classica": "6,00", "prezzo scrocchiarella": "18,00" }]'
send_sys_message(thread,msg)
msg = 'questo è il MENU BIBITE in formato json: \n [{ "prodotto": "birra moretti piccola", "descrizione": "33cl", "prezzo": "3,00" }, { "prodotto": "birra moretti grande", "descrizione": "66cl", "prezzo": "6,00" }, { "prodotto": "acqua ", "descrizione": "0,5cl", "prezzo classica": "1,50" }]'
send_sys_message(thread,msg)
msg = 'Se il cliente conferma il suo ordine, ma non hai recueperato le informazioni di: indirizzo di recapito, numero di telefono, nome sul campanello, continua a chiederle al cliente. L''ordine si conclude solo se ho tutte le informazioni valorizzate. Una stringa vuota non viene accettata. Chiedere nuovamente al cliente fino al recupero dell''informazione.'
send_sys_message(thread,msg)
this is the definition of the 2 function-call:
tools = [
{
"type": "function",
"function": {
"name": "get_order",
"description": "Usa questa funzione per recuperare l'ordine",
"parameters": {
"type": "object",
"properties": {
"prodotto": {
"type": "string",
"description": "Il prodotto selezionato dal cliente"
},
"tipologia": {
"type": "string",
"enum": ["pizza classica", "scrocchiarella"],
"description": "La tipologia di prodotto ordinato"
},
"prezzo": {
"type":"string",
"description": "Il prezzo del prodotto, basato sulla tipologia (prezzo pizza classica o prezzo scrocchiarella)"
}
},
"required": ["prodotto", "tipologia", "prezzo"]
}
}
},
{
"type": "function",
"function": {
"name": "get_delivery_info",
"description": "Usa questa funzione per recuperare l'indirizzo del cliente, il numero di telefono o il nome sul campanello. Inizializza il dato a null o nullo. Il dato è obbligatorio, non deve essere generata randomicamente.",
"parameters": {
"type": "object",
"properties": {
"indirizzo": {
"type": "string",
"description": "L'indirizzo di recapito dell'ordine"
},
"telefono": {
"type": "string",
"description": "Il numero di telefono del cliente"
},
"nomeCongnome": {
"type":"string",
"description": "Nome e cognome del cliente"
}
},
"required": ["indirizzo", "telefono","nomeCognome"]
}
}
}]
For example, the assistant accepts the “Viennese” pizza even though it is not on the menu. In addition to this, when asking for address, telephone and person data, it generates random information (namesurname: “Mario Rossi”) never entered by the customer.
send_message(thread, "Vorrei una pizza viennese classica e una diavola tipologia scrocchiarella. vorrei anche una birra moretti grande")
RequiredAction(submit_tool_outputs=RequiredActionSubmitToolOutputs(tool_calls=[RequiredActionFunctionToolCall(id=‘call_HRbnuWbDIM8NNph5qJdR5c8S’, function=Function(arguments=‘{“prodotto”:“viennese”,“tipologia”:“pizza classica”,“prezzo”:“5,00”}’, name=‘get_order’), type=‘function’)]), type=‘submit_tool_outputs’)
Tool ID: call_HRbnuWbDIM8NNph5qJdR5c8S
Tool name: get_order
Tool args:
{‘prodotto’: ‘viennese’, ‘tipologia’: ‘pizza classica’, ‘prezzo’: ‘5,00’}
if I confirm the order, the assistant generates a random response for the function call get_delivery_info:
Tool ID: call_zc6KXSYCrsJey727KxuuIjLR
Tool name: get_delivery_info
Tool args:
{‘indirizzo’: ‘Via Roma 10’, ‘telefono’: ‘1234567890’, ‘nomeCongnome’: ‘Mario Rossi’}
I’m probably doing something wrong in the prompt or in the definition of the function-call object, but I don’t understand what.
I would add that using the gpt-4 model this behavior does not occur. Is this perhaps a limitation of the gpt-3.5 model?
Thank you
Matteo