是否可以从aiml调用Java函数?

时间:2017-04-14 06:48:57

标签: java aiml

我正在使用Java和程序ab创建一个聊天机器人。在一些地方我无法直接回答问题,我必须处理某些事情或调用Web服务并处理结果然后回复。在这种情况下,如何将我的java函数的结果包含在aiml中的响应中。

说,

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 个答案:

答案 0 :(得分:2)

通常,AIML扩展程序实现为扩展标记。因此,您无法直接从AIML脚本调用编程语言方法/函数。在AB文档中,您可以找到有关实现此类功能的更多详细信息here。以下是相关文字,其中包含在GitHub上的forked project中找到的PCAIMLProcessorExtension的更新链接。可以找到一些关于工作扩展的实际例子。

  

<强> AIMLProcessorExtension

     

程序AB定义了一个名为AIMLProcessorExtension的Java接口   您可以使用它来定义新的AIML标签。

     

实现AIMLProcessorExtension的类必须提供:

     
      
  • 一组标签名称。
  •   
  • 用于递归评估与新标记关联的每个节点的XML分析树的函数。
  •   
     

程序AB源   包括一个名为的接口的示例实现   PCAIMLProcessorExtension,定义了一组标签   模拟联系人数据库。

答案 1 :(得分:2)

有一个简单而通用的选项,您可以保留稍后在开关中使用的关键字,例如

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;
}