跳至内容

实验

什么是实验?

实验是对你的应用进行的有意更改,以测试一个假设或想法。例如,在检索增强生成 (RAG) 系统中,你可能会替换检索器模型,以评估新的嵌入模型如何影响聊天机器人响应。

良好实验的原则

  1. 定义可衡量的指标:使用诸如 accuracy、precision 或 recall 等指标来量化您更改的影响。
  2. 系统化的结果存储:确保结果以有组织的方式存储,便于比较和跟踪。
  3. 隔离更改:一次只做一个更改,以确定其具体影响。避免同时进行多个更改,因为这会掩盖结果。
  4. 迭代过程: 遵循结构化方法: *进行更改 → 运行评估 → 观察结果 →
    graph LR
        A[Make a change] --> B[Run evaluations]
        B --> C[Observe results]
        C --> D[Hypothesize next change]
        D --> A

Ragas 中的实验

实验的组成部分

  1. 测试数据集: 用于评估系统的数据。
  2. 应用端点: 正在被测试的应用、组件或模型。
  3. 指标: 用于评估性能的定量度量。

执行过程

运行一个实验包括:

  1. 在应用程序端点上执行数据集。
  2. 计算用于量化性能的指标。
  3. 返回并存储结果。

使用 @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 文件夹中。存储后端可以根据您的偏好进行配置。