生成AIをさらに便利に使う技術がRAGです。
RAGを使うことで、一般的ではない社内規約や技術情報などに関する質問に対しても精度よく回答させることができるようになります。
RAGは構築するのは比較的簡単ですが、精度を改善させるところが難しいと言われています。
今回はRAGの精度改善に取り組む際に注意したい点をいくつかまとめたいと思います。
RAGについての説明はこちらの記事でも書いています
【RAG、追加学習】生成AIをより便利に使う技術【生成AI②】
まずはRAGのどこから改善すべきか?
RAGの精度を上げるためには、まずはその構成を理解しておきましょう。
RAGは次のように検索と生成の組み合わせによって最終的な回答を出します。
つまり、”精度が悪い”と一言でいっても、ベクターDBの検索精度が悪いのか、LLMの生成精度が悪いのかによって取るべきアクションが変わってきます。
また、年々LLMの性能は上がっており、ベクターDBからの検索が間違っていたとしても、LLMが一般的な知識の範囲で上手く答えてしまい、評価ができないなんてこともあり得ます。
全ての性能を評価するのは非常に大変ですので、ある程度定量的にRAGの性能を評価することができると、開発者としてはありがたいわけです。
精度を数値化して評価するには?
よくRAGを構築した際の評価方法としては、質問リストをいくつか作り答えさせるといったやり方があります。
RAGを構築してみるとわかるのですが、このやり方はとても難しいです。
私は次の問題にブチあたり、何度か挫折しました。。。
- ベクターDBに使用したデータの中身の知識が私自身になく、そもそも質問とその回答を数多く作ることができない
- 上と同じ理由でLLMが出してきた答えが本当に正しいのかどうか判断できない
- 何をもって”正しさ”というのか、人によって判断が変わる場合がある
それではどうやってRAGを評価するのか?というと、最近はRAGを定量的に評価することができるRAGASというツールが登場しております。
RAGASとは
RAGASとは何か?についてはこちらの記事が参考になります。
RAGASは検索と生成に分けて性能を定量的に評価することができ、大きく下の表の観点で評価することが可能です。
評価したい内容 | 評価項目 | 説明 |
検索 (Retrieval) |
Context Precision | 検索されたコンテキストの有用性を評価 |
Context Recall | 質問に答えるために必要な関連情報を全て検索できているかを評価 | |
生成 (Generation) |
Faithfulness | 生成された回答がどれだけ事実に忠実かを評価 |
Answer Relevancy | 生成された回答が質問に対してどれだけ関連性があるかを評価 |
上記は一部で、2024年12月現在RAGに関する評価項目は以下の通りのようです。
- 文脈の精度 (Context Precision)
- 文脈の再現率(Context Entities Recall)
- 文脈のエンティティ(固有名詞など)の再現率(Context Precision)
- ノイズ感度(Noise Sensitivity)
- 応答の関連性(Response Relevancy)
- 忠実さ(Faithfulness)
- マルチモーダルな忠実さ(Multimodal Faithfulness)
- マルチモーダル関連性(Multimodal Relevance)
※マルチモーダル:テキストだけでなく画像や表といった様々な入力に対応すること
※一覧はRAGAS Webサイトを和訳
LLMやRAGといった技術は進化が早く、こういった進化に対応するためにも新しい指標が次々と登場しています。
精度改善は具体的に何をするべきか?
RAGASの評価結果に応じて精度改善のアクションは変わります。
RAGの「生成」部分の精度改善をしたい場合
生成部分の根幹を担うのはLLMになりますので、このLLMを改善する必要があります。
が、コストや手間を考えると正直できることはそんなに多くないのかなと思います。
大きく以下の4つが考えられます。
- LLMを最新のものに変更する
- プロンプトエンジニアリングを行う
- ファインチューニングを行う
- 追加学習を行う
概要や利点をまとめると次ようになります。
手法 | 概要 | メリット | デメリット |
LLM自体を最新のものに替える | 最新のLLM(例: GPT-4からGPT-5)にアップデートする | – 楽に最新技術を活用できる – 汎用的な性能向上 – 計算効率や機能性の改善も期待できる |
– モデル切り替えにコストがかかる – 既存システムとの統合、調整が必要 |
ファインチューニングを行う | モデルを特定タスクやドメインに適応させるために再学習させる | – 特定タスクやドメインでの精度が向上 – 特化した回答生成が可能 |
– 訓練データが必要 – 大規模な計算資源が必要 |
追加学習を行う | 既存のモデルに新しい知識を付加する | – 元の知識を保持しつつ新知識を学習 – 柔軟で計算負荷が少ない |
– 最新データには都度学習が必要 – 知識の整合性が求められる |
プロンプトエンジニアリング | プロンプトを工夫してモデルの性能を最大限引き出す | – 簡単かつ低コストで実装可能 – データやモデル自体の変更がない |
– 長期的な改善には不向き – 複雑なプロンプト設計が必要になることがある |
最初にトライすべきは、最も手軽かつ交換が見込めるプロンプトエンジニアリングです。
プロンプトの指定の仕方にもいくつかテクニックがあるので、実践する場合は試行錯誤が必要です。
「検索」の精度を改善したい場合
RAGの検索はベクターDBが根幹になります。
検索精度を改善するためには、いくつかの段階に分けてやる必要があります。
- データの形式を見直す
- エンベディング(埋め込み)モデルを変更する
- 文章の分割(チャンキング)を調整する
何よりもデータの形を見直すことが重要
やはり、手元にあるデータ(文章)をそのまま使ってしまうとフォーマットが異なっていたり、新旧混ざった情報が含まれていたり、様々な問題が生じます。
ベクターDBに投入する前に、以下のポイントに注意しておくと精度向上が見込めます。
- 情報を更新し、古い情報は削除する
- 文章の構成やフォーマットを統一化する
- マークダウン形式で記載し、見出しや表の関係性を捉えられるようにする
文章の構成やフォーマットを統一化することは特に重要で、検索時に文章をある程度の塊に分割する(チャンキング)する際に、ひと塊ごとに説明が完結していると上手く検索しやすくなります。
しかしながら、データが膨大な場合は上記の作業はとても大変で、コストがかかります。
機械的に処理が可能であればPythonなどのプログラミング言語で処理してしまうのも良いですが、そうもいかない場合がほとんどでしょう。
そういうケースでは、文書を整理する生成AIを挟んでデータ整備をしてしまうというのも一つの手です。
コメント