LlamaIndexによるRAGの改良状況をragasで計測! #LlamaIndex #AI #LLM #ragas
はじめに
ChatGPT関連のAI技術を紹介するシリーズです。
前回のLlamaIndex検証に続いて、今回はLlamaIndexをカスタマイズしていく方法を見ていきましょう。
LlamaIndexを利用したRAG(Retrieval-augmented Generation:検索により強化した文章生成)で、より適切な回答を得るためには、アプリのカスタマイズ(作り込み)が必要です。
しかしながら、LLMのモデル自体を改良したりRAGで使用するデータ自体を新たに作り込んだりするのは難易度が非常に高いです。ひとまずこれらを避けながらRAGの実用度を高めるには、どのようなことができるでしょうか?本記事ではいくつかの代表的なアプローチを紹介します。
記事の後半では、これらのアプローチによる改良で課題となる「適切さの計測」について延べ、ragasというOSSを使いながら、RAGシステムの改良と改良結果の測定を繰り返す手法について紹介します。
アプローチ方法
LlamaIndexでは何も指定しないとデフォルトで動作しますが、下記のようなものをそれぞれを指定することができます。
以下に挙げるものは一例で、他にもプロンプトの作り込みやtop_k
・cutoff
の設定など色々なアプローチ手法があります。
実際の組み込みにはLlamaIndexを完全に理解するチュートリアル その1:処理の概念や流れを理解する基礎編(v0.7.9対応)のシリーズ記事が役に立つでしょう。
モデル指定
言うまでもなくLLMを用いたシステムで最も重要なのはLLM自体の性能です。
しかしながら、モデルの開発には多大なる時間とお金がかかるため、既存のLLMから選択して使うのが現実的でしょう。
GPT-3.5やLlama 2などのLLMから、うまくいきそうなものを選択します。LlamaIndexがデフォルトで使うGPTの他にも、Hugging Faceには多くのLLMが公開されています。各モデルには日本語の対応度など様々な特徴があります。LlamaIndexではそれらのモデル名を指定するだけで簡単に使用することができます。
パラメータ設定
LLMにコンテキストとして与えるチャンクが適切なほど、LLMからの回答が適切になることが期待できます。
しかしながらRAGは大量にある既存のドキュメントを活用する手法であるため、チャンクの元となる既存ドキュメントの内容を大幅に調整するのは難しい場合もあるでしょう。
そこで、チャンク化のseparator
・chunk_size
・chunk_overlap
などといったパラメータを調整することにより、チャンクの内容をある程度適切にします。
チューニングサイクル
モデルを切り替えたりパラメータを変更したりして改良を目指すには、変更と計測のサイクルを回していく必要があります。
※計測とは、ある質問に対して返ってきた回答がどの程度適切かを判断(評価)するということです。
しかしながら、私達は自然言語でのやりとりを対象としているため、その評価が非常に困難であることに気づきます。また、なるべく多くの質問に対して評価する必要があり、これには莫大な手間がかかります。さらに、なるべく主観を排除して評価する必要があり、これは非常に難しい作業になります。
つまり、変更そのものは簡単に適用できるのですが、その変更によってどの程度改良されたか(または悪化したか)の計測・判断が現実的に無理なレベルで難しいのです。
そのため、変更を適用する前に計測方法を検討・準備しておくことが重要です。
ragasでの計測
ragasはRAGの性能を計測するためのフレームワーク(OSS)です。公式サイトによると
Evaluation framework for your Retrieval Augmented Generation (RAG) pipelines
と紹介されています。これを使えば、先述のような計測の困難さを解決することができます。
インストール方法は公式サイトに記載されているとおりです。
計測項目の意味
計測できる主な項目の意味は下記の通りです。(公式サイトの説明)
faithfulness
与えられたコンテキストに対して、回答がどの程度忠実か。
コンテキストから得られない情報が回答に含まれていると減点される。
context_precision
選ばれたコンテキストが質問にどの程度関連しているか。
質問への回答に不要な情報が含まれていると減点される。
answer_relevancy
回答がどの程度直接的に解決していて適切かどうか。
回答の真実性は無関係。
質問に対して冗長な回答や不完全な回答は減点される。
Aspect Critiques
「無害さ」などの自分で定義した指標を測定。
回答だけから測定。
ragas_score
各指標の調和平均。
計測方法
ragasには以下のものを与える必要があります。
- LLMに与えた、ユーザーからの質問内容
- LLMから返ってきた回答
- RAGがLLMに与えたコンテキスト(チャンクの一覧)
これらを複数セット(複数の質問とそれに対応する回答・コンテキスト)用意して、ragasに与えることになります。
簡単な計測のサンプルは下記のようになります。
# 質問からの文脈と応答の生成
contexts: list[list[str]] = []
answers: list[str] = []
for question in questions:
response = query_engine.query(question)
answers.append(str(response))
contexts.append([x.node.get_content() for x in response.source_nodes])
# 計測対象を準備
ds = Dataset.from_dict(
{
"question": questions, # 質問の一覧
"answer": answers, # 回答の一覧
"contexts": contexts, # 「質問時に使ったチャンクの一覧」の一覧
}
)
# 計測
results = dict[str, float](
# 第二引数は計測する項目の指定。(後述)
evaluate(ds, [faithfulness, context_precision, answer_relevancy])
)
print(results)
計測結果の例は下記のようになります。
{'faithfulness': 0.6455357142857142, 'context_relevancy': 0.17072893805462988, 'answer_relevancy': 0.8716361599807388, 'ragas_score': 0.3507292502492895}
計測対象として指定したfaithfulness
・context_precision
(出力結果ではcontext_relevancy
)・answer_relevancy
と、それらを総合的に勘案したragas_score
が取得できています。
ragasのメリット
ragas公式によると、GPT 3.5を用いた計測よりもragasを用いた計測の方が人間による評価に近く、人間による評価と約70%の相関があるとのことです。70%が高いかどうかは判断が難しいところですが、少なくとも「ある程度意味のある値」と言うことができそうです。
また、このような指標を定量的かつ自動的に計測してくれるという点がragasの優れたところです。
ragasを使えば、変更と計測のサイクルを回していくことが可能になるでしょう。特にパラメータの変更は、(そのようなプログラムを作れば)いくつかのパラメータを自動的に変えながら計測し、最良の設定・組み合わせを自動的に探し出すことができます。
どの指標を使うか
指標の意味からして、faithfulness
とanswer_relevancy
が高評価であれば実用性が高いと判断できるのではないでしょうか。モデルの変更やプロンプトの作り込みでは、特にこれらの指標を確認するのがよさそうです。
また、チャンクの切り具合を調整する際にはcontext_precision
を参照するのがよいかもしれません。
ragasの辛さ
計測にはOpenAIのAPIが呼び出されます。これには時間とお金がかかります。今回実施した例では「日本語、約7700チャンク、10個の質問、各種設定はデフォルト」という条件で、下記の時間と$0.58がかかりました。faithfulness
:107秒context_precision
:50秒answer_relevancy
:21秒
※RAG自体の実行を含む。ドキュメントのインデクス化は事前に実施済みのため含まない。
※ragasのFAQには、最低20個の質問を用意するようにという案内が記載されています。
また、得られた計測結果がどの程度適切かの評価(=評価方法の評価)が困難で、ragasを信じるしかありません。ragas以外に同様のものがあったとしても、どれがよいかを選定するのは困難でしょう。
ragasの活用方針
定量的・自動的に計測できるragasは非常に有用なため、これを使いながら改善していくことになりそうです。
ただ、ragas(とRAG自体)の実行には時間とお金がかかるため、闇雲にチャレンジするのではなく、何をどう変更してどの程度改善(悪化)されたかを確認しながら、次に何を変更するのかを計画していくのがよいでしょう。
また、ragasによる評価は100%絶対的なものではないため、要所で人間による評価も組み合わせて使っていくのがよいかもしれません。
We're Hiring!
クリエーションラインでは、このような新たな技術を積極的に取り入れ、弊社が目指すビジョン「IT技術によるイノベーションにより顧客とともに社会の進化を実現する」を一緒に進めていく開発メンバーを募集しております。
ご関心のある方は弊社のお問い合わせページより、是非お気軽にご連絡ください! 一緒に社会を変えたい開発者・エンジニアの皆様の応募を心よりお待ちしております!