メディア
連載
» 2023年07月18日 07時00分 公開

話が長い人はChatGPTも使えない? 正しい命令文の書き方(第3回)

「ChatGPT」に何か質問すると、すぐに回答が返ってくる。だが、質問が複雑だったり、場合分けがあったりすると期待した回答を得られないことがある。どうすればよいのだろうか。記事の後半では、ChatGPTで役立つ「小技」も紹介した。

[畑陽一郎キーマンズネット]

 「ChatGPT」はどんな質問を投げ掛けても答えを返してくる。だが、質問が悪いと望んだ結果は得られない。

 第1回第2回に続き、今回はChatGPTの開発元であるOpenAIが公開した6つの戦略から3つ目の戦略*を紹介する(連載記事の一覧はこちら)。

*OpenAIがベストプラクティスとして紹介した具体例の幾つかはGPT-4でのみ動作する。

戦略3 複雑なタスクをより単純なサブタスクに分割する

 ChatGPTに複雑な命令(タスク)を与えると、想定した回答が得られない確率が高まる。複雑なタスクは単純なタスクよりも回答のエラー率が高くなる。ではどうしたらよいのか。

 このような場合はサブタスクに分解するとよい。まずタスクを一連の流れに分割する。そして1つ前の先のタスクの出力を次のタスクの入力として使う。

元のタスク A=(a+b+c)

分割したタスク a→b→c


 これはソフトウェア工学において、複雑なシステムをモジュール化されたコンポーネントに分解して開発しなければならないことと同じだ。

戦術1 ユーザーのクエリに最も関連する命令を特定するために、インテント分類を使用する

 ChatGPTはユーザーが何を求めて質問しているのかを「理解」するためにインテント分類を使っている。インテント分類が正しく働くように質問すればよい。

 複数の場面に対応するためにタスクが複雑に分岐しているとしよう。「Aの場合はこうしなさい」「Bの場合はこう」「Cの場合は……」というように、タスクが細かく分かれている場合だ。

 こうした状況では「場合分け」をはっきりさせて、それぞれの場合にどの命令が必要なのかを最初に決めておかなければならない。

 場合分けを定義して、場合ごとにタスク処理に必要な命令を書き下す。場合分けを再帰的に適用して、タスクをさらに分解することもできる。この戦術を使うと、各クエリがタスクの次の段階を実行するために必要な単純な命令だけで済む。ChatGPTに与えるプロンプトが長いと実行コスト(計算コスト)が高くなるため、有償版を使っているときはコスト削減にもなる。

 次の例はカスタマーサービスアプリケーションを作ろうとしている。クエリをどのように分類しているだろうか。

顧客サービスに関する問い合わせを受けてください。各クエリをプライマリーカテゴリーとセカンダリカテゴリーに分類する。プライマリとセカンダリをキーとして、jsonフォーマットで出力してください。

プライマリーカテゴリー: 課金、テクニカルサポート、アカウント管理、または一般的な問い合わせ。

課金の二次カテゴリー:

- 購読解除またはアップグレード

- 支払い方法を追加する

- 請求に関する説明

- 請求に対する異議申し立て

テクニカルサポート

- トラブルシューティング

- デバイスの互換性

- ソフトウェアのアップデート

アカウント管理

- パスワードのリセット

- 個人情報の更新

- アカウントを閉じる

- アカウントのセキュリティ

一般的なお問い合わせの二次カテゴリー

- 製品情報

- 価格設定

- フィードバック

- 人間と話す


 するとカスタマーサービスクエリを一次カテゴリーと二次カテゴリーに分類する次のようなjsonのコードが出力された。

{
  "queries": [
    {
      "query": "購読解除方法を教えてください。",
      "primary_category": "課金",
      "secondary_category": "購読解除またはアップグレード"
    },
    {
      "query": "新しい支払い方法を追加したいです。",
      "primary_category": "課金",
      "secondary_category": "支払い方法を追加する"
    },
(中略)
    {
      "query": "人間と話したいです。",
      "primary_category": "一般的な問い合わせ",
      "secondary_category": "人間と話す"
    }
  ]
}

 顧客からの問い合わせの分類に基づいて、次のステップを処理するために、より具体的な指示のセットをGPTモデルに与えよう。ここでは、顧客が「トラブルシューティング」の助けを求めているとする

テクニカルサポートにおいて、トラブルシューティングを必要とするカスタマーサービスの問い合わせを受ける。以下の方法でユーザーを助ける:

- ルーターと全てのケーブルが接続されていることを確認する。ケーブルが時間の経過とともに緩むことはよくあることだ。

- 全てのケーブルが接続されているにもかかわらず問題が解決しない場合は、使用しているルーターのモデルを確認する。

- デバイスの再起動方法をアドバイスする:

-- 型番がMTD-327Jの場合、赤いボタンを押して5秒間押し続け、5分間待ってから接続をテストするようアドバイスする。

-- 型番がMTD-327Sの場合、プラグを抜き差しして、5分待ってから接続をテストするようアドバイスする。

- デバイスを再起動して5分待っても問題が解決しない場合は、{"IT support requested"}を出力してITサポートに接続する。

- ユーザーがこのトピックに関係のない質問を始めたら、トラブルシューティングに関する現在のチャットを終了したいかどうかを確認し、次のスキームに従ってリクエストを分類する:

/* プライマリ/セカンダリ分類スキームをここに挿入する */


 紹介したモデルは、会話の状態が変化したときに特定の文字列を打ち出すように指示している。これは、ソフトウェア工学でいう「ステートマシン」を作りたかったからだ。ステートマシンはステート(状態)と状態間の遷移から成るモデルだ。現在の状態を保持し、イベントが発生すると、定義されたルールに基づいて状態が変化する。

 どの命令が入力されるのかは状態によって決まる。状態を追跡し、その状態においてどの命令が関連するのか、またオプションとしてその状態からどのような状態遷移が許されるのかを追跡しやすい。このように構造化されていないタスクだと、内容が分かりにくく、漏れを見つけにくくなる。

戦術2 非常に長い会話を必要とするダイアログアプリケーションを作る場合は、前のダイアログを要約するかフィルタリングする

 ChatGPTは参照できる過去のコンテキストの長さが決まっているため、対話を続けていくとコンテクストウィンドウ(GPT-3.5では1024トークン《単語、または単語をさらに分割した単位》、GPT-4は8192または3万2768)に過去の対話内容が入りきらなくなってしまう。こうなると、既にChatGPTに説明したり、指示したりした内容を忘れてしまう。

 解決策は幾つかある。まずは1つ前の会話を要約することだ。入力のサイズが所定のしきい値の長さに達すると、会話の一部を要約するクエリにトリガーがかかり、前の会話の要約がシステムメッセージの一部として含まれる。あるいは、会話全体を通して、バックグラウンドで非同期に以前の会話を要約することもできる。

 別の解決策は、現在のクエリに最も関連する会話の前の部分を動的に選択することだ。効率的な知識検索を実装するために埋め込みベースの検索を使用する。

戦術3 長い文書を断片的に要約し、再帰的に完全な要約を構築する

 GPTはコンテキストの長さが決まっているため、コンテキストの長さから生成される要約の長さを引いた長さよりも長い文章を1つのクエリで要約することはできない。例えば文章の長さと要約の長さを足した長さが1024トークン(GPT-3.5の場合)を超えると、要約できなくなる。

 本のような非常に長い文書を要約するには、文書の各セクションを要約する一連のクエリを使用する。セクションの要約を連結して要約し、要約の要約を生成しよう。このプロセスは、文書全体が要約されるまで再帰的に進めることができる。

 後のセクションの意味を理解するために、前のセクションの情報を使う必要がある場合、さらに有用なトリックは、その時点の内容を要約しながら、その本の任意の時点より前のテキストの実行中の要約を含めることである。本を要約するためのこの手順はGPT-3の変種を使ったOpenAIの以前の研究で実証されている。

筆者直伝、ChatGPTで役立つ「小技」

 第2回につづき、OpenAIのベストプラクティスから離れて仕事や学習に役立つ筆者の小技を幾つか紹介しよう。

 まずは英語に関連した使い方だ。翻訳にChatGPTを使ってみよう(以下では筆者の質問を太字で示した)。

次の英文を翻訳してください。サイバーセキュリティを扱った文脈です。The rapid growth and adoption of generative AI is a democratizing force within cybersecurity for adversaries and defenders, he said.

彼は、生成AIの急速な成長と採用は、サイバーセキュリティにおいて敵対者と防御側の間で民主化の力となっていると述べました。


 さほど複雑な英文ではない。訳文に問題はないだろう。ChatGPTの真価が発揮されるのは、次のような質問を続けた場合だ。

今の英文の「democratizing force」とはどのような意味ですか。

"Democratizing force"という表現は、特定の領域や産業において、より多くの人々に参加やアクセスの機会を提供し、力関係を平等化する要素を指します。つまり、この文脈では、生成AIの急速な成長と採用が、サイバーセキュリティにおいて攻撃者と防御側の両方にとって、より多くの人々が関与し、競争する機会を創出し、力のバランスを平等にする役割を果たしていると言っています。生成AIが普及することによって、サイバーセキュリティに関わる活動や技術へのアクセスが広がり、それによって個々の能力やリソースの差が少なくなり、競争力が均等になる可能性があるという意味です。


 ChatGPTは文章の意味を「理解してはいない」ものの、民主化の力という部分が何を表しているのかを説明できた。ChatGPTを翻訳ツールとして使うときはこのような使い方もできる。ただし常に正しい結果が返ってくるとは限らないため、ユーザーがきちんと確認しなければならない。

 次は辞書代わりにChatGPTを使ってみよう。英単語の意味が分からないときは英和辞典を引くべきだが、代わりにChatGPTを使うこともできる。特に役立つのは似たような単語が2つあって、違いが分かりにくい場合だ。

次の2つの英単語の意味の違いを教えてください。「advantage」「vantage」。その後それぞれの単語を含む短い例文と日本語訳を3つずつお願いします。

「advantage」と「vantage」は似ていますが、わずかに異なる意味を持ちます。

「Advantage」は、有利な状況や好都合な条件を指す言葉です。何かを得ることや成功するための有利な要素や優位性を表現します。

一方、「Vantage」は、観点や見通しを指します。ある位置や立場からの視点や利点を意味し、特定の状況や環境からの有利さを強調します。

以下にそれぞれの単語を含む短い例文と日本語訳を示します。

「Advantage」の例文:

Having a strong online presence gives businesses a competitive advantage. (強力なオンラインの存在は企業に競争上の利点を与える)

Her extensive experience in the field gives her an advantage over other candidates. (彼女の広範な経験は他の候補者に対して優位性を与える)

The team's speed and agility on the field gave them the advantage in the match. (チームの速さと機敏さが試合で彼らに有利をもたらした)

「Vantage」の例文:

From this vantage, you can see the entire city skyline. (この視点からは、市の全体のスカイラインが見えます)

Standing on the hilltop, they had a vantage over the battlefield. (丘の上に立っていると、彼らは戦場を見渡せる位置にいた)

The higher vantage allowed him to spot the hidden treasure in the distance. (より高い視点から彼は遠くの隠された宝を見つけることができた)


 次はもっと軽い例を挙げよう。意味は分かるが、発音しようとすると難しい「単語」の例だ。

英文で次の数字が書かれていた時、発音はどうなりますか。「8.6:1」

「8.6:1」は数値と比率を表す表記ですが、通常は以下のように発音されます:

"8.6 to 1"(エイト・ポイント・シックス・トゥ・ワン)または "8.6 ratio to 1"(エイト・ポイント・シックス・レイシオ・トゥ・ワン)

この表現では、比率を示すコロン(:)の代わりに "to" もしくは "ratio to" を使用しています。数字の読み方は通常の英語の発音ルールに従います。


 日本語なら、「はちてんろくたいいち」と読むことは分かるが、英語の場合は辞書を引くこともできず困ってしまうだろう。なお、第2回では「km2」を試してみた。

単語博士は単語の内部構造に弱い

 前回「island」クイズに挑戦した単語博士(ChatGPT)に別のクイズを与えてみよう。

 ChatGPTは漢字の形をうまく扱えるだろうか。

次に挙げる3つの条件を満たした漢字の読み方を教えてください。条件1:漢字の左側が「虫」、条件2:漢字の右上が「世」、条件3:漢字の右下が「木」

条件1:漢字の左側が「虫」、条件2:漢字の右上が「世」、条件3:漢字の右下が「木」を満たす漢字の読み方は「蚕(さん)」です。

「蚕」は、左側が「虫」(むし)であり、右上が「世」(せ)であり、右下が「木」(き)で構成されています。この漢字は、家畜として養われる昆虫の一種である「蚕」を表します。蚕は、絹糸を作り出すために飼育されることで知られています。

なお、漢字の読み方は文脈や単語によって異なる場合がありますので、ご注意ください。


 ChatGPTが誤った回答を返したときは、次の例のように間違っている点を指摘すると改善できる場合がある。

「蚕」という漢字の左側は「虫」ではないですよ。

申し訳ありません、誤った情報を提供しました。正しい情報をお伝えします。

条件1:漢字の左側が「虫」、条件2:漢字の右上が「世」、条件3:漢字の右下が「木」を満たす漢字の読み方は「蝶(ちょう)」です。

「蝶」は、左側が「虫」(むし)であり、右上が「世」(せ)であり、右下が「木」(き)で構成されています。この漢字は、「蝶」や「チョウ」と呼ばれる蝶のことを表します。蝶は、美しい羽を持つ昆虫であり、花や自然との関連性が強く、文学や詩にも頻繁に登場します。

再度、前回の回答において誤った情報を提供し、混乱を招いたことをお詫び申し上げます。正しい漢字「蝶」を示しましたことをご理解いただければ幸いです。


 漢和辞典は偏や画数、読みなどが分からないと使えないが、ChatGPTであれば部品を指定すれば何とかなりそうだ。

ある「もの」を表す単語が分からないときに役立つ

 次は言葉で説明できるが、そのものずばりを言い表す単語を忘れてしまった場合だ。ChatGPTはこういった場面で役に立つだろうか。

小麦粉を伸ばしてうどんを作るときに使う円柱状の木製の棒を何と言いますか。

小麦粉を伸ばしてうどんを作る際に使う円柱状の木製の棒は、一般的に「麺棒」(めんぼう)と呼ばれます。麺棒は、生地を均等に伸ばし、うどんやそばなどの麺を作る際に使用される道具です。


 専門用語ではどうだろうか。

1年間を通じて正午の太陽を撮影すると8の字を描いたように写る現象を何と呼びますか。

1年間を通じて正午の太陽を撮影すると8の字を描いたように写る現象は「太陽のアノレマ(Analemma)」と呼ばれます。アノレマは地球の軌道の傾きや地球の自転の速さの違いによって生じます。太陽の位置が毎日わずかにずれるため、1年を通じて太陽を撮影すると、太陽の位置が8の字を描くように見えるのです。この現象は地球上のさまざまな地域で観察できます。


 ChatGPTが答えた単語に疑問があるときは、その単語をWeb検索すれば正解なのかどうかが分かる。Wikipediaを検索したところ、日本語版では「アナレンマ」、英語版では「Analemma」に正解が見つかった。

米国ニュージャージー州でアノレマを撮影した写真(出典:Wikimedia Commons、CC BY-SA 3.0)

Copyright © ITmedia, Inc. All Rights Reserved.

会員登録(無料)

製品カタログや技術資料、導入事例など、IT導入の課題解決に役立つ資料を簡単に入手できます。