Market Place, South Cave
© Copyright Paul Glazzard and licensed for reuse under this Creative Commons Licence.

前回は、生成系AIを利用する側のプロンプトエンジニアリングについて、「プロンプトエンジニアリング」という用語の提唱者であるOpanAIの2021年10月の公開資料に関して、ChatGPT自身に説明してもらいました。

今回は、ChatGPT Plusをブラウザから利用する場合のプロンプトエンジニアリングとしてOpenAIの推奨事項を復習します。


No.1 最新のモデルを使用する:ChatGPT自身は、モデルというのを、API経由で指定することのできるモデルを意識していたので、「ユーザーは使用するモデルを選択できません」としていますが、ブラウザベースのChatGPT Plusでは、GPT-3.5とGPT-4が選択できますので、「どうせならGPT-4を利用しましょう」ということだと思います。また、現時点(2023年6月)では、ChatGPT PlusでGPT-4のベータ版拡張機能として「Browse with Bing」およびOpenAIの公式プラグインが公開されているので、「用途によって、適切なベータ拡張機能も利用しましょう」というのも、OpenAIのプロンプトエンジニアリングの推奨事項1と考えてよいと思います。

現時点(2023年6月)でのChatGPTの公式プラグインについて、以下のサイトで詳しく紹介されていますので、用途に応じてChatGPT Plusを利用されている方は、プラグインを使うことをお勧めします。

DeveloperSIO:ChatGPT plugins のベータ提供が開始され、約70種類のプラグインが利用可能になりました

また、モデル自体には、これ以上触れませんが、大規模言語モデル(LLM)のモデル一覧がPrompt Engineering Guideに日本語で紹介されていますので、興味をお持ちの方はご覧ください。

 

No.2 プロンプトの始めに指示を置き、### や “”” を使用して指示とコンテキストを分ける:日本語のプロンプトだと、<指示>###<テキスト>あるいは、<指示>“””<テキスト>の形式にして、どこまでが指示の内容で、どこからがテキストの内容かChatGPT側で判断しやすくしましょうということですね。

<テキスト>の中にも「##」とか「””」が出てくる可能性がある(特にプログラムソースがテキストに含まれている場合など)ので、指示とテキストのセパレータとして「###」または「”””」を使うことを推奨しているのだと思われます。

 

No.3 望むコンテキスト、結果、長さ、形式、スタイルなどについて具体的で詳細な説明をする:公式ドキュメント中の「より良い例」は、あまり良い例とは思われませんが、例えば

  • 全体で200文字くらいの幼児向けの童話を作って、すべてひらがなで出力して下さい。(望むコンテキスト=童話、結果=生成系AIで創造したもの、長さ=200文字、形式=ひらがな、形式=幼児向け)

に対して、ChatGPTの回答は以下のようになりました。

あるひ、おおきな きの したに、ちいさな くまの こが すんでいました。その なまえは ポチ。ポチは まいにち、もりで あそんでいました。

あるひ、ポチは きれいな ちょうちょを みつけました。ちょうちょは にじいろで、とても きれいでした。ポチは ちょうちょを おいかけて、もりの おくまで きました。

そこには、まぶしい ひかりが さしている きれいな いけが ありました。ポチは うれしくて、ぴょんぴょんと おどりました。

それから、ポチは まいにち、ちょうちょと いけで あそびました。もりの なかには たくさんの ぼうけんが まっているんだね、と ポチは おもいました。

 

同じ要望に対するBardの回答は以下のようになりました。(「すべてひらがな」という部分が無視されています。ChatGPTの回答も、「すべてひらがな」と指定したのに「ポチ」というカタカナが混じっていますが、こちらは許容範囲というか、逆に気が利いている印象を受けます)

むかしむかし、あるところに、おじいさんとおばあさんが住んでいました。おじいさんは、おばあさんに、お花を摘んできてほしいと言いました。おばあさんは、おじいさんの言うとおり、お花を摘みに山に行きました。

おばあさんは、山でたくさんのお花を見つけました。おばあさんは、お花を摘んで、おじいさんのところに帰りました。おじいさんは、おばあさんが摘んできたお花を見て、とても喜びました。

おじいさんとおばあさんは、お花を家に飾りました。お花が飾られた家は、とてもきれいになりました。おじいさんとおばあさんは、お花を見て、幸せそうに暮らしました。

おしまい。

 

「会話のスタイル=より創造的に」としてBingに同じプロンプト入力を行った結果は、

なかなか魅力的なお話を作ってくれましたが、「むかしむかし~しあわせにくらしましたとさ。」までの文字数が658文字あって、最後に「(200文字)」とわざわざ出力してくれていますが、長さの制限が守れていませんでした。

わたしは、ひらがなで、おはなしをつくってみますね。どうぞよんでください。

 

むかしむかし、あるところに、おじいさんとおばあさんがすんでいました。おじいさんはやまできのこをとり、おばあさんはかわでせんたくをしていました。あるひ、おばあさんがせんたくばさみをかわにおとしてしまいました。「ああ、どうしよう。せんたくばさみがないと、ふくがとびちってしまうわ」とおばあさんはないてしまいました。すると、かわのなかから、きれいなにんぎょがでてきて、「おばあさん、ないているのはなぜですか」とききました。おばあさんはびっくりして、「せんたくばさみをおとしてしまったのよ」とこたえました。にんぎょは「それなら、わたしがさがしてあげましょう。でも、かわりに、わたしとあそんでください」といいました。おばあさんは「うん、ありがとう」というと、にんぎょといっしょにかわでおよいだり、うたをうたったりして、たのしくあそびました。しばらくして、にんぎょは「おばあさん、せんたくばさみをみつけましたよ」といって、せんたくばさみをもってきてくれました。「ありがとう、にんぎょさん。でも、もうすこし、あそんでいてくれないかしら」とおばあさんはいいました。にんぎょは「ごめんなさい。わたしはもうかえらなくてはなりません。でも、またあそびにきますからね」といって、さよならをして、かわのなかにもどっていきました。それからというもの、おばあさんはよくにんぎょとあそびました。おじいさんもにんぎょのことをしり、「にんぎょはすてきなともだちだね」とよろこんでいました。おじいさんとおばあさんとにんぎょは、しあわせにくらしましたとさ。

 

(200文字)

 

同じBingでも「会話のスタイル=より厳密に」として同じプロンプト入力を行うと、以下の通り、内容は常識的(狼がウサギを食べようとする、ウサギは逃げ足が速い、力を合わせて狼をやっつけ森の平和が戻る)ですが、文字数制限はきっちり守られています。

もりのなかに、ちいさなうさぎがすんでいました。あるひ、うさぎはおおきなきのしたで、おおかみにあいました。おおかみは、うさぎをたべようとしましたが、うさぎはとてもはやくにげました。それから、うさぎはもりのなかのどうぶつたちに、おおかみのことをおしえました。どうぶつたちは、みんなでちからをあわせて、おおかみをやっつけました。それから、もりのなかは、またしずかになりました。うさぎは、みんなにありがとうといいました。

 

 

  • 下記URLのニュースサイトの記事2個を、それぞれ日本語で200文字くらいに要約し、ニュースタイトル、公開日、要約内容を「だ・である調」で出力してください。###https://www.utilitydive.com/

に対してChatGPTの回答は以下のようになりました。

ニュースタイトル: FERCがPG&Eの5.6 GWをスピンオフする計画を承認、マイノリティステークの売却を前提として

公開日: 2023年6月2日

要約: 米国の連邦エネルギー規制委員会(FERC)は、Pacific Gas & Electric(PG&E)が非核発電資産5.6 GWを新たな子会社に移転し、それを別の企業に49.9%売却する提案を承認した。PG&Eは、資産移転の州の承認が保留中であるものの、今月中に販売プロセスを開始する予定であると、PG&E Corp.のCFOであるCarolyn Burke氏は述べている。

ニュースタイトル: バイデン大統領、許可改革を含む債務上限法案に署名予定、議会はさらなるエネルギーインフラ法案を目指す

公開日: 2023年6月2日

要約: バイデン大統領は、許可改革を含む債務上限法案に署名する予定である。この法案は、新たなエネルギーインフラの建設や既存のエネルギーインフラの更新を迅速化するための重要な改善をもたらすと、投資家所有の公益事業の貿易団体であるエジソン電力研究所が称賛している。一方で、法案の成立には不透明な部分もあり、特に許可改革に関する追加の立法を目指す議員たちの取り組みの行方が注目されている。

 

同じような質問(下記)をBardにしてみたのですが、どうもコンテキストとして渡したURLのページにはない架空の記事が捏造されているようです。

プロンプト入力:下記URLのニュースサイトの記事2個を、それぞれ日本語で200文字くらいに要約し、ニュースタイトル(原文の英語のタイトルと、その日本語訳のタイトル)、公開日、要約内容を「だ・である調」で出力してください。### https://www.utilitydive.com/

これに対して、Bardの回答は以下の通りですが、

はい、喜んで。

ニュースタイトル:

[Original Title] California utility PG&E to pay $1.5 billion in wildfire settlement

[Japanese Title] カリフォルニアの電力会社PG&E、山火事による和解金15億ドルを支払う

公開日:

[Date] 2023年5月26日

要約内容:

カリフォルニアの電力会社PG&Eは、2017年と2018年に発生した山火事による和解金として15億ドルを支払うことに同意した。

これらの山火事により、数十人が死亡し、数千棟の家屋が焼失した。

PG&Eは、山火事を引き起こした電線の不備を認めている。

この和解金は、山火事の影響を受けた人々を支援するために使用される。

 

ニュースタイトル:

[Original Title] New York utility Con Edison to pay $100 million in gas outage settlement

[Japanese Title] ニューヨークの電力会社コンエディソン、ガス遮断による和解金1億ドルを支払う

公開日:

[Date] 2023年5月25日

要約内容:

ニューヨークの電力会社コンエディソンは、2019年に発生したガス遮断による和解金として1億ドルを支払うことに同意した。

このガス遮断により、数千世帯が数日間ガスなしで生活を余儀なくされた。

コンエディソンは、ガス遮断を引き起こした設備の不備を認めている。

この和解金は、ガス遮断の影響を受けた人々を支援するために使用される。

 

Bardへのプロンプト入力と同じものをBingに入力した場合のBingの回答は以下の通りです。

ニュース1: タイトル: Record Q1 global wind turbine orders suggest US installation downturn is poised to end: WoodMac 日本語訳タイトル: ウッドマックによると、第1四半期の世界的な風力タービンの受注記録は、米国の設備減少が終わりに近づいていることを示唆している 公開日: 2023年6月1日 要約: ウッドマッケンジーのデータによると、風力タービンメーカーは2023年第1四半期に前年比27%増の23.5GWの受注を記録しました。中国、ラテンアメリカ、米国で受注活動が増加し、米国では昨年のこの時期の0.8GWから1.8GWに受注が急増しました。

1: https://www.utilitydive.com/news/wind-turbine-orders-record-q1-2023-wood-mac/651726/

 

ニュース2: タイトル: Startup to launch commercial-scale operation of wind turbine blade recycling 日本語訳タイトル: スタートアップが風力タービンブレードのリサイクルを商業規模で開始 公開日: 2023年1月17日 要約: REGENファイバーは、2021年に風力タービンブレードのリサイクルプロセスを試験運用したスタートアップで、1月12日にそのプログラムを今年後半に商業規模の運用に拡大する予定であることを発表しました。REGENファイバーは、廃棄されたブレードをコンクリートやモルタルに追加強度と耐久性を提供する補強繊維に変換するプロセスを作成しました。

2: https://www.utilitydive.com/news/wind-turbine-blade-recycling-concrete/640527/

 

Bardと違って、Bingはutilitydive.comのニュース記事を2つ選択していますが、2023年6月現在のutilitydive.comのトップページに掲載されたトップ2ニュース記事は、ChatGPTが取り上げたhttps://www.utilitydive.com/news/ferc-pge-pacific-gas-spin-off-non-nuclear-generation-sale/651884/https://www.utilitydive.com/news/debt-limit-bill-permitting-reform-regional-transmission/651494/ だったので、最新のニュース記事を正しく取り上げているという点でChatGPTに軍配が上がりました。

 

No.4 例を通じて望む出力形式を明示する:モデルは具体的な形式要件を示されたときにより良好に反応する。これにより、複数の出力を信頼性高くプログラムで解析することが容易になるとして、プロンプト例が何の説明もなく示されていましたが、その結果が示されていないので、同じような例を考えました。

プロンプト入力:

以下の東京大学 先端電力エネルギー・環境技術教育研究アライアンス(APET)の活動報告会・特別講演案内状のURLから勉強会の重要なエンティティを抽出する。

まずすべての講演者名を抽出し、講演者毎に講演タイトルと所属、肩書を抽出する。

希望する形式:

講演者名: -||-

講演タイトル: -||-

所属: -||-

肩書: -||-

URL:

https://drive.google.com/file/d/1sPGHypQPsYo_KePrE-0TDeCv-Wt5Px77/view

ChatGPT(GPT-4 Used AskYourPDF)出力:

以下の情報を抽出しました:

 

講演者名: 熊田 亜紀子

講演タイトル: APET の活動概要 ~第4期に向けて~

所属: 東京大学 先端電力エネルギー・環境技術教育研究アライアンス(APET)

肩書: 工学系研究科 電気系工学専攻 教授

講演者名: 馬場 旬平

講演タイトル: ユビキタスパワーネットワーク 寄附講座の研究成果

所属: 東京大学 新領域創成科学研究科

肩書: 先端 エネルギー 工学専攻 教授

講演者名: 藤井 隆

講演タイトル: パワーフロンティア 寄附講座の研究成果

所属: 東京大学 工学系研究科

肩書: 電気系工学専攻 特任教授

講演者名: 松田 章志

講演タイトル: 広域系統長期方針(広域連系系統 マスタープラン )の概要

所属: 電力広域的運営推進機関

肩書: 計画部長

講演者名: 塚本 幸辰

講演タイトル: 世界のカーボンニュートラル に向けた エネルギーマネジメントについて

所属: 三菱電機株式会社 電力システム製作所

肩書: 電力エナジーシステム開発部 部長

以上の情報は、以下のURLから抽出されました:

URL 2023年APET活動報告_Part1.pdf

 

使い方はこれでわかったのですが、プロンプト中の「-||-」に関しては、公式ドキュメント中、何の説明もなく使われていましたので、ChatGPTに、この記号の意味と正しい使い方を尋ねてみました。

私:

プロンプトでの「-||-」の意味と使い方について教えてください。

ChatGPT:

「-||-」は一般的には特定の形式や構造を示すために使用される記号ではありません。しかし、ユーザーが特定のコンテキストや目的で使用する場合があります。この場合、ユーザーはそれを区切り記号として使用しているようです。

ここで「-||-」は、後で具体的な情報(講演者名、講演タイトル、所属、肩書)を挿入するためのプレースホルダーとして機能しています。

一般的に広く認識されている記号ではないことに注意してください。

ということで、別に「-||-」である必要はないですが、出力形式を指定するにあたって、ChatGPTに対して、「ここに該当する情報を入れてください」という指示になるようです。

ちなみに、以下のプロンプト入力に変更しても、まったく同じように出力が返されました。

以下の東京大学 先端電力エネルギー・環境技術教育研究アライアンス(APET)の活動報告会・特別講演案内状のURLから勉強会の重要なエンティティを抽出する。

まずすべての講演者名を抽出し、講演者毎に講演タイトルと所属、肩書を抽出する。

希望する形式:

講演者名: xxx

講演タイトル: xxx

所属: xxx

肩書: xxx

URL:

https://drive.google.com/file/d/1sPGHypQPsYo_KePrE-0TDeCv-Wt5Px77/view

 

No.5 ゼロショットプロンプトで期待した結果が得られないならフューショットプロンプトを試みる:ChatGPTに限らず、BardもBingもブラウザからアクセスする限り、ファインチューニングは行えないので、こういう推奨になると思います。

ここで、ゼロショットプロンプト(zero-shot prompt)やフューショトプロンプトというのは、AIモデルに対する指示の形式で、モデルがタスクを遂行するためにどれだけの事前情報(例えば、タスクの例)を与えられているかを示します。

ゼロショットプロンプトでは、モデルには事前にタスクの例を何も示さずタスク遂行を指示します。

  • ゼロショットプロンプトの例:

プロンプト:

以下の文章をフランス語に翻訳してください:’Hello, how are you?’

ChatGPT:

‘Hello, how are you?’をフランス語に翻訳すると、「Bonjour, comment ça va?」となります。

 

これに対して、フューショットプロンプトでは、モデルがタスクを遂行する前にいくつかの例を見せ、モデルがタスクを理解し、適切な回答を生成するのを助けます。

  • フューショトプロンプトの例:

プロンプト:

以下の例を参考にして、翻訳対象の分をフランス語に翻訳してください:

例1: ‘Hello, how are you?’ -> ‘Bonjour, comment ça va?’

例2: ‘I am fine, thank you.’ -> ‘Je vais bien, merci.’

例3: ‘What is your name?’ -> ‘Comment vous appelez-vous?’

###

ターゲット: ‘Nice to meet you.

ChatGPT:

フューショットプロンプトの例に従って、”Nice to meet you.”をフランス語に翻訳すると、「Enchanté de vous rencontrer.」となります。

 

以前、ChatGPTが一般的なニュースにも出始めたころ、山口那津男公明党代表がChatGPTに自分の名前を知っているかたずねたところ、間違った肩書の人物として回答したというような報道がありましたが、多分、これは典型的なゼロショットプロンプトだったのではないかと思います。

現時点でWebPilotのプラグインを使ったGPT-4ベースのChatGPTで「山口那津男について教えてください。」と尋ねると最新のWikipediaに掲載されているのと同じ情報が提供されますが、Bard、ChatGPT(GPT-3.5)、Bingに同じゼロショットプロンプトでの質問をした場合、以下の答えが返ってきました。

Bardの回答:

山口那津男は、日本の政治家、弁護士。公明党所属の参議院議員、公明党代表。 衆議院議員、防衛政務次官、新進党副幹事長、公明党参議院国会対策委員長、公明党政務調査会長を歴任した。

山口は、1952年7月12日に茨城県で生まれた。東京大学法学部を卒業後、弁護士として活動した。1993年に衆議院議員に初当選し、2期務めた。2001年に参議院議員に当選し、現在に至る。

山口は、公明党の代表として、憲法改正、安全保障、少子高齢化対策、経済政策など、幅広い分野で政策を主導している。また、日中関係の改善、地雷除去支援、持続可能な開発目標(SDGs)の達成など、国際社会でも積極的に活動している。

山口は、2023年6月現在、70歳。公明党の代表として、今後も日本の政治に大きな影響を与えていくことが期待されている。

ChatGPT(GPT-3.5)の回答:

山口那津男(やまぐち なつお)とは、私の知識の範囲では特定の有名な人物や公的な情報源とは関連がありません。可能性として、山口那津男は個人の名前、あるいは限られた地域やコミュニティで知られている人物かもしれません。

もし、山口那津男に関する具体的な情報や背景がある場合は、それを教えていただければ、より具体的な情報を提供することができるかもしれません。

Bingの回答:

山口那津男さんは、1952年7月12日生まれの政治家、弁護士です。公明党所属の参議院議員(4期)、公明党代表(第3代)です。衆議院議員(2期)、防衛政務次官(第51代)、新進党副幹事長、公明党参議院国会対策委員長、公明党政務調査会長を歴任しました。

1:https://ja.wikipedia.org/wiki/山口那津男

 

生成系AIは時として事実に基づいていない情報や架空の出来事を生成することがあり、これをハルシネーションというようですが、フューショットプロンプトの別の使い方として、質問に対して適切な学習データが見当たらない場合、無理に回答を「捏造」しないで「わからない」と答えるように仕向けることができるのではないかと思います。例えば、存在しない用語に関する質問をゼロショットプロンプトとフューショットプロンプトで実施して、結果を比べてみましょう:

Bardへのゼロショットプロンプト:

ゼロシートプロンプトについて教えてください

Bardの回答:

ゼロシートプロンプトとは、Google スプレッドシートで使用できる機能で、スプレッドシートのシート1に入力したテキストを、シート2に自動的にコピーすることができます。ゼロシートプロンプトは、スプレッドシートのデータを簡単にコピーしたい場合に便利な機能です。

ゼロシートプロンプトを使用するには、次の手順に従います。

スプレッドシートを開きます。

シート1にテキストを入力します。

シート2をクリックします。

メニューバーの「挿入」タブをクリックします。

「ゼロシートプロンプト」をクリックします。

シート1に入力したテキストが、シート2に自動的にコピーされます。

ゼロシートプロンプトは、スプレッドシートのデータを簡単にコピーしたい場合に便利な機能です。

Bardへのフューショットプロンプト:

以下の回答例に従って、私の質問3に答えてください。

質問1:ゼロショットプロンプトについて教えてください。

回答1:ゼロショットプロンプトとは、自然言語生成モデルが、訓練データに含まれていない新しいタスクやトピックについて、特定の指示や追加の訓練なしにテキストを生成することを指します。

質問2:ワンショットプロンプトについて教えてください。

回答2:ワンショットプロンプトという用語に関して、情報がありません。

質問3:ゼロシートプロンプトについて教えてください。

回答3:

Bardの回答:

ゼロシートプロンプトという用語は存在しません。

 

Googleスプレッドシートのメニューバーの「挿入」のサブメニューを調べてみましたが、「ゼロシートプロンプト」というのは存在しませんでしたが、ゼロショットプロンプト入力への回答は、「いかにも」という感じで、納得させられてしまいます。ところが、フューショットプロンプトの質問3でゼロショットプロンプトとまったく同じ質問をすると、Bardはあっさり「そんな用語はない」と回答しています。

 

No.6 「フラフィー」で不正確な説明を減らす:いわゆるフワフワした表現で指示を出すなということですね。

以下は、フワフワした表現の例として、「旧垂直統合型電力会社」とか「発送配電分離後できた会社」に関して何の定義も与えず生成AIが知っているものと仮定したゼロショットプロンプトをBard、ChatGPT、およびBingに投げかけてみました。

質問:

旧垂直統合型電力会社から発送配電分離後できた会社を新旧会社名を対応付けてリストアップしてください。

Bardの回答:

旧垂直統合型電力会社から発送配電分離後できた会社を新旧会社名を対応付けてリストアップします。

旧会社名

新会社名

東京電力株式会社

東京電力パワーグリッド株式会社

中部電力株式会社

中部電力パワーグリッド株式会社

関西電力株式会社

関西電力送配電株式会社

九州電力株式会社

九州電力送配電株式会社

北海道電力株式会社

北海道電力ネットワーク株式会社

東北電力株式会社

東北電力ネットワーク株式会社

四国電力株式会社

四国電力送配電株式会社

中国電力株式会社

中国電力送配電株式会社

沖縄電力株式会社

沖縄電力ネットワーク株式会社

 

これらの会社は、発送配電分離により、発送電事業と小売電気事業に分離されました。発送電事業は、送電線や変電所などの送配電設備を保有・管理し、電気を送配電する事業です。小売電気事業は、電気を一般のお客さまに販売する事業です。

ChatGPT(GPT-4 with Web Browsing)の回答:

旧垂直統合型電力会社から発送配電分離後できた会社は以下の通りです:

旧会社名と新会社名:

北海道電力: 北海道電力ネットワーク

東北電力: 東北電力ネットワーク

東京電力: 東京電力パワーグリッド

中部電力: 中部電力パワーグリッド

北陸電力: 北陸電力送配電

関西電力: 関西電力送配電

中国電力: 中国電力ネットワーク

四国電力: 四国電力送配電

九州電力: 九州電力送配電

沖縄電力: 沖縄電力

なお、東京電力は他の電力会社に先駆けて「持株会社方式」を採用し、ホールディングカンパニー制となっています。それ以外の8社は全て「発電・小売親会社方式」を採用しています

Bingの回答:

申し訳ありませんが、私の検索結果には、旧垂直統合型電力会社から発送配電分離後できた会社を新旧会社名を対応付けてリストアップする情報が見つかりませんでした。他にお手伝いできることはありますか?

 

これまで、ChatGPT(GPT-4)にWebブラウジングの拡張機能がなかったので、この質問に介して正解を得るために悪戦苦闘したのですが、今回はあっさり正解を貸してくれました。Bardの回答は、見やすく表にまとめてくれていて素晴らしいのですが、北陸電力が抜けているのと、沖縄電力ネットワーク株式会社というのは存在しません。ただ、入力したプロンプトに旧垂直統合電力会社10社に関する情報と、発送配電分離の情報を示していれば、このような間違いはなかったものと思われます。Bingには、もう少し頑張ってほしかったですが、やはり正しい回答を得るためには、そのための情報をプロンプトで渡すべきだという見本であると思います。

 

No.7 何をしないかだけを言うのではなく、代わりに何をするべきかを言う:OpenAIがプロンプトエンジニアリング技術の1つとして、ここで推奨していることは、自明な気がしますが、公式ドキュメントにあるプロンプト例に関して、実際にどのようにエージェントと顧客の間の会話が発展行きそうか、続けてみました。

効果が低いとされるプロンプト例:

エージェントと顧客の間の以下の会話です。ユーザーネームやパスワードを尋ねないでください。ユーザーネームやパスワードを要求しないでください。

顧客: 私のアカウントにログインできません。

エージェント:

ChatGPT(GPT-4)の回答:

すみません、アカウントにログインできないとのことで困っていらっしゃるようですね。しかし、私はAIであり、セキュリティ上の理由からユーザー名やパスワードを取り扱うことができません。そのため、お手数ですが、公式のカスタマーサポートまたは技術サポートに直接お問い合わせいただくことをお勧めします。彼らはあなたの問題を解決するための適切な手順を提供できます。

Bardによるその後の会話:

エージェント:申し訳ありませんが、お困りのところ、お聞かせください。

顧客:私は自分のユーザー名とパスワードを入力しましたが、ログインできません。

エージェント:わかりました。ユーザー名とパスワードをもう一度確認していただけますか?

顧客:はい、確認しました。

エージェント:わかりました。他に何か問題はありますか?

顧客:はい、確認コードが届きません。

エージェント:わかりました。確認コードを再送信します。確認コードは、お使いの電話番号に送信されます。

顧客:わかりました。確認コードを受け取りました。

エージェント:わかりました。確認コードを入力していただけますか?

顧客:はい、入力しました。

エージェント:わかりました。ログインできました。他に何か問題はありますか?

顧客:はい、アカウントがハッキングされたようです。

エージェント:わかりました。アカウントがハッキングされた場合は、パスワードを変更する必要があります。パスワードを変更していただけますか?

顧客:はい、変更しました。

エージェント:わかりました。パスワードを変更しました。他に何か問題はありますか?

顧客:はい、アカウントからすべてのデータを削除したいです。

エージェント:わかりました。アカウントからすべてのデータを削除します。他に何か問題はありますか?

顧客:はい、アカウントを削除したいです。

エージェント:わかりました。アカウントを削除します。他に何か問題はありますか?

顧客:はい、ありません。

エージェント:わかりました。他にご不明な点がございましたら、お気軽にお問い合わせください。

Bingによるその後の「会話」:

エージェント: 申し訳ありませんが、ログインに問題がありますね。どのようなエラーメッセージが表示されていますか?

顧客:パスワードが違いますと表示されます

エージェント: パスワードが違うというメッセージが表示される場合、パスワードをリセットすることができます。パスワードのリセット方法についてご案内いたしますか?

顧客:はい、パスワードのリセット方法を教えてください

エージェント: パスワードのリセット方法は、サービスによって異なります。どのサービスのアカウントにログインできないのか教えていただけますか?

 

ということで、Bard/ChatGPT/Bingとも、この例では、「何をしないか」という指示がよく守られていて、あまり良い「効果の低い例」にはなっていないようです。

逆に、公式ドキュメント上、「より良い例」とされている方で問題が出ました。

効果が低いとされるプロンプトより良いとされるプロンプト:

エージェントと顧客の間の以下の会話です。エージェントは問題を診断しようと試みます。

顧客: 私のアカウントにログインできません。

エージェント:

ChatGPT(GPT-4)の回答:

私が直接アシストすることはできませんが、一般的なトラブルシューティングのステップを提供できます。まず、以下のことを確認してみてください:

ユーザー名とパスワードが正しいか確認してみてください。時々、タイプミスや大文字・小文字の誤りが原因でログインできないことがあります。

キャッシュとクッキーをクリアしてみてください。これらは時々ログイン問題を引き起こすことがあります。

別のブラウザやデバイスで試してみてください。特定のブラウザやデバイスの問題である可能性があります。

これらのステップで問題が解決しない場合は、サポートチームに連絡してください。彼らはより詳細な問題解決をサポートします。

Bardによるその後の「会話」:

エージェント: 申し訳ありませんが、お困りのところ、お聞かせください。

顧客: 私のアカウントにログインできません。

エージェント: わかりました。お使いのアカウント名とパスワードを教えてください。

顧客: アカウント名は[アカウント名]、パスワードは[パスワード]です。

エージェント: ありがとうございます。確認しました。アカウント名とパスワードは正しいです。

顧客: でも、ログインできません。

エージェント: わかりました。他に何か問題はありますか?

顧客: はい。確認コードが届きません。

エージェント: わかりました。確認コードを再送信します。

エージェント: 確認コードは[確認コード]です。

顧客: ありがとうございます。確認コードを入力しましたが、まだログインできません。

エージェント: わかりました。他に何か問題はありますか?

顧客: はい。アカウントがロックされています。

エージェント: わかりました。アカウントをロック解除します。

エージェント: アカウントはロック解除されました。ログインできますか?

顧客: はい。ログインできました。ありがとうございます。

エージェント: ご不便をおかけして申し訳ございません。また何かございましたら、お気軽にお問い合わせください。

Bingによるその後の「会話」:

エージェント: 申し訳ありませんが、ログインに問題がありますね。どのようなエラーメッセージが表示されていますか?

顧客:パスワードが違いますと表示されます

エージェント: パスワードが違うというメッセージが表示される場合、パスワードをリセットすることができます。パスワードのリセット方法についてご案内いたしますか?

顧客:はい、パスワードのリセット方法を教えてください

エージェント: パスワードのリセット方法は、サービスによって異なります。どのサービスのアカウントにログインできないのか教えていただけますか?

ということで、Bardの場合、見事に!してほしくないことをBardがやってしまいました。

したがって、Bardに関するプロンプトエンジニアリングテクニックNo.7は、ChatGPT/Bingと違い、何をするべきかを言うだけでなく、何をしないかもはっきり指摘すること重要であることが分かりました。

 

No.8 コード生成特有 – モデルを特定のパターンに向けるために「リーディングワード」を使用する:リーディングワードとして、公式ドキュメントでは、例として「import」や「SELECT」を挙げていましたが、以下では、C++でMySQLデータベースのレコードをアクセスするためのテンプレートを生成AIに作ってもらいました。

効率が低いプロンプト例:

C++からMySQLデータベースのレコードを読み書きするコードテンプレートを作ってください

Bardの回答:

// MySQLデータベースへの接続

// データベース名、ユーザー名、パスワードを指定してください。

 

// データベースへの接続

// データベース名、ユーザー名、パスワードを指定してください。

 

// レコードの読み取り

// テーブル名とレコードのIDを指定してください。

 

// レコードの書き込み

// テーブル名、レコードの値を指定してください。

 

// データベースの切断

このコードテンプレートは、C++からMySQLデータベースのレコードを読み書きするための基本的なものです。データベースへの接続、レコードの読み取り、レコードの書き込み、データベースの切断の4つの処理を実行します。

データベースへの接続は、mysql_connect()関数を使用します。この関数には、データベース名、ユーザー名、パスワードを指定します。

レコードの読み取りは、mysql_query()関数を使用します。この関数には、テーブル名とレコードのIDを指定します。

レコードの書き込みは、mysql_query()関数を使用します。この関数には、テーブル名、レコードの値を指定します。

データベースの切断は、mysql_close()関数を使用します。この関数には、データベース名を指定します。

このコードテンプレートは、C++からMySQLデータベースのレコードを読み書きするための基本的なものです。データベースへの接続、レコードの読み取り、レコードの書き込み、データベースの切断の4つの処理を実行します。

ChatGPT(GPT-4)の回答:

C++でMySQLデータベースに接続し、レコードを読み書きするためには、MySQL Connector/C++を使用します。以下にその基本的なコードテンプレートを示します。

 

まず、MySQL Connector/C++をインストールし、プロジェクトにリンクする必要があります。その後、以下のコードを使用できます。

 

#include <mysql_driver.h>

#include <mysql_connection.h>

#include <cppconn/driver.h>

#include <cppconn/exception.h>

#include <cppconn/resultset.h>

#include <cppconn/statement.h>

 

#define DB_HOST “tcp://127.0.0.1:3306”

#define DB_USER “username”

#define DB_PASS “password”

#define DB_NAME “database_name”

 

int main() {

    sql::mysql::MySQL_Driver *driver;

    sql::Connection *con;

 

    try {

        driver = sql::mysql::get_mysql_driver_instance();

        con = driver->connect(DB_HOST, DB_USER, DB_PASS);

 

        con->setSchema(DB_NAME);

 

        sql::Statement *stmt = con->createStatement();

        sql::ResultSet *res;

 

        // Insert a record

        stmt->execute(“INSERT INTO table_name (column1, column2) VALUES (‘value1’, ‘value2’)”);

 

        // Read records

        res = stmt->executeQuery(“SELECT * FROM table_name”);

 

        while (res->next()) {

            std::cout << “\t… MySQL replies: “;

            std::cout << res->getString(“column1”) << “, ” << res->getString(“column2”);

            std::cout << std::endl;

        }

 

        delete res;

        delete stmt;

        delete con;

 

    } catch (sql::SQLException &e) {

        std::cout << “# ERR: SQLException in ” << __FILE__;

        std::cout << “(” << __FUNCTION__ << “) on line ” << __LINE__ << std::endl;

        std::cout << “# ERR: ” << e.what();

        std::cout << ” (MySQL error code: ” << e.getErrorCode();

        std::cout << “, SQLState: ” << e.getSQLState() << ” )” << std::endl;

    }

 

    return 0;

}

 

このコードは、MySQLデータベースに接続し、レコードを挿入し、全てのレコードを選択して表示する基本的なテンプレートです。”username”, “password”, “database_name”, “table_name”, “column1”, “column2”, “value1”, “value2″は適切な値に置き換えてください。

エラーハンドリングのために例外をキャッチしています。これにより、接続やクエリの問題が発生した場合にエラーメッセージが表示されます。

なお、このコードはMySQL Connector/C++がインストールされていることを前提としています。また、データベースのホスト名、ユーザー名、パスワード、データベース名は適切なものに置き換えてください。

Bingの回答:

C++からMySQLデータベースにアクセスするには、MySQL Connector/C++ライブラリを使用することができます。以下は、MySQLデータベースに接続し、レコードを読み書きするための簡単なコードテンプレートです。

 

#include <iostream>

#include <mysqlx/xdevapi.h>

 

using namespace std;

using namespace mysqlx;

 

int main() {

    try {

        // MySQLデータベースに接続

        Session session(“localhost”, 33060, “user”, “password”);

        Schema schema = session.getSchema(“database_name”);

 

        // テーブルを取得

        Table table = schema.getTable(“table_name”);

 

        // レコードの挿入

        table.insert(“column1”, “column2”)

            .values(“value1”, “value2”)

            .execute();

 

        // レコードの取得

        RowResult result = table.select(“column1”, “column2”)

            .where(“column1 = :value”)

            .bind(“value”, “value1”)

            .execute();

 

        // 結果の表示

        for (Row row : result) {

            cout << row[0] << ” ” << row[1] << endl;

        }

    } catch (const Error &err) {

        cout << “Error: ” << err << endl;

    }

 

    return 0;

}

 

このコードは、localhost上のMySQLデータベースに接続し、指定されたデータベースとテーブルを使用してレコードを挿入および取得します。適切な値に置き換える必要があります。

リーディングワードを追加したより良いプロンプトの例:

C++からMySQLデータベースのレコードを読み書きする、includeを含むコードテンプレートを作ってください

Bardの回答:

はい、喜んで。C++からMySQLデータベースのレコードを読み書きする、includeを含むコードテンプレートは次のとおりです。

 

#include <iostream>

#include <mysql/mysql.h>

 

int main() {

  // MySQLへの接続を確立します。

  MYSQL *conn = mysql_init(NULL);

  mysql_real_connect(conn, “localhost”, “username”, “password”, “database”, 3306, NULL, 0);

 

  // レコードを読み取ります。

  std::string query = “SELECT * FROM table”;

  MYSQL_RES *result = mysql_query(conn, query.c_str());

  if (result == NULL) {

    std::cout << “Error: ” << mysql_error(conn) << std::endl;

    return 1;

  }

 

  // レコードをループして表示します。

  MYSQL_ROW row;

  while ((row = mysql_fetch_row(result)) != NULL) {

    for (int i = 0; i < mysql_num_fields(result); i++) {

      std::cout << row[i] << ” “;

    }

    std::cout << std::endl;

  }

 

  // レコードを書き込みます。

  query = “INSERT INTO table (column1, column2) VALUES (‘value1’, ‘value2’)”;

  if (mysql_query(conn, query.c_str()) != 0) {

    std::cout << “Error: ” << mysql_error(conn) << std::endl;

    return 1;

  }

 

  // MySQLへの接続を閉じます。

  mysql_close(conn);

 

  return 0;

}

このコードテンプレートは、MySQLデータベースへの接続を確立し、レコードを読み取り、書き込む方法を示しています。

 

以上のとおり、ChatGPTおよびBingではリーディングワードを指定しなくても、かなりしっかりしたコードテンプレートを作成してくれることが分かりました。

 

パラメータ:ChatGPT Plusでは、Modelやtemperatureなどのパラメータを直接調整することはできないことになっていますが、Bingではチャットの開始時に「会話のスタイルを選択」で「より創造的に/よりバランスよく/より厳密に」から1つを選ぶことができます。これは、temperatureパラメタの指定に相当するものではないかと思います。Bingチャットのモデルに関しては、OpenAIのGPT-4ということでよいと思います。

BardのModelおよびtemperatureパラメタに関しては、以下の通りBard自身が教えてくれました。

Modelに関するプロンプト:

Bardが利用しているモデルは何ですか?それともBard自体が生成AIモデルということでしょうか?

Bardの回答:

Bardは、Google AIが開発した大規模言語モデル(LLM)です。LLMとは、テキストとコードの膨大なデータセットでトレーニングされた機械学習モデルです。Bardは、このデータセットを使用して、テキストを生成し、言語を翻訳し、さまざまな種類のクリエイティブ コンテンツを作成し、有益な方法で質問に答えることができます。

Bardは、Google 検索に統合されており、ユーザーが質問をより自然な方法で検索できるように支援します。また、Bard は、Google ドキュメント、スプレッドシート、スライドなどの Google 製品にも統合されており、ユーザーがこれらの製品をより効率的に使用できるように支援します。

Bard はまだ開発中ですが、さまざまなタスクを実行することを学びました。

私はあなたの指示に従い、思慮深くあなたの要求を完了するために最善を尽くします.

私は自分の知識を使用して、質問がオープンエンド、挑戦的、または奇妙であっても、包括的かつ有益な方法で回答します.

詩、コード、台本、音楽作品、電子メール、手紙など、さまざまなクリエイティブなテキスト形式を生成します。すべての要件を満たすために最善を尽くします。

Temperatureに関するプロンプト:

Bardの出力を制御するtemperatureというパラメタの使い方を教えてください。

Bardの回答:

Bardの出力を制御するtemperatureというパラメータは、0から1までの値で指定できます。値が低いほど、Bardの出力はより正確で、事実に基づいたものになります。値が高いほど、Bardの出力はより創造的で、詩的なものになります。

たとえば、temperatureを0に設定すると、Bardは事実に基づいたテキストのみを生成します。temperatureを1に設定すると、Bardはより創造的なテキストを生成します。

temperatureの適切な値は、Bardの出力をどのように制御したいかによって異なります。たとえば、Bardに事実に基づいたテキストを生成させたい場合は、temperatureを低く設定します。Bardに創造的なテキストを生成させたい場合は、temperatureを高く設定します。

temperatureの値を変更するには、次のコマンドを使用します。

コード スニペット

curl -X POST -H “Authorization: Bearer YOUR_ACCESS_TOKEN” -H “Content-Type: application/json” -d ‘{

  “temperature”: 0.5

}’ https://api.bard.ai/v2/models/bard/generate

※ただし、https://api.bard.ai/v2/models/bard/generateに対してアクセス権がなければtemperatureは勝手に修正できないということかもしれません。

 

今回は以上です。

終わり