加载中

现在我们的评估数据集已经准备好了,接下来是构建核心评估流程的时候了。这包括获取每个测试用例,将其与我们的提示合并,将其提供给Claude,然后对结果进行评分。

评估过程遵循一个清晰的工作流程:我们获取测试用例数据集,将每个测试用例与我们的提示模板结合,将其发送给Claude进行处理,然后使用评分系统评估输出结果。

构建核心函数

评估流程由三个主要函数组成,每个函数都有特定的职责。让我们从最简单的函数开始——处理单个提示的函数。

run_prompt 函数

此函数接收一个测试用例并将其与我们的提示模板合并:

python
def run_prompt(test_case):
    """Merges the prompt and test case input, then returns the result"""
    prompt = f"""
Please solve the following task:

{test_case["task"]}
"""
    
    messages = []
    add_user_message(messages, prompt)
    output = chat(messages)
    return output

目前,我们保持提示极其简单。我们没有包含任何格式化指令,因此Claude可能会返回比我们需要的更冗长的输出。我们将在后续迭代提示设计时对此进行优化。

run_test_case 函数

此函数负责协调运行单个测试用例并对结果进行评分:

python
def run_test_case(test_case):
    """Calls run_prompt, then grades the result"""
    output = run_prompt(test_case)
    
    # TODO - 评分
    score = 10
    
    return {
        "output": output,
        "test_case": test_case,
        "score": score
    }

目前,我们使用的是硬编码的10分。评分逻辑是我们将在后续章节中投入大量时间的部分,但这个占位符让我们能够测试整体流程。

run_eval 函数

此函数协调整个评估过程:

python
def run_eval(dataset):
    """Loads the dataset and calls run_test_case with each case"""
    results = []
    
    for test_case in dataset:
        result = run_test_case(test_case)
        results.append(result)
    
    return results

此函数处理数据集中的每一个测试用例,并将所有结果收集到一个列表中。

运行评估

要执行我们的评估流程,我们加载数据集并通过我们的函数运行它:

python
with open("dataset.json", "r") as f:
    dataset = json.load(f)

results = run_eval(dataset)

第一次运行时,预计会花费一些时间——即使使用Claude Haiku,处理完整数据集也可能需要大约30秒。我们将在后面介绍优化技巧。

检查结果

评估返回一个结构化的JSON数组,其中每个对象代表一个测试用例的结果:

python
print(json.dumps(results, indent=2))

每个结果包含三个关键信息:

  • output:Claude的完整响应
  • test_case:被处理的原始测试用例
  • score:评估分数(目前是硬编码的)

正如您在输出中所看到的,由于我们还没有提供具体的格式化指令,Claude生成的响应相当冗长。这正是我们在优化提示时需要解决的问题。

我们已经完成的工作

至此,我们已经成功构建了核心评估流程。我们可以获取数据集,通过Claude处理它,并收集结构化的结果。目前缺失的主要部分是评分系统——那个硬编码的10分需要被实际的评估逻辑所取代。

这个流程代表了大多数AI评估系统的基础。虽然它看起来很简单,但您刚刚构建的已经是评估流程实际工作内容的大部分。复杂性体现在细节中——更好的提示、更复杂的评分以及性能优化。

接下来,我们将深入探讨评分器这一关键主题,它将把我们硬编码的分数转变为对Claude性能的有意义评估。