この記事はリクルートが提供する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文字列なので、それを普通の文字列に変換する処理がある。
エラーハンドリングはゆるゆるなのでご容赦を。
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;
}
}
結果
会話できてますね(白目
[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はまだ公開されたばかりなので、これからの学習に期待しましょう。