GitHubリポジトリはこちら
https://github.com/sheltie-fusafusa/dojin-rag-2
TL;DR
前回チャレンジした「【Go/ChromaDB/Ollama Vol.1】RAG型同人誌サークル検索の構築をベクトルDBを使用して行ってみた」の続きとなります
前回の問題点は以下の通りです
- もととなるデータは自然言語に即したデータにする
- エイリアスを充実させる(ブルアカ、ブルーアーカイブなど)
- ユーザーからの入力をLLMで拡張、整形した後にベクトルDBに検索を行う
今回の主な改良点は
- CSVファイルフォーマットの変更。サークルの補足説明、アピールポイント、配置番号などを追加し、ユーザーが検索したときにより多くの情報にヒットするよう対策した
- LLM要約生成機能を追加し、より多くの情報をベクトルDBに登録することであいまい検索にヒットしやすくした
- 入力されたチャットについてもベクトル化し、検索を行うように修正(前回作成時はチャット入力のベクトル化が行われておらず、結果が取得できなかった可能性があるため)
となります
ただ、このような対策を行っても利用に耐えられるような検索精度を出すことが出来ませんでした
考えられる原因は
- 検証マシンのスペック不足、十分な性能を持つLLMを動作させることが出来なかった
- ノウハウ不足、RAG検索への理解はエンベディングのノウハウが足りなかった
- エイリアス実装の見送り、エイリアスを実装するための良い方法が見つからず、採用を見送った
となります
以下に今回の問題点を記載します
システム的な限界
RAG検索を動作させる環境が「MacBookPro 2019」という、AIシステムを動作させることを考えるとものすごく非力なマシンで動かそうとしました
このPC上でDockerを使ってGo、Python、Redis、ollama、chromaDBなどが動作するため、一つ一つのシステムに割り当てられるリソースが限定されます
特にメモリ16GBではパラメータ数の多いモデルは利用できないため、結果的に精度の良くない小型モデルを利用し、エンベッティング、検索ともに十分な変換ができないという問題がありました
ノウハウ不足
RAG検索は「検索した結果をLLMに渡し、回答を生成する技術」なので、核になるのは「ユーザーが望んだ検索結果を、データストアから取得する」部分になると考えています
今回、データストアにchromaDBを使用し、ユーザーの検索結果をベクトルに変換、chromaDBに対して検索を行うことで(意味的な)距離が近い回答を取得し、LLMにて最終的な回答を作成するというアーキテクチャにしました
ただ、最初の「chromaDBから意味的に近い回答を取得する」部分がうまく言っておらず、テストデータの距離がすべて近いものとして出力されていました
これは「エンベッティング」「chromaDBに対しての検索手法」の知識が無く、なんとなくで作成してしまったことで、結果的に意味のない検索システムが出来上がってしまいました
当然、意味のないデータをLLMに渡したところで、意味のない回答が生成されるだけなので、結果使えないシステムとなりました
エイリアスの実装を見送った
前回の問題点と考えていたエイリアスの充実について、よい方法が浮かばず実装を見送りました
これはマシンスペックが足りないことにも関連してきますが、利用しているLLMの規模が小さく、アニメ(同人)特有のエイリアスを生成することが難しいと判断したためです
特に最近の作品のエイリアスを生成しようとした場合、当然学習データには含まれていないためLLM単体での生成はできません
人の手によって手動で生成するか、都度ウェブ検索を行うような仕組みを入れて対応する必要がありました
その他、ローカルLLMの有用性と限界
今回はローカルLLMとして以下のモデルを利用しています
HauhauCS/Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive
このモデルはRTX5070Ti VRAM16GBの環境で60tokens / secの速度が出るため、かなり実用的に利用できるLLMだと思っています
VSCodeにOpenCodeを設定し、プロバイダとして上記モデルを読み込んだllama.cppサーバーを指定してコーディングさせました
フロントサイド、サーバーサイドともに「動作するもの」はできましたが、やはり一発成功となならず、完成報告を受けて実際に動かしてみたら「Docker buildに失敗」「チャットを送るとエラー」「回答が出力されない」など、多くの問題が発生しました
そのため、動かしつつ問題点は随時修正させることで、一旦動くものはできました
ただ、使えるか?というと、残念ながら使えないものができてしまいました
ローカルLLMはしばらく運用していましたが、やはり大手企業が展開するサブスクモデルレベルのクオリティを求めた場合、現状は困難と判断し、先日GeminiのAI Proプランを契約しました(お試しで3か月720円で利用できるため)
次回に向けて
根本的にRAG検索の理解を深めていきたいと思います
ここの知識が不足していると、そもそも最適なデータ設計や検索仕様が決められないためです
RAGの知識を固めたうえで、改めてデータ設計、検索仕様を固めて、次こそは「使えるRAG検索」を作りたいと思います
以上です
ということで、RAG検索を作成したお話でした
結果失敗に終わりましたが、今まで「なんかいい感じに検索してくれる仕組み」となんとなく思っていましたが、実際に作ってみるとデータ設計、データ検索手法が最も大事だということがわかりました