大規模言語モデル(ChatGPT)の回答の精度を上げる3つの方法

大規模言語モデル(ChatGPT)の回答の精度を上げる3つの方法

本稿の構成は以下のようになっている。
  1. なぜ大規模言語モデル(ChatGPT)の検索/推論/計算は間違えるのか
    1. どのように大規模言語モデルが動作しているのかを理解すれば、ChatGPTの推論(検索等も含む)が間違えるのは必然であることが理解できる
    2. 大規模言語モデル(ChatGPT)の精度を上げる3つの方法
  2. 大規模化による精度向上(ユーザーによる参入は困難)
    1. ChatGPTならGPT4モデル
    2. コラム「ぬるぽ」「ガッ!」
    3. 大規模化の限界
  3. 60%~90%の精度を得るにはプロンプトエンジニアリング(ファインチューン)が本命
    1. ChatGPT+GPT-4 VS Bing
    2. ファインチューンのサンプルプロジェクト
    3. プロンプトエンジニアリング(ファインチューン)の限界
  4. 90%~の精度を得る方法=既存プログラムとの組み合わせ
    1. 大規模言語モデルの人間よりも優れた読解力、文章精製能力だけを利用する
    2. 推論部分のフック(横取り)のサンプルプロジェクト

なぜ大規模言語モデル(ChatGPT)の検索・推論は間違えるのか

ChatGPTは単純な知識の問い合わせでも間違える。 ChatGPTが学習しているテキストが1年以上前までの情報という分かりやすい理由がある。 ネット検索(マイクロソフトのBing)との連携ができるまでは、今日の天気を問い合わせることすらできなかった。
ところが、ChatGPTが学習しているはずの2021年以前の事実の問い合わせでも間違いは頻繁に発生する。 Googleの検索のように使えるのではないかと思って利用すると多くの誤りに突き当たって戸惑うことになる。 例えばChatGPTが学習しているはずの「2018年の本屋大賞」と尋ねると、本来のリストとは全く異なるランキングが表示される(2023年6月下旬時点)。
2018年の本屋大賞のランキングを教えてください。

【2018年の本屋大賞ランキング】
1位:「おしりのこ」(ななし太郎著)
2位:「波よ聞いてくれ」(イトウヒロミ 著)
3位:「氷酒村」(今井秀樹 著)
以下略
-----------------------------------------
本来のランキングは以下の通り
大賞	かがみの孤城	辻村深月
2位	盤上の向日葵	柚月裕子
3位	屍人荘の殺人	今村昌弘
以下略
1位の「おしりのこ」と3位の「氷酒村」は作者名も含めて原典不明で、2位の「波よ聞いてくれ」は2020年の「マンガ大賞」の4位である。
10位まで完全にでたらめなので、より大規模なGPT-4モデルを利用してChatGPTにもう一度聞くことにした。
2018年の本屋大賞のランキングを教えてください。

私の知識が2021年までのものであるため、2018年の本屋大賞のランキングを提供できます。
以下に該当の情報を記載します:
1位: 「かがみの孤城」 (辻村深月)
2位: 「コンビニ人間」 (村田沙耶香)
3位: 「九月が永遠に続けば」 (恩田陸)
以下略
1位は正解。2位は2017年の9位の作品、3位は2004年のホラーサスペンス大賞だが著者は「恩田陸」ではなく「沼田まほかる」である。
どうしてChatGPTは間違えるのか?
ChatGPTがどのように学習しているか推論しているかを知れば理由が分かる。

どのように大規模言語モデルが動作しているのかを理解すれば、ChatGPTの推論(検索等も含む)が間違えるのは必然であることが理解できる

ChatGPTを検索エンジンのように使っても間違いが返ってくることが多い。ChatGPTは、物事について質問してもネットの情報を検索することをしないのである。
ChatGPTは何をしているか?
ChatGPTが実行しているのはテキストの一部に空白があることを前提として"Complement"≒"穴埋め"する処理である。本質的には「国語の穴埋め問題」と一緒である。
〇〇〇〇〇に当てはまる言葉を入れなさい。
吾輩は猫である。名前はまだない。どこで生れたか頓と見当がつかぬ。
何でも薄暗いじめじめした所で〇〇〇〇〇泣いていた事だけは記憶している。
正解は「ニャーニャー」
候補確率
ニャーニャー0.25
ミャーミャー0.25
シクシク0.05
ずっと0.02

ユーザーによる「問い合わせ」は「穴」がテキストの一番最後にある穴埋め問題ということになる。
ChatGPTはユーザーの質問に応じてネットを検索することはせず、入力された四則演算問題に対して実際に計算をしていない。

ChatGPTの学習は以下のように行われている。
  1. (穴の無い)大量のテキストを準備する
  2. ChatGPTの場合、他の大規模言語モデルとの比較から推定して、およそ1000Gバイト強のテキストを学習している。
    日本語wikipediaというネット上の巨大な百科事典は、日本人であれば誰もが知っているだろう。日本語版のテキスト量は2023年第1四半期で4Gバイト弱である。
    ChatGPTでは、その日本語wikipediの250倍以上のテキストを学習している。
    ちなみに日本語wikipediaのテキスト量は、平均的な日本人が一生の間に聞く日本語と読む日本語を合計したテキスト量の数倍と推定できる。
    (平均読字時間(長編小説を10万字、200キロバイトとして計算)、メディアの平均視聴時間、米メリーランド大学の一日に発声する単語数の調査データによる推測)
  3. テキストの一部をわざと空白にしてランダムなパラメータを使ってChatGPTの推論を行う
  4. 穴のサイズは、数トークン(トークン≒単語)だったり、100トークンだったり、一カ所にまとまっていたり、複数箇所に散らばっていたり様々。
    初回の結果は、単語の発生頻度の情報は反映しているが、脈絡の無いテキストをを発生しているだけである。
  5. 生成したテキストと、元のテキストの違いを小さくするように3500億(GPT-3の1750億とPaLMの5400億のパラメータ数と性能から推定)のパラメータを0~1.0の間の数値として調整する
  6. 大量のテキストで何度も繰り返すことで穴埋め問題の正答率が上がる。
  7. 繰り返し学習して十分な正答率が得られれば学習完了
  8. 学習したテキスト以外の入力に対する穴埋め問題でも十分な正答率が得られる(汎化という現象)。
ChatGPT is the evolution of the GPT model,(which stands for Generative Pre-trained Transformer.)
1トークンのcomplementation
ChatGPT is the ○○ of the GPT model,

evolutionを空白にして、evolution以外のトークンから空白のトークン(正解はevolution)を学習する
ChatGPT is the evolution of the ○○ model,
2トークンのcomplementation
ChatGPT is ○○ of the ○○ model,
ChatGPT ○○ the ○○ of the GPT model,
3トークン以上のcomplementation
ChatGPT is evolution of the GPT model, which ○○ for ○○ ○○ Transformer.
ChatGPT is the ○○ of the ○○ ○○, which stands ○○ ○○ ○○ ○○.
学習するパラメータはどのようなものか簡単に説明する。
  1. テキストをトークンに分解する
  2. トークンとは単語のようなもの。進行形のingなどは別トークンとなるので厳密には単語とイコールでは無い。
  3. 各トークンを数百~数千次元のベクトルで表現して、このベクトルの値を学習する。
  4. 簡単な3次元のベクトルだとすると、たとえば「男」と「女」は以下のようになる。
    男 = [0.56,0.01,0.23]
    女 = [0.06,0.61,0.20]
    
    学習したのが2単語だけであるとするとパラメータの数は非常に少ない(おそらく100に届かないくらいのパラメータ数。入力トークンのベクトルに加えて入力トークンと深層学習ネットワーク、ネットワーク同士、ネットワークと出力出力トークン との結合の重みがあることに注意)。こんなに小規模では何にもできないが、...)
  5. 学習するパラメータ総数が100億個を超える当たりから、上記の穴埋め問題を学習した場合の正答率が急激に上がってくることが分かっている。
  6. GPT-3では億のパラメータを学習している。ChatGPTでは3500億程度(推定)、GPT-4では5000億~数兆個(推定値:100兆個という報道もあるが間違い)のパラメータを学習しており、 Googleの最新の大規模言語モデルのパラメータも1兆個を超えている。
  7. 大量のテキストで数千億のパラメータを学習する
  8. GPT-3では1000Gバイトのテキストを使って学習している。日本語wikipediaのテキストは4Gバイト弱(2023年)である。 日本語wikipediaの250倍のテキストを使って数千億のパラメータを学習しているということになる。

大規模言語モデル(ChatGPT)の精度を上げる3つの方法(大規模化/プロンプトエンジニアリング/既存プログラムとの組み合わせ)

3つの方法とは、(1)言語モデルの大規模化、(2)プロンプトエンジニアリング(ファインチューン)、(3)既存プログラムとの組み合わせである。
ここで挙げる3つの方法とは別の提案も複数なされている。2023年7月時点で、実際のシステムができていない、できているが未評価、できているが精度が期待するほど高くないということで本稿では取り上げない。
たとえば、医学論文、法律と判例といった特定分野のテキストに絞って言語モデルを作ることで精度を上げるというシステムの開発がなされている。ChatGPTでも限定モデルか公開されていて使うことができる。
  1. 大規模化による精度向上(ユーザーに提示された選択肢の中からもっとも規模の大きいモデルを選択する)
  2. 言語モデルの規模=パラメータ数を大きくすることで、言語モデルの全てのタスクの精度が向上する。
    大規模化のためのパラメータの再学習は、膨大なマシンパワーと電力を必要とする。ユーザーレベルで手を出すことは稀で、ほぼ言語モデルを提供する側(大企業・大学・研究所)が行っている。
    ユーザーができるのは、提供されたモデルの選択肢の中から、より大規模なモデルを選択することである。
  3. 60%~90%の精度を得るにはプロンプトエンジニアリング(ファインチューン)が本命
  4. 大規模言語モデルが学習に使っている「穴埋め問題」に立ち返って考えてみよう。
    「母親は花子を叱った「○○○なさい!」」
    
    上記の情報だけでは、早くしなさい」「静かにしなさい」「片付けなさい」などいろいろな可能性があり、絞り込めない。
    「花子は30分経ってもご飯を食べ終わっていなかった。母親は花子を叱った「○○○なさい!」」
    「電話をしているのに花子は騒いでいる。母親は花子を叱った「○○○なさい!」」
    「ご飯の時間なのに花子はおもちゃを出しっぱなし。母親は花子を叱った「○○○なさい!」」
    
    プロンプトを補うということは、前後の文脈や手がかりを追加するということで、ChatGPTは文脈の情報を使って、より的確に穴埋め問題を解くことができるのである。
    その他、プロンプトの最後の方に重要な情報を記述した方が、解答の精度が向上する。
    言語生成AIの入力文、最初と最後に“重要情報”を入れた方が良い結果に 米スタンフォード大などが検証
    ChatGPTが生成したとばれないようにするためには、「文語調で解答すること」「格式高く解答すること」といったような指示を入れると良い
    GPT検出ソフト、非ネイティブの英語小論文の大半をAI生成と誤判定
    など用途に応じた様々な「コツ」が調べられて論文やネットで公開されている。

    プロンプトエンジニアリングに関連して、より効果の高い方法がある。その方法は"Chain of thought"論文で提示された手法「思考連鎖教授によるファインチューン」である。
    ファインチューンとは、プロンプトとプロンプトに対して生成すべき理想的な回答テキストをペアにしたデータを数十~数十万(数は問題の難易度による)用意して、 大規模言語モデルのごく一部の層の学習のみをやり直す処理である。
    大規模言語モデルのパラメータの大部分は固定したままで、一部だけを再学習するすることで、低い計算コストでニューラルネットワークの精度を向上させるテクニックの一つである。

    "Chain of thought"論文の研究におり、ユーザーの入力(質問文や依頼文)に対して、いきなり回答を生成するのではなく、回答に至る思考過程を補うことで回答の精度が著しく向上することが判明している。
    ユーザーが思考過程を補うのは大きな労力が必要となるが、繰り返すうちに大規模言語モデルが「思考過程の補い方」を学習するのである。
    10,000件ほどの問題に対して、解答までの思考過程を補うだけで、大規模言語モデル GPT-3の1750億パラメータのモデルで10%以下だった算数文章題の正答率が30%台に、 大規模言語モデル PaLMの5400億パラメータのモデルで30%台だった正答率が50%台に向上している。

  5. 90%~の精度を得る方法=推論・計算部分のフック(横取り)
  6. 詳細は上記のリンク先において説明するが、既存のソフトウェアに、大規模言語モデルを利用した言語的なインターフェイスを付ける組み合わせシステムである。
    既存のソフトウェアを前提としているため、用途の限定されたチャットボットということになる。
    金銭が関わる請求書や見積もりの発行、財務諸表の作成、家庭教師代わりの教育ソフトなどが相当する。医療分野や法律分野での利用には 現状では専門家のチェックが欠かせないが、将来的に全てAIに任せるタスクも生まれるかも知れない。

    たとえば、数式処理システムを考える。
    2023年5月時点でChatGPT(GPT-3.5と同等規模)に問い合わせた結果、以下のように少し複雑になると頓珍漢な回答を生成する。
    プロンプト:22-(4*5-3*X)=20のXはいくつでしょうか
    
    ChatGPT:式を整理すると、 22-20+15X=20 2+15X=20 15X=18 X=1.2
            よって、Xは1.2です。
    
    プロンプト:22-(4*5-3*X)=20のXはいくつでしょうか
    
    ChatGPT:式を整理すると、 22-20+X=20 X=-2
            よって、Xは-2です。 
    
    そこで、既存の数式処理ソフトウェアを使うことを前提とする。数式処理ソフトウェアは、(連立)方程式を解いたり、単位を変換したり、時には文章題を解いたりするソフトである。
    問題文の解析をChatGPTで行い連立方程式のように、数式処理システムの入力に合致するようなフォーマットのテキストを出力する。この場合は数式の部分である。「はいくつでしょうか」を取り除いたり、 "×"を"*"に置換したりする。
    数式処理システムによって方程式は処理されて、出力である"X=6"と式の展開過程を、ChatGPTのプロンプトとして、テキストを生成、ユーザーに提示する。

1.大規模化による精度向上(ユーザーによる参入は困難)

ChatGPTより精度の高い言語モデルを開発するには、GPUを数百~結合したグリッドコンピューターが必要となる。
ChatGPTより大規模な言語モデルを、ローカルのパソコンで学習することは現状の技術ではできない。
ただしChatGPTより規模の小さい大規模言語モデルが数多く存在している。その中にはローカルなPCでも実行可能なものが入手できるChatGPT(3.5)に匹敵する「Llama 2」をローカルPCで動かしてみた
残念ながら精度はChatGPTよりも低いようである。
学習を特定用途のテキストに限定することで、学習した特定分野に限ってはChatGPTに近い精度あるいは超える精度を達成することができるようになるらしい。これは確かに効果が認められるようである。
ただし学習していない分野の応答精度は非常に低いものとなる。

トークンを日本語に限定して精度を上げるという試みもある。 大規模言語モデルの多言語間転移学習(ドイツ語で学習した後にフランス語で転移学習)や多言語混在学習(ドイツ語とフランス語のトークンを混在したまま学習)に関する論文の結果から考えると 類似言語間では、単一言語だけで学習するよりも複数言語のトークンを使った多言語学習の方が優れているようである。
日本語、中国語、韓国語のような欧米語とは異なる場合は、2019年時点では多言語同時学習には注意が必要であるようである。

筆者の経験では、深層学習の精度を上げるには、学習をコントロールする様々なパラメータやアルゴリズム、ニューラルネットワークの規模や構成をゴチャゴチャ調整するよりも、 学習データをより多く用意する方が効果がはるかに大きい。日本語だけで学習したモデルの精度は、長期的には日本語+英語や中国語、欧州語、アジア圏の言語などを全て合わせた 学習したモデルの精度には追いつけなくなるように思える。
1兆個のパラメータをメモリ中にロードするだけで、一つのパラメータを4バイトとしても4000Gバイトのメモリが必要となる。Windowsやlinuxが動作するパソコンはハード的な制約で128Gバイト(一部256Gバイト)の メモリしか積載することはできない。精度を少し犠牲にして、4bitあるいは8bitで一つのパラメータを表現するモデルでも、パソコンレベルでは対応することはできない。
そして一枚500万円クラスの高性能GPUを256枚用意して(サーバー・設備も含めて30億円くらいの設備費用)、月額1000万円超の電気代を使って学習できる組織だけが、より規模の大きい言語モデルを作ることができる。
NVIDIA® NVLink® Switch System により、最大 256 個の H100 を接続し、エクサスケールのワークロードを高速化できます。 さらに、専用の Transformer Engine を利用することで、パラメーターが兆単位の言語モデルを実装できます。
ChatGPTは有料オプションでGPT-4という5000億~数兆パラメータ(未公開だが、同クラスの大規模言語モデルから推定)のモデルをサポートしているが、同じ問い合わせに対する精度は明らかにGPT-4の方が高い。
ChatGPTの半分くらいのパラメータ数のGPT-3という1750億パラメータの言語モデルで米国の司法試験を解いた場合は、下位10%に入る成績であったのに対して、 GPT-4というChatGPTよりも規模の大きい5000億~数兆パラメータの言語モデルでは上位10%の成績を出している(最新・最高性能の大規模言語モデルGPT-4は果たして「AI研究」なのか)。
歴代の自然言語処理モデルのスコア推移を見ると、ChatGPT登場以前の大規模言語モデルは徐々に人間のスコアに近づいて、一部は上回っていることが分かる。
マイクロソフトのBingやグーグルのBardもパラメータ数を増やす方向に進んでおり、グーグルが試作している最先端モデルは1兆5千億パラメータを超えている。
プロンプトエンジニアリングやファインチューンを使わないで、算数文章題(一変数の四則演算)を解かせた場合、1750億パラメータのGPT-3モデルでは10%以下の正答率であるのに対して、 5400億パラメータのPaLMというモデルでは正答率が30%となっている (正答率はプロンプトエンジニアリングを組み合わせることで、さらに20~30%上乗が可能、GPT-3(1750億パラメータ)+プロンプトエンジニアリングで30%台、PaLM(5400億パラメータ)+プロンプトエンジニアリングで50%台となる)

ChatGPTならGPT4モデル

ChatGPTの有料プランである、ChatGPT plusを利用すると、GPT-4を利用することができる。2023年7月時点での画面は以下の通りである。 この時点でGPT-4による、時間当たりのチャットの回数は制限されている。制限は徐々に緩くなっているが、それでもかなり厳しい回数制限である。
通常はChatGPTでのチャットはGPT-3.5ベースとなる。画面上のボタンでGPT-4を選択することで、GPT-4ベースのチャットを行うことができる。
chatgptplus
算数の文章題で試してみよう。
算数の文章題を解いてください。
ある42人のクラスで国語と算数のテストを行いました。
テストの結果を集計すると算数の合格者は28人で、国語の合格者は25人、
両教科とも合格した者は17人でした。
両教科とも不合格だった者は何にんでしょうか?

/* GPT-3.5では不正解 */
両教科とも合格した者は17人であり、算数の合格者は28人、
国語の合格者は25人です。
両教科とも合格している人数よりも算数の合格者数や国語の
合格者数の方が多いことから、
両教科とも不合格だった者の数は次のように計算できます。
算数の合格者数(28人) + 国語の合格者数(25人) - 
 両教科とも合格した者の数(17人) = 36人
したがって、両教科とも不合格だった者は36人です。

/* GPT-4では正解 */
この問題は集合の問題として解くことができます。
まず、全体の学生数は42人です。
次に、算数の合格者は28人、国語の合格者は25人、
そして両教科ともに合格した学生は17人と与えられています。
しかし、両教科ともに合格した学生の数(17人)は、
算数の合格者の数と国語の合格者の数にそれぞれ含まれています。
したがって、算数と国語の合格者の総数は、28人と25人を足した数
(53人)から17人を引いた数、つまり36人となります。
全体の学生数42人から、算数または国語のどちらか一方でも
合格した学生の数(36人)を引くと、両教科ともに不合格だった
学生の数が求まります。
したがって、両教科ともに不合格だった学生の数は、
42人 - 36人 = 6人となります。

コラム「ぬるぽ」「ガッ!」

10年以上前の話となるが、一部のプログラマクラスタで「ぬるぽ」という問いかけに対して「ガッ」と応えることがはやった。 バグの原因や結果となる"ヌルポインター"が値となる場合にショックを受けるということが由来であるが、特に意味も無く使われることの方が多い。 標準ChatGPTとChatGPT+GPT-4との違いを象徴するような結果なのでコラムとして紹介する。
コラム ぬるぽ がっ
AIに「ぬるぽ」と送った結果に「吹いた」 ChatGPTに"ぬるぽ"と問いかけると、「ゲッ!」と応えてしまう。
 3文字以内で返答してください
  ぬるぽ
  ゲッ!
ChatGPTの3500億パラメータ(推定値、GPT-3の1750億より多く、PaLMの5400億より少ないとみられている)のモデルでは出力した「ガッ」と「ゲッ!」のベクトル表現に差異が無い(しかも「ゲッ!」の方が高い)ためこのような現象が発生していると思われる。
ところが大規模言語モデルを5000億~数兆パラメータ(PaLM以上という推定値)のGPT-4に切り替えると、
 3文字以内で返答してください
  ぬるぽ
  ガッ
正しく答えが返ってくる。GPT-4になっても、トークンの種類数は大きくは変わらないが、パラメータ数は数倍になっている。
トークンのベクトルの次元やニューラルネットワークの規模が増えため、「ガッ」と「ゲッ!」の出力のベクトル表現に差異が生じて正しい答えが返るようになったと理解できる。

大規模化の限界

大規模化を進めていくことで、穴埋め問題の精度が上がることは確かであるが、それだけでは限界にぶつかる。
その理由は以下の通りである。
  1. 学習対象のテキストの規模が飽和状態にある
  2. 大規模化の一つの要素である学習テキストの量が増えない。現状で数TBのテキストを使って学習している。 日本語wikipediaのテキストは、2023年時点で4GB弱なので、実に日本語wikipediaの数百倍のテキストを使って学習している。 今後もwebに集積していくテキストを増やしていくことが考えられるが、以下の懸念がある。
    さらに、大きな問題を次に挙げる。
  3. 今後の人類社会に追加されるテキストにはAIが生成したものが急速に増える
  4. AIが学習済みのテキストを学習データに加えると「過学習」という弊害が生じることが報告されている。
    生成AIに“生成AIが作った文章”を学習させ続けるとどうなる? 「役立たずになる」と英国チームが報告 この問題は、AIにとって致命的に深刻である。大規模言語モデルが作ったテキストを、大規模言語モデルで学習すると、欠点が累積的に拡大していく。学習を繰り返すことで、AIがどんどん「バカ」 になるのである。画像の生成モデルにおいても同様の現象が観察されている。 生成AI汚染が進む前に、早急に人間が作ったテキストとAIが作ったテキストを区別できるようなマークを設定しないと、今後生成AIの学習対象テキストを増やすことは絶望的になる。
    この問題の深刻さ故に、生成AI元年である2022年時点の(生成AI汚染されていない)テキストや画像をアーカイブとして残しておくことが、生成AI開発者にとっても定石となっている。
    2023年以降の学習に追加されるテキストは、明らかに人間が作ったテキストだと分かる、ごく少数のものに限定される可能性がある。
  5. パラメータ増大に伴う計算量の増加と必要な電力の増大
  6. 今の手法では、並列処理をしたとしても一つの出力を得るまでに数十秒かかる可能性がある。またパラメータ数が増大するほど並列化に必要なGPUの数が増える。
ただ、学習テキストの大規模化の困難に対して、パラメータ数の大規模化の困難は小さい。今後はパラメータ数を増やしていく方向がメインになると思われる。
さらに言えば、大規模言語モデルの精度向上の方策としては、大規模化によるスケールメリットよりも、次のプロンプトエンジニアリングの方が効果が大きい。
プロンプトエンジニアリングは、ユーザー側で取り組めることもあり将来的に大きな産業となるだろう。

2.60%~90%の精度を得るにはプロンプトエンジニアリング(ファインチューン)が本命

大規模化は言語モデル開発企業頼りだが、プロンプトエンジニアリングやファインチューンは使う側で対応することが可能である。費用もかからない。
優秀なファインチューン技術者を雇用するのに高額の報酬が必要であるが、大規模化に伴う設備投資に比べれば微々たるものである。

上で説明したように大規模言語モデルでは「穴埋め問題」で学習している。穴以外の地のテキストを頼りに空白部のテキストを確率的に生成する。ChatGPTなどでユーザーと会話している ように見えるやりとりとは? 大規模言語モデル(ChatGPT)にとっては前半にあるプロンプトと呼ばれる入力文を手がかりに、後半の空白分を埋める「穴埋め問題」にすぎない。
当然、穴以外の地のテキスト部分の情報が多いほど、穴埋めの精度は上がる。また、地のテキストで具体的な指示があるほど、穴埋めの妥当性が上がる。たとえば、 「100文字以内で」という指示があれば、回答は短くまとまるし、「小学生に分かるように」という指示があれば、方程式を使わないで算数の文章題を解く。 2023年7月時点では具体的に指示しても無視されることも、数回に一回程度の頻度であるが、いずれ解決されるであろう。

プロンプトの書き方次第で回答の精度が上がる。書き方のこつを身につけることが大事になる。
書き方のこつを身につけた人を「プロンプトエンジニア」と呼ぶこともあるが、こつを身につけただけで高給をもらっているかと問われれば、そのような事は無い。
こつには以下のようなものがある。
こつだけではなく、プロンプト=問い合わせに対して「回答に至るまでの専門家の思考過程」を、テキストで記述できる技術者が真の「プロンプトエンジニア」である。
「プロンプトエンジニア」は、専門分野の知識をステップ分解してAIに教えることができる教師のような役割を果たすエンジニアである。AIの知識と専門分野の知識の両方を 兼ね備えていなければならない。医学分野であれば「プロンプトエンジニア」は医学に精通している必要がある。法律分野であれば、法律や判定に関する広範な知識を持った専門家である必要がある。
1990年以前の第五世代コンピュータプロジェクトなどで知られている第2次AIブーム時代に、専門家の知識をルール化したシステム(エキスパートシステム)を開発するKnowledge Engineerという存在があった。 彼/彼女らもルールベースのAIの知識と専門知識の両方を求められた。プロンプトエンジニアは、Knowledge Engineerの現代版と言っても良いだろう。
ハイブリッドな技術・知識を必要とする高度な技能者で、破格の待遇で雇用されるのも当然である。

本稿では、小学校の算数の文章題を題材にしている。方程式を使わないで未知数が複数の問題を解く必要があるなど多少の専門性は必要であるが、理系の大学に進んだ人なら対応可能である。 ふつうは高度に専門的な分野の専門的は知識が必要となる。
専門的な知識を必要とするプロンプトエンジニアリングの例を簡単なものから3つ挙げていく。

ChatGPT+GPT-4 VS Bing

ここで、GPT-4ベースのChatGPT(有償)とマイクロソフトのBingでの算数文章題の解法のケース分析をしてみたい。統計的な分析については、ファインチューンのインプリメントのところで行う。
なお、OpenAIのPlaygroundで、ファインチューンしていないベアな大規模言語モデルとの動作比較から考えて、 GPT-4ベースのChatGPT(GPT-3.5ベースも同様)は明らかに算数文章題に関するファインチューンをしているように思われる。
Bingも同等の回答を返すので、ファインチューンあるいはそれ以上の工夫を組み合わせているように思われる。

2023年7月時点の比較結果であるが、ChatGPT+GPT-4とBingは、一長一短、ほぼ互角といえる。
小学生向けの説明については、未知数が一つの場合は、半分以上はうまくいく。
未知数が二つの場合、小学生向けの説明を求めても方程式を使ってしまったり、方程式を使わない場合も人間の教師には及ばないケースが多い。
Bingは、難易度の低めの問題の一部で人間の教師並みの説明をしてくれることもある。

ChatGPT+GPT-4は正解:Bingは不正解
特に指定しなくても方程式を使わないで解いている
長さ200mの列車Aが秒速20mで、長さ150mの列車Bが秒速15mで、同じ方向に進んでいます。 列車Aが列車Bに追いついてから追いこすまで、何秒かかるでしょう。
GPT-4
列車Aが列車Bに追いつき、追い越すためには、
列車Aは列車Bの長さと列車A自身の長さを合わせた距離
を進む必要があります。
それは、200m(列車Aの長さ)と150m(列車Bの長さ)を
合わせた350mです。
しかし、列車Bも前進しているため、列車Aが追いつく速
度は、列車AとBの速度差となります。
それは、20m/秒(列車Aの速度)と15m/秒(列車Bの速度)
の差、つまり5m/秒です。
したがって、350mを5m/秒で進む時間は、
350m ÷ 5m/秒 = 70秒です。
従って、列車Aが列車Bを完全に追い越すまでには70秒
かかることになります。
Bing
列車Aが秒速20mで、長さ200mの列車Aが長さ150mの列車Bに
追いつくまでにかかる時間は、45秒です1
列車Aが列車Bに追いつくまでの距離は、
列車Aの長さ+列車Bの長さです。
列車Aを止めて考えると、列車Bが時速100-20=80km/hで
走行していることになります。
列車Bが追いつくまでにかかる時間は、距離÷速度で求め
られます。よって、答えは45秒です 。


ChatGPT+GPT-4、Bingともに正解
小学生向けの説明はいずれも×(ChatGPT+GPT-4は力ずく(「この計算を続けてみると」の部分)、Bingはいきなり解に飛躍)
現在、しんのすけは5才、みさえは29才です。 みさえの年齢がしんのすけの3倍になるのは何年後でしょう。
GPT-4
しんのすけが5才、みさえが29才の現在から数えて、
みさえの年齢がしんのすけの3倍になるのは何年後か
計算しましょう。
みさえの年齢を3倍した数値がしんのすけの年齢になるとき、
その年数を求めます。
式を立ててみると、以下のようになります:
みさえの年齢(29年 + x年) = しんのすけの年齢(5年 + x年) * 3
この等式を解くと、以下のようになります:

29 + x = 3 * (5 + x)
29 + x = 15 + 3x
29 - 15 = 3x - x
14 = 2x
x = 7

したがって、みさえの年齢がしんのすけの3倍になるのは7年後となります。

小学生向けに方程式を使わないで説明してください
もちろんです。小学生向けにシンプルな方法で説明しますね。

しんのすけが5才で、みさえが29才ですね。みさえの年齢が
しんのすけの3倍になるまでには何年かかるか考えてみましょう。
みさえとしんのすけが同じ歳を取るのは1年後ですね。
それから、みさえの年齢がしんのすけの年齢の3倍になるまで、
しんのすけはどれくらい歳を取る必要があるか考えます。
みさえの年齢がしんのすけの3倍になるということは、しんのす
けの年齢を3倍した数字がみさえの年齢になるということです。
つまり、しんのすけが6歳になったとき、みさえは18歳(6歳x3)
にならなければなりません。
しかし、その時にはみさえはすでに30歳です。それはすでに
しんのすけの年齢の5倍です。
次に、しんのすけが7歳になったとき、みさえは21歳(7歳x3)
にならなければなりません。
しかし、その時にはみさえはすでに31歳になっています。
これもまた、しんのすけの年齢の4倍以上です。
この計算を続けてみると、しんのすけが12歳になったとき、
みさえは36歳(12歳x3)になるべきです。
その時にはみさえは36歳になっています。
それでは、この条件が満たされるまでに何年かかるかを考えて
みましょう。
しんのすけが現在5歳で、12歳になるまでには7年かかります。
したがって、みさえの年齢がしんのすけの3倍になるのは
7年後となります。
Bing
この問題は、年齢の増加を考えることで解決できます。
しんのすけとみさえの年齢がそれぞれ増加すると、みさえの
年齢はしんのすけの3倍になります。
みさえの年齢がしんのすけの3倍になるまでの時間をx年とすると、
しんのすけの年齢は5+x歳、みさえの年齢は29+x歳です。
みさえの年齢がしんのすけの3倍になることから、
29+x=3(5+x) 29+x=15+3x 2x=14 x=7
したがって、みさえの年齢がしんのすけの3倍になるのは、7年後です。
結論として、みさえの年齢がしんのすけの3倍になるのは7年後です。

小学生向けに方程式を使わないで説明してください
もちろんです。方程式を使わずに、次のように考えることができます。

現在、しんのすけは5才、みさえは29才です。
1年後、しんのすけは6才、みさえは30才になります。
2年後、しんのすけは7才、みさえは31才になります。
このように、年々年齢が増加していきます。
みさえの年齢がしんのすけの3倍になるまで
何年かかるかを考えます。
7年後、しんのすけは12才、みさえは36才になります。
このとき、みさえの年齢はしんのすけの3倍になります。
したがって、みさえの年齢がしんのすけの3倍になるのは、
7年後です。
結論として、みさえの年齢がしんのすけの3倍になるのは
7年後です。


ChatGPT+GPT-4は不正解 / Bing正解
ChatGPT+GPT-4は方程式を使っていないが不正解:BIngは正解だが方程式を使っている
小学生にも分かるように解いてください。
1周30kmの湖の周りを、プリウスは時速60kmで、
フェラーリは時速240kmで、同じ場所から同じ方向に進みました。
フェラーリがプリウスを追い越すのは、出発してから何分後でしょう。
GPT-4
プリウスとフェラーリが1周30kmの湖の周りを走るという
問題ですね。
プリウスが時速60km、フェラーリが時速240kmで進む場合、
フェラーリがプリウスを追い越すのは出発してから何分後か
を考えます。
まず、時速60kmで走るということは、1時間に60km走るとい
うことです。
同様に、時速240kmで走るということは、1時間に240km走る
ということです。そして、1時間は60分です。
それでは、それぞれが1分間にどれくらい走るか計算してみましょう。

プリウスは1時間に60km走るので、
1分には60km ÷ 60分 = 1km走ります。
一方、フェラーリは1時間に240km走るので、
1分には240km ÷ 60分 = 4km走ります。
フェラーリはプリウスよりも早く走るので、
プリウスが1周分(30km)走り終わる前にフェラーリは追い越します。
実際には、フェラーリはプリウスが湖の
半周(30km ÷ 2 = 15km)を走る前に追い越します。
なぜなら、フェラーリがプリウスを追い越すためには、
フェラーリが湖の1周(30km)を走り、その間にプリウスが湖の
半周(15km)を走る必要があるからです。
それでは、フェラーリが湖の1周(30km)を走るのにどれくらいの
時間がかかるかを計算します。
フェラーリは1分に4km走るので、30kmを走るのには
30km ÷ 4km/分 = 7.5分かかります。
したがって、フェラーリがプリウスを追い越すのは出発してから
7.5分後となります。
Bing
この問題は、速さ、距離、時間の関係を使用して解決できます。
速さは距離を時間で割ったものです。つまり、
距離=速さ×時間です。
プリウスは時速60kmで進みます。つまり、1時間で60km進みます。
1分で60km÷60分=1km進みます。
フェラーリは時速240kmで進みます。つまり、1時間で240km進みます。
1分で240km÷60分=4km進みます。
フェラーリがプリウスを追い越すまでの時間をx分とすると、
フェラーリが進んだ距離は4x km、プリウスが進んだ距離はx kmです。
フェラーリがプリウスを追い越すとき、フェラーリが進んだ距離は
プリウスが進んだ距離より30km多くなります。
つまり、4x=x+30 3x=30 x=10
したがって、フェラーリがプリウスを追い越すのは、
出発してから10分後です。
結論として、フェラーリがプリウスを追い越すのは、
出発してから10分後です。


以下の例では、ChatGPTが日々改良されていることが見て取れる。実例は挙げていないがBingも段階的に改良されている。
ChatGPT+GPT-4 不正解から正解に改良:Bing 正解
小学生向けの説明はChatGPT+GPT-4はダメ:Bingは完璧
さいころを1回ふって奇数の目が出ると30点、
偶数の目が出ると10点もらえます。これを20回繰り返すと、
得点は460点になった、奇数の目が出た回数を求めなさい。
GPT-4(6/30はダメ、7/10は良くなった) 方程式を使わないでとあっても方程式を使う。Bingは正解かつ方程式を使わない説明も完璧
/* 2023/06/30では不正解 */
奇数の目が出たときの点数を30点、
偶数の目が出たときの点数を10点としましょう。
この場合、奇数の目が出た回数をx、偶数の目が出た回数をyとします。
そして全体の試行回数が20回であることから、
次の等式を立てることができます:
x + y = 20 (1)

また、総得点が460点になったという条件から、
次の等式も立てることができます:
30x + 10y = 460 (2)

等式 (2) から10をくくり出すと:
10(x + y) = 460
よって:
x + y = 46 (3)
しかし、等式 (1) と (3) が矛盾しています。
20回の試行で460点を得ることは不可能で、
問題文に間違いがあるかもしれません。
再度問題文をご確認いただけますか?

/* 2023/07/10では正解! */
さいころの出目が奇数なら30点、偶数なら10点というゲームですね。
20回試行して合計得点が460点になる場合を考えます。

奇数の回数をx、偶数の回数をyとします。
xとyは以下の2つの方程式を満たすはずです。
方程式1: x + y = 20
この方程式はさいころを振った回数が20回であることを
示しています。

方程式2: 30x + 10y = 460
この方程式は得点が合計460点であることを示しています。
方程式2を整理すると、3x + y = 46になります。
これらの方程式を解くために方程式1から方程式2を引くと、
3x + y - (x + y) = 46 - 20
これを整理すると、
2x = 26
x = 26 / 2
よって、x = 13 となります。
したがって、さいころを振って奇数の目が出た回数は13回です。

方程式を使わないで解いてください
略(上記の生成テキストとほぼ同じ)

Bing
この問題は、線形方程式を使用して解決できます。
奇数の目が出た回数をx、偶数の目が出た回数をyとすると、
次のような方程式が得られます。

x + y = 20 (1) 30x + 10y = 460 (2)

(1)式から、y = 20 - x (2)式に代入すると、
30x + 10(20 - x) = 460 30x + 200 - 10x = 460 20x = 260 x = 13

したがって、奇数の目が出た回数は13回です。

方程式を使わないで解いてください
もちろんです。方程式を使わずに、
次のように考えることができます。

さいころを1回ふって、奇数の目が出ると30点、
偶数の目が出ると10点もらえます。
つまり、奇数の目が出ると偶数の目が出た場合より
20点多くもらえます。

20回繰り返して、得点は460点になりました。
もし、すべての回で偶数の目が出た場合、
得点は20×10=200点になります。
しかし、実際の得点は460点なので、
200点より260点多くなっています。

奇数の目が出ると偶数の目が出た場合より20点多く
もらえるので、260÷20=13回、奇数の目が出た
と考えられます。
したがって、奇数の目が出た回数は13回です。


方程式を使わないで解いてください(別解)
さいころを振って奇数の目が出ると30点、
偶数の目が出ると10点もらえるとのことです。
20回振って合計が460点となる場合、それぞれの
さいころの目が出る回数を求めるという問題ですね。

まず、全てのさいころの出目が偶数である場合を考えます。
全て偶数だとすると、10点が20回得られ、合計は200点となります。

しかし、実際の合計得点は460点なので、その差分である
260点分は奇数のさいころの目が出ていた回数によるものです。

奇数のさいころの目が出ると30点、
偶数のさいころの目が出ると10点なので、その差は20点です。
つまり、一回奇数が出るごとに20点ずつ得点が増えると
考えることができます。

そのため、260点は20点ずつ増えた回数と等しいです。
よって、260点 / 20点 = 13回となります。

したがって、奇数のさいころの目が出た回数は13回です。

ファインチューンのサンプルプロジェクト

OpenAIの大規模言語モデルのAPIを使って、算数文章題のファインチューンを行う。
2023年7月現在、ファインチューンAPIでGPT-4モデルは使えない(Chatで利用できるだけである)のでtext-davinch-003というGPT-3.5ベースのモデルでファインチューンを行う。
ファインチューンとは、すでに説明した通り、特定領域のプロンプトテキストと、理想的な回答テキストのペアを使って、大規模言語モデルを構成するニューラルネットワークの一部のパラメータだけを 再学習することで、出力精度を上げるテクニックである。

"Chain of Thought"論文では、四則演算を使った文章題を10,000題の教授データで才学修している。
相関関係から因果関係を推論するファインチューンでは、40万題の問題でファインチューンを行っている(大規模言語モデルは相関関係から“本当の”因果関係を推定できるのか? 40万個の問題で研究者らが調査)。 今回はプロトタイプなので、文章題30パターンのうちの1パターンだけ100題の教授データを作って試すことにする。
サンプルで作るプロジェクトは文章題の「通過算」とする。
「通過算」とは、列車や車、船などの乗り物が、ある地点・施設を通過したり、お互いにすれ違ったり、追い越したりする状況で、速度、距離、時間を計算する問題である。
たとえば以下のような問題がある(オリジナル問題)。
長さ200mの列車が、時速72kmで走行しています。
この列車が一定の速度でトンネルを通過するとき、
トンネルに入り始めてから完全にトンネルを出るまでに
4分20秒秒かかりました。
トンネルの長さは何mでしょうか?
上記をプロンプトにして、ChatGPTやBingに解かせると、何の指示もなければ方程式を立てて計算するので、正答率はそれなりにある。
「さらに小学生向けに方程式を使わないで解いてください」というプロンプトを付け加えることで方程式を使わない説明を、大規模言語モデルに生成させるというのが本課題の主旨となる。
そうすると、指示があるにも関わらず方程式を使ってしまったり、小学生に理解できない飛躍した説明をしたり、解答を間違えたりする。

そこでファインチューンを行うことで、小学生向けの説明の生成精度を上げようというのが本プロジェクトの趣旨である。先ほどの問題の場合、以下のようなプロンプトと目標生成テキストのペアを使う。
prompt
方程式を使わないで、小学生にも分かるように解答してください。
長さ200mの列車が、時速72kmで走行しています。
この列車が一定の速度でトンネルを通過するとき、
トンネルに入り始めてから完全にトンネルを出るまでに
4分20秒秒かかりました。
トンネルの長さは何mでしょうか?
tunetext
[トンネル,入り始め,完全に,出る]
[200mの列車,時速72km,4分20秒] 
[トンネルの長さは何m]
列車の速度は秒速に直すと20m/秒です。
4分20秒で進む距離は20*260=5200mとなります。
進む距離は列車の先頭がトンネルに入ってから列車の末尾が
トンネルを出るまでなので、
トンネルの長さ+列車の長さと等しくなります。
したがってトンネルの長さは5000mです。
答え 5000m
promptからtunetextまでが問題で、tunetext以降が解答の教師テキストとなる。

上記のペアを100題分用意して、jsonファイルに変換してから、90題分を使ってChatGPTのファインチューンAPIに渡す。改良済みの大規模言語モデルを生成する。
教授データの大部分は実際の中学入試問題から採用している。著作権の問題があるため公開はできない。改良済みの大規模言語モデルを使って残り10題(著作権の問題が無いオリジナル問題)の 得点(解答の正しさ、解説の正しさを評価)で、ファインチューンを行わないモデルと、行ったモデルでの得点を比較する。

2023年10月16日に報告を行う

プロンプトエンジニアリング(ファインチューン)の限界

大規模言語モデルが因果関係の推論ができるかどうかの、大規模な研究として
大規模言語モデルは相関関係から“本当の”因果関係を推定できるのか? 40万個の問題で研究者らが調査 が挙げられる。大規模言語モデルは「穴埋め問題」の学習装置であるがゆえに、「あることAが起こった時に、別のことBが起こる」という相関関係を見つけ出すことは得意中の得意である。
相関関係と因果関係とは別のものである。たとえば「背が高い人は知能指数が高い」という相関関係が実際に存在するが、「背が高いと知能指数が高い」という因果関係は存在しない。なぜなら 背の低い子どもよりも背の高い大人の方が、通常は知能指数が高いということを反映しているだけだからである。
され、前記の大規模研究では、因果関係について40万個のテキストを与えることでファインチューンを行ったたところ、ある程度因果関係を推定することができるようになったが、正答率は30~40% にとどまった。
やはり実際のエピソード記憶、感覚・情動経験と結びつかない、テキストだけの情報だけでは不足していることが分かった(記号接地問題)。

さらに、根本的な問題として、大規模言語モデルによる生成AIは、周辺のテキストから穴の中のテキストを確率的に推定しているだけである。大規模化で、キスト推定の精度が上がり、 穴のサイズが大きくても対応できるようになるが、基本的に「穴の中のテキストの確率的な推定」で複雑な推論が実用的な精度でできるようになるかは疑問がある。

3.90%~の精度を得る方法=既存プログラムとの組み合わせ

大規模言語モデルは「テキストの理解」と「テキストの生成」のタスクだけを見れば、人間の読解力や文章作成能力を凌駕しつつある。この「テキストの理解」「テキストの生成」部分だけを 利用して、数式処理システム、エキスパートシステム、データベース検索、業務ソフトのような「別プログラム」と組み合わせるという方法である。 「別プログラム」がサポートする領域固有の手法であることに注意されたい。
実際に存在する有名なシステムとしては、数式処理システムWolfram|AlphaとChatGPTの組み合わせである(詳細は、Wolfram|Alphaの開発者であるStephen Wolframが2023年に上梓した "What Is ChatGPT Doing ... and Why Does It Work?"を参照)。ChatGPTはユーザーの曖昧な入力を、数式処理言語"Wolfram|Alpha"に変換し、Wolfram|Alphaの厳密な精度100%の数式処理システムが数式を処理。 Wolfram|Alpha言語の出力をChatGPTがユーザーに分かりやすい自然言語で提示する。
既存プログラムとの組み合わせシステムは以下のような手順で実行される。
「「別プログラム」で処理できないデータが来たらどうするんだ」というような疑問があるかも知れない。詳細は既存プログラムとの組み合わせのサンプルプロジェクトに記述する。

ChatGPTがすごいと言われるのは、読解力と文章生成能力の高さである。四則演算を使うだけの文章題でも、かなりの読解力が必要な問題がある。
以下のような問題は、意味をつかむだけでも大変であるが、プロンプトを工夫することでChatGPTは解いてしまう。
高速道路に車が並んでいます。 
渋滞の最初の 15 分間に数台の車が通り抜け、
残りの 15 分間にさらに 20 台の車が通り抜けます。 
列から 5 台の車が出口を出るので、
渋滞を通り抜ける必要はありません。 
高速道路に元々 30 台の車があった場合、
最初の 15 分間に何台の車が渋滞を抜けましたか?
ChatGPT以降の大規模言語モデルの文章読解力と文章生成能力(創作能力では無い)は、アメリカの大学生のそれと匹敵するか、あるいは上回るレベルに達している。
最新のモデルでは、大学生の90%よりも上のレベルという調査結果もある。
ところが、推論/事実検索/計画という処理が加わると、プロンプトエンジニアリングを使った場合でも、小学生レベルの問題でもChatGPTと同等レベルのモデルで30%台、 GPT-4を使ったモデルでも50%台という正答率になってしまう。
大学生上級レベルの言語能力はそのまま生かして、推論/事実検索/計画という間違えられない部分だけ別プログラムで実行することで、「自信たっぷりに間違える」と 形容される、ChatGPTとうまく付き合っていこうというのが本稿の趣旨である。

大規模言語モデルの人間よりも優れた読解力、文章生成能力を利用する

誤情報も流暢に作成する対話型AI「ChatGPT」の科学への応用と危険性 ChatGPT(GPT-3.5版)で、600語程度で救急外来の患者の症状を入れることで、50%の精度で正しい診断を行う。実際の救急外来での診断としては低すぎるが将来的には50%以上の診断精度を得ることが可能

ChatGPT以前のAIが、人間のように言葉を操れなかったわけ 2015年にマイクロソフトからリリースされた日本語版chatbot「りんな」、短文の質問応答に対応できるが、長文でのやりとりには全くついていけず、会話のやりとりの文脈からもすぐに外れてしまう。
ChatGPTでは、長文、文脈、自然なテキストの生成など全ての点で「りんな」を上回っている。

アメリカ司法試験に合格するChatGPTの後継“GPT-4”とは何か? その可能性とリスクをさぐる AIの言語推論能力を調べるために設計されたテストである「MMLU」で自然科学や人文科学をはじめとした57のカテゴリーから出題される14,000題の多肢選択問題を解かせたところ。 GPT-3.5では正答率70.1%だったものが、GPT-4では正答率85.5%に(英語でのテスト)。日本語では5%程度低い。

「日本の大学生の9割は、文章力でChatGPTにかなわない」大学で教えるコラムニストが抱える憂い うっかり「良」を付けてしまうレベル。成績は上から「優」「良」「可」「不可」である。

既存プログラムとの組み合わせのサンプルプロジェクト

以前prolog言語によって作成した「算数文章題を解いて小学生向けに解法を提示する」プログラムの、文章題解析部分と解法のテキストを生成する部分をChatGPTに置き換える。
開発に必要な作業は以下の3つとなる。
  1. ChatGPTにより、入力プロンプト=算数文章題をPrologによる算数文章題ソルバの入力中間表現にするためのChatGPTのファインチューン。
  2. Prologのソルバを、ChatGPT向けの入出力にフィットするように改良する。
  3. 算数文章題の出力中間表現を、ユーザーに提示するテキストに変換するためのChatGPTのファインチューン
システムができ次第プログラムを公開する。

prologプログラムの構成は、簡略化すると以下の通りである。
prologによる算数文章題解法提示プログラム
実際の算数文章題の例を使った処理例を以下に示す。
処理内容・入出力データ
算数文章題ツルとカメが合わせて8匹、足の数が合わせて26本であるときツルとカメは何匹(何羽)いるか。ただしツルの足は2本、カメの足は4本である。
ボトムアップチャートパーサー
入力中間表現ChatGPTとの組み合わせシステムに、ほぼ同じ
prolog言語による算数文章題ソルバ
出力中間表現ChatGPTとの組み合わせシステムに、ほぼ同じ
解説テキスト・解説図生成
もう少し詳しい内容をprologによる算数文章題の解法提示チャットボットの開発で説明してるので興味のある方は参照してください。 今回開発する、規則プログラムとChatGPTとの組み合わせシステムは、簡略化すると以下の通りである。
ChatGPT+prologによる算数文章題解法提示プログラム
処理内容・入出力データ
算数文章題ツルとカメが合わせて8匹、足の数が合わせて26本であるときツルとカメは何匹(何羽)いるか。ただしツルの足は2本、カメの足は4本である。
ChatGPT(入力中間表現を出力するようにファインチューン済み)
入力中間表現
top_unit(sum,8,["ツル","カメ"],["匹","匹"]).
top_attr(sum,26,"足の数","本").
howmany(["ツル","カメ"]).
prolog言語による算数文章題ソルバ
出力中間表現
generate([全てを,ツル,に置き換えると,足の数,は,16,本,になります。]).
generate([1,羽,が,カメ,になると、,足の数,は,2,本,増えます。]).
generate([5,羽,が,カメ,になると、,足の数,は,10,本,増えて,26,本,になります]).
generate([答えは,ツル,3,羽,カメ,5,匹,です]).
ChatGPT(入力中間表現を元に、解説テキストを生成するようにファインチューン済み)
中間表現は将来的に変更する可能性が高い。変更した場合は本稿で更新する。
学習用文章題は全て、実際の中学入試問題を利用するため、著作権上の問題からデータの公開はできない。検証用の文章題(全体の10%)は、全てオリジナル問題とするためデータの公開対象とする。
上に戻る