CFC部署最佳实践(Java)

本文介绍如何使用Java语言在百度云CFC上部署技能,如果你不了解什么是CFC部署,请先阅读CFC部署

本文以查询个税技能为例,讲述如何在CFC上使用Java语言实现技能,主要分为技能功能代码实现和在CFC部署技能两部分。阅读本文内容前请参照链接完成查询个税技能的交互模型的创建。其中意图名称、槽位名称等需要与示例保持一致,这些名字会在本文的代码示例中使用。

使用Java开发技能代码

本文将使用Java语言开发技能代码分成如下六个步骤,并以查询个税技能为例详细的讲解每一步骤中的具体实现。

  1. 配置Java环境。

    在开发和运行示例之前,请按下面的指导配置Java运行环境。如果已经完成环境配置,请阅读第二步。

    • 安装Maven软件项目管理工具,点击链接下载。
    • 安装Java SE开发工具包(JDK) 7或更高版本,点击链接下载。
  2. 创建Java工程。

    根据下面的命令创建工程并设定groupId和artifactId。查询个税示例中的groupId为com.baidu.dueros.bot,artifactId为demo,创建工程的命令如下。

    mvn archetype:generate -DgroupId=com.baidu.dueros.bot -DartifactId=demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
  3. 修改pom.xml文件。
    增加技能开发平台和百度云cfc相关的SDK的依赖关系。查询个税示例的pom.xml文件内容如下。

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.baidu.dueros.bot</groupId>
    <artifactId>demo</artifactId>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>com.baidu.dueros</groupId>
            <artifactId>bot-sdk</artifactId>
            <version>1.1.1</version>
        </dependency>
    
        <dependency>
            <groupId>com.baidubce.faas</groupId>
            <artifactId>bce-cfc-java-core</artifactId>
            <version>1.0.0</version>
            <scope>provided</scope>
        </dependency>
    
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
                        <phase>package</phase> <!-- bind to the packaging phase -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    </project>
  4. 编写工程入口函数代码。
    在使用Java编程时,需要定义一个函数入口类。下面是查询个税技能使用的入口函数的示例,请将下面的内容拷贝到文件src/main/java/com/baidu/dueros/bot/App.java中。

    package com.baidu.dueros.bot;
    import com.baidubce.faas.core.FaasContext;
    import com.baidubce.faas.core.InvokeHandler;
    import org.apache.commons.io.IOUtils;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.nio.charset.StandardCharsets;
    public class App implements InvokeHandler
    {
    public void invoke(InputStream input, OutputStream output, FaasContext context) throws Exception {
        try {
            String result = IOUtils.toString(input, StandardCharsets.UTF_8);
            Bot bot = new Bot(result);
            bot.disableVerify();
            //调用bot的run方法
            String responseJson = bot.run();
            output.write(responseJson.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
            output.write("{\"status\":1,\"msg\":\"function error\"}".getBytes());
        }
    }
    }

    其中,函数入口类要继承并实现com.baidubce.faas.core.InvokeHandler接口。函数invoke有三个参数:input表示输入数据,output表示输出数据,context表示函数运行时信息。用户日志输出到stdout和stderr,函数计算服务会自动收集这些日志。

  5. 实现技能功能代码。
    在文件src/main/java/com/baidu/dueros/bot/Bot.java进行技能功能代码的实现,查询个税的代码请参考Bot.java文件。这里简单介绍查询个税技能处理DuerOS发送的LaunchRequest、IntentRequest和SessionEndedRequest三种请求的代码实现。
    • 当用户调用技能时,如用户说“打开查询个税”,此时DuerOS会向用户发送LaunchRequest请求消息,函数onLaunch()实现了对LaunchRequest请求的处理,播报欢迎语,并在屏幕上展现欢迎界面和提示语,代码示例如下。
      protected Response onLaunch(LaunchRequest launchRequest) {
          // 新建文本卡片
          TextCard textCard = new TextCard("欢迎使用查询个税");
          // 设置链接地址
          textCard.setUrl("www:....");
          // 设置链接内容
          textCard.setAnchorText("setAnchorText");
          // 添加引导话术
          textCard.addCueWord("我想查询个税");
          // 新建返回的语音内容
          OutputSpeech outputSpeech = new OutputSpeech(SpeechType.PlainText, "欢迎使用查询个税");
          // 构造返回的Response
          Response response = new Response(outputSpeech, textCard);
          return response;
      }
    • 当用户发送查询个税请求后,DuerOS会发送IntentRequest消息。技能收到请求后,对月薪和城市的槽位信息进行确认,并为用户提供服务,代码示例如下。
      protected Response onInent(IntentRequest intentRequest) {
          // 判断NLU解析的意图名称是否匹配 inquiry_tax
          if ("inquiry_tax".equals(intentRequest.getIntentName())) {
              // 判断NLU解析解析后是否存在这个槽位
              if (getSlot("sys.number") == null) {
                  // 询问月薪槽位
                  ask("sys.number");
                  return askNumber();
              } else if (getSlot("sys.city") == null) {
                  // 询问城市槽位
                  ask("sys.city");
                  return askCity();
              } else {
                  // 计算个税缴纳情况
                  return compute();
              }
          }
          return null;
      }
    • 当用户想要退出查询个税技能时,会说“退出”,此时DuerOS会向技能发送SessionEndedRequest请求,技能收到请求会退出技能,并播报退出语。
      protected Response onSessionEnded(SessionEndedRequest sessionEndedRequest) {
          // 构造TextCard
          TextCard textCard = new TextCard("感谢您使用查询个税服务");
          textCard.setAnchorText("setAnchorText");
          textCard.addCueWord("");
          // 构造OutputSpeech
          OutputSpeech outputSpeech = new OutputSpeech(SpeechType.PlainText, "感谢您使用查询个税服务");
          // 构造Response
          Response response = new Response(outputSpeech, textCard);
          return response;
      }

      可以点击链接下载查询个税示例工程的完整代码。

  6. 编译工程。
    编译工程,并将编译的jar包压缩成zip文件,为技能部署到CFC做准备。
    mvn package
    cd target
    zip java-bot.zip demo-1.0-jar-with-dependencies.jar

部署技能

技能代码开发完成后,需要将技能部署到CFC上。

  1. 在开发平台“配置服务”页面,选择“百度云CFC”,点击CFC邀请链接进入函数计算CFC产品页面。
    图片
  2. 按照如下步骤创建函数并进行参数设置。

    • 在基础信息中填写函数名称,运行语言选择"java8"。示例函数名称为“demo”。
    • 在函数代码中上传工程的zip文件。目前CFC不支持在线编辑java。示例中工程的文件是上文中压缩好的java-bot.zip文件。
    • 开启高级设置,填写处理程序名称。示例中为"com.baidu.dueros.bot.App"。其他选项使用默认配置。

    图片

  3. 函数创建成功后,设置触发器。在配置->触发器中,添加DuerOS触发器

    图片

  4. 开放平台上面填写函数的BRN信息。
  5. 在模拟测试中测试技能功能,详细测试过程请参考技能模拟测试示例

功能扩展

示例主要演示了如何怎么使用java语言在CFC上实现技能的部署的流程,技能实现的功能比较简单,仅使用了卡片和对话指令。开发者在实现技能时服务可能比较复杂,下面列出技能常用功能参考文档。

技能发布及上线

技能测试后,可以将技能发布到技能商店让更多的用户使用。请参照技能发布版本管理完成技能的上线,这里不做详细介绍。

相关文档

SDK文档链接