はじめに
同じAIエンジニアの友人より、RAG開発に関する苦労した点を聞かれたので整理してみることにしました。
こんな人におすすめ
・これからRAGにかかわる予定の方
・AIエンジニアの方
開発における段階
RAGの開発には、いくつかの段階が存在します。
1.セマンティック検索用資料を取込
2.プロンプトをベクトル化して、1をセマンティック検索
3.検索結果をLLMへ提供して自然言語を取得
4.取得した情報を画面へ展開
大きくはこの4つです。
サービスとして追加で機能を実装する場合を除くと、これでRAGは完成します。
では、この4つの中で苦労する点を順に説明します。
セマンティック検索用資料を取込
取込が難しいというよりも、取込後の検索で想定しているものが抽出できるように取り込むにはどのようにしたらよいか、という点を悩む段階です。
ここで何度もやり直す点としては、チャンク数です。
チャンク数は、取り込む資料のテキスト情報をどの程度のサイズでデータベースに保存するかの値です。
この値が大きすぎると、意味検索にヒットしづらくなりますが、その分1度で検索時に抽出できる情報が多くなります。
逆に小さいと、意味検索にヒットしやすくなりますが、小さすぎると意味として成り立たず抽出時の情報量も少なくなります。
これらの状況を加味しながら、適切なチャンク数を探っていくことが大切です。
また、取り込む資料について不要な情報は極力削除したほうがいいので、
ヘッダー、フッター、目次削除は基本必須です。
プロンプトをベクトル化して、取り込んだ資料をセマンティック検索
無事に資料を取り込んだ後の段階です。
ここで困ることは、セマンティック検索でどのようにして、目的の情報を抽出するのかにあります。
コサイン類似度で検索が行われるのですが、これがまた厄介です。
それは、数字さえ近ければ一致するものがうえに上がってしまうからです。
例えば、うえの不要な文章の削除が甘いと、文章ともいえないものがこのタイミングで検索順位上位となる可能性もあります。
その為、ここでやることとして、1つセマンティック検索を行うことですが、必ずリランキングも実施するようにしてください。
実装する手法として、
①CohereのAPI連携による実施
②Langchainでの実装
の方法があります。
私は①の手法をとっており、おすすめしております。
2025年2月現在で、V3.5が登場しており、かなり精度が高くお勧めです。
体感、リランキングで10位くらいまで抽出すれば希望したものは抽出できると考えています。
検索結果をLLMへ提供して自然言語を取得
ここでは、どのLLMを呼び出して利用するのかによります。
私は現在、3つほど呼び出せるように構築しておりますが、こだわりがないなら普通にChatGpt4oでいいと思います。
最近では、インプットのトークン数も増えてアウトプットのトークン数を上がってきたため、ある程度雑に情報を渡しても回答精度は保証できます。
しかし、唯一気を付けていただきたいことが、先日、OpenAIはアクセス過多で利用制限が発生しました。
そのため、サービスとして可用性を担保させたいなら、2つはモデルを利用できるように構築しておくと、そのような事態にも対処することが可能です。
個人的には、Geminiがおすすめです。
ぜひ、検討してみてください。
取得した情報を画面へ展開
実際にサービスを展開する場合は、画面が必須となります。
上記の開発を行うのは、Pythonとなる可能性が高いと思いますが、それを画面で表示できるように構築が必須です。
私は、単独で開発を行っていたため、1から作ることができず、ローコードツール【OracleAPEX】で作りました。
ただし、OracleAPEXは、直接Pythonを利用できないため、FunctionsというサーバーレスでサービスをたてることができるOCIの機能を利用しました。
OCIでまとめることができた為、かなり楽に構築を進めることができました。
まとめ
サービスとしての実装の観点を切り離し、RAGとしての苦労した点のみを今回はまとめました。
今後は、サービスとしての実装における苦労した点など、Ver2の記事も考えております。
ぜひ今後ともよろしくお願いいたします。