jiku log

データサイエンスの核心を掴む : 学びと発見の記録

「RAG・AIエージェント[実践]入門」を読む ~第7章① Ragasによる合成テストデータの生成~

はじめに

業務でLLMを活用していくためには,検索拡張生成(RAG)やAIエージェントといった技術が必要になってくると考えられる。これらの技術の基礎知識と実践経験を積むために,西見公宏・吉田真吾・大嶋勇樹 著「LangChainとLangGraphによるRAG・AIエージェント[実践]入門」を読むことにした。

本記事は,第7章 「LangSmithを使ったRAGアプリケーションの評価」における,Ragasによる合成テストデータに関する読書メモである。

  • 本書の紹介ページ

gihyo.jp

第7章 LangSmithを使ったRAGアプリケーションの評価

サンプルコードを動かしながら,挙動を確認した。
github.com

7.1 第7章で取り組む評価の概要

本章では,RAGアプリケーションの評価について説明している。RAGアプリケーションの評価が必要なタイミングとして,第6章で紹介されていたRAGの精度向上の工夫をしたときや,LLMのモデルを新しいモデルに変更する際などが挙げられる。

オフライン評価とオンライン評価

本節では,オフライン評価とオンライン評価を説明している。

オフライン評価は,あらかじめ用意したデーセットを使った評価である。
オンライン評価は,実ユーザの反応など,実際のトラフィックを使った評価であり,本番システムに対して実施する。
LangSmithは,オフライン評価とオンライン評価の両方の機能を持っている。本章では,LangSmithを活用したオフライン評価を主に扱う

7.2 LangSmithの概要

LangSmith(https://www.langchain.com/langsmith)は,LangChainの開発元が提供する,LMアプリケーションのためプラットフォーム(Webサービス)である。
LangSmithha,大きく次の3種類の機能を持つ。

  1. Tracing (トレースの収集に関する機能)
  2. Prompts (プロンプトの管理に関する機能)
  3. Evaluation (評価に関する)

7.3 LangSmithとRagasを使ったオフライン評価の構成例

Ragasとは

RagasはRAGの評価フレームワークである。
github.com

RagasはRAGの評価のためのデータ生成機能を持っている。本章では,オフライン評価に使うデータセットをRagasで生成して準備する。処理はGoogle Colabで行なうが,データセットや評価結果はLangSmithに保存を行なう。

7.4 Ragasによる合成テストデータの生成

Ragasによって合成テストデータを作成する。LLMによって生成されたデータを「合成データ(Synthetic data)」とよぶ。

Ragasによる合成データ生成の実装

サンプルコードでは,「Ragasによる合成データ生成用のコード実行時にエラー(RateLimitError)が出る」との警告があった。実際にコードを実行すると,RateLimitErrorが発生した。

そのため,gpt-4oではなく,gpt-4o-miniにモデルを切り替えた。

  • サンプルコード(修正後)
import nest_asyncio
from ragas.testset.generator import TestsetGenerator
from ragas.testset.evolutions import simple, reasoning, multi_context
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

nest_asyncio.apply()

generator = TestsetGenerator.from_langchain(
    generator_llm=ChatOpenAI(model="gpt-4o-mini"),
    critic_llm=ChatOpenAI(model="gpt-4o-mini"),
    embeddings=OpenAIEmbeddings(),
)
'''
generator = TestsetGenerator.from_langchain(
    generator_llm=ChatOpenAI(model="gpt-4o"),
    critic_llm=ChatOpenAI(model="gpt-4o"),
    embeddings=OpenAIEmbeddings(),
)
'''

testset = generator.generate_with_langchain_docs(
    documents,
    test_size=4,
    distributions={simple: 0.5, reasoning: 0.25, multi_context: 0.25},
)

上記のコードを実行した結果,4つのテストデータができた。4つのテストデータのうち,0番目のデータは以下のような内容であった。

  • question : What is the purpose of the VectorStore wrapper in MyScale?
    • 訳 : MyScale の VectorStore ラッパーの目的は何ですか?
  • ground_truth : The purpose of the VectorStore wrapper in MyScale is to allow users to utilize the MyScale database as a vectorstore, which can be used for semantic search or similar example retrieval.
    • 訳 : MyScale の VectorStore ラッパーの目的は、ユーザーが MyScale データベースをベクターストアとして利用し、セマンティック検索や類似の例の取得に使用できるようにすることです。

LangSmithのDatasetの作成

オフライン評価に使うデータセットは,LangSmithの管理機能を用いる。本書では,"Datasets & Testing"になっているが,2025/1/6現在では"Datasets & Experiments"に変わっていた。

(おまけ)合成テストデータ生成にかかった料金

OpenAI Platformのサイトから,合成テストデータ生成にかかった料金を確認した。

  • 生成前 : $0.06


  • 生成後 : $1.34

1回の合成テストデータ生成で,$1.28かかっていた。

まとめと感想

Ragasによる合成テストデータの生成について学んだ。

今回,合成テストデータは4件生成した。ただし,通常は100個から1,000個以上のデータを構成するとのことである。今回作成した件数の25倍~250倍ということなので,単純計算で$32~$320かかることになる。個人利用にしては結構な金額なので,APIの機能ごとにかかる金額*1は事前に把握しておきたい。


本記事を最後まで読んでくださり,どうもありがとうございました。

*1:なお本書では,「このコードを実行すると数ドル程度の料金が発生する」という注意書きが2回書かれていた