实验
什么是实验?
实验是对你的应用进行的有意更改,以测试一个假设或想法。例如,在检索增强生成 (RAG) 系统中,你可能会替换检索器模型,以评估新的嵌入模型如何影响聊天机器人响应。
良好实验的原则
- 定义可衡量的指标:使用诸如 accuracy、precision 或 recall 等指标来量化您更改的影响。
- 系统化的结果存储:确保结果以有组织的方式存储,便于比较和跟踪。
- 隔离更改:一次只做一个更改,以确定其具体影响。避免同时进行多个更改,因为这会掩盖结果。
- 迭代过程: 遵循结构化方法: *进行更改 → 运行评估 → 观察结果 →
graph LR A[Make a change] --> B[Run evaluations] B --> C[Observe results] C --> D[Hypothesize next change] D --> A
Ragas 中的实验
实验的组成部分
- 测试数据集: 用于评估系统的数据。
- 应用端点: 正在被测试的应用、组件或模型。
- 指标: 用于评估性能的定量度量。
执行过程
运行一个实验包括:
- 在应用程序端点上执行数据集。
- 计算用于量化性能的指标。
- 返回并存储结果。
使用 @experiment
装饰器
Ragas 中的 @experiment
装饰器简化了实验的编排、扩展和存储。下面是一个示例:
from ragas import experiment
# Define your metric and dataset
my_metric = ...
dataset = ...
@experiment
async def my_experiment(row):
# Process the query through your application
response = my_app(row.query)
# Calculate the metric
metric = my_metric.score(response, row.ground_truth)
# Return results
return {**row, "response": response, "accuracy": metric.value}
# Run the experiment
my_experiment.arun(dataset)
传递附加参数
您可以通过 arun()
向您的实验函数传递额外的参数。这对于模型、配置或实验所需的任何其他参数很有用:
@experiment
async def my_experiment(row, model):
# Process the query with the specified parameters
response = my_app(row.query, model=model)
# Calculate the metric
metric = my_metric.score(response, row.ground_truth)
# Return results
return {**row, "response": response, "accuracy": metric.value}
# Run with specific parameters
my_experiment.arun(dataset, "gpt-4")
# Or use keyword arguments
my_experiment.arun(dataset, model="gpt-4o")
使用数据模型
您可以在装饰器级别为您的实验结果指定数据模型:
from pydantic import BaseModel
class ExperimentResult(BaseModel):
response: str
accuracy: float
model_used: str
@experiment(experiment_model=ExperimentResult)
async def my_experiment(row, model):
response = my_app(row.query, model)
metric = my_metric.score(response, row.ground_truth)
return ExperimentResult(
response=response,
accuracy=metric.value,
model_used=model
)
# Run experiment with specific model
my_experiment.arun(dataset, model="gpt-4o")
完整示例:LLM 参数传递
下面是一个完整示例,展示如何将不同的 LLM 模型传递给你的实验函数:
from pydantic import BaseModel
from ragas.experimental import Dataset
from ragas import experiment
class ExperimentResult(BaseModel):
query: str
response: str
accuracy: float
model_used: str
latency_ms: float
@experiment(experiment_model=ExperimentResult)
async def llm_experiment(row, llm_model, temperature=0.7):
"""Experiment function that accepts LLM model and other parameters."""
import time
start_time = time.time()
# Use the passed LLM model
response = await my_llm_app(
query=row.query,
model=llm_model,
temperature=temperature
)
# Calculate metrics
metric = my_metric.score(response, row.ground_truth)
end_time = time.time()
return ExperimentResult(
query=row.query,
response=response,
accuracy=metric.value,
model_used=llm_model,
latency_ms=(end_time - start_time) * 1000
)
# Run experiments with different models
gpt4_results = await llm_experiment.arun(
dataset,
llm_model="gpt-4o",
temperature=0.1
)
claude_results = await llm_experiment.arun(
dataset,
llm_model="claude-4-sonnet",
temperature=0.7
)
结果存储
一旦执行,Ragas 会处理数据集中的每一行,将其传入函数运行,并将结果存储在 experiments
文件夹中。存储后端可以根据您的偏好进行配置。