見出し画像

ノーコードでわかる ChatGPTの精度向上法「RAG」入門1(ChatGPT 3.5版)

こんにちは!
ノリトです。ChatGPT使ってますか?

プロンプトいじっても、思ったような結果が出ない?
そんな時は、RAG(ラグ)です。
RAGという技術をご存知ですか。
ChatGPTに外部情報を与えて回答の精度を上げる技術です。

RAG
を知れば、お役に立つChatGPTを作れるようになります。
あなたも、GPTsデザイナーになりたくありませんか?

ただ、ChatGPTの精度向上法「RAG」を調べるとエンジニアばりばりの記事ばかりです。
しかし、本記事は違います。
ChatGPTの無料版でプロンプトを使って、体験的にRAGが理解できます。
有料版でなくても、非エンジニアでも、RAGの基本がわかります。
RAGを理解して、
あなたもMy GPTsのデザイナーにデビューしましょう。

この記事は、大阪のIT専門学校「清風情報工科学院」の校長・平岡憲人(ノリト)がお送りします。
ノリトについては、こちらの記事を。


0.限界を知っておく

ChatGPT、とりわけ有料版のChatGPT 4は、人間かと思われるような能力を持っています。
私自身、
 すごい「知能」が現れた。
 専門家以上じゃないか。
と色めきました。

しかし、突き詰めるとこれは幻想です。
なぜなら、ChatGPT「人間が喜びそうなことを言う機械」(※)に過ぎないからです。
あえて言うなら、「よくできた銀座のホステスさん」です。
売れっ子ホステスは、相槌打ちの名人ですし、はげましの天才ですし、週刊誌なども読んで社会常識もよく知っています。
ただ、あくまでも目的お客さんを喜ばすこと(でお金をもらう)、その手段はお客さんが言ってほしそうなことを言う事にあります。

そう、「言ってほしそうなことを言う」力がホステスの条件なのです。
で、ChatGPTは、それに成功して、全世界的に大ブレークしました。

生成AIは、これまでのコンピュータとは異なります。
これまでのコンピュータは正確に徹する機械でした。
その代わり融通は利きませんでした。
生成AIは、正確に徹するわけでもなく、いい加減に徹するわけでもなく、ものごとを「大体」把握する機械(※※)です。
この「大体」をコントロールするにはどうしたらいいか、が記事のテーマです。 《このあたりの追記は、げるさんからの質問のおかげです。感謝》

ChatGPTには、2種類あります。
GPT 3.5
GPT 4
の2つです。

この2つは能力が違います。
・GPT 3.5 ・・・ 難しい話は無理、細かい話も無理、楽しく適当に!
・GPT 4  ・・・ 少々難しい話もOK、少々細かい話もOK、親身に相談!
さっきの例えで言えば、
・GPT 3.5 ・・・ ガールズバー嬢
・GPT 4  ・・・ よくできた銀座のホステス
結果として
・GPT 3.5 ・・・ 安いよ!
・GPT 4  ・・・ 高いよ!
となっています。
値段は約10倍違います。

後々、あなたがGPTsのデザイナーになる際、値段は大事になってきます。
「本当は全部GPT 4でやれば楽なんだけど、高いから、部分的にGPT 3.5でできないか」、とか考える様になります。
よほど儲からない限り、飲むと言えば銀座、とならないのと同じです。

それと、「人間が喜びそうなことを言う」だけなので、真に受けてはいけないですね。
ChatGPTは、発言の責任をとることはありません
だって、あなたを喜ばせたかっただけなのよ、と言われるのがオチです。
ホステスさんの意見で経営判断などしてはいかん、ということです。
当たり前ですね。
でも、時にホステスさんの一言で意見が変わる時もあるので、人間というのは難しいものですが。

この記事では、格安のGPT 3.5を使い、その限界の範囲でRAG基本をさらっと説明いたします。
なお、想定読者は、
・ChatGPTを使ってみたがよくわからない、使えないと思って投げ出した人
・エンジニアを主対象とするが、非エンジニアでも十分理解できる
ことにしています。

<技術情報>

(※)専門的には、Transformerモデルといいます。
正確には、Transformerモデルそのものが「人が気に入りそうな情報を生み出す仕組み」で、ChatGPTはそこに対話がなりたつよう「人が気に入らない表現を除外」する修正(ファインチューニング)がかけてあります。詳しくは、次のものなどお読み下さい。

(※※)生成AIは、理論上
論理的であるわけではない(これまでのコンピュータとの大きな違い
・論理性がないわけではない(論理性の程度は性能による)
・情報をある程度正確に把握・表現できる(正確さの程度は諸条件による)
・情報を大まかにとらえて検索できる(大まかさの程度は性能による)
・言葉や画像などを生成できる(生成できる内容は性能による)
という機械です。

この記事が焦点をあてるのは、論理性の程度正確さの程度大まかさの程度で、特に正確さの程度が中心で、そのコントロールの方法です。

1.これからすること

これから、無料版のChatGPT(GPT 3.5)を利用して、簡単な情報検索と回答生成を体験します。
目的は、ChatGPTが「知らない」情報に対して、正確な情報を出せるようにすることです。

取り上げる例題は、マイナーな情報になります。お許し下さい。
メジャーな情報は、すでにChatGPTが知っているので、それを引き出すなら、プロンプトの工夫が大事です。
今回のテーマはRAGなので、あえてマイナーな情報を題材にしています。
ですが、どんなマイナーな情報に対しても活用できる知識ですからご安心下さい。

なお、ChatGPTと言えばプロンプトじゃないのか?と思われる方、少しだけ聞いて下さい。

ChatGPT気の利いたことを言ってくれます。
でも案外、仕事のことや身の回りのことは知らないのがChatGPTです。
聞くと、ポエムのようなものを吐き出します。

どうすればいいか。
プロンプトいじりでしょうか?
ChatGPTが知っていることを引き出すには、確かに有効な方法です。
ただ、ChatGPTが知らないことには使えません

もし、ChatGPTがあなたの社内のことを知らない、
もし、あなたの趣味のことを知らない、
そんな時は、いくらプロンプトをいじっても駄目です。

代わりに必要なのが「RAG」なのです。
RAGの中でもプロンプトを使いますよ。

2.基本技

(0)基本技0「ログインする」

まず、ChatGPTにログインして下さい。

ChatGPT ログイン画面

アカウントがない方は、ChatGPTにアカウントをつくり、無料版のまま、ログインして下さい。
アカウント作りの方法などはこちらを御覧ください。

ログインすれば、次のような画面になっています。
左上中央よりに「ChatGPT 3.5」とありますか?

ChatGPT 無料版の画面

もし、アカウントが有料版なら「ChatGPT 4」になっている可能性があります。
その際は、「ChatGPT 4」をクリックします。

ChatGPT 4になっている場合

すると、上の図のようにメニューがでてきますので、「GPT-3.5」をクリックします。

なお、無料版で「GPT-3.5」をクリックすると、こういうメニューが出るだけです。
今は、「プラスにアップグレード」する必要はありません。

無料版のメニュー

まずは、ChatGPT 3.5で、ChatGPTの基本画面にたどり着けた前提で次に進みます。

【ご注意】
有料版の方で、ChatGPT 4で実行してもここに書いたようなことは起きません!

ChatGPT 無料版の画面

(1)基本技1「知らないことを確認する」

まず、ChatGPTの内蔵知識を確認します。
ChatGPTが、これから取り上げることを知っているのかの確認です。
次のメッセージを入れて、送信ボタン「↑」をクリック。

清風情報工科学院の住所を教えて

具体的には、画面上の点線部分に「清風情報工科学院の住所を教えて」をコピペして、「↑」ボタンをクリック。

メッセージの送り方

さて、ChatGPTの返答は知らない、というものでした。

ChatGPTの返答

念の為、こういう風にも確認しておきます。

清風情報工科学院はどんな学校?

やはり知らないようです。

ChatGPTの返答

一般的には「情報工科学院」が含まれる学校は、情報技術や工学に焦点を当てた学問や専門職に関連する教育を提供していることがあります。

ChatGPT

もっとも、学校名から推測して、おそらくIT関係の学校だろうと言っています。
一応正しいです。
こういうのは、「人間が喜びそうなことを言う」スキルです。
知らん、とだけ言うと角が立つので、名前から推測して、多分IT関係のだろうと当てをつけて話しているわけです。

これ以上、知らないことについて根掘り葉掘り聞いても、適当な話が出てくるだけになるのはわかりますね。
そこで、情報を与えて、返答が変わるのか調べていきます。

(2)基本技2「JSONをデータベースの様に使う」

情報を与えて、返答が変わるのか調べて行きたいわけですが、どうやって情報を与えればいいのか、ここが問題です。
対話的に教えていくことは可能です。
しかし、その方法には限界があります。

有りていに言えば、コストが高いです。
なぜなら、その知識を引き出すには、その都度対話の全体を与えないといけないからです。
ChatGPTの利用料金は、与える情報量に比例します。
たくさん与える=高くなる、です。
なので、少ない情報を与えて、いい回答を引き出す必要があります。

ChatGPT側から言えば、話の長い人につきあわされてる感じです。
めんどくささ=コストアップです!
端的にさっと結論言ってよ、と内心思っているChatGPTに、さくっと答えを教えてやると安くすみます。

ChatGPTはただのデータベースではなく、意味を考えながら回答を生成していく機械です。
実は、データの意味を与えてやると、回答品質が上がります。
例えば、
  大阪市阿倍野区丸山通1-6-3
という情報を与えるよりも、
  住所: 大阪市阿倍野区丸山通1-6-3
と与えたほうがいいということです。

え、その程度のこと?
と思われるかもしれませんが、大事なことです。

人間は経験上、
  大阪市阿倍野区丸山通1-6-3
を見れば住所だろうとわかります。
しかし、生成AI側から言うと、「多分住所なんだろうね」という疑いをもってデータに接しています。
この「疑い」の部分を減らせば減らすほど、回答の精度が上がります。

そこで、「住所」という情報とセットで、具体的な住所を与えてやることにします。
こういう、データにラベルをつけて情報を与える時に使えるのがJSON形式のデータです。

JSON(ジェーソン)はデータのフォーマット(形式)のひとつです。
キー名をセットにして、例えば、「住所」というキー名と「大阪市阿倍野区丸山通1-6-3」というをセットにした形式です。
概念具体例がセットになるのが特徴です。

HTMLやCSSみたいなものと理解しておけば十分です。
この後に、プログラムは出てきませんからご安心下さい。
JSONについて知りたい人は次の記事などお読み下さい。

例えば、次のような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"
  }
]

実行結果はこうでした。

"会員番号"が"B598"のエントリーの "日本語教育機関名"は、"清風情報工科学院日本語科"です。

ChatGPT

続けて次のをやってみて下さい。

"会員番号""B114"のエントリーの "TEL"を教えて
"会員番号""B810"のエントリーの "FAX"を教えて
"TEL""06-6657-2369"のエントリーの "日本語教育機関名"を教えて

それぞれの質問に対する回答は以下の通りです。
"会員番号"が"B114"のエントリーの "TEL"は "06-6779-8364" です。
"会員番号"が"B810"のエントリーの "FAX"は "06-4303-3338" です。
"TEL"が"06-6657-2369"のエントリーの "日本語教育機関名"は "清風情報工科学院日本語科" です。

ChatGPT

ということで、次のようなプロンプトを使えば、JSONのデータを検索できることがわかりました。

次のJSONのデータで、 <インデックス>が <ある値>の エントリーの <キー名>を教えて
【ここにJSONのデータ】

また2度目以降は、最初の部分を省略して次の形で十分でした。

<インデックス>が <ある値>の エントリーの <キー名>を教えて

ChatGPTはJSON形式のデータを扱うことができ、具体的には次のことができます。

  • JSON形式のデータを読み込める

  • JSON形式のデータを検索できる(GPT 3.5ではいい加減)

  • JSON形式のデータを抽出できる

  • JSON形式のデータを加工できる

  • JSON形式でデータを出力できる(GPT 3.5ではいい加減)

つまり、ChatGPTはJSON形式のデータをデータベースとして扱える、ということです。
情報を与える時に、JSON形式にしてやれば、正確にこちらの情報を伝えることが可能です。
実際には限界があり、GPT 3.5では表面的にしかできません。
どういう限界があるかは、また後に述べます。

JSON形式のデータであれば、ChatGPTはプラグインなしで扱えます。
無料版のChatGPTのアカウントでも扱えます。
ChatGPTの奥にいるGPTモデル自体がJSON形式を扱えるからです。
ChatGPTに聞いた所、一番好きなデータ形式だそうです。

<技術情報>

ChatGPTの内部では、JSONデータはエントリーごとに分けて記憶されているそうです。
ここでいうと、1つの学校単位でエントリーが分かれているので、学校単位の情報として記憶されています。
その上で、その集合体として、会員名簿が記憶されています。
どんな単位で情報を把握するか(構造化するか)は、情報を取り扱う上で重要なことです。
JSON形式にしておけば、人間側で構造化したものをそのまま誤差なく生成AIに渡せるということです。
生成AIに、この意味は何だろうという疑いをもたさずに情報が渡せるということです。

(3)基本技3「履歴離脱」

ここで、これまでのやりとりの履歴とは別の、新しいチャットを始める方法を説明します。

ChatGPTはやりとりの履歴を踏まえて、「人間が喜びそうなことを言っ」てきます。
これがありがたい時もありますが、「これまでのことを置いておいて」、などと言っても、話題を切り替えられないことが多いです。
何より、全履歴をシステムに送って次の回答を生成するので、処理に時間がかかり、コストもかかります。

そこで、「新しくチャットを始める」という機能がついています。
新しくチャットを始めても、これまでのチャットの履歴は別のところに保管されていますので、後で元のチャットに戻ることも可能です。

画面の左上にある「New chat」というボタンをクリックします。
これはChatGPTの将来のバージョンで、「新しいチャット」「新しい会話」などに変わるかもしれせん。

新しくチャットを開始する

「New chat」をクリックすれば、メイン画面に戻ります。

メイン画面

(4)基本技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"
  }
]

実行結果は次のようになりました。

これで、それぞれを「会員名簿1」と「会員名簿2」と呼べるようになりました。

では、この名前を使ってデータにアクセスしてみましょう。

「会員名簿2」で、"会員番号""5028""日本語教育機関名"を教えて

ちょっと意地悪してみましょう。

「会員名簿1」で、"会員番号""5028""日本語教育機関名"を教えて

"会員名簿1"には"会員番号"が "5028"のデータが存在しないようです。従って、"会員名簿1"からは"5028"に対応するデータが見つかりません。

ChatGPT

ちゃんと、「ない」と言ってますね。

最後に、こういうことも可能です。

「会員名簿1」と「会員名簿2」をあわせて「会員名簿」と呼ぶね

これを入れてみて下さい。

名簿の結合

名簿が結合されました。

もっとも、名簿は結合せずに、名前だけ統合したいんですが、ChatGPT 3.5ではそういうことはできません。

以上で、次のことが確認できました。

  • JSON形式で与えたデータ(データセットと言います)に命名できる

  • 命名された名前を使ってデータセットにアクセスできる

  • 名前で特定したデータセットにデータがなければ、データが見つからない旨の反応をする

  • 複数のデータセットを切り替えてアクセスできる。

  • 複数のデータセットをまとめて、それに命名し、その名前でデータセットにアクセスできる

(5)基本技5「文脈検索」

ここまでだと、単なるデータベースかよ、というところですね。
しかし、ChatGPTのデータベース機能は一味違います。

a.キー名を指定せずに検索

これまでは、キー名を指定して検索してきました。

"会員番号""B114"のエントリーの "TEL"を教えて

<インデックス>が <ある値>の エントリーの <キー名>を教えて

しかし、キー名を省略して検索可能です。

大阪日本語アカデミーのTELを教えて

「大阪日本語アカデミー」の電話番号(TEL)は、以下の通りです。

大阪日本語アカデミーのTEL: "06-6707-2227"

ChatGPT

命名がどの程度効いているか調べるために、このように聞いてみましょう。

「会員名簿2」で、大阪日本語アカデミーのTELを教えて

「会員名簿2」には「大阪日本語アカデミー」のデータは含まれていません。従って、「会員名簿2」からは「大阪日本語アカデミー」のTELは取得できません。お探しの情報は「会員名簿1」に含まれています。

ChatGPT

まだちゃんと「会員名簿」の違いを知っていました。
こういうのは、当たり前だと思うかもしれません。
しかし、チャットが長くなってくると、忘れてしまうかもしれません。
こういうあたりは、生成AIならではの特徴です。
この記事では取り上げませんが、忘れない、忘れてくれないコンピュータに対し、忘れてしまう、忘れてしまうかもしれない生成AI、とりあえずこういう特徴があることは覚えておいて下さい。

そして、名簿においてTELというのは電話番号だ、と内蔵の知識で知っているので、この様に聞くことも可能です。

大阪みなみ日本語学校の電話番号を教えて

「会員名簿1」において、「大阪みなみ日本語学校」の電話番号(TEL)は以下の通りです。

大阪みなみ日本語学校のTEL: "06-4306-4000"

ChatGPT

つまり、キー名を意識せずに検索可能ということです。

そして、調べるべきデータセット(「会員名簿1」なのか「会員名簿2」なのか)についても、勝手に切り替えて検索可能となっています。

今回の例では、検索対象は名簿です。しかし、検索対象がPDFの複数の文書という場合でも、検索対象のPDFを自動的に切り替えて調べることが可能です。

このような、ユーザーの文脈を踏まえて、検索対象の文脈を調べて必要な情報を取ってくる検索のことを「文脈検索」と呼びます。
ChatGPTは、この「文脈検索」ができるという特徴があります。
これにより、膨大な情報から、「それらしい」情報を取ってきています。
「文脈検索」には落とし穴があるんですが、そのことは後ほど触れましょう。

<技術情報>

データセットを勝手に切り替えている裏には、
 ・質問を分析する
 ・質問と複数あるデータセットを見比べて可能性の高い方を取り出す
  (ここでは「会員名簿1」)
 ・取り出したデータセットの中を調べて必要なエントリーを取り出す
  (ここでは「大阪みなみ日本語学校」のエントリー)
 ・取り出したエントリーの中から必要なデータを取り出す
  (ここでは「TEL」のキーの値)
という処理が走っています。
これに使われる技術は、Text Embeddingという技術です。
検索に焦点を当てるとベクトル検索と呼ばれることもあります。
生成AIの機能の一つです。

また、この一連の処理をAIオーケストレーションと呼ぶようです。
様々な機能をオーケストラのように使い分け・組み合わせ・協調させて動かしているもの、という意味です。

b.おまかせ検索

さらに、ザクッと質問することも可能です。

「会員名簿」で大阪日本語アカデミーはどんな学校?
ChatGPT

ザクッとした質問では、いろんな解釈が可能なので、みなさんの場合の返答はこれと異なるかもしれません。

「どんな学校」で適当に情報を引っ張ってきてくれました。


以上、a.b.で、次のことが確認できました。

  • キー名を意識せずに検索可能

  • データセットを意識せずに検索可能

  • ChatGPTが適切なデータセットやエントリーを勝手に切り替えてデータにアクセスすることができる。

  • 質問の文脈を調べ、その文脈に近いデータセット・エントリー・キーのデータを取ってくる「文脈検索」ができる

すごくないですか?
こういうのが、ただまたは格安で使えるんです。
もっとも、ChatGPT 3.5ではいろいろ限界があり、上に書いたことを確実に実行してくれるとは限りません

最初に次のように書きました。
・GPT 3.5 ・・・ 難しい話は無理、細かい話も無理、楽しく適当に!
・GPT 4  ・・・ 少々難しい話もOK、少々細かい話もOK、親身に相談!
GPT 3.5なら、ここまでに書いた程度の話なら通じるということです。

次の例では、これが破綻する例も入れて、GPT 3.5の限界を感じつつ、ChatGPTに外部情報を与えて回答の精度を上げる技術「RAG」の本体に進んでいきます。

では、「(3)基本技3「履歴離脱」」で紹介した、「新しくチャットを始め」て下さい。

新しくチャットを開始する

3.応用技

(1)応用技1「検索結果を使って回答生成」

データを引き出せることはわかりましたが、それ以上のことはできないのでしょうか?
そんなことはありません。
データをもとに、「あとはよしなに」ということが可能です。
ちょっとやってみましょう。

次の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"
  }
]

ChatGPTの返答

ChatGPTの返答(これと異なる場合があります)

では、次のように頼んで見ましょう。

「会員名簿」の情報を使って、「清風情報工科学院日本語科」を紹介する文章を作って

ChatGPTの返答

ChatGPTの返答(これと異なる場合があります)

さらっと案内文を生成してきました。
(案内文は、毎回違う可能性があります)
確かに、住所電話番号、FAX番号は正確です。
ただ、どうなんでしょう。

「日本語の効果的な学習を提供し、学生たちが日本の文化や社会に適応できるようにサポートしています。質の高い教育環境と経験豊富な教育者が、学生たちの言語能力向上をサポートしています。」
「学院は現代の情報技術にも焦点を当て、学生たちに先進的な言語スキルを身につけさせています」

まぁ、うそじゃないんですが、これは「会員名簿」から得られた情報じゃないですねぇ。
余計なことを言うな、と言ってみます。

「名簿」以外の情報を加えずに紹介文を作り直して。
ChatGPTの返答(これと異なる場合があります)

しかし、相変わらず、盛ってますね!
紹介文の後半は、知らないことをさも知っていることであるかのように盛る「幻想(ハルシネーション)」です。

何と言っても、「基本技1「知らないことを確認する」」で確認したように、素のChatGPTは学校名以外の情報を知らないのです。
そして、JSONデータで「会員名簿」の情報を与えました。
すると、「会員名簿」の情報を正確に引用できるようになりました。
そして、その情報から勝手にかつ適当に幻想をふりまくようになったのです。

ここまでで、次のことがわかりました。

  • 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は引き出した情報を用いて回答を生成できる

  • 情報を与えて回答を生成させると回答の精度が上がる

  • 情報が(ChatGPT側から見て)十分だとChatGPTによる勝手な情報の付け加えはあまり起きない

(3)ChatGPT 3.5の限界

ここまで読んで来られた方は、ChatGPT 3.5すごいんじゃね、とお感じになったかもしれません。
ある程度はすごいんです。これは認めます。
しかし、お客さんに使ってもらうシステムを作る、業務で自分以外の人が使えるシステムを作る、という目的を考えると、限界を知っておくことは必要です。

では、ChatGPT 3.5の化けの皮が剥がれる質問をしてみましょう。
曖昧な検索に耐えるかどうか調べてみます。

「日本語学校名簿」を使って、ベトナムの学生がいる学校を教えて

ChatGPTの返答

ChatGPTの返答(これと異なる場合があります)

2校が選ばれています。
しかし、与えた情報からするとちょっと変です。

元データの関係部分

実は、「ベトナム」の学生がいると説明している学校は、「清風情報工科学院日本語科」「大阪日本語アカデミー」「大阪みなみ日本語学校」の3校です。
「大阪YMCA学院」は「20カ国以上の国籍の学生」とはあるものの、「ベトナム」の学生がいるかわかりません。

この状態で、「大阪YMCA学院」と「大阪みなみ日本語学校」が選ばれるのはよろしくありません。
なぜ、こういう現象が起きるのか、すこしデータをいじって確かめてみます。

2.(3)基本技3「履歴離脱」」で紹介した、「新しくチャットを始め」て下さい。

新しくチャットを開始する

次のプロンプトを入れて下さい。
余計な情報をカットして、重要な情報のみにしました。

次のJSONデータを「日本語学校名簿」と呼ぶね。

[
  {
    "会員番号": "B114",
    "日本語教育機関名": "大阪YMCA学院",
    "学生の国籍": "20カ国以上の国籍の学生が学ぶ多様性ある教育環境",
  },
  {
    "会員番号": "B598",
    "日本語教育機関名": "清風情報工科学院日本語科",
    "学生の国籍": "中国・ベトナム・ミャンマー・ネパールの学生が中心の進学校",
  },
  {
    "会員番号": "B810",
    "日本語教育機関名": "大阪日本語アカデミー",
    "学生の国籍": "ミャンマー・ベトナム・バングラディシュを中心にアジアの学生が学ぶ学校",
  },
  {
    "会員番号": "B691",
    "日本語教育機関名": "大阪みなみ日本語学校",
    "学生の国籍": "ベトナム・中国の学生が中心の進学校",
  }
]

ChatGPTの返答

ChatGPTの返答(これと異なる場合があります)
「日本語学校名簿」を使って、ベトナムの学生がいる学校を教えて

ChatGPTの返答

ChatGPTの返答(これと異なる場合があります)

あれれれ、情報が更に減りました!
「清風情報工科学院日本語科」だけになってしまっています。
では、ミャンマーではどうでしょうか。

「日本語学校名簿」を使って、ミャンマーの学生がいる学校を教えて

ChatGPTの返答

ChatGPTの返答(これと異なる場合があります)

これも中途半端ですよね。
「清風情報工科学院日本語科」が消えてしまいました。

では、情報が引き出せなくなったのか、というとそうではありません。

「日本語学校名簿」を使って、清風情報工科学院の学生の国籍を教えて

ChatGPTの返答

ChatGPTの返答(これと異なる場合があります)

ちゃんと、清風情報工科学院日本語科には、中国、ベトナム、ミャンマー、ネパールの学生がいることがわかります。
でも、国籍で調べると、ヒットしないということです。
キーを工夫したり、キーを分割してみたり、いろいろやって見ましたが、よい結果は得られませんでした。

これはChatGPT 3.5の検索能力の限界です。
たったこの程度のことで化けの皮が剝がれました。
一見いろんなことができるようですが、結構適当です。

生成AIは、正確に徹するわけでもなく、いい加減に徹するわけでもなく、ものごとを「大体」把握する機械というのはこういう意味です。

最初に次のように書きました。
・GPT 3.5 ・・・ 難しい話は無理、細かい話も無理、楽しく適当に!
・GPT 4  ・・・ 少々難しい話もOK、少々細かい話もOK、親身に相談!
「難しい話は無理、細かい話も無理」ということを感じていただけますでしょうか。

ChatGPT 3.5に検索をさせようとすると
・情報のエントリーを特定できた時は正確に情報を引き出してくる
・複数のエントリーにまたがった情報を正確に引き出して来れるとは限らない

これが基本性能です。
なんとも言えない中途半端な能力です。

正確な情報を与えれば確かに正確な情報を引き出し、それを元によしなに回答生成してはくれる。
しかし、その正確な情報を引き出して来れるかどうかは生成AIの性能による
言い換えれば、たくさんの社内文書(あるいはデータ)を与えたところで、もしかしたらうまく検索してくれないかも、ということですね。

ちなみに、有料版であるChatGPT 4を使えば、この程度なら、ビシッと正確にデータを引っ張ってきます。

となると、人は考えます。
・有料版といっても月額$20なら、払っちまうか!
と。
あるいは、技術者・エンジニアならこう考えるかも知れません。
単純な検索は通常のデータベースを使えばいいんじゃね
回答文を生成するところだけChatGPTを使えばいいじゃん

こうして、金か、技術か、という話になるんですね。
システムの企画者/デザイナーの立場から言えば、得愛(AI)の沙汰も金次第、ということですね!

最初に申しました。
・GPT 3.5 ・・・ 難しい話は無理、細かい話も無理、楽しく適当に!
・GPT 4  ・・・ 少々難しい話もOK、少々細かい話もOK、親身に相談!
例えで言えば、
・GPT 3.5 ・・・ ガールズバー嬢
・GPT 4  ・・・ よくできた銀座のホステス
結果として
・GPT 3.5 ・・・ 安いよ!
・GPT 4  ・・・ 高いよ!
値段は約10倍違います。

つまり、いい女(生成AI)を落とすには、カネか技か、という話になるのでしょう。

プログラマは安心しましょう。
生成AIといえども万能ではありません
しょせん、「人間が喜びそうなことを言う機械」なのです。
しかも、その根幹はコンピュータ・プログラムでできています。
プロトタイピングではともかく、性能を出させようとすれば、プログラムを書かないといけなくなって来ます。
なので、仕事はなくならないですね。
しかし、全く生成AIにからむプログラムを知らないとしたらどうでしょうか。
仕事なくなるかもしれませんね!

ということで、エンジニアも、非エンジニアも精進せざるを得ないのです。


以上によって、次のことがわかりました。

  • ChatGPTに正確な情報を与えるにはJSON形式のデータを使えばよい

  • データに命名しその名前でデータにアクセスできる

  • JSON形式のデータセットをデータベースとして扱え、キー名を使ってキーワード検索できる

  • 文脈検索できる

  • 指示しなくても引き出した情報を適当に引用・加工して回答を生成できる

  • 引き出した情報を指示通り引用・加工して回答を生成できる

  • 情報を与え、適切に指示して回答を生成させると回答の精度が上がり、足りないと勝手な情報が付け加わる

  • 正確な情報を引き出して来れるかどうかは生成AIの性能による(ChatGPT 3.5の限界はかなり低いところにある)

  • 生成AIの性能を引き出すには、金か技術が必要である

  • 今後もプログラマは必要であるが、なんらかの形で生成AIを活用できるのが前提

まとめると、外からいい情報を与えて生成AIの性能を踏まえてちゃんと指示すれば、こちらの意図する回答を生成できるようになる、ということですね。
ある意味、当たり前っちゃ当たり前ですね。

<技術情報>

なぜ、ChatGPT 3.5で、「会員名簿」をうまく検索できないのか?
簡単に言うと、こういう事です:

  • 生成AIは大量のデータを扱うために、全文検索を放棄している。その代わりに導入したのが文脈検索

  • 生成AIは、ある塊の情報に対して複数の重要キーワードを見つけて、その並びで「大体こういうことが書いてある情報」と把握している(Text Embedding)

  • 情報を探す時は、この「大体こういうことが書いてある情報」を頼りに検索する。これが文脈検索の正体(ベクトル検索)

  • ChatGPT 3.5の文脈検索は、複数の重要キーワードの密度が薄いので、ある塊の情報をバクっとしか把握できない

  • 文脈検索をどの程度の密度・精度で行うかは、生成AIの性能による。ChatGPT 3.5の性能はChatGPT 4に比べて限定されているので、情報検索の精度が低い

4.RAGのイントロ

最後のセクションでは「RAG(ラグ)」という生成AIの回答精度向上技術について、簡単な導入を行います。

さて、ChatGPTには膨大な情報が「常識」として内蔵されています。
これはChatGPT事前学習した情報です。
事前学習したことについては、ChatGPTは精度の高い回答を返すことができまます。
しかし、事前学習していないことについては、適当な回答を返すことも知られています。上の例でもそうでしたね。
これはハルシネーション(幻想)という現象です。

我々が、業務や特定の興味に強い生成AIサービスをつくるには、このハルシネーション問題を超えなければなりません。
それにはどうすればいいか。
事前学習した情報を増やせばいいんじゃないか、と考えられますよね。
これを実現する技術がRAG(ラグ、Retrieval Augmented Generationと呼ばれる技術です。

RAGは、生成AIの外部の情報検索してそれを加味して回答生成する技術です。
まぁ、回答の直前に外部の情報を学習しておく、一夜漬けのような方法です。

ところで、「外部の情報を検索してそれを加味して回答を生成する」という言葉で、あれっと思われた方は感度がいいですね。
なぜなら、我々はここまでで、次の3つのことを確認してきたからです:

  • ChatGPTはJSON形式のデータを取り扱えること

  • JSON形式の情報を検索して情報を引き出せること

  • さらに引き出した情報を用いて回答を生成できること

RAGは、このChatGPTでJSON形式のデータを扱う技に似てないか、ということです。
実は、この技はRAGです。
但し、プロンプト内に外部情報を組み込んでいるので、擬似的なRAGというべきです。
私は勝手に「インラインRAG」と呼んでいます。

RAGのワークフロー

JSONデータは、ChatGPTの知らない・事前学習していない外部情報です。
その知らない情報をJSON形式で与れば、事前学習させたのと同様の効果(回答精度の向上)が得られます。
そして、この記事で紹介した方法を使えば、プログラムを書かなくともRAGをコントロールできます。
もっとも、ChatGPT 3.5では様々な制約があるため、十分RAGを体験できるとは言えません。
しかし、ここで述べた、ChatGPTにおいて、プロンプトでJSON形式のデータを取り扱う方法は、非常に大事な方法なので覚えておきましょう。

<技術情報>

RAGは、通常の生成AI(ChatGPT)のシステムに、上の図の点線部分を追加する技術です。
点線部分は検索モジュール+データベースです。
やりとりとしては、「Q」「R」のやりとりが増え、「A」「G」のやりとりが変化します。

本来のRAGは、情報検索を検索モジュールで実行します。
また外部情報はデータベースに置きます。
本記事の方法は、検索モジュールとしてGPTモデルそのものを使ってしまい、外部情報プロンプト内に置く、という裏技です。
こういうことが可能なのは、ChatGPTの頭脳である大規模言語モデル(GPTモデル)がある程度論理的で、部分的にデータベース機能を実行可能だからです。 《このあたりの情報は飯箸先生からの質問で追加しました。感謝》

5.まとめ

以上で、ChatGPTJSON形式のデータを取り扱え、さらにJSONから引き出した情報を用いて回答を生成でき、この方法は生成AIの精度向上の技術であるRAGをプログラムなしで疑似的に実現・コントロールする方法でもあることを説明しました。

つまり、ChatGPTにJSON形式で情報を与えておいてプロンプトを工夫すると、ChatGPTが知らないことも扱えるようになります。
そして、この技こそ、RAGという生成AI精度向上技術の入口なのです。

次の記事からは、ChatGPTのサービスであるMy GPTsを利用して、プログラムを書かずにRAGを実現・コントロールする方法を説明してゆきます。お楽しみに。

6.謝辞 CursorConnectの紹介

この記事を書くにあたって、CursorConnect生成AIエンジニア塾の講義・演習がとても勉強になりました。生成AI起業家 KandaQuantum 元木 大介さんの話がわかりやすかったです。自分なりに講義で紹介されたRAGの技術を掘り進んで、この記事に至りました。上に示したRAGのワークフロー図は講義資料の一部を引用したものです。改めて、感謝いたします。

CursorConnect

清風情報工科学院では、情報系の講師を急募しております。
ご興味のある方、こちらの記事を御覧ください。


この記事が参加している募集

AIとやってみた

仕事について話そう

よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます! (