見出し画像

ChatGPT勉強日記 #1. APIの公式ドキュメントを読む

僕がChatGPTを使い始めたのは今年の頭くらいだったが、そのころはChatGPTよりも同じOpen AIのモデルをつかっているGithHub Copilotのほうをよく使っていた。
ちょうど新しいプログラミング言語を勉強し始めたところだったので、GitHub Copilotはすごく役に立った。
一番役立ったのは、当時見ていた動画のチュートリアルの進み方がめちゃくちゃ早く、動画のスピードについていきながら不慣れな言語でサンプルコードを書くのにこのGitHub Copilotは最高のツールだった。

先生の話を聞く -> サンプルコードの入力動画をみる -> 一旦ビデオを止めて手元のエディターに同じプログラムを書く -> 動画を再度再生する
というのが今までの手順だったが、GitHub Copilotのおかげで、

先生の話を聞きながらサンプルコードを手元で書いて動かす
ということがビデオを止めなくてもできるようになった。

またサンプルコード程度のお題であればGitHub Copilotの推薦してくるコードが間違っていることはほぼないため、書いたコードも何の問題もなく動いてくれた。

もちろん、ビデオを止めて自分で考えながらコードを下記、コンパイルエラーや実行時のエラーを自分で直したほうが血となり肉となることは間違いない。
ただ今回は購入したビデオチュートリアルが膨大だったため、挫折せずできるだけ早く最後までチュートリアルを完遂することができたほうが自分にとってはメリットだった。GitHub Copilotがなかったら途中でチュートリアルをやめていたかもしれない。

その後は、ベトナムで法人を作ることになり、膨大なベトナム語の書類を理解する必要があり、これでChat GPTをかなり高頻度で使うようになった。

短い文章であればGoogle翻訳よりもChat GPTのほうが僕的にはわかりやすい翻訳を返してくれた。またChat GPTは翻訳の内容で更に疑問があった場合、その前の会話のコンテクストを維持したまま追加の質問ができるので、これが難解な法律文章の理解に役に立った。
半分はベトナム語->英語の翻訳マシーンとして、半分は英訳された文章の法律的な解釈の相談相手としてChatGPTと対話しまくっていたのである。
またベトナム語の略語表記についても元々の意味が何なのかや、こちらが記入しないと行けない箇所に略語表記が使えるのか、などベトナムの一般的な文章作成の知識まで教えてくれるので、驚いた。
たとえばベトナムでは会社が作る就労規則などの公式文章には通し番号をつけないと行けない。DBでいうところのプライマリーキーのようなものをつけるのだが、ドキュメントの種類ごとどういうプラマリーキーが妥当なのかというアドバイスまで受けることができた。

このようにChat GPT、あるいはOpen AIの大規模言語モデルを自分の直近のニーズに合わせては使ってきたのだが、
ChatGPTを使ってどういうものが作れるかという部分に今まで忙しくて時間が割けなかった。

ようやく身の周りの慌ただしさが落ち着いてきたころ、一度ChatGPTの勉強を改めてしてみようと思ったのである。

このブログシリーズは”勉強日記”なので、チュートリアルではありません。
僕のChatGPTの勉強の実況中継のような内容のため、内容の正確性や包括性は低いことをご了解いただき、この先に進んで頂ければと思います。

さぁ、ChatGPTの勉強を始めよう!


今年の頭から今までTwitter上でいろいろなChatGPTのハックノウハウのツイートを見るたびに面白そうなものをブックマークしてしてきた。50個くらい溜まっているこれらのブックマークをまず見返して見ようと思った。

見返し初めて1時間後。。。

う~ん、いろいろと目を引く使い方、プラグイン、各種ツールとのインテグレーション、それらを使って作られたすごいものがでてくるものの、どうも掴みづらいというか核心的な知識というものが入ってこない。。

モデルのトレーニングができる、
自前のFunction callができる、

というところに自分の興味があることがわかったがこれはどうやってやるのだろうか。
また自分が昔Google Assitant(Google Home)の音声アプリの開発をやっていた時につかっていたDialog Flowは、予め決められた会話シナリオにユーザーを引き込んである種マニュアル的な回答をする、というパターンをよく作った。いわゆる人工知能のようで実はただのif/elseのロジックに引き込んで行き、必要な情報を提示したり、必要なアプリやWebに誘導したりするのだが、こういういわゆる無能ロジックを組み込むことはできるのか?
というところにも自分の興味があった。

こういうことはツイートを見ているだけではわからない。
またChatGPTがバズワードになったこともありGoogle検索してもどれがいい情報なのか分かりづらいほど既に情報が溢れてしまっていた。

そこで、やはりOpen AIの公式ドキュメントを読んだほうが遠回りのようで近道であろうと思い、公式ドキュメントを探してみた。

↓がOpen AI API開発者向けの公式サイトである。

このサイトの
Quickstart tutorial(https://platform.openai.com/docs/quickstart)を開いて読み始めて5分、、
おぉ、そうそうこういう基本的なことが知りたかったんですよ!という感動。。

まずはプロンプトの使い方の正しい使い方、効果的な使い方からこの公式ドキュメントは始まっていた。
ここからは自分の目に留まったチャプター、をピックアップして実況中継していきます。

より具体的に書く

Tactic: Include details in your query to get more relevant answers

例えば、

フィボナ値数列を計算するコードをかいてください。

と書いた場合と

TypeScriptでフィボナッチ数列を計算する関数を書いてください。

では、自分が望むものを得られる確率は変わってくる。
ふむふむ、なるほど。いつもそんなに意識していないし、わりとできていると思いこんでいたが、言われてみれば意識することで対話の質はあがりそうだ。


ペルソナを定義する

Tactic: Ask the model to adopt a persona

例えば、メール文などのライティングを頼む時に、文体や自分の地位(社長、顧客、納入業者など)を先にインプットしておいてズレのないメール文が得られるというものだった。

例えばこんな感じ↓

(以下一瞬、デスマス調になります)

ここからは、Open AI APIのプレイグラウンドといわれる、APIの挙動を試す、遊ぶ、戯れる↓のコンソールを使って解説していきます

https://platform.openai.com/playground
プレイグラウンドでは、Open AI APIの仕様と同じ用に予め
SYSTEMという欄にChatGPTに予め伝えておきたい(設定しておきたい)想定を入力し、

USERという欄にChatGPTへの質問、命令を記述して

Submitボタンを押すと

ASSITANTという欄にChatGPTからの答えが返ってきます。
このチャプターの例ではSYSTEMにペルソナを設定し、それから質問をすることで、ペルソナに設定したキャラクターにChatGPTが擬似的に演技して答えてくれるというデモになっています。
Open AI APIではなく、通常のChatGPTのプロンプトでも最初にSYSTEMで設定したようなことを頼んだ後に、質問・命令をすればほぼ同じ効果が得られます。

(これを執筆している最中、Custom InstructionというのがChatGPTにも登場したので、これを使っても同じことが得られるます。
Open AI API内部でCustom InstructionとSYSTEMの違いはあるのかは後日別の機会に調べてみます。)


参照してほしい文を"""(3つのダブルコーテーション)で括る

Tactic: Use delimiters to clearly indicate distinct parts of the input

"""で囲まなくてうまくいく場合がほとんどだが、これを入れるとChatGPTが混乱をする可能性が低くなるようだ。

このようなメッセージが添えられていた
Don’t make GPTs work to understand exactly what you are asking of them.
(ChatGPTにあなたが何を質問したいのかを考えさせないように)

確かに何でも聞いてくれるから自分もついつい質問や命令が雑になりがちだったが、ChatGPTだって人間だもの、、、いや、人工知能だけど、、
自分の質問の意図を相手に推測させなければいけないような質問を人間社会だってChatGPTとだってしちゃいけないよね、と肝に命じたのであった。


これはもはやコーディング..

Tactic: Specify the steps required to complete a task

Assitantメッセージを恣意的にこっちで用意したものにかえることで、答えの振る舞いを変えることができるようだ

これは""" ”””で挟まれたString文字列を引数にとり、Step 1を実行した後にStep 2を実行して結果を返すプログラムを書いているようなものである。

ちなみに同じような記述を日本語でChat GPTに命令してみたがうまくいかなかった。↓

「"""で囲んだ」や、「ステップにしたがって」などが、英語で書いたときほど明確な意味を持ちづらいからだと思う。日本語を工夫すればできそうだが、Chat GPTの解釈ミスを極力減らすためには英語で命令文を書いたほうが良いなと思った。

カテゴリーへの仕分け

Tactic: Use intent classification to identify the most relevant instructions for a user query

最初に質問をどのようにカテゴリー分けしたら良いかChat GPTに教えておいて質問内容の仕分けができる。
仕分け内容をメインカテゴリーとサブカテゴリーにわけて最初にChat GPTに説明しておけば下の例のように2段階の仕分けができてしまう。


最初に書いたように、Chat GPTの勉強を始める前はGoogle AssitantのDialog Flowのようにユーザーのインプットをパターン分けして、あとはお決まりの処理に引き込んでいく人工知能から人工無能へ的な処理をどのように組み込めるのかということに興味があったが、ここに解答があった。

日本語と英語、両方のパターンで試してみたが、英語のほうが誤作動の確率は少なくなると感じた。上の例の場合は結果のJSONを別のプログラムで読み取って使うと思うので英語で記述した方がこれも良い場合がほとんどだろう。


このように人工知能に成約を与えて自分の所望の解答を引き出す方法のもっと単純な方法として、例を与えると言うことも公式ドキュメントに少し触れられていた。
「例えば、以下のような方法で質問に答えてください」のような記述をして例文を一定数並べることで解答のフォーマットや内容に成約を与えることができるのだ。

その他

その他僕が気になった気になった機能として、Open AI APIのリクエストに入れることができるstream=trueというフラグがある。
最初このフラグを見た時は、ん?、ChatGPTにStreamで大量のデータをフィードできる機能なのか!?と思って調べてみたら、勘違い。。
↓のサイトが参考になった。
https://dev.classmethod.jp/articles/shuntaka-open-ai-api-sse/

ユーザーインターフェース部分を作ることが多い僕にとっては今後お世話になる機能なのは間違いないのでここに紹介しておきたい。

だいぶ長くなってしまったので、一旦ここで区切りにして、次回はよりOpen AI APIをシステムに組み込んで使う際に重要となる機能について説明している部分を深く読んでいきたい。

つづく。

このブログに関する質問やWeb・Android・iOSアプリの開発の相談はこちらからお願いします。↓↓↓

@mizutory
mizutori@goldrushcomputing.com


次回は↓↓↓


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