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

评估过程遵循一个清晰的工作流程:我们获取测试用例数据集,将每个用例与我们的提示模板结合,将其发送给Claude进行处理,然后使用评分系统评估输出结果。
构建核心函数
评估流程由三个主要函数组成,每个函数都有特定的职责。让我们从最简单的函数开始——处理单个提示的函数。
run_prompt 函数
此函数接收一个测试用例并将其与我们的提示模板合并:
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 函数
此函数负责协调运行单个测试用例并对结果进行评分:
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 函数
此函数协调整个评估过程:
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此函数处理数据集中的每一个测试用例,并将所有结果收集到一个列表中。
运行评估
要执行我们的评估流程,我们加载数据集并通过我们的函数运行它:
with open("dataset.json", "r") as f:
dataset = json.load(f)
results = run_eval(dataset)第一次运行时,预计会花费一些时间——即使使用Claude Haiku,处理完整数据集也可能需要大约30秒。我们将在后面介绍优化技巧。
检查结果
评估返回一个结构化的JSON数组,其中每个对象代表一个测试用例的结果:
print(json.dumps(results, indent=2))
每个结果包含三个关键信息:
- output:Claude的完整响应
- test_case:被处理的原始测试用例
- score:评估分数(目前是硬编码的)
正如您在输出中看到的,由于我们还没有提供具体的格式化指令,Claude生成的响应相当冗长。这正是我们在优化提示时要解决的问题。

我们已经完成的工作
至此,我们已经成功构建了核心评估流程。我们可以获取数据集,通过Claude处理它,并收集结构化的结果。目前缺失的主要部分是评分系统——那个硬编码的分数10需要被实际的评估逻辑所取代。
这个流程代表了大多数AI评估系统的基础。虽然它看起来很简单,但您刚刚构建了评估流程实际所做工作的大部分内容。复杂性体现在细节中——更好的提示、更复杂的评分以及性能优化。
接下来,我们将深入探讨评分器这一关键主题,它将把我们硬编码的分数转变为对Claude性能的有意义评估。