背景や目的
・先日ローカルLLMの基本環境を構築したので、今回はそれでRAGができるか試してみます。
(関連記事:「→性能の良さそうなローカルLLM3つを動作確認しました」)
・実用レベルにすることを念頭に置き、本番に近いデータで試してみます。
先日のおさらい(2024年9月の実験)
・LLMの確認環境としてOpen WebUIを採用し、ローカルでセットアップしました。
・モデル自体は、ELYZA-JP、gemma、Phiをそれぞれ試し、ELYZA-JPが良かったです。
・RAGはOpen WebUIの機能そのままでも使えそうでしたが、詳細確認はしていません。
・以下は、その時にぼんやり考えていた事です。
- VectorStoreは別の何かで作った方が良い?
- そうなるとOpen WebUIのカスタマイズになるのか?
Open WebUIの再確認:標準RAG機能
・さて、今回はOpen WebUIを開き、まずRAGの標準機能を入念にチェックしてみます。
・ちなみに、利用した環境は以下の通りです。
| PC | Dell Inspiron7590/[CPU]Intel Corei7-9750H 2.60GHz/[RAM]16.0 GB |
| OS | Windows 10 Pro上のWSL2(Ubuntu 22.04) |
| LLMランタイム | Ollama |
| チャット画面 | Open WebUI |
・セットアップ手順は、こちらにありますので、必要な方はご参照下さい。
(関連記事:「→性能の良さそうなローカルLLM3つを動作確認しました」)
・RAGの機能面をチェックした結果は以下の通りでした。
| RAG出来る? | ・可能 (小さなファイルを作成しその質問をするミニ実験し、大丈夫でした。) |
| 使い方 | ・ チャット画面で「#」を入力すると参照ファイルリストが表示され、そこでファイルを選ぶ。 ・ その後に質問をすると、それを参照した回答が得られる。 |
| ベクターデータの登録 | ・チャット画面の左メニューでワークスペースを押し、ワークスペース画面の「ドキュメント」タブを選択。ドキュメント欄右の+ボタンを押して登録します。 ・Open WebUIの画面で登録させるのが基本か。 |
・以下は、操作時の画面です。


Open WebUIの再確認:DB直接操作
・さらに、データは別途投入出来た方が良いのかも・・と思い、直接操作できるか試しました。
・操作するためにインストール済ファイルをgrep等で調べ、わかった事は以下の通りです。
| Open WebUIで 使われているベクターストア | Chromadb |
| Chromadb直接操作用 PersistentClientのpath | ~/venv/lib/python3.11/site-packages/data/vector_db |
| Chromadb直接操作用 collection名 | ・SHA256出力の先頭63文字 ・Open WebUI画面ワークスペース/ドキュメントの”ドキュメントマッピングをエクスポート”押下で取得可能。 |
・上記のpathとcollection名を使ってpythonコードを作成し、登録したファイルから作成されたと思われるデータを見る事が出来ました。確認した値は、以下の通りです。
- 収容データの数(idsの数):1ファイルの内容が勝手に(?)分割されて格納されていました。
- id別の、中身(documents)、ベクター値(embeddings)、付帯情報(metadatas)
・実行時のコードです。ご参考までに。(pathやnameは実際の値をセットして下さい。)
import chromadb
chroma_client = chromadb.PersistentClient(path="~/venv/lib/python3.11/site-packages/data/vector_db")
collection = chroma_client.get_collection(name="16b6a・・・7ff38")
print('Total documents in collection:',collection.count()) #収容件数を表示
documents = collection.get()
i=1
for id_num in documents['ids']: #データ内容、付属情報を出力(10行-14行)
print('No.',i,'ids:',id_num)
doc = collection.get(id_num)
print(f"ids: {doc['ids']}\ndocuments: {doc['documents']}\nmetadatas: {doc['metadatas']}\n-----------------")
i+=1
for id_num in documents['ids']: #ベクター値を出力させたい場合はこちら(15行-19行)
print('No.',i,'ids:',id_num)
doc = collection.get(id_num,include=['embeddings'])
print(f"embeddings: {doc['embeddings']}\n-----------------")
i+=1Open WebUIの再確認:DOCSスキャン
・画面内に”DOCS_DIR (/data/docs) からドキュメントをスキャン”というボタンがあり、これも調べてみました。
・先程と同様にインストール済ファイルをみたり、動作させて分かった事は以下の通りです。
| DOCS_DIRのパス | ・~/venv/lib/python3.11/site-packages/data/docs |
| ファイル登録後のその中身 | ・DOCS_DIRパスのディレクトリに何も格納されていない。 ・Open WebUI画面をしらみつぶしに探したが、そこにアップロードさせるようなボタンは無し。 |
| 新しい試験ファイルを作成し、そのディレクトリに置いてスキャンを実行 | ・新しいcollection_nameでその分がChromadbに登録された。 ・登録のされ方は、画面内から実施した時と同じようだ。 |
・別システムとの連携処理用の仕組みなのか・・、これ以上は未確認です。
Open WebUIの再確認:会話履歴
・画面内に表示されている会話の保存先(会話履歴)が気になり、これも少し調べました。
わかった事は以下の通りです。
| 保存されてる? | ・保存されている。(数回会話してみて、それは一目瞭然) |
| 格納場所 | ・「参照ファイル」と同じPersistentClientのpathを対象にしてDBを直接みようと思いましたが、collection名が分からず。見られません。 ・~/data/vector_dbや~/data/webui.dbにあるのか・・。時間切れでGiveUPです。 |
・いずれにせよ、前の会話が考慮されていて機能的な問題は無さそうです。
・色々調べてみましたが、結論として標準機能で構築する事にしました。本番に近いデータを使う事で課題がみえてくるはずと考えつつ、インストールに進みます。
インストール:環境やソフトウェア
・RAGを試すためのインストールを始めます。とにかくOpen WebUIが必要です。下表の環境でセットアップした例を、関連記事にて紹介しています。まだの方はそちらをご参照下さい。
関連記事:「→性能の良さそうなローカルLLM3つを動作確認しました」
| PC | Dell Inspiron7590/[CPU]Intel Corei7-9750H 2.60GHz/[RAM]16.0 GB |
| OS | Windows 10 Pro上のWSL2(Ubuntu 22.04) |
| LLMランタイム | Ollama |
| チャット画面 | Open WebUI |
インストール:データファイル作成
・ベクターストアの元データとして、提供中システムのサポート対応記録を利用してみます。
・利用する元データの概要です。
| データ概要 | 問い合わせ関連の情報 |
| データ件数 | 661件 |
| データ項目 | 問合せID,問合せ種類システム,問合せ種類,問合せ内容,対応,メモ |
・以下はデータの中身の抜粋です。シリアル番号「問合せID」で識別可能なQAの情報です。

・元データがCSVなので、AI処理(テキスト生成)で参照され易い形にしておきます。
| 以下の文章は+[問合せ種類システム]+の+[問合せ種類]+についてサポート対応をした時の記録です。(改行)+ <問合せ内容>(改行)+ [問合せ内容] +(改行)+ <対応内容>(改行)+ [対応] +(改行)+ <メモ>(改行)+ [メモ] +(改行) |
・それら(個々のQA)を661件結合して、テキストファイルとして保存したら完了です。
| ファイル形式 | text (UTF-8) |
| ファイル名 | QA_data.txt |
・作成したファイルは以下のような内容です(一部抜粋、システム名は伏字)。
| 以下の文章は、*****システムの内訳工種についてについてサポート対応をした時の記録です。 <問合せ内容> 作業単位の情報を残したまま内訳工種の金額を0にしたいが、設計数量(計算数量、契約数量)が変更できない。 どのように変更すればいいか。 <対応内容> 数量は0にできないため、作業単位の単価を0に設定していただくよう説明した。 ——————————————————————– 以下の文章は、*****システムの経費調整についてサポート対応をした時の記録です。 <問合せ内容> 設計変更1回目の経費調整を行った際に、全ての内訳科目を設計変更対象科目にしているのだが、 「間接仮設費の累計」「現場経費の累計」「一般管理費の累計」に特定の1科目(034)の当初の諸経費金額を引っ張ってきてしまう。 工事費は0円となっていて正しい。何故か? <対応内容> データをもらい、社内環境で再現性を確認したが再現せず。 お客様には取り急ぎ諸経費欄を手修正して対応いただいた。 調査を行う。 ——————————————————————— |
インストール:ファイルの登録(=DB作成)
・作成したデータファイルを登録します。
・Open WebUIを開き、画面左部ワークスペース、上段ドキュメント、の順にクリックします。

・ドキュメントの画面で、+をクリックし、先ほどのファイルを指定します。

・ファイルを指定後、保存を押せば完了です。内部でDB作成がされています。(約5秒)

・pythonコードでChromaDB内を直接確認しました。とりあえず全部入っています。
| 元データの661件のQA情報 | 存在している |
| 収容データ数(ids数) | 186件 |
| 1idsあたりのQAデータ量 | 約1500文字 |
・実際には分割されていて、186個に分けらていました。画面内の設定値「チャンクサイズ(デフォルト1500)」で制御されていそうです。
・これでRAGのインストールは完了しました。試験に進みます。
試験仕様
・以前にGPT-4 Turboを使用しクラウドベースでRAGを構築した事があり、それと比較できるように、その時の試験内容を抜粋して、試す事にしました。
(以前の実験:→本番データでのRAGシステム構築例紹介)
・実際の試験項目です。
- 試験1.~ 4.検索と回答生成が適切(情報が存在するケース1~4)
- 試験5.6. 前提情報不足を考慮できるか(ケース1、2)
- 試験7.8.情報が存在しない事を適切に回答(ケース1、2)
- 試験9.10.別のローカルLLMで挙動確認(変更LLM1、2)
・各試験の共通手順は以下のとおりです。
- 対象DBは作成済のものをそのまま使用。画面内で#を入力し、そのファイルを選択。
- モデルは「ELYZA-JP-8B」を選択。
- 画面内入力欄に各試験の「入力文」を入力し、「↑」マークを押す。
試験1(情報が存在するケース1)
・結果は以下の通りです。(*****は伏字です。実際には名称が記載されています。)
| 入力文 | 結果 |
| *****システムで出力した作業工種内訳書は、作業単位入力画面の単価と比べて高い。何故か? | ✖ (前回○) |
| 回答文 | |
| *****システムでは、諸経費率の増減に関わらず、諸経費総額を工事総価に対し、諸経費率を掛けて金額を算出します。また、各内訳工種の諸経費は、今回諸経費額(諸経費総額から既契約額を引いた額)を今回設計変更対象の内訳工種の金額に対し金額按分しています。 |
| ✕の理由 |
| ・回答はいかにもそれっぽいのですが、答えが書いてあるQAを参照していません。その期待していたQAは元データの問合せID=1590でした。 ・正しく参照していれば、以下のような回答になるはずでした。 「作業工種内訳書では、工事区分「U 測量・環境調査」を選択している場合、単価の値は、測量環境調査の率が掛かったものが表示されるからです。」 |
| 原因 |
| 引用文(画面内回答文直下に表示されます)に、この情報が含まれていない。少し追試します。 |
| 参考)問合せID:1590 問合せ内容:工事区分はU 測量・環境調査を選択している。*****システムで出力した作業工種内訳書は、 作業単位入力画面の***** や*****システムから出力した作業工種内訳書の単価と比べて高い。なぜ単価が違うのか? 測量の諸経費率の値を合算させた金額が表示されているのか? 対応:*****システムから出力した作業工種内訳書では、工事区分「U 測量・環境調査」を選択している場合、 単価は測量環境調査の率が掛かったものが表示されます (一部省略) |
試験1追試(引用文に含ませるための深掘り)
・検索周りに問題がありそうです。それに関わりそうなパラメータを調整してみます。
| 追加手順 |
| ・画面設定値「トップK(デフォルト10)」を適度な数にする。→検索結果出力量に関係 ・画面設定値「コンテキストの長さ(デフォルト2048)」を調整する。→生成時参照量に関係 ・試験1と同じ質問文を入力し、期待した文が出るまで上記の値を変え、試行錯誤する。 |
・結果は以下の通りです。
| 入力文 | 結果 |
| *****システムで出力した作業工種内訳書は、作業単位入力画面の単価と比べて高い。何故か? | 〇 トップK 90/コンテキストの長さ 5000 |
| 回答文 | |
| 工事区分「U 測量・環境調査」を選択している場合、測量環境調査の率が掛かった金額が表示されます。 |
| 〇の補足説明 |
| ・答えが書いてあるQA(元データの問合せID=1590)を参照している。 ・トップKを増やしてゆき、90にしたら回答文直下の引用文に現れた。 ・コンテキストの長さは2048では足りず、5000で参照された。 (引用文内の期待するQAの位置は末尾から約2400文字あたり) |
| 考察 |
| ・検索結果の採用量は「トップK」、参照量は「コンテキストの長さ」でそれぞれ制御されることが分かりました。ただし、参照量は末尾からカウントしているよう。 ・「コンテキストの長さ」を250000に設定するとエラーが発生し、5000に設定した場合の回答時間は46秒かかった。 ・PCの基本性能に関わりそうなので、この数値はあまり増やせないのかもしれない。 |
試験2(情報が存在するケース2)
| 追加手順 |
| トップK=10,コンテキストの長さ=2048を設定。(いずれもデフォルト値) |
・結果は以下の通りです。
| 入力文 | 結果 |
| *****システムの労務単価のコードで「停電責任者」が2つあるが、どう使い分ければよい? | ✖ (前回○) |
| 回答文 | |
| 申し訳ございませんが、そのような情報は提供された文書に含まれておりません。 |
| ✕の理由 |
| ・答えが書かれたQAを参照していない。そのQAは元データの問合せID=1449だった。 ・正しく参照していれば、以下のような回答になるはずだった。 「RB03を使ってください。」 |
| 原因 |
| ・引用文には存在(しかも先頭に)しているが、コンテキスト参照で漏れている。 ・末尾から約2,000文字の範囲に、期待するQAが含まれないのが原因。今回は約13,000文字の位置。 →コンテキストの長さを増やすのは無理がありそうだが、追試で確認してみる。 |
| 参考)問合せID:1449 問合せ内容:「労務単価のコードで・RA62(停電責任者)・RB03(停電責任者)はともに「停電責任者」でどう使い分ければよいのか?」 対応:「RA62は***社内で一部使っているコードなので、RB03を使ってください。」 |
試験2追試(引用文内の期待箇所を参照)
・生成時参照量に問題がありそうです。引用文内の期待箇所が参照されるように、関連設定値を増やしてみます。
| 追加手順 |
| 画面設定値「コンテキストの長さ」を18000に増やす。→生成時参照量に関係 |
・結果は以下の通りです。
| 入力文 | 結果 |
| *****システムの労務単価のコードで「停電責任者」が2つあるが、どう使い分ければよい? | 〇 |
| 回答文 | |
| RA62は*****社内で一部使用しているコードなので、RA03を使ってください。 |
| 〇の補足説明 |
| 期待とおり参照された。ただし、回答生成開始までに約5分かかった。 |
| 原因 |
| 5分は遅すぎるので、コンテキストの長さは5000位が限界では無いか。 |
試験3(情報が存在するケース3)
| 追加手順 |
| トップK=10,コンテキストの長さ=2048を設定。(いずれもデフォルト値) |
・結果は以下の通りです。
| 入力文 | 結果 |
| 「残高確認」が届いたが、これはどうしたらよいのか? | ✖ (前回○) |
| 回答文 | |
| 残念ながら、提供された文書には「残高確認」についての記載がありませんでした。恐れ入りますが、具体的な対応方法を示すことができません。 |
| ✕の理由 |
| ・答えが書かれたQAを参照していない。そのQAは元データの問合せID=1417だった。 ・正しく参照していれば、以下のような回答になるはずだった。 「決算期のタイミングで残高が一定以上金額がある場合に、TSHから届く。」 |
| 考察 |
| ・引用文には未存在。そもそも検索に失敗している状態。 ・純粋に検索精度の問題で、Embeddings用LLMやチャンクのデータ量を見直す等が必要か。 |
| 参考)問合せID:1417 問合せ内容:経理から、「東京システムハウスから「残高確認」が届いたが、これはどうしたらよいのか?」との連絡があった。 どうすればよいか? (*****社の経理に届いたものが、*****社の経理に渡され、そこから*****様の方へ来た)対応:「RA62は*****社内で一部使っているコードなので、RB03を使ってください。」 対応:毎年、TSHの決算期のタイミングで残高が一定以上の金額ある場合に、残高確認を送付させていただいていることを説明。 返信用封筒を入れているため、内容が問題ないことを経理の方へお伝えいただき、対応いただくようお願いした。 |
試験4(情報が存在するケース4)
・結果は以下の通りです。
| 入力文 | 結果 |
| *****システムで、ログイン直後の担当課選択画面を表示するところで処理中のまま進まない。どうしたら良い? | ✖ (前回○) |
| 回答文 | |
| 申し訳ございませんが、そのような情報は提供されていないため、具体的な対処方法を回答することができません。 |
| ✕の理由 |
| ・答えが書かれたQAを参照していない。そのQAは元データの問合せID=1359だった。 ・正しく参照していれば、以下のような回答になるはず。 「ユーザマスタメンテ画面で、ログインユーザーの所属課が正しく設定されているか確認して下さい。」 |
| 考察 |
| ・これも引用文に未存在。そもそも検索に失敗している状態。 |
| 参考)問合せID:1359 問合せ内容:ログイン直後の担当課選択画面を表示するところで処理中のまま進まない。 対応:以下の対応を行なった。 ・F5キー押下で画面リフレッシュ ⇒効果なし。 ・ユーザマスタメンテ画面にて、ログインユーザーの所属課を確認。 ⇒所属課が「存在しないコード(1040)」と表示された。 ⇒思い当たる節ないか尋ねると、課マスタメンテで、ID=1040の課を削除したとの事。←これが原因。 ⇒ユーザマスタメンテ画面にて、ログインユーザーの所属課を正しく付け直したところ、解消した。 ・プログラムを修正し、恒久対応を行なった。*****様に動作確認していただいた。 |
試験5(前提情報不足のケース1)
・結果は以下の通りです。
| 入力文 | 結果 |
| バージョンアップが失敗する。どうしたら良い? | △ (前回△) |
| 回答文 | |
| バージョンアップの際に「サーバに接続できません」というエラーが表示される場合、VerUp.exe の日付が古い可能性があります。以前システムを使っていたが、久しぶりに使うとおっしゃっていたので、それが原因でVerUp.exe のバージョンアップがされていなかった模様です。 解決策としては、VerUp.exe のバージョンアップを実施してください。 |
| △の理由 |
| ・答えが書かれたQA(元データの問合せID=1588)を参照しているが、回答文ではシステム名の事に言及していない。 ・以下が期待した回答例。 「*****システムの件でしたら、System.logを送ってもらい、調査すれば良いと思います。」 |
| 考察 |
| ・引用文には存在して、コンテキスト参照もOK。 ・検索OK、参照OK、システム名言及NG、という結果は、前回実験(GPT4turbo)と同じ。 ・ここは、LLM(Elyza)自体の質の問題となりそう。 |
| 参考)問合せID:1588 問合せ内容:*****システム起動時、バージョンアップが失敗する「サーバに接続できません」というエラーが表示される。 対応:ログファイルをいただいたところ、VerUp.exe の日付が古かった。以前システムを使っていたが、久しぶりに使うとおっしゃっていたので、 それが原因でVerUp.exe のバージョンアップがされていなかった模様。VerUp.exe のバージョンアップを実施していただいたところ、 問題なく利用できるようになった。 |
試験6(前提情報不足のケース2)
・結果は以下の通りです。
| 入力文 | 結果 |
| ログインできない。どうしたら良い? | △ (前回〇) |
| 回答文 | |
| エラー画面を確認したところ、PCの.NETの構成が不足しているようなメッセージでした。システム管理部門に確認いただくようお願いしました。 |
| △の理由 |
| ・答えが書かれたQA(元データの問合せID=958)を参照しているが、回答文ではシステム名の事に言及していない。 ・以下が期待した回答例。 「*****システムの件でしたら、パスワードの初期化方法をお伝えすれば良さそうです。」 |
| 考察 |
| ・引用文には存在して、コンテキスト参照もOK。 ・前回実験(GPT4turbo)では、システム名への言及があった。 ・このあたりは、ElyzaとGPT4turboとの差になりそう。 |
| 参考)問合せID:958 問合せ内容:*****システムのログイン時にエラーメッセージが表示され、ログインできない状況。 対応:エラー画面を確認したところ、PCの.NETの構成が不足しているようなメッセージであった。システム管理部門に確認いただくようお願いした。 他のPCにインストールしたところ問題なかったため、そちらを使用していただくことで了承いただいた。 |
試験7(情報が存在しないケース1:単純)
・結果は以下の通りです。
| 入力文 | 結果 |
| *****システムをwindows11で使う場合の注意点について質問された。どうしたら良い? | 〇 (前回〇) |
| 回答文 | |
| 申し訳ございませんが、提供された文書には、*****システムをWindows11で使う場合の注意点に関する情報はありません。 |
| 〇の補足説明 |
| ・期待通り、ハルシネーションせず素直に「不明」と回答している。 (DB内にこの質問に関する情報が無い事を確認済。) |
試験8(情報が存在しないケース2:難しい)
・結果は以下の通りです。
| 入力文 (補足) DB内には”.mitumoriファイル”の事がいくつか存在 | 結果 |
| *****システムで.misumoriファイルを開く方法を知りたいです。 | ✖ (前回△) |
| 回答文 | |
| 申し訳ございませんが、提供された情報には、*****システムで.misumoriファイルを開く方法についての記載はありませんでした。 |
| ✕の理由 |
| ・言及されたいQA(.mitumoriファイルの事/問合せID=1405)をまず参照できていない。 ・正しく参照していれば、以下のような回答になる事を期待していた。 「misumoriファイルでは無く、mitumoriファイルの事でしたら、 工事選択画面にある「送付データの読込」ボタン押下、「見積」ボタン押下で.mitumoriファイルを選択すれば開けます。」 |
| 考察 |
| ・引用文にQA情報が含まれておらず、検索ミス。 ・細やかな表現を試したかったが、それは確認できず。 |
| 参考)問合せID:1405 問合せ内容:.mitumoriファイルを*****システムで開く方法を知りたい 対応:工事選択画面にある「送付データの読込」ボタン押下、「見積」ボタン押下で.mitumoriファイルを選択すれば開けるようになることをご説明し、開けるようになったことを確認した。 |
試験9(変更LLM1:Gemma2 9B)
・最後にLLMを別のものに変えて少し試しました。
| 追加手順 |
| ・画面内”モデルを選択”で、 Gemma2を選択。 ・画面内の“トップK”を90に,”コンテキストの長さ”を5000に、それぞれ設定。#検索成功させる意図 |
・結果は以下の通りです。
| 入力文 (試験1と同じ) | 結果 |
| *****システムで出力した作業工種内訳書は、作業単位入力画面の単価と比べて高い。何故か? | 〇 (Elyza:〇) |
| 回答文 | |
| *****システムから出力した作業工種内訳書では、工事区分「U 測量・環境調査」を選択している場合、単価に測量環境調査の率が掛かったものが表示されます。 作業単位入力画面の単価は、この率を含まない単価です。 |
| 〇の補足説明 |
| ・答えが書かれたQA(問合せID=1590)を参照し、良い回答文になっている。 ・以下が期待した回答例。 「作業工種内訳書では、工事区分「U 測量・環境調査」を選択している場合、単価の値は、測量環境調査の率が掛かったものが表示されるからです。」 |
| 考察 |
| ・Elyzaと同様に要約の質は良好。時間はElyza同様に遅め(Elyza46s,Gemma87s)。 |
試験10(変更LLM2:Phi-3 14B)
・もう一つ変えて試しました。
| 追加手順 |
| ・画面内”モデルを選択”で、 Phi-3を選択。 ・画面内の“トップK”を90に,”コンテキストの長さ”を5000に、それぞれ設定。#検索成功させる意図 |
・結果は以下の通りです。
| 入力文 (試験1と同じ) | 結果 |
| *****システムで出力した作業工種内訳書は、作業単位入力画面の単価と比べて高い。何故か? | ✖ (Elyza:〇) |
| 回答文 | |
| 曙 が不知ってくれることなくらざり出力に推して費穴釦部内はせたようです。 Answer: ICTシステールと比け工事計算の侅回答合い問高く、作業を求。 |
| ✕の理由 |
| ・答えが書かれたQA(問い合わせID=1590)を参照しているが、回答文が滅茶苦茶。 ・以下が期待していた回答例。 「作業工種内訳書では、工事区分「U 測量・環境調査」を選択している場合、単価の値は、測量環境調査の率が掛かったものが表示されるからです。」 |
| 考察 |
| ・純粋にLLM(Phi-3)の問題。 本番のRAGシステムで使うのは厳しそう。 |
試験結果サマリー クラウドvsローカル
| 試験No. | GPT-4 Turboを使用した クラウドベースのRAG(前回) | ローカルLLM環境 (今回) |
|---|---|---|
| 1 | 〇 | ✕(追試:〇) |
| 2 | 〇 | ✕(追試:〇) |
| 3 | 〇 | ✕ |
| 4 | 〇 | ✕ |
| 5 | 〇 | △ |
| 6 | △ | 〇 |
| 7 | 〇 | ✕ |
| 8 | △ | ✕ |
・ローカルLLM環境(今回)の方は「トップKとコンテキストの長さ」がデフォルトの時です。
・括弧書きした追試の〇は「トップK」や「コンテキストの長さ」を増やして調整した結果で、反応時間が1分~5分位と遅く、問題があります。
・結果として、クラウドベースのRAGの圧勝となりました。ローカルLLM環境は検索精度が課題です。
まとめ
ローカルLLMでRAGを構築してみました。その過程でわかった事を最後にまとめます。
1.検索機能について
・回答文の下に表示される「引用文」が検索結果でした。
・回答生成で使われるコンテキストはその引用文全てでは無く、設定値:コンテキストの長さ(デフォルト2048)で指定した分がその対象になるようです。ただ、その範囲は引用文の末尾から参照されていて、少し不思議でした(類似度低い順?)。
・検索結果を引用文へどれだけ出力するかについては、クエリパラメータ トップK(デフォルト10)で設定可能です。チャンク分割されChromadbへ登録されたデータ(キー情報はids)を、類似度の高い順にいくつ含めるか設定する事になります。
・検索精度自体(ベクター値同士の類似度比較処理)はあまり良くないです。原因がチャンク数によるものか、モデルの質によるものかは断定できませんが、ベクター値の類似度で差を出やすくするために、チャンクサイズを小さくする方向で調整する事は有効かもしれません。
2.プロンプト(コンテキスト含む)について
・RAG用プロンプトは英文のデフォルト値をそのまま使い、特に気になりませんでした。
・検索結果の参照用に、設定値「コンテキストの長さ」が使われています(前述の通り)。
3.ローカルLLM(Elyza)の要約性能について
・良かったです。参照した時、はずれた時、いずれも違和感の無い回答文でした。
・前提条件(システム名)の不明点を再確認する等、細やかな面ではGPT4oが勝りそうです。
4.試験結果全体から
・全体を通じて、検索精度の向上が一番の課題だと思いました。
・処理時間が5秒以上かかる事も課題。コンテキストの長さを増やすとすごく遅くなります。
以下が検討テーマ。
- 速度だけを考慮したらコンテキストの長さは2048が良い。→検索精度の向上が鍵。
- ローカルPCの性能に起因する事も考慮する。→クラウドにあるLLMを使う事も視野に。
・テキスト生成能力(要約能力)は、Elyzaで大丈夫そう。ただ、GPT-4oの方が性能は良い。
生成AIを利用したツール開発は、今後も注目してゆきたいと思います。
何かお気づきの点があれば、下の「ご連絡フォーム」からご指摘頂くととても助かります。
お読み頂き、ありがとうございました。
