RagasのValueError: Dataset does not contain required column ['contexts'] の修正方法

beginner🧠 AI Tools2026-07-22| Python 3.9+, Ragasライブラリ(全バージョン), Hugging Face Datasets, LangChainまたはLlamaIndexのRAGパイプライン

Error Message

ValueError: Dataset does not contain required column ['contexts']
#ragas#rag#評価#python

エラーの概要Ragas (Retrieval Augmented Generation Assessment) で評価指標を実行する際、evaluate() の呼び出し中にクラッシュが発生することがあります。トレースバックは通常、以下のようになります:

ValueError: Dataset does not contain required column ['contexts']

これは、データセットが完全であると思っている場合でも発生します。Ragas ライブラリは入力スキーマに対して厳格です。必要なカラムが1つでも欠けていたり、スペルミスがあったりすると、評価プロセスは直ちに停止します。

根本原因Ragas の指標で計算を行うには、Hugging Face の Dataset オブジェクトに特定のカラム名が含まれている必要があります。選択した指標(context_precisioncontext_recall など)に応じて、ライブラリは文字通り contexts という名前のカラムを期待します。

このエラーの一般的な原因には以下が含まれます:

  • 名前の不一致: データセットで contexts の代わりに、context(単数形)、source_documents、または retrieved_chunks が使用されている。- データ型の問題: contexts カラムは、単一の文字列やオブジェクトのリストではなく、文字列のリスト (List[str]) である必要があります。- 辞書のキーの欠落: Python の辞書を Hugging Face Dataset に変換する際、取得したドキュメントのキーが Ragas の期待するものと一致していない。## ステップバイステップの解決策### 方法 1:Hugging Face Dataset のカラム名を変更するすでにデータセットオブジェクトがあり、名前が間違っている場合は、rename_column メソッドを使用します。これは、データを再処理せずにエラーを修正する最も効率的な方法です。
from datasets import Dataset

# 「間違った」カラム名を持つサンプルデータ
data = {
    "question": ["What is Ragas?"],
    "answer": ["Ragas is an evaluation framework."],
    "source": [["Ragas helps evaluate RAG pipelines."]], # これは 'contexts' である必要があります
    "ground_truth": ["Ragas is a framework for RAG evaluation."]
}

ds = Dataset.from_dict(data)

# 修正:'source' を 'contexts' にリネーム
if "contexts" not in ds.column_names:
    ds = ds.rename_column("source", "contexts")

print(ds.column_names)
# 出力:['question', 'answer', 'contexts', 'ground_truth']

方法 2:コンテキストを正しくフォーマットするRagas は、各行の contexts が文字列のリストであることを期待しています。RAG パイプラインが単一の文字列を返す場合は、それをリストで囲む必要があります。LangChain の Document オブジェクトを返す場合は、page_content を抽出する必要があります。

# 不適切なフォーマット(名前が正しくても問題が発生します)
# contexts: "This is a single string"

# 正しいフォーマット
# contexts: ["Chunk 1 text", "Chunk 2 text"]

# LangChain のドキュメントから抽出する例
retrieved_docs = retriever.get_relevant_documents(query)
context_strings = [doc.page_content for doc in retrieved_docs]

# データ辞書に追加
eval_data = {
    "question": [query],
    "answer": [result_from_llm],
    "contexts": [context_strings], # ネストされたリストであることに注意
    "ground_truth": [actual_answer]
}

方法 3:EvaluationDataset クラスを使用する (Ragas 0.2 以降)新しいバージョンの Ragas では、データを処理するためのより構造化された方法が提供されています。生のデータセットを渡す代わりに、EvaluationDatasetSingleTurnSample クラスを使用することで、重い評価ロジックを実行する前にスキーマを検証できます。

from ragas import EvaluationDataset

# 'contexts' が欠落している場合、早い段階で明確な検証エラーが発生します
eval_ds = EvaluationDataset.from_dict({
    "question": [...],
    "answer": [...],
    "contexts": [[...]], 
    "ground_truth": [...]
})

検証修正を確認するには、1つの指標だけで最小限の評価を実行します。これにより、スキーマを検証しながら API クレジットを節約できます。

from ragas import evaluate
from ragas.metrics import context_precision

# これが ValueError なしで実行されれば、スキーマは正解です
result = evaluate(
    dataset=ds,
    metrics=[context_precision]
)

print("Evaluation successful:", result)

予防策将来のプロジェクトでこのエラーを回避するために、RAG 出力用のシンプルなマッピング関数を実装します。フレームワーク(LangChain、LlamaIndex、Haystack など)によって取得されたノードの命名規則が異なるため、マッパーを使用することで一貫性を確保できます。

def prepare_ragas_dataset(rag_results):
    """
    RAG 出力を Ragas 形式に標準化します。
    rag_results: 'query'、'result'、'source_documents' を含む辞書のリスト
    """
    formatted_data = {
        "question": [],
        "answer": [],
        "contexts": [],
        "ground_truth": []
    }
    
    for item in rag_results:
        formatted_data["question"].append(item["query"])
        formatted_data["answer"].append(item["result"])
        # contexts が文字列のリストであることを確認
        formatted_data["contexts"].append([doc.page_content for doc in item["source_documents"]])
        formatted_data["ground_truth"].append(item["expected_answer"])
        
    return Dataset.from_dict(formatted_data)

データ取り込みレイヤーでこのスキーマを強制することで、ValueError が Ragas 評価エンジンに到達するのを防ぐことができます。

Related Error Notes