見出し画像

流行りのGPTを Google Spreadsheet に組み込んで調査用シートを作成した

久しぶりにNoteを書いてみる

chatGPT もの凄く話題になってますね。触ってみると、確かに楽しい。
かなり自然な回答が対話形式で返ってくるので、誰かとチャットしている感があって、つい色々と投げ掛けたくなってしまいます。
対話式botという意味では SiriGoogle Assistant と同じはずなのに、この没頭感はどうしてなんでしょうね? ⇒ https://chat.openai.com/chat

日本ディープラーニング協会(JDLA) が主催する G検定 という試験がありますが、その試験範囲にも

  • 1964年に ELIZA(イライザ) という初期の対話型システムが作成され、コンピュータの機械的な動作と分かっていても人間と対話しているような錯覚が得られるとして、人気が出た

  • 1970年代から1980年代にかけて エキスパートシステム と呼ばれる、特定の専門知識を取り込んで専門家のように振る舞う対話型システムが多数開発され、多くの米国企業などで採用されていた

というような記載が出てきます。対話型システムは昔から人気なんですね。

G検定対策本の宣伝 (よろしくお願いします)

ちなみに G検定 はディープラーニング領域の知識を広く学ぶのには最適な検定試験です。オンラインで受験でき、今年は 年5回 の開催が予定されているそうなので、御興味ある方は是非受験してみてください。

また、受験される際は、対策本として下記のテキスト&問題集がオススメです!! (拙著の宣伝です・・よろしくお願いします🙇‍♂️)

自己紹介 (簡易バージョン)

簡単な自己紹介ですが、ITを中心にデータ分析やディープラーニング、画像認識や顔認証などの領域で20年のキャリアがあり、技術領域への理解が私のバックグラウンドの1つです。
その後、外資系コンサルティングファームや経営学修士(MBA)取得などを経て、営業支援(プリセールス)やコンサルティング業務を経験しました。Business(経営) × Technology(技術) の知識と経験を生かし、その両方に跨る領域で活躍できる人材を目指しています。

現在は、顔認証でWebシステムやWindowsに簡単にログインできるというクラウドサービスである JCV Face Login のプロダクトマネージャーを担当しています。

先日2/7に配信したWebinar動画は下記リンクから御覧いただけます。リモートで自宅から配信していたら、途中でヤマトの配達員がインターホンを鳴らしてしまい、講演している後ろでピンポン鳴り続ける・・というハプニングもバッチリ収録されていますのでww、御興味ある方は是非!

調査用GPTシートの作成手順

さて、前置きや宣伝が少し長くなってしまいましたが、早速本題に入っていきましょう。
冒頭に書いた通り、chatGPT は対話型ということで話題を集めている側面もありますが、実際にビジネスの現場で活用しようとすると、もう少し簡単に複数のクエリを投げ、その回答結果を一覧表示できる ワークシート形式 の方が便利そうです。

ということで、今回はGPTを Google Spreadsheet に関数形式で組み込んで使ってみたいと思います。残念ながら chatGPT のAPIは未だ公開されていない(2023/02/09時点)ようなので、既にAPIが公開されている GPT-3 を利用します。全体手順は下記の通りです。

  1. OpenAI のアカウント取得 https://openai.com/api/

  2. OpenAIAPI Key を取得 https://platform.openai.com/account/api-keys/

  3. Google Apps Script (GAS)GPT関数 を登録

    1. Googleスプレッドシートを『新規作成』し、メニューから、『拡張機能』> 『Apps Script』をクリック

    2. 元々入力されていたテキストを削除して、後述のスクリプトを貼り付け

    3. API Key ([2]で発行した文字列)をスクリプト内の所定の位置に貼り付ける *SECRET_KEYの場所

    4. スクリプトを保存して実行する

  4. Spreadsheetに「A列に国名を記入するとGPTがB列にその首都を返すような関数」を設定してみる

    1. シート1行目のセルに項目名を手入力 (例: A1="国名"、B1="首都")

    2. B2のセルに次の関数を入力 =IF(ISBLANK(A2),,GPT("Answer in one word. The capital of "&A2&" is:"))

    3. A2セルに "Japan" と入力して、B2セルに "Tokyo" という正解が返って来れば成功!!

GPT関数を使ったワークシートの例

GPT関数を登録する Google Apps Script (GAS)

手順3-2では、下記スクリプトを丸ごと貼り付けして、API Keyを入力した上で保存⇒実行してください。Webで公開されていたスクリプトをベースに、幾つかの引数をオプションで任意指定できるように修正してあります。

/**
* GPT-3 and Google Sheets
*
* @param {string} prompt Prompt.
* @param {number} temperature (Optional) Temperature.
* @param {integer} max_tokens (Optional) Max Tokens.
* @param {string} model_name (Optional) GPT-3 Model.
* @return Response returned by GPT-3.
* @customfunction
*/

const SECRET_KEY = “<ここにOpenAIで発行したAPI-Keyを入れる>”;
const MAX_TOKENS = 10;
const MODEL_NAME = "text-davinci-003"; // more structured and deterministic: for data
//const MODEL_NAME = "davinci"; // more flexible and creative: for stories, chatbots
const MODEL_TEMP = 0.3;

function GPT(prompt, model_temp=MODEL_TEMP, max_tokens=MAX_TOKENS, model_name=MODEL_NAME) {
  const url = "https://api.openai.com/v1/completions";
  const payload = {
    model: model_name,
    prompt: prompt,
    temperature: model_temp,
    max_tokens: max_tokens
  };

  const options = {
    contentType: "application/json",
    headers: { Authorization: "Bearer " + SECRET_KEY },
    payload: JSON.stringify(payload),
  };

  const res = JSON.parse(UrlFetchApp.fetch(url, options).getContentText());

  return res.choices[0].text.trim();
}

作成したGPT関数の使用方法

今回作成したGPT関数をSpreadsheetから呼ぶ際の使用方法について、以下に解説します。

GPT(prompt, temperature(option), max_tokens(option), model_name(option))

引数は最大4つ、でも後ろ3つは省略可なので、引数は1〜3つでもOKです。

必須なのが prompt。これはGPTへの問い合わせクエリで、文字列形式で指定します。””で囲んだテキストと、A2 などのセル参照を & で結合します。ワークシート上でGPTを活用する場合には少しコツがあって、”簡潔に答えよ” とか ”Answer in one word.” とか回答方式を指定しておくと短い返答が得られます。元々はチャットbotのように文章を返すAIモデルなので、回答方式を指定しないと長めの文章でダラダラと返してくる傾向が・・💦

2つ目の引数は temperature と言って0から2の間の数値を指定するそうです。省略した場合のデフォルト値は0.3です。小さい値だとより確実な答えを返すので、調査結果などを一貫して返して欲しい時に向いています。2.0に近い大きな値だと、回答のランダム性が上がってよりクリエイティブな答えを返すので、自由に作文させる時なんかは大きい値が良いみたいですね。

3つ目の引数は max_tokens で、返答の最大文字数に相当します。デフォルトは10なので、質問/回答の内容に応じて適宜小さい/大きい値を指定してください。token はあまり馴染みの無い単位ですが、英語だと1トークンが約4文字・約0.75単語に相当するそうです。日本語だとトークン数は文字数に近いですが、漢字の場合は1文字で1トークンを超えるみたいですね。。詳しくはこちらの記事を御参照ください⇒ https://auto-worker.com/blog/?p=7005#toc_id_4

You can think of tokens as pieces of words used for natural language processing. For English text, 1 token is approximately 4 characters or 0.75 words.

https://openai.com/api/pricing/#faq-token

4つ目の引数は model_name です。GPTにも幾つかのモデルがあり、デフォルトで選択される text-davinci-003 とは別のモデルを指定することも可能です。例えば “davinci” と指定すると会話や作文が得意なモデルからクリエイティブな文章が返って来ます。(ただし呼び出す度に答えが変わったり、日本の首都を"東京・大阪・名古屋"と答えたり、調査系用途には向きません)

感想

やってみると、実装は意外と簡単でした。素晴らしいAIモデルを無償でトライアルさせてくれる OpenAI社 と、その使用方法を無料公開してくれている国内外のwebpage作成者に感謝です。
少し前までは国内外のベンチャーを含む多くのプレイヤーが『AIを作る』ことを競っていましたが、GAMFAやそれに準ずる"札束でぶん殴れる系"のtechプレイヤーはほぼ絞られて来た感があり、戦場が『AIを使う』ことに完全にシフトしたと実感します。もちろん得られた回答は70%程度の正解率で間違いも多いし未だ完璧ではありませんが、とは言えこれを使える人と使ったことの無い人では、例えばマーケティング調査のタスクを処理するスピードに大きな差がつくでしょう。とにかく手を動かして試してみることの重要性を強く感じました。

また、扱える言語の違いによる差も再実感しました。例えばGPTに対して、日本語で『最も人気のある車種は?』と質問すると、トヨタなら"カローラ"、ポルシェなら"911"という答えが返って来ます。ところが英語で『What is the most popular car?』と質問すると、トヨタは"Camry"、ポルシェは"Cayenne"という答えが返って来るのです。メーカー別に売上高や販売台数を質問した時も、日本語と英語では回答に差がありました。
単純に日本と外国の違いが表れているだけならば良いのですが、学習に使われた大量データの多くが英語テキストだったはずなので、恐らく日本語で質問するよりも、英語で質問した方が正確な回答が得られるであろうことは容易に想像がつきます。自動翻訳や0-shot Learningなど言語の壁を超える自然言語処理技術の開発が進んでいることは理解していますが、それでもなお、巨大な言語モデルが世界共通で利用されるという姿を目の当たりにすると、やはり世界共通言語としての英語を読める/聴ける/書けるスキルは重要だなと再実感しました。(自戒を込めて)

=IF(ISBLANK(D2),,GPT("Answer in sipmle one word. What is the most popular car of "&D2&" in 2020?:",0.1,3))
=IF(ISBLANK(D2),,GPT("1単語で簡潔に回答して。"&D2&"の中で最も人気のある車種は何?",0.1,3))

注意点

OpenAIのアカウント登録の際に、3ヶ月間$18の無償クレジットが付与されるそうです。上記のGPT-3 APIはこの範囲内で無料で利用できます。最も高額なDavinciモデルでも1,000トークンあたり$0.0200(約2.6円)ですので、検証の範囲内であれば充分に試せると思います。

Start for free
Start experimenting with $18 in free credit that can be used during your first 3 months.

https://openai.com/api/pricing/

ただし、無償トライアル期間の3ヶ月を過ぎてしまった場合や、トライアル期間中であってもAPIコール量が上限を超えてしまった場合、以後は有償での利用という形になるので御注意ください。
とは言え、アカウント作成時にはクレジットカードの入力などは求められないため、『気が付かないうちに利用料を請求されていた』というような事態にはならないので、その点は良心的ですね☆
(メールアドレスと携帯番号が複数あれば、OpenAIのアカウントを新規で作成し直せば良いような気もします。。規約的にNGなのかな?!)

あと、無償だとCall数の制限が厳しいのか、サーバーが混んでいるのか、スクリプトや関数が正しく記述されてもErrorが一定頻度で発生してしまうようです。再読み込みや、時間を空ければ正常に答えが返ってくるので、気長に待ちましょう。。

参考にしたWebページ

Thanx to the following web pages!!

この記事が気に入ったらサポートをしてみませんか?