Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RAGのretrievalの評価を “ranx”で行う / Evaluate retrival...

RAGのretrievalの評価を “ranx”で行う / Evaluate retrival of RAG using "ranx"

Kuniaki Shimizu

May 24, 2024
Tweet

More Decks by Kuniaki Shimizu

Other Decks in Programming

Transcript

  1. RAG/LLMの評価ツール • Ragas • Prompt Flow • promptfoo • ARES

    RAG全体をパイプラインとして評価するものが多い印象 ※全部触ったわけではないので個人的な主観です • TruLens • LangSmith • DeepEval • Uptrain
  2. RAG

  3. ranxで必要なもの 正解データ (Qrel) 実際の検索 結果データ (Run) 評価メトリクス 評価結果 TREC形式(.trec) →

    TREC (Text REtrieval Conference) = NIST主催の情報検索技術の  ワークショップで使用されるフォーマット(後述)
  4. 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) ※「関連度のグラデーション」や「ランキングの順位」に意味があるものとないものがあるので注意 ※ 複数の結果を融合することもできるらしい
  5. 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 ランキング スコア タグ
  6. 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} 評価メトリクス
  7. 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を渡す
  8. ranx/retrieval単体評価のメリット • シンプル ◦ シンプルで学習コストが低い ◦ 必要なものはTRECファイルだけ、フレームワークに依存せず、柔軟 性が高い • 低コスト

    ◦ retrieval単体のコストは比較的安価 • 実績のある評価手法 ◦ 既存の検索/ランキング/推薦システムの一般的な評価手法 ◦ ベクトルDB以外の検索ソースにも適用しやすい
  9. ranx/retrieval単体評価のデメリット • あくまでもretrievalの評価のみ ◦ generationの評価は別途必要 • フレームワーク・プラットフォーム等での採用事例が少ない ◦ 自動化が必要なら組み込みが必要 •

    評価メトリクスの知識は必要 ◦ ツールはシンプルだが、評価メトリクスの知識は必要 ◦ 関連度のグラデーションやランキング順まで評価するなら、相応の データを用意する必要がある ◦ それらに応じたメトリクス選定が必要
  10. 補足: テストの実施条件 • 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で使用
  11. • 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モデルの比較
  12. 補足: クエリ書き換えの比較 • クエリ書き換えなし(ベースライン) • HyDE ◦ Hypothetical Document Embeddings

    ◦ クエリから仮の回答文をLLMに生成させて、その回答文でベクトル検索 ◦ https://arxiv.org/abs/2204.07496 • RAG Fusion ◦ クエリから複数のクエリをLLMに生成させて、それぞれのクエリで 検索。検索結果を融合アルゴリズムでリランキング。 ◦ https://github.com/Raudaschl/rag-fusion ◦ BM25等のキーワード検索と組み合わせたり、複数の融合アルゴリズムがあ る ◦ 今回はシンプルに類似クエリを生成してベクトル検索+ランク順位だけでリラ ンキング(Reciprocal Rank Fusion)
  13. 参考リンク • 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
  14. 参考リンク • 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
  15. 参考リンク • 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