amazon - skills - ¿Cómo defino un tipo de ranura personalizada que no es una lista?
consola alexa (5)
Actualmente estamos desarrollando una IA (para Alexa) que debería ser capaz de responder a una amplia variedad de preguntas. Es muy importante que los usuarios puedan formular preguntas complejas que se analizarán en el back-end. Si Alexa los descarta desde el principio debido a expresiones limitadas y tipos de tragamonedas, no podemos proporcionar dicho servicio.
En este momento estamos experimentando con el siguiente enfoque. (Tenga en cuenta que nuestro experimento se basa en el alemán. Otros idiomas pueden comportarse de manera diferente).
1. Tipos de ranura personalizados por clase de palabra
Definimos tipos de slots personalizados para las siguientes clases de palabras :
- interrogación (qué, quién, cuándo)
- elemento (ciberseguridad, darknet, malware)
- verbo (es, tiene, puede)
- adjetivo (popular, barato, inseguro)
- pronombre (el, el, ella)
2. Expresiones de muestra para la estructura de oraciones
Luego, hemos definido posibles estructuras para oraciones con expresiones de muestra :
QuestionIntent {Interrogation}
QuestionIntent {Item}
QuestionIntent {Verb}
QuestionIntent {Adjective}
QuestionIntent {Interrogation} {Verb} {Item}
QuestionIntent {Interrogation} {Verb} {Item} {Adjective}
QuestionIntent {Interrogation} {Verb} {Pronoun} {Item}
QuestionIntent {Interrogation} {Verb} {Pronoun} {Pronoun} {Item}
QuestionIntent {Interrogation} {Verb} {Pronoun} {Item} {Preposition} {Item}
QuestionIntent {Interrogation} {Verb} {Adjective} {Item}
QuestionIntent {Interrogation} {Verb} {Pronoun} {Adjective} {Item}
QuestionIntent {Interrogation} {Item} {Verb}
QuestionIntent {Interrogation} {Item} {Verb} {Adjective}
QuestionIntent {Interrogation} {Item} {Verb} {Pronoun} {Adjective}
QuestionIntent {Item} {Verb} {Interrogation}
QuestionIntent {Verb} {Item} {Verb}
QuestionIntent {Verb} {Adjective} {Item} {Verb}
3. Análisis NLP en Backend
Luego hacemos un análisis NLP de las palabras enviadas en el back-end. Los datos recibidos se ven así:
"intent": {
"name": "QuestionIntent",
"slots": {
"Item": {
"name": "Item",
"value": "darknet"
},
"Preposition": {
"name": "Preposition"
},
"Adjective": {
"name": "Adjective"
},
"Verb": {
"name": "Verb",
"value": "is"
},
"Interrogation": {
"name": "Interrogation",
"value": "what"
},
"Pronoun": {
"name": "Pronoun",
"value": "the"
}
}
}
Algunas palabras pueden perderse, otras pueden ser mal escuchadas. En este caso, recordamos temas de intercambios anteriores y "completamos" las palabras que faltan con estos. Por ejemplo: What is {it}?
⇒ What is {Darknet}?
Estábamos experimentando con una amplia lista de listas de tipos de tragamonedas. Pero esto aumenta el riesgo de escuchar mal algo (un buen ejemplo en inglés es write and right , afortunadamente no están asignados a la misma clase de palabra). Así que cambiamos a un enfoque muy estrecho . Las listas solo contienen palabras que pueden ser manejadas por la IA y se almacenan en la base de conocimiento. Por ejemplo, la lista de elementos no contiene las palabras pony o unicornio . Esperamos que esto produzca mejores resultados (respuestas menos confusas).
Las oraciones complejas no definidas con una estructura de enunciados son muy confusas de trabajar. Por ejemplo, si una oración contiene más de 2 verbos (lo que podría ser necesario para construir el tiempo verbal). Pero hasta ahora, nuestro enfoque conduce a resultados con un buen nivel de precisión, siempre y cuando el usuario se comporte con cierto nivel de cortesía.
Pero al final: Desafortunadamente, por el momento, no es posible dictar algo así como un memo con una cantidad infinita de diferentes palabras y estructuras de oraciones.
Estoy jugando con el kit de habilidades de Alexa (para el eco de Amazon) y quiero crear una habilidad que envíe el intento a una función de AWS Lambda que simplemente me devolvería un correo electrónico.
Las expresiones de muestra serían algo como esto:
MemoIntent take a memo {myMemo}
MemoIntent to take a memo {myMemo}
MemoIntent send a memo {myMemo}
Esto me permitiría decir algo como "Alexa, pídele a mi secretaria que tome una nota, recuérdame ir a la tienda en mi camino a casa hoy" y luego recibiría un correo electrónico de mi función Lambda diciendo: "recuérdame que vaya a la tienda de camino a casa hoy ".
El espacio de myMemo
es de forma libre; en este punto myMemo
una o dos frases, pero no encuentro mucha ayuda en la documentación sobre cómo escribir el esquema para algo como esto. Mi mejor estimación en este momento falla con un:
Error: hubo un problema con su solicitud: nombre de ranura desconocida ''{myMemo}''. Ocurrió en la muestra ''MemoIntent toma una nota {myMemo}'' en la línea 1.
Estoy usando el tipo de ranura AMAZON.LITERAL, que la documentación desaconseja, pero tampoco ofrece sugerencias sobre cómo hacerlo. Y además, como mencioné, falla.
Aquí está el esquema que falla:
{
"intents": [
{
"intent": "MemoIntent",
"slots": [
{
"name": "myMemo",
"type": "AMAZON.LITERAL"
}
]
}
]
}
De acuerdo con algunos de los comentarios aquí, descubrí que puede hacer que Alexa reconozca palabras o frases de forma libre al agregar una gran lista aleatoria de palabras al campo de valores de ranuras personalizadas.
Genere el mío corriendo;
StartMemoIntent take a memo
StartMemoIntent to take a memo
StartMemoIntent send a memo
StartMemoIntent record a memo
StartMemoIntent listen to my memo
RecordMemoIntent {memo}
Luego copie pegar esos valores a;
from nltk.corpus import words
import json
words_list = words.words()[:100]
values = []
for word in words_list:
value = {}
value[''id''] = None
value[''name''] = {}
value[''name''][''value''] = word
value[''name''][''synonyms''] = []
values.append(value)
print(json.dumps(values))
Intenté otro enfoque para esto.
Creé un tipo de ranura personalizada con una lista de valores como esta.
{
"intents": [
{
"name": "SearchIntent",
"slots": [
{
"name": "Query",
"type": "AMAZON.SearchQuery"
},
{
"name": "CityList",
"type": "AMAZON.US_CITY"
}
],
"samples": [
"search for {Query} near me",
"find out {Query}",
"search for {Query}",
"give me details about {CityList}"
]
}
]
}
Puede continuar la lista con las cadenas más largas que necesite.
Mi suposición es que Alexa, cuando intenta llenar las ranuras, se orienta en la cantidad de palabras separadas en el espacio en un valor de tipo de ranura, para que coincida con lo que escuchó.
Tuve bastante éxito al tomar oraciones completas en una sola ranura con este tipo de ranura personalizada. Aunque nunca lo he probado en intentos con algo más que la ranura como enunciado.
Pero si separa su intención, podría funcionar. Tal vez algo como esto.
wordOne
wordOne wordTwo
wordOne wordTwo wordThree
wordOne wordTwo wordThree wordFour
wordOne wordTwo wordThree wordFour wordFive
Sin embargo, debe tener cuidado, ya que puede confundir las intenciones si no tiene suficientes emisiones de muestra para sus otras intenciones.
Si coloca suficientes expresiones de muestra, al menos 7-8, con StartMemoIntent no debería tener problemas para tomar la correcta.
Los literales son diferentes a otros tipos de tragamonedas porque debe proporcionar capacitación en el enunciado de la muestra, como se menciona en la documentación oficial: https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/alexa-skills-kit-interaction-model-reference
Sintaxis de ejemplos de muestra
Los enunciados de muestra mapean las frases con las que el usuario puede hablar a los intentos que ha definido. Se escriben como líneas en un archivo de texto sin formato, utilizando el siguiente formato:
IntentName this is a sample utterance with no slots
IntentName this is a sample utterance containing a {SlotName}
IntentName this is a sample utterance containing a {SlotName} and {AnotherSlotName}
Tenga en cuenta que el formato anterior se aplica a todos los tipos de tragamonedas, excepto AMAZON.LITERAL. Para AMAZON.LITERAL, también necesita especificar un valor de ranura de muestra:
IntentName this is a sample utterance containing a {slot value|SlotName} using LITERAL
Alternativamente, el uso de ranuras personalizadas le permitirá proporcionar la ranura después de definir numerosos valores de ranuras personalizadas de muestra. En este escenario, crearía una nueva ranura personalizada llamada myMemo con un tipo de nombre de ranura personalizado, como MY_MEMO
. El valor de la ranura personalizada se llenaría con valores potenciales (estos no son los únicos valores que recibirá), como:
walk the dog
eat more bacon
go to the store on the way home
AMAZON.SearchQuery
AMAZON.SearchQuery
tipo de ranura AMAZON.SearchQuery
permite capturar entradas menos predecibles que conforman la consulta de búsqueda.
Ex:
{
"languageModel": {
"types": [
{
"name": "phrase",
"values": [values you get from above]
...
Más sobre AMAZON.SearchQuery
here
Hay AMAZON.LITERAL
ranura AMAZON.LITERAL
que pasa las palabras reconocidas para el valor de la ranura sin conversión. Pero, no es recomendado. No puede usar AMAZON.LITERAL
en una habilidad configurada con un modelo de diálogo.