问题
I am creating a chatbot using Java and program ab. In few places I can’t answer the questions directly, I have to process something or call a web service and process the result and then reply back. In such cases how to include the result of my java function to the responses in the aiml.
Say,
User: What is the price of the product A?
Bot: The price of product A is $50
In the above example, $50 is not going to be same always. I have to take that in run time. So how to solve this problem?
**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;
}
Please someone help me. Thanks in advance.
回答1:
Typically AIML extensions are implemented as an extension tag. So you wouldn't call a programming language method/function directly from AIML script. In the AB documentation you can find more details about implementing this kind of functionality here. Below is the relevant text with an updated link to PCAIMLProcessorExtension
found in a forked project on GitHub. There a couple of practical examples on of working extensions can be found.
AIMLProcessorExtension
Program AB defines a Java Interface called AIMLProcessorExtension that you can use to define new AIML tags.
A class implementing AIMLProcessorExtension must provide:
- a Set of tag names.
- a function to recursively evaluate the XML parse tree for each node associated with a new tag.
The Program AB source includes a sample implementation of this interface called PCAIMLProcessorExtension, which defines a collection of tags simulating a contacts database.
回答2:
There is a simple and general option, you can keep a keyword to be used in switch later on, e.g.
AIML template will have a keyword for operation,
<category>
<pattern>WHAT IS THE PRICE OF THE *</pattern>
<template>PRICE,The price of <star/> is,<star/> </template>
And update java code like:
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;
}
来源:https://stackoverflow.com/questions/43406590/is-it-possible-to-call-java-functions-from-aiml