Java
HTTP
proxy
AI
A3RT

AI「A3RT」を使ってJavaでトークアプリを作ってみた

More than 1 year has passed since last update.

この記事はリクルートが提供するAI「A3RT」の「Talk API」を利用しトークアプリを作成する、しかもcurlコマンドやPython、JavaScriptで書けばもっと簡単にできるのに、敢えてJavaを駆使(苦死?)するGWを持て余した暇人の記事である。


はじめに

AI「A3RT」については公式サイトを参照のこと。


提供されているAPI


  • Listing API

  • Image Influence API

  • Text Classification API

  • Text Suggest API

  • Proofreading API

  • Talk API

今回はTalk APIを使って簡単なトークアプリを作ってみる。


環境・準備


  • Windows10

  • JDK1.8.0_121

APIを実行するためにはAPI KEYが必要なのでここで発行する。


サンプルコード

標準入力で取得した文字列をAPIにPOSTで送信し結果を得る、これをループするだけの簡単な仕様。「bye」と入力すると終了します。

作った環境がProxyありの環境だったのでサンプルコードにはProxyまわりの記述があるが、Proxyがない環境であれば不要です。

あと、レスポンスの文字が一部unicode文字列なので、それを普通の文字列に変換する処理がある。

エラーハンドリングはゆるゆるなのでご容赦を。:stuck_out_tongue_closed_eyes:

import java.io.BufferedReader;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;

public class SmallTalkApp {

public static void main(String[] args) {
while (true) {
HttpURLConnection conn = null;
try {
//標準入力
System.out.print("[me]");
BufferedReader br
= new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();

if (input == null || input.isEmpty()) {
continue;
} else if (input.equals("bye")) {
System.out.println("終了");
return;
}

//送信データ
//発行したAPI KEYを書く
String data = "apikey=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&query=" + input;

//HTTP接続
URL url = new URL("https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk");
//Proxy設定(ネット環境でProxyがある場合のみ)
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxyhost", 9999));
conn = (HttpURLConnection) url.openConnection(proxy);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setUseCaches(false);

//POST送信
try (DataOutputStream dos = new DataOutputStream(conn.getOutputStream())) {
dos.writeBytes(data);
}

//レスポンス受信
int rescode = conn.getResponseCode();
if (rescode == HttpURLConnection.HTTP_OK) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
StringBuilder buf = new StringBuilder();
String line;

while ((line = reader.readLine()) != null) {
buf.append(line);
}
System.out.println(convertToOiginal(buf.toString()));
}
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (conn != null) {
conn.disconnect();
}
}
}
}

/**
* unicode文字列を文字列に変換(u\3042 ⇒ あ)
*
* @param unicode unicode文字列を含む文字列
* @return 文字列
*/

private static String convertToOiginal(String unicode) {
String tmp = unicode;
while (tmp.indexOf("\\u") > 0) {
String str = tmp.substring(tmp.indexOf("\\u"), tmp.indexOf("\\u") + 6);
int c = Integer.parseInt(str.substring(2), 16);
tmp = tmp.replaceFirst("\\" + str, new String(new int[]{c}, 0, 1));
}
return tmp;
}
}


結果

会話できてますね(白目:rolling_eyes:

[me]お疲れ様です。

{"status": 0, "message": "ok", "results": [{"perplexity": 0.7773633993386415, "reply": "私はそんなに嫌いじゃないですよ"}]}
[me]ありがとうございます。
{"status": 0, "message": "ok", "results": [{"perplexity": 0.07521183094611102, "reply": "あなたはよくするんですか?"}]}
[me]はい、します。あなたはよくするんですか?
{"status": 0, "message": "ok", "results": [{"perplexity": 1.5817458708187506, "reply": "私のですか?秘密ですよ"}]}
[me]お願いします。教えてください!
{"status": 0, "message": "ok", "results": [{"perplexity": 2.4087016492196223, "reply": "あなたはよくするんですか?"}]}
[me]私も秘密です
{"status": 0, "message": "ok", "results": [{"perplexity": 0.23161212785866075, "reply": "あなたはよくするんですか?"}]}
[me]休みは何をしますか?
{"status": 0, "message": "ok", "results": [{"perplexity": 7.697953651890003, "reply": "あなたはよく確認するんですね?"}]}
[me]


おわりに

このAIはまだ公開されたばかりなので、これからの学習に期待しましょう。