kintoneに乗るっ!

非エンジニアが勉強がてら kintone で遊ぶブログ

OpenAI APIでkintoneにAIを!その①

f:id:ibukintone:20210602002632p:plain

「kintoneに乗るっ!」記念すべき一本目の記事は、

「Open AI API で kintone でも AI を使おう!」

時代は AI ということで、今回は OpenAI の API で遊んでみます。

OpenAI とは?

OpenAI は Microsoft が出資する AI プロジェクトで、GPT-3 と呼ばれる自然言語処理モデルを開発しています。

data-analytics.fun

学習に利用するモデルデータの規模が半端じゃないらしい。

私はこの分野はまったく詳しくありませんが、最先端を行く AI の一つです。

そんな OpenAI、記事作成時点で API をベータ公開しており、申し込みさえ行えば誰でも利用することが可能。

私は以前申し込みしておいたのですが、忘れた頃に招待メールが届いていました。さっそく使っていきましょう。

kintone で AI 〜いい感じに映画のタイトルと絵文字を生成〜

映画タイトルと絵文字の組み合わせを入力すると、いい感じに他の映画のタイトルと絵文字の組み合わせを表示するカスタマイズをやってみます。

入力できる映画タイトルは英語のみ。

下準備

OpenAI が公開しているコードサンプルをもとに進めていきます。

beta.openai.com

kintone アプリはこんな感じに作成。

f:id:ibukintone:20210601233910p:plain

コードを書き書き。今回は kintone UI Component でボタンを作成して、ボタンがクリックされたら API を実行し、値をフィールドに設定するようにしました。

(function (){
  'use strict';

  // レコード詳細表示時に実行
  kintone.events.on(['app.record.create.show', 'app.record.edit.show'], event => {
    // レコード情報を取得
    const title = event.record['title'].value;
    const space = kintone.app.record.getSpaceElement('space');
    
    // kintone UI Component でボタンを作成
    const button = new Kuc.Button({
      text: '実行!',
      type: 'submit'
    });
    space.appendChild(button);
    
    // ボタンがクリックされたら API を実行
    button.addEventListener('click', event => {
      const url = 'https://api.openai.com/v1/engines/davinci/completions';
      const method = 'POST';
      const headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer {API-Token}'
      }
      const data = {
        'prompt': title,
        'temperature': 0.8,
        'max_tokens': 60,
        'top_p': 1.0,
        'frequency_penalty': 0.0,
        'presence_penalty': 0.0,
        'stop': ['¥n']
      }
      kintone.proxy(url, method, headers, data).then(arg => {
        // 実行結果をフィールドに設定
        const record = kintone.app.record.get();
        const resp = JSON.parse(arg[0])
        record.record['emoji'].value = resp.choices[0].text;
        console.log(record);
        kintone.app.record.set(record);
      }).catch(err => {
       console.log(err); 
      });
    });
  }); 
})();

kintone 的には kintone UI Component がポイント。kintone っぽい UI の要素を作れるライブラリです。

    // kintone UI Component でボタンを作成
    const button = new Kuc.Button({
      text: '実行!',
      type: 'submit'
    });
    space.appendChild(button);

OpenAI に POST する JSONですが、意味がよくわからないパラメータが何個かありますね...

      const data = {
        'prompt': title,
        'temperature': 0.8,
        'max_tokens': 60,
        'top_p': 1.0,
        'frequency_penalty': 0.0,
        'presence_penalty': 0.0,
        'stop': ['¥n']
      }

公式ドキュメントによると、次のような意味とのこと。

  • temperature:独創性。01.〜0.9 の値で、高いほど独創的な回答をする。
  • max_tokens:回答の最大トークン数。GPT-3 はデータを「トークン」と呼ばれる単位で管理しており、1トークンは大体アルファベット4文字。
  • top_p:よくわからん。

kintone UI Component と JS ファイルを kintone に適用します。

f:id:ibukintone:20210531222906p:plain

以上で下準備は終わり!

いざ実行!

レコード追加画面にて、映画のタイトルと絵文字の組み合わせを「映画のタイトル」フィールドに設定して「実行!」

f:id:ibukintone:20210601234253p:plain

おお〜。結果が表示されました。「ノマドランド」の絵文字、いい線いってますね。

f:id:ibukintone:20210601234353p:plain

試しにもう一回実行。「最後のジェダイ」はヘリなんですねw

f:id:ibukintone:20210601234608p:plain

temperature0.1にして再度実行してみると、同じタイトルばかり返ってきました。確かに独創性がない。

f:id:ibukintone:20210602001128p:plain

今回はまったく実用性のないカスタマイズでしたが、次回はもう少し実用的に OpenAI を使ってみようと思います。