Slide 1

Slide 1 text

RAGのretrievalの評価を “ranx”で行う @kun432

Slide 2

Slide 2 text

アジェンダ ● 自己紹介 ● RAGの評価について ● ranxのご紹介 ● ranx/retrieval単体評価を行うメリット・デメリット ● 参考になる情報など

Slide 3

Slide 3 text

自己紹介

Slide 4

Slide 4 text

自己紹介 ● Kuniaki Shimizu(@kun432) ● 神戸在住のフリーランスエンジニア ● ZennでLLM周りの記事をいろいろ書いてます https://zenn.dev/kun432 ● 最近の興味 ○ 競馬予想RAGエージェントを作りたい

Slide 5

Slide 5 text

RAGの評価について

Slide 6

Slide 6 text

RAG/LLMの評価ツール ● Ragas ● Prompt Flow ● promptfoo ● ARES RAG全体をパイプラインとして評価するものが多い印象 ※全部触ったわけではないので個人的な主観です ● TruLens ● LangSmith ● DeepEval ● Uptrain

Slide 7

Slide 7 text

RAG

Slide 8

Slide 8 text

RAGパイプライン評価 クエリとコンテキスト の関連正 コンテキストの 正確性 コンテキストの 網羅率 生成された 回答の正確性 生成された 回答の関連性

Slide 9

Slide 9 text

シンプルに小さくやるというやり方

Slide 10

Slide 10 text

Garbage In, Garbage Out. (ゴミを入れたら、ゴミが出てくる)

Slide 11

Slide 11 text

RAG ここにフォーカス ここまでを評価

Slide 12

Slide 12 text

ranx

Slide 13

Slide 13 text

ranx ● ランキング評価メトリクスのライ ブラリ ● 情報検索・推薦システム の評価や比較が目的 ● Python製 ● MITライセンス https://github.com/AmenRa/ranx

Slide 14

Slide 14 text

ranxで必要なもの 正解データ (Qrel) 実際の検索 結果データ (Run) 評価メトリクス 評価結果 TREC形式(.trec) → TREC (Text REtrieval Conference) = NIST主催の情報検索技術の  ワークショップで使用されるフォーマット(後述)

Slide 15

Slide 15 text

ranxがサポートしている評価メトリクス Hits Bpref Hit Rate RBP(Rank-biased Precision) Precision MRR(Mean Reciprocal Rank) Recall MAP(Mean Average Precision) F1 DCG(Discounted Cumulative Gain) r-Precision NDCG(Normarized Discounted Cumulative Gain) ※「関連度のグラデーション」や「ランキングの順位」に意味があるものとないものがあるので注意 ※ 複数の結果を融合することもできるらしい

Slide 16

Slide 16 text

実際のRAGでやってみる

Slide 17

Slide 17 text

使用したデータセット ● LINEが自治体向けAIチャットボット導入促進 に向けて、公開しているオープンデータ ● シンプルなQ&A形式(Q:Aが1:1) https://linecorp.com/ja/csr/newslist/ja/2020/260 母子手帳を受け取りたいの ですが、手続きを教えてくだ さい。 窓口で妊娠届をご記入いた だき、母子手帳をお渡ししま す。住民票の世帯が別の方 が代理で窓口に来られる場 合は、・・・

Slide 18

Slide 18 text

Qrelの作成 母子手帳を受け取りたいの ですが、手続きを教えてくだ さい。 窓口で妊娠届をご記入いた だき、母子手帳をお渡ししま す。住民票の世帯が別の方 が代理で窓口に来られる場 合は、・・・ ID:Q_001 ID:A_001 Q_001 0 A_001 1 Q_002 0 A_002 1 Q_003 0 A_003 1 Q_004 0 A_004 1 Q_005 0 A_005 1 (snip) クエリID クエリに 関連する ドキュメントID 関連度 TSV

Slide 19

Slide 19 text

Runの作成 母子手帳を受け取りたいの ですが、手続きを教えてくだ さい。 ID:Q_001 Q001 Q0 A037 1 0.9046793350727792 openai-text-embedding-ada-002 Q001 Q0 A003 2 0.898394740756145 openai-text-embedding-ada-002 Q001 Q0 A108 3 0.8972154176078383 openai-text-embedding-ada-002 (snip) Q662 Q0 A349 97 0.8157339552059201 openai-text-embedding-ada-002 Q662 Q0 A468 98 0.815688009571736 openai-text-embedding-ada-002 Q662 Q0 A106 99 0.81553835940394 openai-text-embedding-ada-002 ベクトル DB 母子手帳は、妊娠届の内容を確認させていた だき、その場でお渡しします。 ・・・ 母子手帳の申請には診断書はいりませんが、 妊娠届に診断を受けた・・・ ID:A_037 ID:A_003 クエリID クエリで検索された ドキュメントID ランキング スコア タグ

Slide 20

Slide 20 text

Evaluate: QrelとRunを1対1で評価 from ranx import Qrels, Run, evaluate qrels = Qrels.from_file("qrels.trec", kind="trec") run = Run.from_file("run_openai-text-embedding-ada-002.trec", kind="trec") score_dict = evaluate(qrels, run, ["hit_rate@5", "mrr"]) score_dict {'hit_rate@5': 0.850453172205438, 'mrr': 0.7342841784444143} 評価メトリクス

Slide 21

Slide 21 text

Compare: 複数のRunを比較して評価 from ranx import Qrels, Run, evaluate, compare qrels = Qrels.from_file("qrels.trec", kind="trec") run_1 = Run.from_file("run_openai-text-embedding-ada-002.trec", kind="trec") run_2 = Run.from_file("run_openai-text-embedding-3-large.trec", kind="trec") report = compare(qrels, runs=[run_1, run_2], metrics=["hit_rate@5", "mrr"], max_p=0.01) report # Model Hit Rate@5 MRR --- ----------------------------- ------------ ------ a openai-text-embedding-ada-002 0.850 0.734 b openai-text-embedding-3-large 0.906ᵃ 0.814ᵃ 複数のRunを渡す

Slide 22

Slide 22 text

Compareの例: Embeddingモデルの比較 Notebook: https://gist.github.com/kun432/85fe25a7c0433d8686c38ff4239840ba ベース ライン

Slide 23

Slide 23 text

Compareの例: クエリ書き換えの比較 ベース ライン Notebook: https://gist.github.com/kun432/49b5be26963ab8c52a89fb66e839156e

Slide 24

Slide 24 text

● あくまでも今回使用したデータや実装に対する結果。 ○ 別のデータを使う・異なる実装等の場合には結果が異なる可能性 ○ 特にLLMを使っている場合(HyDE等)、パラメータ・プロンプトにより、同じ データでも異なる結果になる可能性。 ● notebookを公開しています。ご参考になれば。 注意

Slide 25

Slide 25 text

ranx/retrieval単体評価の メリット・デメリット

Slide 26

Slide 26 text

ranx/retrieval単体評価のメリット ● シンプル ○ シンプルで学習コストが低い ○ 必要なものはTRECファイルだけ、フレームワークに依存せず、柔軟 性が高い ● 低コスト ○ retrieval単体のコストは比較的安価 ● 実績のある評価手法 ○ 既存の検索/ランキング/推薦システムの一般的な評価手法 ○ ベクトルDB以外の検索ソースにも適用しやすい

Slide 27

Slide 27 text

ranx/retrieval単体評価のデメリット ● あくまでもretrievalの評価のみ ○ generationの評価は別途必要 ● フレームワーク・プラットフォーム等での採用事例が少ない ○ 自動化が必要なら組み込みが必要 ● 評価メトリクスの知識は必要 ○ ツールはシンプルだが、評価メトリクスの知識は必要 ○ 関連度のグラデーションやランキング順まで評価するなら、相応の データを用意する必要がある ○ それらに応じたメトリクス選定が必要

Slide 28

Slide 28 text

まとめ

Slide 29

Slide 29 text

まとめ ● RAGのretrievalの品質評価は重要 ● ranxはシンプルで始めやすい ● retrieval以外の評価は他のツールを併用 ユースケースに合わせて選択

Slide 30

Slide 30 text

補足

Slide 31

Slide 31 text

補足: テストの実施条件 ● Q&Aデータを使用してベクトルインデックスを作成 ○ Aをベクトル化して、Qで検索(Q≠A) ○ QとAは1:1でQrelを作成 ● LlamaIndexを使用して実装 ● 評価メトリクスは以下を使用 ○ Hit Rate ■ クエリに紐づく回答が検索結果に含まれるか ■ top-k内に含まれるかどうか、順位は考慮されない ○ MRR ■ クエリに紐づく回答が検索結果の上位に含まれるか ■ top-k内の順位が高いほど高スコア ● Embeddingモデルは、OpenAI text-embedding-ada-002 をベースラインとして使用 ● Completionが必要な場合は OpenAI gpt-3.5-turbo-0125&temperature=0.1で使用

Slide 32

Slide 32 text

● OpenAI ○ text-embedding-ada-002 (ベースライン) ○ text-embedding-3-small ○ text-embedding-3-large ● Cohere ○ embed-multilingual-v3 ● Amazon Bedrock ○ Amazon Titan Embeddings G1 ● Hugging Face ○ infloat/multilingual-e5-large ○ infloat/multilingual-e5-large ○ BAAI/bge-m3 補足: Embeddingモデルの比較

Slide 33

Slide 33 text

補足: クエリ書き換えの比較 ● クエリ書き換えなし(ベースライン) ● HyDE ○ Hypothetical Document Embeddings ○ クエリから仮の回答文をLLMに生成させて、その回答文でベクトル検索 ○ https://arxiv.org/abs/2204.07496 ● RAG Fusion ○ クエリから複数のクエリをLLMに生成させて、それぞれのクエリで 検索。検索結果を融合アルゴリズムでリランキング。 ○ https://github.com/Raudaschl/rag-fusion ○ BM25等のキーワード検索と組み合わせたり、複数の融合アルゴリズムがあ る ○ 今回はシンプルに類似クエリを生成してベクトル検索+ランク順位だけでリラ ンキング(Reciprocal Rank Fusion)

Slide 34

Slide 34 text

参考リンク

Slide 35

Slide 35 text

参考リンク ● GitHubレポジトリ https://github.com/AmenRa/ranx ● ranxドキュメント https://amenra.github.io/ranx/ ● ranxを紹介しているブログ ○ 「ranxを使って検索システムのオフライン評価を する - Ahogrammer」 https://hironsan.hatenablog.com/entry/2023/10/13/085841 ● 自分の記事 ○ 「ranxを試す」 https://zenn.dev/kun432/scraps/1356729a3608d6 ○ 「検索の評価指標をranxを使いながら理解する」 https://zenn.dev/kun432/scraps/0f1577a6988558

Slide 36

Slide 36 text

参考リンク ● RAGの様々なテクニック ○ 「RAGの性能を改善するための8つの戦略| Fintan」 https://fintan.jp/page/10301/ ○ 「Retrieval-based LM (RAG system) ざっくり理解する」 https://speakerdeck.com/smiyawaki0820/retrieval-based-lm-rag-sys tem-zatukurili-jie-suru ○ 「RAGの実装戦略まとめ」 https://qiita.com/jw-automation/items/045917be7b558509fdf2 ○ langchain-ai/rag-from-scratch https://github.com/langchain-ai/rag-from-scratch

Slide 37

Slide 37 text

参考リンク ● TREC ○ 公式サイト: https://trec.nist.gov/ ○ Wikipedia: https://ja.wikipedia.org/wiki/TREC ■ Qrelフォーマット https://trec.nist.gov/data/qrels_eng/ ■ Runフォーマット https://trec.nist.gov/data/qa.html