Ragas 自动化评估代码示例
import os from datasets import Dataset from langchain_openai import ChatOpenAI, OpenAIEmbeddings from ragas import evaluate from ragas.metrics import ( context_recall, faithfulness, answer_relevancy, context_precision ) # ========================== # 1. 配置 LLM 和 Embedding模型 # ========================== # 注意:请替换为你自己的 API Key 和 Base URL (如果是本地模型或中转站) os.environ["OPENAI_API_KEY"] = "your-api-key-here" # 如果使用本地模型或特定中转站,取消下面注释并配置 # os.environ["OPENAI_BASE_URL"] = "http://localhost:11434/v1" # 初始化用于评估的 LLM (裁判) # 建议使用能力较强的模型如 gpt-4o, gpt-4-turbo 或 qwen-max 等 evaluator_llm = ChatOpenAI(model="gpt-4o", temperature=0) # 初始化 Embedding 模型 (用于计算答案相关性等需要向量比对的指标) embeddings = OpenAIEmbeddings(model="text-embedding-3-small") # ========================== # 2. 准备测试数据 # ========================== # 数据格式必须包含: question, answer, contexts, ground_truths # contexts 是列表形式,因为检索可能返回多个文档片段 data_samples = { 'question': [ '故宫位于哪个城市?', 'Python中列表和元组的主要区别是什么?' ], 'answer': [ '故宫位于中国北京市中心。', '列表是可变的,而元组是不可变的。此外,列表使用方括号,元组使用圆括号。' ], 'contexts': [ ['故宫,旧称紫禁城,位于中国北京市中心,是中明清两代的皇家宫殿。'], ['在Python中,列表(list)是可变序列,通常用于存储同质集合;元组(tuple)是不可变序列。列表用[]定义,元组用()定义。'] ], 'ground_truths': [ ['故宫位于北京。'], ['列表可变,元组不可变。'] ] } # 转换为 Ragas 需要的 Dataset 格式 dataset = Dataset.from_dict(data_samples) # ========================== # 3. 执行评估 # ========================== print("开始评估 RAG 系统性能...") result = evaluate( dataset=dataset, metrics=[ context_recall, # 检索召回率:是否找全了关键信息 faithfulness, # 忠实度:回答是否基于上下文,有无幻觉 answer_relevancy, # 答案相关性:回答是否切题 context_precision # 上下文精度:检索到的内容是否精准且排序合理 ], llm=evaluator_llm, # 指定裁判 LLM embeddings=embeddings # 指定 Embedding 模型 ) # ========================== # 4. 输出结果 # ========================== # 转换为 Pandas DataFrame 方便查看 df = result.to_pandas() print("\n--- 评估详细得分 ---") print(df) # 打印平均分 print("\n--- 平均指标得分 ---") for metric_name in result.scores.keys(): avg_score = sum(result.scores[metric_name]) / len(result.scores[metric_name]) print(f"{metric_name}: {avg_score:.4f}")开始评估 RAG 系统性能...
Evaluating: 100%|██████████| 2/2 [00:05<00:00, 2.50s/it]--- 评估详细得分 ---
question ... context_precision
0 故宫位于哪个城市? ... 1.000000
1 Python中列表和元组的主要区别是什么? ... 1.000000[2 rows x 6 columns]
--- 平均指标得分 ---
context_recall: 1.0000
faithfulness: 1.0000
answer_relevancy: 0.9850
context_precision: 1.0000