この記事のテーマ
一ヶ月前に書いた前回の記事ではプロンプティングについて調べました。その延長として極端にプロンプティングを極めるとどうなるか、という例もいくつか収集したのにアップするのを忘れていました。その他、ChatGPTに関わるハイレベルな内容もまとめます。
一ヶ月の間に色々と状況が変わった部分もあるので、適宜補足も加えます。
プロンプティングスキルを極めた例
無数のペルソナを生み出して、ペルソナ同士で考えさせる
まじやばい!やった人はスクショ希望!
— ハヤシ シュンスケ@AI for U株式会社 (@openagi_lab) March 23, 2023
目標:献立を考える
専門家の数: 100…
ShunsukeさんはLLM(大規模言語モデル, ChatGPTやBardを支えるAI技術)の専門家ではないそうですが、経験的な観点から素晴らしい洞察をChatGPTに与えておられます。
NewsPicksで落合陽一さんがChatGPTについて語ってらっしゃいましたが、Twitter上で落合さんがShunsukeさんのことべた褒めしてましたね。Shunsukeさんや落合さんらが[変数]などと特定の概念を抽象化するようなプロンプトデザインのやりかたをX-promptと呼ぶそうです。
Shunsukeさんのめちゃめちゃ長いプロンプトを実行すると、次のようなものができます。
クリックでプロンプト全文をみる
目標:献立を考える
専門家の数: 100 専門家の数に対して専門家のペルソナを設定して専門家を具体的に表現してから専門家を使用してください専門家の表現の仕方は何の専門家であるかを明確に書いてください勝つ名前バックグラウンド覆面全て検討して考えて書いてください
プロンプト1:
抽象オブジェクト:[抽象オブジェクトを記述]
サブオブジェクト:[サブオブジェクト1]、[サブオブジェクト2]、[サブオブジェクト3]…
知識:[知識1]、[知識2]、[知識3]…
能力:[能力1]、[能力2]、[能力3]…
管理オブジェクト:[管理オブジェクト1]、[管理オブジェクト2]、[管理オブジェクト3]…
プロンプト2:
[手順1] [手順2] [手順3] … N. [手順N] 専門家プロンプト:
[専門家1のプロンプト1] [専門家1のプロンプト2] … N. [専門家1のプロンプトN] [各専門家に対して上記のプロンプトを提供し、回答を収集します。]
プロンプトの評価:
評価基準アウトカム1のスコアアウトカム2のスコア専門家プロンプトのスコア 明確さ[スコア1][スコア2][専門家プロンプト1のスコア] 実行可能性[スコア1][スコア2][専門家プロンプト2のスコア] 網羅性[スコア1][スコア2][専門家プロンプト3のスコア] 柔軟性[スコア1][スコア2][専門家プロンプト4のスコア] 目標達成の確率[スコア1][スコア2][専門家プロンプト5のスコア] 合計スコア[合計スコア1][合計スコア2][合計専門家プロンプトスコア] 最終アウトカムの選択とプロセス:
最終的なプロセスは、プロンプト1とプロンプト2のスコアの合計が最も高いものを選択します。また、専門家プロンプトのスコアも考慮に入れ、最終的な決定を下します。ただし、専門家プロンプトのスコアは、プロンプト1とプロンプト2のスコアよりも重要度が低いことに注意してください。
具体的には、以下の手順を実行します:
プロンプト1とプロンプト2を使用して、複数の回答を収集します。 各回答のスコアを評価基準に基づいて計算します。 各回答の合計スコアを計算します。 最も高い合計スコアを持つ回答を選択します。 専門家プロンプトのスコアを考慮に入れ、最終的な決定を下します。 このプロセスを踏まえて、目標を達成するために必要なアクションプランを策定することができます。また、このプロセスは、複数の専門家の知識や能力を結集し、より正確な結論を導き出すことができます。
クリックで全文をみる
目標:献立を考える
抽象オブジェクト:献立
サブオブジェクト:前菜、主菜、デザート
知識:栄養バランス、旬の食材、調理方法
能力:料理の組み合わせ、味のバランス、食材選び
管理オブジェクト:栄養価、食材コスト、調理時間
以下は、5名の専門家のペルソナ例です。
専門家1:山田太郎
背景:フレンチ料理のシェフ 知識:フランス料理、旬の食材、ワイン 能力:フレンチ料理の組み合わせ、味のバランス、食材選び 専門家2:佐藤花子
背景:管理栄養士 知識:栄養学、食材の栄養価、食事バランス 能力:栄養バランスの良い献立作り、食材選び 専門家3:鈴木一郎
背景:イタリア料理のシェフ 知識:イタリア料理、パスタ、チーズ 能力:イタリア料理の組み合わせ、味のバランス、食材選び 専門家4:田中美咲
背景:和食料理人 知識:和食、旬の食材、日本の食文化 能力:和食の組み合わせ、味のバランス、食材選び 専門家5:高橋健太
背景:料理研究家 知識:家庭料理、レシピ開発、食材の保存方法 能力:簡単で美味しい料理の提案、レシピ開発 手順1:各専門家に献立案を提案してもらう 手順2:提案された献立を栄養バランス、食材コスト、調理時間の観点から評価する 手順3:評価結果を基に最適な献立を選ぶ
専門家プロンプト:
専門家1のプロンプト1:フレンチ料理をベースにした献立案を提案してください。 専門家1のプロンプト2:旬の食材を活かしたフレンチ料理の組み合わせを教えてください。
専門家2のプロンプト1:栄養バランスが良い献立案を提案してください。 専門家2のプロンプト2:食材選びのポイントを説明してください。
専門家3のプロンプト1:イタリア料理をベースにした献立案を提案してください。 専門家3のプロンプト2:パスタとチーズを活かした料理の組み合わせを教えてください。
専門家4のプロンプト1:和食をベースにした献立案を提案してください。 専門家4のプロンプト2:旬の食材を活かした和食の組み合わせを教えてください。
専門家5のプロンプト1:家庭料理をベースにした献立案を提案してください。 専門家5のプロンプト2:手軽で美味しい料理の提案を教えてください。
各専門家からの回答を収集した後、評価基準に従ってスコアを付け、最適な献立を選択します。最終的な決定は、専門家プロンプトのスコアも考慮に入れますが、プロンプト1とプロンプト2のスコアが優先されます。
各専門家からの献立案を収集する 評価基準(明確さ、実行可能性、網羅性、柔軟性、目標達成の確率)に基づいて、各献立案にスコアを付ける 各献立案の合計スコアを計算する 最も高い合計スコアを持つ献立案を選択する 専門家プロンプトのスコアを考慮に入れ、最終的な決定を下す このプロセスを踏まえて、目標である献立を考えるためのアクションプランを策定することができます。また、このプロセスは、複数の専門家の知識や能力を結集し、より正確な結論を導き出すことができます。
まだ返答は完成していません。今行われたのは「ゴールを達成するプロセスを理解させ、第一段階として架空の料理人を生み出しただけ」です。
次に、そのプロセスに従って献立を考えてください。(=ゴールを達成せよ)と命じてみます。
クリックで全文をみる
専門家1(フレンチ料理): 前菜:季節の野菜のサラダ、ビネグレットソース 主菜:骨付き鶏もも肉のコンフィ、ロースト野菜添え デザート:アップルタルト、バニラアイスクリーム
専門家2(管理栄養士): 前菜:ミックスビーンズサラダ、ヨーグルトドレッシング 主菜:焼き魚、玄米ご飯、ほうれん草のごま和え デザート:カットフルーツ
専門家3(イタリア料理): 前菜:カプレーゼサラダ 主菜:ペンネアラビアータ、ガーリックパン デザート:ティラミス
専門家4(和食料理人): 前菜:季節のお浸し、刺身盛り合わせ 主菜:煮魚、ごはん、味噌汁 デザート:抹茶アイスクリーム
専門家5(料理研究家): 前菜:コールスローサラダ 主菜:チキンカレー、ご飯 デザート:プリン
評価基準に基づいてスコアをつけた結果は以下の通りです。
専門家1(フレンチ料理): 明確さ:5 実行可能性:3 網羅性:4 柔軟性:3 目標達成の確率:4 合計スコア:19
専門家2(管理栄養士): 明確さ:4 実行可能性:5 網羅性:5 柔軟性:4 目標達成の確率:5 合計スコア:23
専門家3(イタリア料理): 明確さ:4 実行可能性:4 網羅性:3 柔軟性:3 目標達成の確率:4 合計スコア:18
専門家4(和食料理人): 明確さ:4 実行可能性:4 網羅性:4 柔軟性:4 目標達成の確率:4 合計スコア:20
専門家5(料理研究家): 明確さ:5 実行可能性:5 網羅性:3 柔軟性:柔軟性:3 目標達成の確率:4 合計スコア:20
評価基準に基づくと、専門家2(管理栄養士)の献立案が最も高い合計スコア(23)を持っています。したがって、この献立案が最も適切な選択となります。
最終的な献立:
前菜:ミックスビーンズサラダ、ヨーグルトドレッシング 主菜:焼き魚、玄米ご飯、ほうれん草のごま和え デザート:カットフルーツ
このプロセスにより、目標である献立を考えるためのアクションプランが策定されました。各専門家の知識や能力を結集し、より正確な結論を導き出すことができました。
このプロンプトの何がすごいかというと、「今日の献立を考えて」といった抽象的なゴールを達成するために何を考慮すべきなのかを我々が知らなくても、思考のプロセスを与えるだけでChatGPTが考えてくれるという点です。
Shunsukeさんはこれ以外にもゴールシークプロンプトというものを開発されています。ゴールシークプロンプトでは、ゴールを抽象的なものであると定義し、ゴールを達成するために必要なプロセスも曖昧なものであると定義します。その上で、ゴールを達成するために必要なプロセスを一からChatGPTに考えさせることで、step-by-stepで理論を組み立て、最終的にゴールを達成します。
例えば、ただ「ブログを書いて」とか「本を書いて」という命令は明らかにいい加減なプロンプティングですが、このゴールシークプロンプトを使うと、ChatGPTはプロセスごと何かを創作し提案してくれます。実際にこうして生成されたブログや本が有益かどうかはさておき、ゴールシークプロンプトは自分が対処できない課題に対してどういうアプローチを取るべきなのかを教わるにはこの上なく良いアプローチになるだろうと思っています。
そんなにこのメソッドが凄いならサービス化すればいいじゃないか、と思っていましたが、数週間前にサービス化されています。GoalGPT: https://beta.nando.ai/goalgpt.php
あなたはプロの**です
これは有名な方法ですが、「あなたはプロの何々です」と言ってから本題の命令を与えると格段に精度が上がることがあります。
たとえば、私はPythonコードをChatGPTに教えて貰うことがあるのですが、普通は以下のようにプロンプトを投げるでしょう。
pythonで以下を実装してください。
- 一秒ごとに数字をカウントアップ
- カウントアップする数字はFuzzBizz問題を適用
- GUIで数字とFuzzBizzを美しいUIで表示
結果は以下です。
クリックして結果をみる
Pythonでは、Tkinterを使ってGUIを作成し、FuzzBizz問題の実装と一秒ごとのカウントアップを行うことができます。以下はその実装例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36python Copy code import tkinter as tk import time def fuzz_bizz(n): if n % 3 == 0 and n % 5 == 0: return "FuzzBizz" elif n % 3 == 0: return "Fuzz" elif n % 5 == 0: return "Bizz" else: return str(n) def update_counter(): global counter counter += 1 label_counter.config(text=f"カウントアップ: {counter}") label_fuzz_bizz.config(text=f"FuzzBizz: {fuzz_bizz(counter)}") root.after(1000, update_counter) counter = 0 root = tk.Tk() root.title("FuzzBizz カウンター") label_counter = tk.Label(root, text=f"カウントアップ: {counter}", font=("Helvetica", 16)) label_counter.pack(pady=10) label_fuzz_bizz = tk.Label(root, text=f"FuzzBizz: {fuzz_bizz(counter)}", font=("Helvetica", 16)) label_fuzz_bizz.pack(pady=10) update_counter() root.mainloop()このコードをPythonファイルに保存して実行すると、一秒ごとにカウントアップし、FuzzBizz問題を適用した結果が表示されるGUIが表示されます。カウントアップはupdate_counter関数で行い、一秒ごとにこの関数が実行されるように設定しています。FuzzBizz問題はfuzz_bizz関数で実装しています。
まあまあ、最低限うまく実装したなという感じがします。さすがと言うべきか、コードを一切編集せずに実行可能です。
では次に、ロールを与えてから同じ問題を与えてみましょう。 ポイントは、説明の仕方やコードの質についての指示
あなたはSenior Python programmerで、WebデザインやUI/UXにも精通しています。あなたの仕事は与えられた命題をPythonや他の言語も利用しながら効率よくスマートに実装することであり、あなたの作成するcodeにはメンテナンスのしやすさや維持のしやすさが重視されている必要があります。そのため、ラインコメントを適宜使用し、後任の人物にもわかりやすいようなコード作成をする必要があります。
以下をpythonで実装し、それを若手の新入社員に説明してください。
- 一秒ごとに数字をカウントアップ
- カウントアップする数字はFuzzBizz問題を適用
- GUIで数字とFuzzBizzを美しいUIで表示
クリックして開く
まず、PythonでFuzzBizz問題を解決し、一秒ごとに数字をカウントアップするプログラムを作成します。次に、Tkinterを使用してGUIを作成し、カウントアップとFuzzBizzの結果を美しいUIで表示します。以下にコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53import time from tkinter import * from tkinter import ttk def fizz_buzz(number): """FuzzBizz問題を解決する関数です。 引数: number (int): FuzzBizz問題に適用する整数 戻り値: str: FuzzBizz問題の結果 """ if number % 15 == 0: return "FizzBuzz" elif number % 3 == 0: return "Fizz" elif number % 5 == 0: return "Buzz" else: return str(number) def update_count(): """カウントアップする数字とFuzzBizzの結果を更新し、ラベルに表示します。""" global count count += 1 count_label.config(text=str(count)) fizz_buzz_result = fizz_buzz(count) fizz_buzz_label.config(text=fizz_buzz_result) root.after(1000, update_count) count = 0 # GUIの作成 root = Tk() root.title("FizzBuzzカウンター") frame = ttk.Frame(root, padding="30 15") frame.grid(row=0, column=0, sticky=(W, E, N, S)) count_label = ttk.Label(frame, text=str(count), font=("Helvetica", 24)) count_label.grid(row=0, column=0, pady=10) fizz_buzz_label = ttk.Label(frame, text="", font=("Helvetica", 24)) fizz_buzz_label.grid(row=1, column=0, pady=10) # カウントアップとFuzzBizzの結果を更新 root.after(1000, update_count) root.mainloop()このコードを新入社員に説明します。
- まず、
fizz_buzz関数はFuzzBizz問題を解決するために作成されました。引数として整数を受け取り、FizzBuzzのルールに従って結果を返します。update_count関数は、カウントアップの数字を更新し、FuzzBizzの結果を計算してGUI上に表示するために使用されます。- Tkinterを使用して、メインウィンドウとラベルを作成しています。
frameはレイアウトを整えるために使用されています。root.after(1000, update_count)を使って、1秒ごとにupdate_count関数が実行されるようにしています。これにより、カウントアップが実現されます。- 最後に
root.mainloop()でGUIが表示され、プログラムが実行されます。このコードを実行すると、数字が1秒ごとにカウントアップされ、FuzzBBuzzの結果が>GUI上に表示されます。このプログラムは、簡潔かつ効率的にFizzBuzz問題とカウントアップの結果を扱っています。また、コメントを適宜使用してコードの可読性を向上させています。これにより、後任の人物がコードを理解しやすくなります。
新入社員に以下の点を強調して説明します。>
関数の役割とパラメータ: fizz_buzzとupdate_count関数は、それぞれ何をするために>存在し、どのような引数を受け取るのかを理解することが重要です。また、各関数がどのような値を返すかも説明しておきます。
グローバル変数の使用: このプログラムでは、countをグローバル変数として使用しています。countはカウントアップの数字を保持し、関数内で更新されます。グローバル変数は適切に使用することで、プログラムの状態を管理しやすくなりますが、過度な使用は避けるべきです。
Tkinterの基本: Tkinterは、Pythonの標準ライブラリでGUIアプリケーションを作成するためのものです。ウィジェット(ラベルやボタンなど)の作成と配置、イベントの管理など、Tkinterを使用する際の基本的な概念を説明します。
イベント駆動プログラミング: root.after(1000, update_count)は、イベント駆動プロ>グラミングの一例です。このコードにより、1000ミリ秒(1秒)ごとにupdate_count関数が呼び出されます。イベント駆動プログラミングは、特定のイベント(時間経過、ボタンクリックなど)が発生したときに関数を実行する方法で、GUIアプリケーションにおいて一般的に使用されます。
以上の説明を行い、新入社員がコードの構造と仕組みを理解できるようにサポートします。また、質問があれば適宜対応し、理解を深めることができるように助けます。
今回は劇的にコードの質が上がったわけではないですが、思った通りにdocstringsなどを書き加えてくれました。何度か試すと分かるのですが、ChatGPTは必ずしも思ったとおりの実装をしてくれるわけではありません。これがロール付与で解決するケースが多い気がするという感じ。
ちなみに、Awesome ChatGPT PromptsではLinuxターミナルやJapanese Kanji quiz machineなどの変なロールを与える例についても紹介されています。
ChatGPTで気をつけたい話題
嘘つき
有名な話ですが、ChatGPTは事実では無いことやChatGPTが知らない事に関して、知ったかぶりをします。この現象はhallucinationと言われています。ChatGPT3.5ではそれが露骨だったのですが、GPT4ではかなりの部分で改善しているそうです。
ChatGPTには極めて深刻な問題、Hallucinationを抱えています。Hallucinationは噛み砕いていうと、しれっと嘘をつく現象です。ユーザーがこの嘘を嘘と見抜けない領域にChatGPTを適用するのは誤った理解を促す可能性があります。これはインターネット黎明期に似ています。https://t.co/3hQmbyVpRw
— あるふ (@alfredplpl) March 26, 2023
また、現在クローズドベータテスト中の機能でWebGPTという検索機能を含むChatGPTもあるそうです。GPT4を搭載しかつ検索にもチューニングされたモデルとしてはBing検索も質が高いですね。検索情報を引用しつつ回答を作成してくれるAIなら多少信用度が増します。
以前からあるものとしてはperplexity.aiも非常に良いです。
これらのように検索エンジンを使い、出典を明記してくれるなら信用度は格段に上がります。
とは言えネットの情報がデマである可能性を忘れてはなりません。いくら出典が添付されていても真実は自分で読んで確かめるのが一番です。
勢力争い
GoogleのBardだけではなく、様々なAIが登場してきています。とりわけChatGPTを開発しているOpenAIはマイクロソフトの資金提供を受けていますから、マイクロソフト社の製品に次々とChatGPTが組み込まれています。BaiduやGoogleなどの他の営利企業は、この情況を良く思っておらず非常に焦っている姿が伺えます。
OpenAIの共同創業者でもあったイーロンマスクは、最早OpenAIが非営利企業ではなく、営利企業のマイクロソフトのための犬になってしまっていると批判しています。
OpenAI was created as an open source (which is why I named it “Open” AI), non-profit company to serve as a counterweight to Google, but now it has become a closed source, maximum-profit company effectively controlled by Microsoft.
— Elon Musk (@elonmusk) February 17, 2023
Not what I intended at all.
結局BaiduもLLMモデルを発表しました。しかし内部の噂によると、完成したモデルは中国の諺をあまり知らないのだとか。情報統制下の国ではたとえ自国の言語でも良いクオリティのモデルは作れないのかもしれません。### 倫理的問題 ChatGPTはあまりに凄すぎたのか、倫理的な問題から法整備等の準備をすべきだという声が上がっています。イーロンマスクやAI研究者達が[今日から6ヶ月間AI研究を完全停止して、AIの使い方について議論すべきだという署名を開始したりもしています](https://time.com/6266679/musk-ai-open-letter/)。(私はこの運動には懐疑的です)結局イーロンはTruthGPTなるものを開発すると発表しました。この署名は本当にくだらないもので、ChatGPTに先を越された人たちの負け惜しみでしかなかったようです。また、解決されつつありますが、InjectionやJail breakといった手法でChatGPTがハックされてしまう可能性があります。GPT4でアプリ開発をしている人たちは要注意です。 あと、DeeplやChatGPTは入力した内容を学習に使用します。個人情報などは絶対に入力してはいけません。・・・といっても入力する人が絶対いるので、これもリスクでしょうね。APIなら収集していないようです。 また、古典的なステレオタイプに基づいてものを言う癖がある点も海外では問題視されています。試しにBingなどで日本人の画像を生成してみてください。とんでもないアジア人への偏見だなって思うような、細くつり上がった目・飛び出た頬骨・ふっくらした輪郭と体型になります。 他にも倫理的問題を挙げればキリが無いと思いますが、**「AIがヒトを支配する」とかいった、いつ起こるか予想できないほど遠い未来の話と、Hallucinationのような現実的な話は切り離して考える必要があります。**この辺をごっちゃにして考えてしまっている人をSNSでよく見かけます。 ## 最後に 一ヶ月前に書いた文章をかき集めたので無いようがとっちらかってしまいました。 最近、色々な方からChatGPTに関して質問をされますが、あ~まだChatGPTへの誤解は大きいな~と思うことが多いので、いずれ包括的な解説記事も書こうと思っています。 ではまた!