SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

生成AIで自社サービスをパワーアップしよう! 「ChatGPT API」活用ガイド

あなたのChatGPTをもっと賢く! APIで使える実践プロンプトエンジニアリング

生成AIで自社サービスをパワーアップしよう!「ChatGPT API」活用ガイド 第4回

  • X ポスト
  • このエントリーをはてなブックマークに追加

Chain-of-Thought

 Chain-of-Thought(以下CoT)は2022年にGoogleの研究者らによる論文で提案されたテクニックで、LLMにある程度の思考能力を付与する方法として非常によく用いられています。その方法は簡単で、最終的なアウトプットの前に、思考過程を言葉で説明させるというものです。

 CoTの効果を確かめるために、ChatGPTに「日本の都道府県の数と徳川幕府の将軍の人数と人間の両手の指の数の合計はいくつですか?」という問題を解かせてみましょう。

 まずはCoTを使わない状態、即ち、思考過程を一切挟まずに、いきなり答えを出させるとどうなるか確認してみます。ここでは、先ほどのFew-shotプロンプティングを用いて解答形式を指定します。

インプット
Q: タコの足の数とイカの足の数の合計はいくつですか?
A: 18
Q: 日本の都道府県の数と徳川幕府の将軍の人数と人間の両手の指の数の合計はいくつですか?
A:

 1行目と2行目はFew-shotプロンプティングのための例題と回答です。敢えて数字だけを答えるように仕向けています。3行目の質問文がここで本来答えて欲しい内容です。これを実行するとどうなるでしょうか?

アウトプット
48

 このように正解とは全く違う答えが返ってきました。たまたま間違えたわけではなく、繰り返し実行してみても正答率はほぼ0%になるはずです。日本の都道府県の数も、徳川幕府の将軍の数も、人間の両手の指の数も全てChatGPTは知っているはずなのに、それらの合計を上手く答えることができません。これが、「LLMは自身の知識を自由に参照できない」や「LLMは思考する能力を持たない」ということです。今回はわかりやすい例で試していますが、これと同じ現象は普段ChatGPTなどを利用している時にも多かれ少なかれ発生していると考えられます。

 次に、CoTを適用して、思考過程を言葉でアウトプットさせながら回答を導くように仕向けてみます。

インプット

Q: タコの足の数とイカの足の数の合計はいくつですか?
A: タコの足の数は8本、イカの足の数は10本なので、合計は18です。
Q: 日本の都道府県の数と徳川幕府の将軍の人数と人間の両手の指の数の合計はいくつですか?
A:

 前回同様Few-shotプロンプティングを用いていますが、今回は2行目の解答例を変更して、回答に至る過程からアウトプットするようにしています。こちらを実行すると、以下のような回答が返ってきます。

アウトプット
日本の都道府県の数は47、徳川幕府の将軍の人数は15、人間の両手の指の数は10本なので、合計は72です。

 今度は正しい答えが導き出せました。足し合わせる3つの要素を具体的な数字に変換していく作業は、人間であれば口には出さずに頭の中で行うことが多いと思いますが、LLMにはそれができません。しかし、このように解答に至るまでの文脈上に言葉としてアウトプットしてあれば、それを擬似的な「思考」として利用することができます。これがChain-of-Thought(思考の連鎖)です。

 今回の例ではFew-shotプロンプティングによって答え方を指定しましたが、思考過程を出力するよう仕向けることさえできれば、この方法でなくても問題ありません。より簡単な方法としては、通常の質問文の末尾に「ステップバイステップで考えてください(Let’s think step by step)」という一文を加えるだけで、同じような出力が得られることも知られています。そちらの手法はZero-shot Chain-of-Thoughtと呼ばれています。

JSON出力でCoTを使う方法

 前回の記事で紹介したように、ChatGPT APIを既存システムのパーツとして利用する場合は、回答をJSON形式で得ることが多いと思います。その場合、回答は思考過程を含まずに答えの部分だけ取得したいケースがほとんどでしょう。そのような場合でも以下のような方法でCoTが適用可能です。

インプット
以下の問題に答えてください。

# 問題
日本の都道府県の数と徳川幕府の将軍の人数と人間の両手の指の数の合計はいくつですか?

# 出力形式
JSON

# 出力項目
- thought: 思考過程(string)
- answer: 回答(number)

 このように、回答をJSON形式で出力するよう指示しました。今回はFew-shotプロンプティングは使用せずに、出力項目の一つとして思考過程を入れるようにしています。

アウトプット
{
  "thought": "日本の都道府県の数は47、徳川幕府の将軍の人数は15人、1人の人間の両手の指の数は10本なので、それぞれを合計して計算すると、47 + 15 + 10 = 72 となります。",
  "answer": 72
}

 この方法でも正しい答えが導けています。このように、JSONで出力する場合でも、本来目的とする項目より前に、その結論に至るための思考過程を出力させることで、CoTを実現できます。この例では、「thought」が「answer」よりも前に出力されていることが重要です。LLMは回答文を冒頭から順番に生成していきますが、前に出力された内容は後ろに出力される内容に影響を与えます。それは出力形式がJSON等であっても変わりません。また、今回は思考過程を一つの項目で書き出しましたが、必要であれば複数の項目に分けても良いでしょう。

次のページ
Self-Consistency

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
生成AIで自社サービスをパワーアップしよう! 「ChatGPT API」活用ガイド連載記事一覧

もっと読む

この記事の著者

株式会社ブリューアス AI-TEAM(カブシキガイシャブリューアス エーアイチーム)

 モバイルのアプリを中心にUI/UXデザインから開発保守まで、幅広い実績を持つ会社です。専門的な知識と豊富な開発経験を活かし、AIとサービスの統合を推進しています。 Brewus.inc

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/19220 2024/03/25 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング