ノーコードでわかる ChatGPTの精度向上法「RAG」入門2(ChatGPT 4版)
こんにちは!
ノリトです。ChatGPT使ってますか?
プロンプトいじっても、思ったような結果が出ない?
そんな時は、RAG(ラグ)です。
本記事では、引き続きChatGPTのプロンプトを使って、
体験的にRAGを紹介していきます。
この記事を読めば、非エンジニアでも、
RAGの基本とChatGPTの能力の限界がわかります。
この知識は、My GPTsのデザイナーに必須の知識です。
第2回にあたる今回は、My GPTsの入口として、ChatGPT 4を使って説明します。
この記事は、大阪のIT専門学校「清風情報工科学院」の校長・平岡憲人(ノリト)がお送りします。
清風情報工科学院では、情報処理系の講師を急募しております。
ご興味のある方はこちらの記事を御覧ください。
ノリトについては、こちらの記事を。
1.その1の振り返り
その1では、無料版のChatGPT(GPT 3.5)を利用して、ChatGPTの精度向上法「RAG」の基本を説明しました。
具体的には、次のことを説明しました。
RAGは、生成AIが知らない情報を正確に答えられるようにするのに使う。
RAGは、外部の情報を検索してそれをもとに回答させる技術。
ChatGPTは、JSONという形式の情報を扱える。
ChatGPTは、プロンプトにおいて名前でデータを呼び出せる。
GPT3.5は、利用料金が安いが、とりわけ検索能力に限界がある。
ところで、ChatGPT、とりわけ有料版のChatGPT 4は、人間かと思われるような能力を持っています。
従来のコンピュータ=正確すぎて融通の効かない機械ではありません。
生成AIは、正確に徹するでも、いい加減に徹するでもなく、ものごとを「大体」理解する機械です。
その上で、「人間が喜びそうなことを言う機械」です。
情報を大体理解して、大体正しいことを言う、
これはある意味人間らしい行動です。
我々は本を読んでも、全ページの全単語を覚えているわけではなく、「大体こういうことが書いてあった」、と覚えている程度です。
詳しさの度合いは人によります。
この大体の理解を実現する方法が見出され、生成AIは膨大な知識を記憶・活用できるようになりました。
また、生成AIは「人間が喜びそうなことを言う」だけなので、真に受けてはいけません。
ChatGPTは、発言の責任をとることはありません!
だって、あなたを喜ばせたかっただけなのよ、と言われるのがオチです。
ChatGPTには、2種類あります。
・GPT 3.5
・GPT 4
の2つです。
この2つは能力が違います。
・GPT 3.5 ・・・ 難しい話は無理、細かい話も無理、楽しく適当に!
・GPT 4 ・・・ 少々難しい話もOK、少々細かい話もOK、親身に相談!
かかる費用も
・GPT 3.5 ・・・ 安い
・GPT 4 ・・・ 高い(少なくとも10倍以上)
となっています。
この記事では、GPT 4を使い、GPT 3.5と比較しつつRAGの基本を説明いたします。
なお、想定読者は、
・ChatGPTを使ってみたがよくわからない、使えないと思って投げ出した人
・エンジニアを主対象とするが、非エンジニアでも十分理解できる
ことにしています。
非エンジニアの方は、<技術情報>は読み飛ばしていただいてかまいません。
裏側のメカニズムの話が中心です。
<技術情報>
「人間が喜びそうなことを言う機械」とは、専門的には、Transformerモデルといいます。
正確には、Transformerモデルそのものが「人が気に入りそうな情報を生み出す仕組み」で、ChatGPTはそこに対話がなりたつよう「人が気に入らない表現を除外」する修正(ファインチューニング)がかけてあります。詳しくは、次のものなどお読み下さい。
ものごとを「大体」理解する技術は、Text Embeddingという技術です。ChatGPTの内部では、言葉は多次元ベクトルという数字の塊で表現されています。多次元ベクトル化されているのは、単語も、文章も、ひとつのテキストファイル全体もです。文章やテキストファイルを多次元ベクトル化する際には、重要キーワードを中心に「拾い読み」の方式で多次元ベクトル化されます。「拾い読み」を詳しくすると、計算量が増える=処理時間がかかる、コストが上がる、ということになります。
生成AIは、理論上
・論理的であるわけではない(これまでのコンピュータとの大きな違い)
・論理性がないわけではない(論理性の程度は性能による)
・情報をある程度正確に把握・表現できる(正確さの程度は諸条件による)
・情報を大まかにとらえて検索できる(大まかさの程度は性能による)
・言葉や画像などを生成できる(生成できる内容は性能による)
という機械です。
この記事が焦点をあてるのは、論理性の程度、正確さの程度、大まかさの程度で、特に正確さの程度が中心で、そのコントロールの方法です。
2.これからすること
これから、ChatGPT(GPT 4)を利用して、簡単な情報検索と回答生成を体験します。
目的は、ChatGPTが「知らない」情報に対して、正確な情報を出せるようにすることです。
取り上げる例題は、マイナーな情報になります。お許し下さい。
メジャーな情報は、すでにChatGPTが知っているので、それを引き出すなら、プロンプトの工夫が大事です。
今回のテーマはRAGなので、あえてマイナーな情報を題材にしています。
ですが、どんなマイナーな情報に対しても活用できる知識ですからご安心下さい。
なお、ChatGPTと言えばプロンプトじゃないのか?と思われる方、少しだけ聞いて下さい。
ChatGPTは気の利いたことを言ってくれます。
でも案外、仕事のことや身の回りのことは知らないのです。
聞くと、いい加減な答えが返ってきます。
この後、体験いただきます。
実は、ChatGPTの知らないことについては、いくらプロンプトをいじっても、よい情報は得られません。
プロンプトいじりは、ChatGPTが知っていることには有効な方法です。
ただ、ChatGPTが知らないことには使えません。
もし、ChatGPTがあなたの社内のことを知らない、
もし、あなたの趣味のことを知らない、
そんな時は、いくらプロンプトをいじっても駄目です。
代わりに必要なのが「RAG」です。
RAGの中でもプロンプトを使いますよ。
3.基本技
(0)基本技0「アップグレード/ログインする」
有料版ChaGPTにログインする方法を説明します。
それには、有料版にアップグレードしなければなりません。
一度、有料版のChatGPT Plusにアップグレードしておけば、ログイン方法は無料版と同じです。
課金したくない、という気持ちはわかります。
ただ、課金するだけの価値はある、と私は強く思います。
1ヶ月$20です。
月3000円で、有能な秘書を獲得でき、先端技術であり今後の常識となる技術を体験し放題です。
自分の人生の価値を何倍にも広げることがたった$20で可能です。
使わなければ、すぐにキャンセルすればいいんです。
まず、無料版でChatGPTにログインして下さい。
アカウントがない方は、ChatGPTにアカウントをつくり、無料版のまま、ログインして下さい。
アカウント作りの方法などはこちらを御覧ください。
ログインすれば、次のような画面になっています。
左下に「プランをアップグレード」とありますか?
「プランをアップグレード」をクリックして、有料版に切り替えてください。
もし、アカウントが有料版なら「チームワークスペースを追加」になっている可能性があります。
この場合、有料版(ChatGPT plus)にアップグレードずみです。
有料版(ChatGPT plus)へのアップグレード方法は、次の記事を御覧ください。
有料版にアップグレードできると、ログイン後は次のような基本画面になります。
もし、左上中央よりの「ChatGPT 4」が「ChatGPT3.5」であればそれをクリックしてください。次のメニューが出ますので、「GPT-4」をクリックします。これで、「有料版の基本画面」になります。
有料版のChatGPT plusで、ChatGPTの基本画面にたどり着けた前提で次に進みます。
【ご注意】
無料版のままこの後の説明を実行してもここに書いたようなことは起きません!
課金するのは嫌だ、という方は第1回の記事を参照なさって下さい。
(1)基本技1「知らないことを確認する」
まず、ChatGPTの内蔵知識を確認します。
生成AIが事前に学習した膨大な情報の中に、自分が引き出したいと考えている情報が含まれているのかどうか確認しようということです。
また、ChatGPT 4は、RAG機能を内蔵しています。
そのため、知らない情報を聞くと裏側でホームページ検索が働くようになっています。
ただし、知らないことに知ったかぶりをするハルシネーションも健在です。
これらのことを確認します。
では、ChatGPTがこれから取り上げることを知っているのか、確認します。
実際に知っているかどうかを直接確認するには、次のように聞けばよいです。
次のメッセージを入れて、送信ボタン「↑」をクリック。
Web Browsingを使わないで、清風情報工科学院の住所を教えて
「Web Browsingを使わないで、」とつけておけば、内臓知識で返答してきます。
回答は次のようなものでした。
続けて、確認しておきます。
Web Browsingを使って、清風情報工科学院の住所を教えて
返答はこうなりました。
さて、ChatGPTは「素早い検索」をして、「清風情報工科学院の住所は「大阪府大阪市阿倍野区丸山通1丁目6-3」です」と答えています。
このあたりの挙動は、ChatGPT 3.5と変化があったところです。
さすが有料版ですね。
この「素早い検索」はRAG技術です。
ChatGPT 4から、RAG技術が内臓されています。
コントロール方法は、後ほど説明します。
念の為、こういう風にも確認しておきます。
清風情報工科学院はどんな学校?
ずらずらとそれらしいことを返答してきました。
一応もっともらしいことを言っているのですが、本当かなと疑って、ソースを聞いておきましょう。
情報ソースは何?
すると白状しました。実は知らないので一般論で答えているとのことです。
つまり、上の返答はハルシネーション(幻想)でした。
ChatGPT 4は、ChatGPT3.5と同様、清風情報工科学院のことは全く知りません。
こちらの問いかけが「(Web Browsingを使って)清風情報工科学院の住所は?」と具体的に聞いた時は、ChatGPT の裏側でWEB検索をして、その検索結果を使って回答してきました。
一方で、こちらの問いかけが「清風情報工科学院はどんな学校?」と漠然と聞くと、ChatGPT は「人間が喜びそうなことを言う」能力を発揮して、学校名から推測して適当なことを返してきました。
返答が怪しい時は「情報ソースは何?」とつっこみましょう。すると、知らない時は知らないと白状してきます。
これ以上、知らないことについて根掘り葉掘り聞いても、適当な話が出てくるだけになるのはわかりますね。
そこで、情報を与えて、返答が変わるのか調べていきます。
RAGの必要・不必要を考える大前提は、ChatGPTがその情報を知っているのか知らないのか、その情報の質はどうか調べることです。
内蔵知識が不十分ならRAGを使う、ということです。
(2)基本技2「JSONをデータベースの様に使う」
次に、不足している情報を与えるにはどうすればいいかです。
効率的な方法は、データとデータの意味をセットにして与えることです。
それには、JSON形式で情報を与えるのが効果的です。
JSON形式で情報を与えておけば、そちらの情報が内蔵知識より優先的に利用されます。
では、情報を与えて、返答が変わるのか調べていきます。
ChatGPTは意味を考えながら回答を生成していく機械です。
データとデータの意味をセットで与えてやると、回答品質が上がります。
例えば、
大阪市阿倍野区丸山通1-6-3
という情報を与えるよりも、
住所: 大阪市阿倍野区丸山通1-6-3
と与えたほうがいいということです。
データの意味が与えられていると、生成AIは「大阪市阿倍野区丸山通1-6-3」を見た時に、「これが住所なのか」という疑いをもたずにデータを理解できます。
この「疑い」を減らすほど、回答の精度が上がります。
先ほどの学校の住所の問い合わせに対するChatGPT の返答を詳しく見てみましょう。(別のWEBサイトが表示されることもあります)
ChatGPT の返答の[”]の部分をクリックすると次のホームページが現れました。
NAVITIMEのホームページです。
このページでは、
という表記があるため、生成AIが迷いなく住所情報を得られています。
生成AIから見て、意味を与えてくれる情報だから安心できる信頼できる情報、ということです。
こういう傾向があるので、我々がChatGPTに情報を与える際も、データは意味とセットで与えましょう。
この例なら、「住所」という情報とセットで、具体的な住所を与えてやります。
こういう、データにラベルをつけて情報を与える時に使えるのがJSON形式のデータです。
なお、JSON形式でなくとも、ホームページの記述方法を工夫すると生成AIに確実に意味を伝えられるようになりますが、別の記事でその方法を紹介します。
なお、ChatGPT 4が勝手にWEB検索する場合、Bingの検索エンジンを使って検索します。このコントロールの方法も別の記事にて。
さて、JSON(ジェーソン)はデータのフォーマット(形式)のひとつです。
キー名と値をセットにして与える形式です。
例えば、「住所」というキー名と「大阪市阿倍野区丸山通1-6-3」という値をセットにして与えます。
概念と具体例がセット、意味とデータがセットになるのが特徴です。
HTMLやCSSみたいなものと理解しておけば十分です。
この後に、プログラムは出てきませんからご安心下さい。
前の記事と同様、次のようなJSONのデータを与えることにします。
[
{
"会員番号": "B114",
"日本語教育機関名": "大阪YMCA学院",
"所在地": "〒543-0054\n大阪府大阪市天王寺区南河堀町9-52",
"TEL": "06-6779-8364",
"FAX": "06-6779-1833"
},
{
"会員番号": "B598",
"日本語教育機関名": "清風情報工科学院日本語科",
"所在地": "〒545-0042\n大阪府大阪市阿倍野区丸山通1-6-3",
"TEL": "06-6657-2369",
"FAX": "06-6657-2386"
},
{
"会員番号": "B810",
"日本語教育機関名": "大阪日本語アカデミー",
"所在地": "〒547-0015\n大阪府大阪市平野区長吉長原西2-2-12",
"TEL": "06-6707-2227",
"FAX": "06-4303-3338"
},
{
"会員番号": "B691",
"日本語教育機関名": "大阪みなみ日本語学校",
"所在地": "〒547-0027\n大阪府大阪市平野区喜連5-2-38",
"TEL": "06-4306-4000",
"FAX": "06-4306-4000"
}
]
これは次のような表形式の名簿データです。
このJSONデータにプロンプトでアクセスするには、次のように言います。
次のJSONのデータで、 "会員番号"が"B598"のエントリーの"日本語教育機関名"を教えて
一般化すればこうなります。
次のJSONのデータで、 <インデックス>が <ある値>の エントリーの <キー名>を教えて
この要領で言えばいいので、次のようにすれば値を取り出せます。
次のJSONのデータで、 "会員番号"が"B114"のエントリーの "TEL"を教えて
次のJSONのデータで、 "会員番号"が"B810"のエントリーの "FAX"を教えて
インデックスは「会員番号」以外でもいいので、こういうのも可能です。
次のJSONのデータで、 "TEL"が"06-6657-2369"のエントリーの "日本語教育機関名"を教えて
では、実際に、ChatGPTでやってみて下さい。
次のJSONのデータで、 "会員番号"が"B598"のエントリーの "日本語教育機関名"を教えて
[
{
"会員番号": "B114",
"日本語教育機関名": "大阪YMCA学院",
"所在地": "〒543-0054\n大阪府大阪市天王寺区南河堀町9-52",
"TEL": "06-6779-8364",
"FAX": "06-6779-1833"
},
{
"会員番号": "B598",
"日本語教育機関名": "清風情報工科学院日本語科",
"所在地": "〒545-0042\n大阪府大阪市阿倍野区丸山通1-6-3",
"TEL": "06-6657-2369",
"FAX": "06-6657-2386"
},
{
"会員番号": "B810",
"日本語教育機関名": "大阪日本語アカデミー",
"所在地": "〒547-0015\n大阪府大阪市平野区長吉長原西2-2-12",
"TEL": "06-6707-2227",
"FAX": "06-4303-3338"
},
{
"会員番号": "B691",
"日本語教育機関名": "大阪みなみ日本語学校",
"所在地": "〒547-0027\n大阪府大阪市平野区喜連5-2-38",
"TEL": "06-4306-4000",
"FAX": "06-4306-4000"
}
]
実行結果はこうでした。
続けて次のをやってみて下さい。
"会員番号"が"B114"のエントリーの "TEL"を教えて
"会員番号"が"B810"のエントリーの "FAX"を教えて
"TEL"が"06-6657-2369"のエントリーの "日本語教育機関名"を教えて
念のため、これも聞いて下さい。
清風情報工科学院の住所を教えて
返答はこうでした。情報ソースを聞いておきましょう。
情報ソースは?
返答はこうでした。
はい、このように、こちらから直接与えた情報が優先されていることがわかります。
ということで、次のようなプロンプトを使えば、JSONのデータを検索できることがわかりました。
次のJSONのデータで、 <インデックス>が <ある値>の エントリーの <キー名>を教えて
【ここにJSONのデータ】
また2度目以降は、最初の部分を省略して次の形で十分でした。
<インデックス>が <ある値>の エントリーの <キー名>を教えて
ChatGPTはJSON形式のデータを扱うことができ、具体的には次のことができます。
JSON形式のデータを読み込める
JSON形式のデータを検索できる
JSON形式のデータを抽出できる
JSON形式のデータを加工できる
JSON形式でデータを出力できる
つまり、ChatGPTはJSON形式のデータをデータベースとして扱える、ということです。
ChatGPTはプラグインなしで、JSON形式のデータを扱えます。
情報を与える時に、JSON形式にしてやれば、正確にこちらの情報を伝えることが可能です。
また、JSON形式で情報を与えておけば、その情報が優先して利用されます。
<技術情報>
なぜ、詳細情報で表示されたホームページが選ばれて表示されたのでしょうか?
このホームページのソースを見ると次のようになっています。
これによると、住所の部分には
<dt class="detail-text-frame__title">住所</dt>
<dd class="detail-text-frame__body">
<span class="address">
<a href="/postcode/result?code=00004-27109300085" class="postal-code">〒545-0042</a>
<a href="/address/27119023000/大阪府大阪市阿倍野区丸山通1丁目6-3/">大阪府大阪市阿倍野区丸山通1丁目6-3</a>
</span>
</dd>
とあります。この特徴は次の通りです。
<dt>住所</dt>と<dd>具体的な住所</dd>がセットになっている
class="address"とクラス名が住所(address)を表している
郵便番号表示から郵便番号を紹介するホームページへリンクしている
住所表示から住所表示の町丁目を紹介するホームページへリンクしている
単に日本語で近くに「住所」と書いてあるから、ということを越えて、「住所」という意味と具体的な住所がセットになっており、さらに名前付けと、詳細情報へのリンクも連動しています。その結果、生成AIは、このホームページの情報を住所だと確信できるのです。一般社会では、役所か郵便局を頼りに住所を確定するところです。しかし、生成AIは、情報への確信のし方が違います。これは従来のSEOおける情報への確信のし方とも異なっているようです。
(3)基本技3「履歴離脱」
ここで、これまでのやりとりの履歴とは別の、新しいチャットを始める方法を説明します。
この操作は、ChatGPT 3.5とほぼ同じですから、簡単に説明します。
少しだけ画面レイアウトが変わっています。
画面の左上にある「鉛筆アイコン」をクリックします。
これが「New chat」の意味です。
クリックすれば、メイン画面に戻ります。
これで、新しいチャットを開始することができます。
実際に、新しいチャットに切り替えてください。
(4)基本技4「命名」
JSONのデータは、名前をつけて呼び出すことができます。
複数のデータに別々の名前を付け、切り替えてアクセスすることもできます。
さらに、ChatGPT 4では複数のデータをまとめて新たな名前をつけ、ひとつのデータのようにまとめて扱うことも可能です。
では、やってみましょう。
JSONのデータには、名前をつけることが可能です。
命名してその名前で呼び出せるということです。
2つのJSONデータに命名するね。
次のJSONは「会員名簿1」。
[
{
"会員番号": "B114",
"日本語教育機関名": "大阪YMCA学院",
"所在地": "〒543-0054\n大阪府大阪市天王寺区南河堀町9-52",
"TEL": "06-6779-8364",
"FAX": "06-6779-1833"
},
{
"会員番号": "B598",
"日本語教育機関名": "清風情報工科学院日本語科",
"所在地": "〒545-0042\n大阪府大阪市阿倍野区丸山通1-6-3",
"TEL": "06-6657-2369",
"FAX": "06-6657-2386"
},
{
"会員番号": "B810",
"日本語教育機関名": "大阪日本語アカデミー",
"所在地": "〒547-0015\n大阪府大阪市平野区長吉長原西2-2-12",
"TEL": "06-6707-2227",
"FAX": "06-4303-3338"
},
{
"会員番号": "B691",
"日本語教育機関名": "大阪みなみ日本語学校",
"所在地": "〒547-0027\n大阪府大阪市平野区喜連5-2-38",
"TEL": "06-4306-4000",
"FAX": "06-4306-4000"
}
]
次のJSONは「会員名簿2」。
[
{
"会員番号": "5012",
"日本語教育機関名": "大阪YMCA国際専門学校",
"所在地": "〒550-0001\n大阪府大阪市西区土佐堀1-5-6",
"TEL": "06-6441-9068",
"FAX": "06-6443-2069"
},
{
"会員番号": "B659",
"日本語教育機関名": "J国際学院",
"所在地": "〒550-0012\n大阪府大阪市西区立売堀1-1-3",
"TEL": "06-6532-7480",
"FAX": "06-6532-7430"
},
{
"会員番号": "A138",
"日本語教育機関名": "クローバー学院",
"所在地": "〒550-0013\n大阪府大阪市西区新町1-2-13 新町ビル4F",
"TEL": "06-6533-3072",
"FAX": "06-6533-3163"
},
{
"会員番号": "5028",
"日本語教育機関名": "日本学生支援機構大阪日本語教育センター",
"所在地": "〒543-0001\n大阪府大阪市天王寺区上本町8-3-13",
"TEL": "06-6774-0033",
"FAX": "06-6774-0788"
}
]
「会員名簿2」は、別の日本語学校4校の情報です。
実行結果は次のようになりました。
これで、それぞれを「会員名簿1」と「会員名簿2」と呼べるようになりました。
では、この名前を使ってデータにアクセスしてみましょう。
「会員名簿2」で、"会員番号"が "5028"の"日本語教育機関名"を教えて
ちょっと意地悪してみましょう。
「会員名簿1」で、"会員番号"が "5028"の"日本語教育機関名"を教えて
ちゃんと、「ない」と言ってますね。
最後に、こういうことも可能です。
「会員名簿1」と「会員名簿2」をあわせて「会員名簿」と呼ぶね
これを入れてみて下さい。
名簿を統合して扱えるようになりました。
ChatGPT 3.5では、名簿そのものも結合されてしまいました。
ChatGPT 4では、名簿を結合せずに、名前だけ統合することができました。
以上で、次のことが確認できました。
JSON形式で与えたデータ(データセットと言います)に命名できる
命名された名前を使ってデータセットにアクセスできる
名前で特定したデータセットにデータがなければ、データが見つからない旨の反応をする
複数のデータセットを切り替えてアクセスできる。
複数のデータセットをまとめて、それに命名し、その名前でデータセットにアクセスできる
(5)基本技5「文脈検索」
ここまでだと、単なるデータベースかよ、というところですね。
しかし、ChatGPTのデータベース機能は一味違うのでした。
それを確認しておきます。
a.キー名を指定せずに検索
これまでは、キー名を指定して検索してきました。
"会員番号"が"B114"のエントリーの "TEL"を教えて
<インデックス>が <ある値>の エントリーの <キー名>を教えて
しかし、キー名を省略して検索可能です。
大阪日本語アカデミーのTELを教えて
命名がどの程度効いているか調べるために、このように聞いてみましょう。
「会員名簿2」で、大阪日本語アカデミーのTELを教えて
返答はこうでした。
ChatGPT 3.5の時は、お探しの情報は「会員名簿1」に、とのことでした。
ChatGPT 4は、さらに気を回して、「会員名簿1」にあって電話番号は云々と答えていることがわかります。
そして、名簿においてTELというのは電話番号だ、とChatGPTは内蔵の知識で知っているので、この様に聞くことも可能です。
大阪みなみ日本語学校の電話番号を教えて
つまり、キー名を意識せずに検索可能ということです。
そして、調べるべきデータセット(「会員名簿1」なのか「会員名簿2」なのか)についても、勝手に切り替えて検索可能となっています。
今回の例では、検索対象はJSON形式の名簿です。しかし、検索対象がPDFの文書でも検索可能です。そして複数のPDF文書という場合でも、検索対象のPDFを自動的に切り替えて調べることが可能です。
このような、ユーザーの文脈を踏まえて、検索対象の文脈を調べて必要な情報を取ってくる検索のことを「文脈検索」と呼びます。
ChatGPTは、この「文脈検索」ができるという特徴があります。
これにより、膨大な情報から、「それらしい」情報を取ってきています。
「文脈検索」には落とし穴があるんですが、そのことは後ほど触れましょう。
<技術情報>
本記事では、情報をJSON形式で与えています。
実際の業務では、このような形式だけでなく、業務の文書をWordやPDF形式で与えることもあることでしょう。
題材として、WordやPDFを使わないのは、上で述べたデータとデータの意味の関係が曖昧になるからです。
WordやPDFだと、ChatGPTの能力の限界がわかりにくくなります。
b.おまかせ検索
さらに、ザクッと質問することができるのも、ChatGPT 3.5と同様です。
「会員名簿」で大阪日本語アカデミーはどんな学校?
ザクッとした質問では、いろんな解釈が可能なので、みなさんの場合の返答はこれと異なるかもしれません。
「どんな学校」で適当に情報を引っ張ってきてくれました。
以上、a.とb.で、次のことが確認できました。
キー名を意識せずに検索可能
データセットを意識せずに検索可能
ChatGPTが適切なデータセットやエントリーを勝手に切り替えてデータにアクセスすることができる。
質問の文脈を調べ、その文脈に近いデータセット・エントリー・キーのデータを取ってくる「文脈検索」ができる。
ChatGPT 3.5でできていたことですので、ChatGPT 4もこれらのことをこなせました。
もっとも、ChatGPT 4でもいろいろ限界があり、複雑になってくると上に書いたことを確実に実行してくれるとは限りません。
次の例では、これが破綻する例も入れて、GPT 4の限界を感じつつ、ChatGPTに外部情報を与えて回答の精度を上げる技術「RAG」の本体に進んでいきます。
3.応用技
(1)応用技1「検索結果を使って回答生成」
データを引き出せるのなら、そのデータをもとに、「あとはよしなに」ということが可能です。
ちょっとやってみましょう。
では、次のように頼んで見ましょう。
「会員名簿」の情報を使って、「清風情報工科学院日本語科」を紹介する文章を作って
ChatGPTの返答
さらっと案内文を生成してきました。
(案内文は、毎回違う可能性があります)
前半部分は、会員名簿からの情報です。
後半は、「ハルシネーション(幻想)」です。
「基本技1「知らないことを確認する」」で確認したように、素のChatGPTは学校名以外の情報を知りません。
そして、JSONデータで「会員名簿」の情報を与えました。
すると、「会員名簿」の情報を正確に引用できるようになりました。
でも、上に引用したような情報を与えたわけではありません。
そして、与えた情報から勝手にかつ適当に幻想をふりまくようになったのです。
こういう性能は、ChatGPT 4も同様だということがわかります。
ここまでで、次のことがわかりました。
ChatGPTは引き出した情報を用いて回答を生成できる
情報を与えて回答を生成させると回答の精度が上がる
いくら引き出した情報を用いても(ChatGPT側から見て)情報が不十分だとChatGPTによる勝手な情報が付け加わる
次の節で「情報を与えて回答を生成させると回答の精度が上がる」と「いくら引き出した情報を用いても情報が不十分だとChatGPTによる勝手な情報が付け加わる」を確認します。
(2)応用技2「十分で質の良い情報を与えて生成させる」
では、精度向上のために、与える情報を増やしてみましょう。
「2.(3)基本技3「履歴離脱」」で紹介した、「新しくチャットを始め」て下さい。
次のプロンプトを入力してみて下さい。
これまでの名簿に、特徴と校長の欄を追加しました。
次のJSONデータを「日本語学校名簿」と呼ぶね。
[
{
"会員番号": "B114",
"日本語教育機関名": "大阪YMCA学院",
"所在地": "〒543-0054\n大阪府大阪市天王寺区南河堀町9-52",
"TEL": "06-6779-8364",
"FAX": "06-6779-1833",
"特徴": "・1990年創立で定員500名 (二部制)の大規模校\n・20カ国以上の国籍の学生が学ぶ多様性ある教育環境\n・独自に開発・編集した総合教材による一貫したカリキュラムの流れで、高い日本語総合力を養う。\n・クラス担任を中心に、教職員が一体となって、学生のケアを徹底し、留学を成功に導く。\n・YMCAボランティア諸活動を通し、地域及び幅広い人との交流と、共同能力養成を図る。",
"校長": "立山英展"
},
{
"会員番号": "B598",
"日本語教育機関名": "清風情報工科学院日本語科",
"所在地": "〒545-0042\n大阪府大阪市阿倍野区丸山通1-6-3",
"TEL": "06-6657-2369",
"FAX": "06-6657-2386",
"特徴": "・2003年創立で定員336名 (二部制)の中規模校\n・中国・ベトナム・ミャンマー・ネパールの学生が中心の進学校\n・進学実績が違います。国公立大学進学・大学院進学も徹底サポート。\n・講師が違います。大学院卒講師、経験豊富なベテラン講師、多数。英語(TOEFL)・数学・物理・化学・総合科目などを履修できます。(追加授業料不要)\n・指導哲学が違います。仏教に基づく生活指導。二言語・二常識を持つ人材を育てます。",
"校長": "平岡憲人"
},
{
"会員番号": "B810",
"日本語教育機関名": "大阪日本語アカデミー",
"所在地": "〒547-0015\n大阪府大阪市平野区長吉長原西2-2-12",
"TEL": "06-6707-2227",
"FAX": "06-4303-3338",
"特徴": "・2012年創立で定員244名 (二部制)の中規模校\n・ミャンマー・ベトナム・バングラディシュを中心にアジアの学生が学ぶ学校。\n・語学レベルに合わせたカリキュラム編成と進路相談します。\n・400社を超える取引企業や支援企業などによる後援会が地域の文化活動や就職(アルバイト)活動を応援します。\n・学校近くに専用の学生寮あり! 自転車も全員に無償貸与!生活指導担当が常に親身になって相談に乗ります。",
"校長": "新田悟朗"
},
{
"会員番号": "B691",
"日本語教育機関名": "大阪みなみ日本語学校",
"所在地": "〒547-0027\n大阪府大阪市平野区喜連5-2-38",
"TEL": "06-4306-4000",
"FAX": "06-4306-4000",
"特徴": "・2007年創立で定員136名 (二部制)の小規模校\n・ベトナム・中国の学生が中心の進学校\n・少人数制によるきめ細かい指導。\n・大学・専門学校入試合格の為の徹底した指導法。\n・多くの学校行事を通しての、日本文化、習慣、日本事情の習得。",
"校長": "橋野信生"
}
]
これで、「日本語学校名簿」という名前でこの情報を呼び出せます。
追加情報は、次の表の通りです。
それでは、紹介文がどう変わるか見てみましょう。
「日本語学校名簿」を使って、清風情報工科学院の紹介文を作って
ちゃんと「日本語学校名簿」の「特徴」欄を踏まえて紹介文が作られるようになりました。
そこで、次のことは言えそうです。
ChatGPTは引き出した情報を用いて回答を生成できる
情報を与えて回答を生成させると回答の精度が上がる
情報が(ChatGPT側から見て)十分だとChatGPTによる勝手な情報の付け加えはあまり起きない
(3)ChatGPT 3.5と4の限界の違い
では、ChatGPT 4はChatGPT 3.5の限界を超えられるのか、あるいはChatGPT 4には限界はないのか、このあたりを調べていきましょう。
ChatGPT 3.5の限界を再確認したい方は、この記事を御覧ください。
まず、ChatGPT 3.5の化けの皮が剥がれた質問をChatGPT 4にしてみましょう。
曖昧な検索に耐えるかどうか調べてみます。
「日本語学校名簿」を使って、ベトナムの学生がいる学校を教えて
ChatGPTの返答
ChatGPT 3.5では、「20カ国以上の国籍の学生」とあった「大阪YMCA学院」と「大阪みなみ日本語学校」の2校が選ばれていました。
ChatGPT 4では、問題なく「清風情報工科学院」「大阪日本語アカデミー」「大阪みなみ日本語学校」の3校が選ばれています。
では、ミャンマーではどうでしょうか。
「日本語学校名簿」を使って、ミャンマーの学生がいる学校の学校名を教えて
ChatGPTの返答
問題ありませんね。
ChatGPT 3.5では、どうやっても、よい結果は得られませんでした。
ChatGPT 3.5に検索をさせようとすると
・情報のエントリーを特定できた時は正確に情報を引き出してくる
・複数のエントリーにまたがった情報を正確に引き出して来れるとは限らない
という現象が生じました。
この例では、ChatGPT 4に問題は生じていません。
(4)ChatGPT 4の限界
では、ChatGPT 4ではこの問題は生じないのか、情報を複雑にして確認してみましょう。
再び、「2.(3)基本技3「履歴離脱」」で紹介した、「新しくチャットを始め」て下さい。
次のプロンプトを入力してみて下さい。
次のJSONデータを「日本語学校名簿」と呼ぶね。
[
{
"会員番号": "B114",
"日本語教育機関名": "大阪YMCA学院",
"所在地": "〒543-0054
大阪府大阪市天王寺区南河堀町9-52",
"TEL": "06-6779-8364",
"FAX": "06-6779-1833",
"日本語教育開始年月日": "1990年4月1日",
"収容定員": "500",
"2部制": "2部制",
"校長名": "立山 英展",
"日本語教育の特色": "1 独自に開発・編集した総合教材による一貫したカリキュラムの流れで、高い日本語総合力を養う。
2 クラス担任を中心に、教職員が一体となって、学生のケアを徹底し、留学を成功に導く。
3 YMCAボランティア諸活動を通し、地域及び幅広い人との交流と、共同能力養成を図る。",
"在籍数": 279,
"国籍別在籍数": "中国 65,韓国 6,台湾 60,ベトナム 19,タイ 12,ミャンマー 41,モンゴル 6,インドネシア 1,スリランカ 5,マレーシア 8,アメリカ 1,インド 6,フランス 22,ロシア 5,フィリピン 1,イギリス 10,カナダ 1,シンガポール 2,その他 8"
},
{
"会員番号": "B598",
"日本語教育機関名": "清風情報工科学院日本語科",
"所在地": "〒545-0042
大阪府大阪市阿倍野区丸山通1-6-3",
"TEL": "06-6657-2369",
"FAX": "06-6657-2386",
"日本語教育開始年月日": "2003年4月1日",
"収容定員": "336",
"2部制": "2部制",
"校長名": "平岡 憲人",
"日本語教育の特色": "1 進学実績が違います。国公立大学進学・大学院進学も徹底サポート。
2 講師が違います。大学院卒講師、経験豊富なベテラン講師、多数。英語(TOEFL)・数学・物理・化学・総合科目などを履修できます。(追加授業料不要)
3 指導哲学が違います。仏教に基づく生活指導。二言語・二常識を持つ人材を育てます。",
"在籍数": 199,
"国籍別在籍数": "中国 77,ベトナム 50,ネパール 15,ミャンマー 54,スリランカ 2,フィリピン 1"
},
{
"会員番号": "B691",
"日本語教育機関名": "大阪みなみ日本語学校",
"所在地": "〒547-0027
大阪府大阪市平野区喜連5-2-38",
"TEL": "06-4306-4000",
"FAX": "06-4306-4000",
"日本語教育開始年月日": "2007年10月1日",
"収容定員": "136",
"2部制": "2部制",
"校長名": "橋野 信生",
"日本語教育の特色": "1 少人数制によるきめ細かい指導。
2 大学・専門学校入試合格の為の徹底した指導法。
3 多くの学校行事を通しての、日本文化、習慣、日本事情の習得。",
"在籍数": 169,
"国籍別在籍数": "中国 46,ベトナム 119,ネパール 2,モンゴル 1,その他 1"
},
{
"会員番号": "B810",
"日本語教育機関名": "大阪日本語アカデミー",
"所在地": "〒547-0015
大阪府大阪市平野区長吉長原西2-2-12",
"TEL": "06-6707-2227",
"FAX": "06-4303-3338",
"日本語教育開始年月日": "2012年10月1日",
"収容定員": "244",
"2部制": "2部制",
"校長名": "新田 悟朗",
"日本語教育の特色": "1 語学レベルに合わせたカリキュラム編成と進路相談します。
2 400社を超える取引企業や支援企業などによる後援会が地域の文化活動や就職(アルバイト)活動を応援します。
3 学校近くに専用の学生寮あり! 自転車も全員に無償貸与!生活指導担当が常に親身になって相談に乗ります。",
"在籍数": 193,
"国籍別在籍数": "中国 11,ベトナム 35,ネパール 71,タイ 1,ミャンマー 36,モンゴル 1,インドネシア 1,スリランカ 9,インド 3,バングラデシュ 23,その他 2"
},
]
学校の情報をさらに細かくしました。
特に、国籍別在籍者数という項目には国別の学生数が入れてあります。
次の質問をしてみて下さい。
Code interpreterを使わないで、「日本語学校名簿」で、ミャンマー人が10名以上の学校の学校名を教えて
回答はこのようなものでした。
実際には、次の表のように該当校は3校のはずです。
実は、GPT 4単体(ChaGPT 4の言語モデル部分)でこのJSONデータを検索すると、国籍別の人数を正確に拾ってくることはできません。(大体は拾ってきます)
もっとも、ChatGPT 4の名誉のため、次のように聞いて下さい。
Code interpreterを使って、「日本語学校名簿」で、ミャンマー人が10名以上の学校の学校名を教えて
今度は、答えられました。
ChatGPT 4には、Code interpreterという機能が内蔵されています。
臨時に必要となった簡単なコンピュータ・プログラムを自動的に生成し、情報検索などを行う機能です。
この例の場合は、Code interpreterで情報を検索し、その結果を用いて回答が生成されています。
これもRAGの一種です。
ここではわざわざ、「Code interpreterを使って」「Code interpreterを使わないで」と断りました。
しかし、もし最初から「「日本語学校名簿」で、ミャンマー人が10名以上の学校の学校名を教えて」と聞いたら、「Code interpreterを使って」と同じ結果が出てきます。
GPT 4単体(ChaGPT 4の言語モデル部分)でこのJSONデータの検索は苦手なんです。けれども、ChatGPTは「こういう作業は、コンピュータ・プログラムにやらせよう」と、コンピュータ・プログラムをChatGPT の内部に作り、その結果を用いて回答を生成しました。
たった4件しかないこの程度の情報でも、ChatGPT 4単体では検索は不完全にしかできない、ということは覚えておいて下さい。
これは後に、外部の情報ソースからデータを取ってくる時などに問題になります。
得られたデータのパラメータが多い時など、ChatGPT 単体では手に負えなくなる、ということですから。
もっとも、複雑な情報そのものを引き出せない訳ではありません。
清風情報工科学院日本語科の「国籍別在籍数」を教えて
回答はこうです。
データをそのまま引き出すだけなら問題はないけれど、データを分析して他のデータと比較したりする作業をするにはコンピュータ・プログラムの助けがないとうまくいかない、ということです。
ということで、ChatGPT 4でも検索をさせようとすると
・情報のエントリーを特定できた時は正確に情報を引き出してくる
・複数のエントリーにまたがった情報を正確に引き出して来れるとは限らない
という現象が生じました。
そして、この現象を突破するのに、コンピュータ・プログラムが介在しました。
ChatGPT 4では、我々から見えない裏側でホームページ検索や、コンピュープログラムによる解析などが働いてくれています。
しかし、このような動作はOpenAI社の計算能力を使うため、コストになって返ってきます。
ChatGPT 4のチャットモードでは無料ですが、この手の機能を使っていると利用限度に達しやすくなります。
また、動作が遅いです。
こういう問題を突破するには、結局プログラムを書くか、金を払うかということに突き当たります。
プログラマの仕事は、生成AI時代にもなくなりそうにありません。
ただ、簡単なプログラムは生成AIが書いてくることもわかりましたよね。
なのでプログラマの仕事は、生成AIを活用することができていれば、なくなりません。
以上によって、次のことがわかりました。
ChatGPTに正確な情報を与えるにはJSON形式のデータを使えばよい
データに命名しその名前でデータにアクセスできる
JSON形式のデータセットをデータベースとして扱え、キー名を使ってキーワード検索できる
文脈検索できる
指示しなくても引き出した情報を適当に引用・加工して回答を生成できる
引き出した情報を指示通り引用・加工して回答を生成できる
情報を与え、適切に指示して回答を生成させると回答の精度が上がり、足りないと勝手な情報が付け加わる
正確な情報を引き出して来れるかどうかは生成AIの性能による(ChatGPT 3.5の限界はかなり低いところにあり、ChatGPT 4と言えどデータが複雑だと引き出せなくなる)
データを分析して他のデータと比較したりする作業をするにはコンピュータ・プログラムの助けがないとうまくいかなくなることがある
生成AIの性能を引き出すには、金か技術が必要である
今後もプログラマは必要であるが、なんらかの形で生成AIを活用できるのが前提
まとめると、外からいい情報を与えて生成AIの性能を踏まえてちゃんと指示すれば、こちらの意図する回答を生成できるようになる、ということです。
ある意味、当たり前っちゃ当たり前ですね。
<技術情報>
ChatGPTの回答についている [>_] をクリックしてみましょう。
するとコンピュータ・プログラムが現れます。
これはPython(パイソン)のプログラムです。
下から2行目はこのようになっています。(毎回、同じプログラムとは限りません)
"国籍別在籍数"というキーには、国名の次にその国の在籍数があり、その組み合わせが「,」で区切られているという特徴をつかんで、このキーから情報を抽出するプログラムになっています。
ChatGPTのシステム全体としては、臨時の検索モジュールを作り、その
検索モジュールによる検索結果を用いて回答を生成した、ということになります。
ですので、これもRAGの一種です。
4.RAGの確認
最後のセクションでは「RAG(ラグ)」という生成AIの回答精度向上技術について、確認します。
さて、ChatGPTには膨大な情報が「常識」として内蔵されています。
これはChatGPTが事前学習した情報です。
事前学習したことについては、ChatGPTは精度の高い回答を返すことができます。
しかし、事前学習していないことについては、適当な回答を返すことも知られています。上の例でもそうでした。
これはハルシネーション(幻想)という現象です。
このハルシネーション問題を超えるため、情報を臨時に増やして回答を生成方法がRAG(ラグ、Retrieval Augmented Generation)と呼ばれる技術です。
RAGは、生成AIの外部の情報を検索してそれを加味して回答を生成する技術です。
下の図の点線部分の技術です。
まぁ、回答の直前に外部の情報を学習しておく、一夜漬けのような方法です。
この記事では、3つのRAG技術が登場しています。
ChatGPTが(プロンプトで与えた)JSONデータを、直接検索して回答を生成する
ChatGPTが(プロンプトで与えた)JSONデータを、Code interpreter機能を使って検索して回答を生成する
ChatGPTが外部ホームページを、WEB検索(Web Browsing機能)して回答を生成する
但し、1と2は、プロンプト内に外部情報を組み込んでいるので、擬似的なRAGです。
特に1のように、プロンプト内に外部情報を組み込んだRAGのことを、私は「インラインRAG」と呼ぶことにしています。
JSONデータは、ChatGPTの知らない・事前学習していない外部情報です。
その知らない情報をJSON形式で与れば、事前学習させたのと同様の効果(回答精度の向上)が得られます。
ChatGPT 4ではGPTモデルの制約が、様々な機能(Code interpreterやWeb Browsing機能)で補完されています。
その結果、この記事で紹介した方法を使えば、プログラムを書かなくともRAGをコントロールできます。
但し、精密なコントロールや、コストの削減、処理時間の削減には、お金か技術が必要になります。
<技術情報>
RAGは、通常の生成AI(ChatGPT)のシステムに、上の図の点線部分を追加する技術です。
点線部分は検索モジュール+外部情報のデータベースです。
上記1は、検索モジュールとしてGPTモデルそのものを使い、プロンプト内に置かれた外部情報を検索し、その結果を用いて回答を生成しています。
上記2は、検索モジュールとしてPythonプログラムが臨時で生成され、プロンプト内に置かれた外部情報を検索し、その結果を用いて回答を生成しています。
上記3は、検索モジュールとして外部のBing(MicrosoftのWEB検索エンジン)を利用し、外部情報である外部のホームページ(例ではNAVITIME)の情報が引き出し、その結果を用いて回答を生成しています。
5.まとめ
以上で、ChatGPTはJSON形式のデータを取り扱え、さらにJSONから引き出した情報を用いて回答を生成できること、そして、この方法は生成AIの精度向上の技術であるRAGをプログラムなしで疑似的に実現・コントロールする方法でもあることを説明しました。
つまり、ChatGPTにJSON形式で情報を与えておいてプロンプトを工夫すると、ChatGPTが知らないことも扱えるようになるということです。
そして、この技は、RAGという生成AIの精度向上技術の入口です。
次の記事は、ChatGPTのサービスであるMy GPTsを利用して、プログラムを書かずにRAGを実現・コントロールする方法を説明します。徐々に山の上に上がっていきますよ。お楽しみに。
6.謝辞 CursorConnectの紹介
この記事を書くにあたって、CursorConnectの生成AIエンジニア塾の講義・演習がとても勉強になりました。生成AI起業家 KandaQuantum 元木 大介さんの話がわかりやすかったです。自分なりに講義で紹介されたRAGの技術を掘り進んで、この記事に至りました。上に示したRAGのワークフロー図は講義資料の一部を引用したものです。改めて、感謝いたします。
よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます! (