Tech
blog
テックブログ

2026.7.31

    ragasのFAQ検索におけるRAG

    こんにちは
    AIチームの戸田です

    今回はRAG(Retrieval Augmented Generation)の評価フレームワーク、ragasをFAQ検索のタスクに適用し、その評価の妥当性を検証してみたいと思います。

    今回の取り組みを行おうと思ったきっかけですが、以前業務でragasを使って、あるRAGシステムの評価を行なっていた際に、Off-Target Problemの(日本語の質問に対して英語で生成されてしまった)文章を高く評価してしまっているケースを見つけたからです。

    検証のための検索対象のデータとして、Japanese FAQ dataset for e-learning systemを利用します。こちらはeラーニングシステムのQ&Aのデータセットで、FAQとそれに対する質問やFAQのカテゴリなどの情報が含まれています。データの詳細はリンク先をご参照ください。

    データの読み込み

    pandasを使ってデータセットを読み込んでいきます

    import pandas as pd
    
    ROOT = "{Japanese FAQ dataset for e-learning systemからダウンロードしたディレクトリ}"
    
    question_df = pd.read_csv(f"{ROOT}/Questions.csv")
    display(question_df.head())
    
    answer_df = pd.read_csv(f"{ROOT}/Answers.csv")
    display(answer_df.head())

    AIDで質問とそれに対する回答が紐づいています。

    なお回答のTextにはhtmlタグが混じっているようなので、以下のコードで前処理しておきます。

    import re
    
    def remove_html_tags(text):
        clean = re.compile('<.*?>')
        return re.sub(clean, '', text)
    
    answer_df["Text"] = answer_df["Text"].map(remove_html_tags)

    検索用Indexの作成

    Answer.csvの内容が回答となるような検索Indexを作成します。今回はLlamaIndexを使いました。

    from llama_index import Document
    from llama_index.llms import OpenAI
    from llama_index import ServiceContext
    from llama_index import VectorStoreIndex
    
    documents = [Document(text=t) for t in answer_df["Text"].tolist()]
    
    
    # モデルはgpt-3.5-turbo
    gpt_35_context = ServiceContext.from_defaults(
        llm=OpenAI(model="gpt-3.5-turbo", temperature=0.1), context_window=2048
    )
    index = VectorStoreIndex.from_documents(documents, service_context=gpt_35_context)
    
    # 上位2件をcontextとする
    query_engine = index.as_query_engine(similarity_top_k=2)

    コードには書いていませんが、環境変数にOpenAI APIのKeyを設定しておく必要があります。

    これで

    ragasのREADMEをみるとCI/CDのためのパイプラインを構築することを目的としているようなので、RAGシステムの性能を測るというよりは、リグレッションテスト的な働きを期待しているのではないかと思いました