エラーの概要Ragas (Retrieval Augmented Generation Assessment) で評価指標を実行する際、evaluate() の呼び出し中にクラッシュが発生することがあります。トレースバックは通常、以下のようになります:
ValueError: Dataset does not contain required column ['contexts']
これは、データセットが完全であると思っている場合でも発生します。Ragas ライブラリは入力スキーマに対して厳格です。必要なカラムが1つでも欠けていたり、スペルミスがあったりすると、評価プロセスは直ちに停止します。
根本原因Ragas の指標で計算を行うには、Hugging Face の Dataset オブジェクトに特定のカラム名が含まれている必要があります。選択した指標(context_precision や context_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 では、データを処理するためのより構造化された方法が提供されています。生のデータセットを渡す代わりに、EvaluationDataset や SingleTurnSample クラスを使用することで、重い評価ロジックを実行する前にスキーマを検証できます。
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 評価エンジンに到達するのを防ぐことができます。

