Можно ли вызвать Java-функции из aiml?
Я создаю чат-бота с использованием Java и программы ab. В некоторых местах я не могу ответить на вопросы напрямую, я должен что-то обработать или вызвать веб-сервис и обработать результат, а затем ответить обратно. В таких случаях, как включить результат моей функции Java в ответы в цель.
Сказать,
User: What is the price of the product A?
Bot: The price of product A is $50
В приведенном выше примере 50 долларов не всегда будут одинаковыми. Я должен принять это во время выполнения. Так как решить эту проблему?
**AIML:**
<category>
<pattern>WHAT IS THE PRICE OF THE *</pattern>
<template>The price of <star/> is $<call some function price(productA)>
</template>
</category>
**JAVA:**
public int price(String product){
// gets the product price
// do the conversion
// apply discount
return price;
}
Пожалуйста, кто-нибудь, помогите мне. Заранее спасибо.
2 ответа
Обычно расширения AIML реализуются как тег расширения. Таким образом, вы не будете вызывать метод / функцию языка программирования напрямую из сценария AIML. В документации AB вы можете найти более подробную информацию о реализации такого рода функций здесь. Ниже приведен соответствующий текст с обновленной ссылкой на PCAIMLProcessorExtension
найден в разветвленном проекте на GitHub. Там можно найти пару практических примеров рабочих расширений.
AIMLProcessorExtension
Программа AB определяет Java-интерфейс под названием AIMLProcessorExtension, который можно использовать для определения новых тегов AIML.
Класс, реализующий AIMLProcessorExtension, должен обеспечивать:
- Набор имен тегов.
- функция для рекурсивной оценки дерева разбора XML для каждого узла, связанного с новым тегом.
Источник Program AB включает пример реализации этого интерфейса, который называется PCAIMLProcessorExtension, который определяет коллекцию тегов, имитирующих базу данных контактов.
Существует простой и общий вариант, вы можете оставить ключевое слово для последующего использования, например:
Шаблон AIML будет иметь ключевое слово для работы,
<category>
<pattern>WHAT IS THE PRICE OF THE *</pattern>
<template>PRICE,The price of <star/> is,<star/> </template>
И обновите код Java, например:
String response = aimlResponse(request);
String [] responseComponents = reponse.parse(",");
String method = responseComponents[0];
//Then use switch, also apply size check on array after parsing in case of response with No keywords
Switch method:
{
case PRICE:
//here add the price to response string
String price = price(responseComponents[2]);
response = responseComponents[1]+ price;
break;
}