@ArizePhoenix: 机器学习中最古老的教训之一,对于使用 LLM 应用仍然非常有用:不要用相同的数据进行评估……
摘要
本文讨论了使用 Arize Phoenix 开发 LLM 应用的最佳实践,特别强调了使用训练集/验证集/测试集拆分来进行诚实评估和追踪回归的重要性。
查看缓存全文
缓存时间: 2026/05/08 10:49
机器学习中最古老的教训之一,对于处理大语言模型应用仍然最为实用:不要在用于构建模型的数据上进行评估。训练集/开发集/验证集/测试集的划分是有原因的。它们有助于区分“这是因为针对它调优而生效”和“这实际上是泛化的”。同样的实践自然适用于智能体、提示词和评估。一个好的数据集可能包含:
- 用于快速迭代的开发集
- 用于提示词/模型选择的验证集
- 用于最终信心的测试集
- 系统一直失败的困难示例集
在整个数据集上的单一聚合分数通常会掩盖最关键的方面:系统在哪里改进,在哪里退化?划分使得实验更有针对性、更诚实,并且更容易在时间维度上进行比较。这是经典的ML原则,也是非常实用的LLM工程模式。 https://arize.com/docs/phoenix/datasets-and-experiments/how-to-experiments/splits#splits…
分割 - Phoenix
来源:https://arize.com/docs/phoenix/datasets-and-experiments/how-to-experiments/splits
文档索引
在此处获取完整文档索引:https://arizeai-433a7140.mintlify.app/llms.txt 在进一步探索之前,请使用此文件发现所有可用页面。
通常,我们希望只对整个数据集的一个子集运行实验。这些数据集的示例子集被称为“分割”。常见的分割包括:
- 经常产生糟糕输出的困难示例,
- 用于少样本提示的示例分割,以及用于评估的、不相交且不重叠的示例分割,
- 用于微调大语言模型的训练集、验证集和测试集分割。
在分割上运行实验,而不是在整个数据集上运行,可以生成更能捕捉到您所关心的特定类型数据上,智能体、工作流程或提示词性能的评估指标。
配置分割
实验可以通过Python或JavaScript客户端,或者在Phoenix Playground中,对先前配置好的分割运行。
创建分割
目前,分割可以在数据集页面的UI中创建。检查数据集时,您会看到一个新的分割列以及一个分割过滤器。
在分割过滤器上,我们可以分配分割和创建分割
一个分割可以被赋予名称、描述和颜色
- 创建分割
- 分割已创建
分配分割
目前,分割只能从数据集的UI界面进行分配。要将数据集示例分配给分割,选择一组示例,然后使用分割过滤器我们可以选择分割,它会自动将这些选中的示例分配给所选的分割集合。
- 分配分割
- 分割已分配
使用分割
在本例的剩余部分,我们将使用以下数据集,该数据集有3个示例分配给测试集,7个示例分配给训练集。
- UI
可以从Playground UI中对数据集分割运行实验。使用数据集分割时,数据集选择器UI现在会显示数据集,并具有选择全部示例或从一组分割中选择的功能。
要对“训练集”分割运行实验,我们可以通过训练集分割选择数据集,它会显示7个选中的示例,然后点击“运行”
- 选中的分割
- 在分割上运行实验
当使用get_dataset客户端方法从Phoenix服务器拉取数据集时,分割会被隐式配置。随后调用run_experiment只会在属于该分割的示例上运行。
# pip install "arize-phoenix-client>1.22.0"
from phoenix.client import Client
client = Client()
# 只拉取选定分割中的示例
dataset = client.datasets.get_dataset(
dataset="my-dataset",
splits=["test", "hard_examples"], # 先前创建的分割名称
)
def my_task(input):
return f"Hello {input['name']}"
experiment = client.experiments.run_experiment(
dataset=dataset, # 只会在选定分割上运行
task=my_task,
experiment_name="greeting-experiment"
)
分割可以在获取数据集时的DatasetSelector中进行配置。选定分割中包含的数据集示例将用于实验运行或评估。
// npm install @arizeai/phoenix-client@latest
import { runExperiment } from "@arizeai/phoenix-client/experiments"
import type { ExperimentTask } from "@arizeai/phoenix-client/types/experiments";
import type { DatasetSelector } from "@arizeai/phoenix-client/types/datasets";
const myTask: ExperimentTask = (example) => {
return `Hello, ${(example.input as any).name ?? "stranger"}!`
}
// 创建一个可用于获取数据集的数据集选择器
const datasetSelector: DatasetSelector = {
datasetName: "my-dataset",
splits: ["test", "hard_examples"] // 先前创建的分割名称
}
runExperiment({
// runExperiment 将执行即时获取数据集 "my-dataset"
// 其示例会根据提供的分割进行过滤
dataset: datasetSelector,
task: myTask,
experimentName: "greeting-experiment"
})
在分割上比较实验
分割作为一个属性是可变的,这意味着您可以随时向分割添加或移除示例。然而,为了保持实验比较的一致性,实验运行在执行的时刻会进行快照。实验运行与其所针对的分割之间的关联是不可变的,这确保即使后续分割分配发生变化,比较结果仍然准确。实验之间的比较始终会参考基础实验的快照。这意味着当比较实验时,系统会使用基础实验执行时所包含的精确示例集,无论随后对分割分配做了任何更改。例如,如果您对包含7个示例(具有特定示例ID)的“训练集”分割运行一个实验,那么这7个相同的示例ID将用于任何未来的实验比较。即使后来您向“训练集”添加了更多示例或移除了一些示例,比较仍然只会包含基础实验快照中的原始7个示例。当比较在分割上运行的实验时,我们现在会看到这种新的重叠状态,即实验比较不包含这些示例ID的情况:
或者存在重叠时的预期状态:
相似文章
@ArizePhoenix:谁来评判评估者?当你使用LLM作为评判者时,你正在信任一个模型来决定你的代理、工作流……
本文讨论了使用Arize Phoenix调试和评估LLM评判者所面临的挑战,Arize Phoenix通过OpenTelemetry追踪评估者运行过程,以检查决策逻辑、成本和潜在偏差。
大多数大语言模型评估工具是否仍然过于侧重提示词?
作者质疑当前的 LLM 评估工具是否过于关注孤立的提示词,而忽视了完整的工作流程和智能体交互,并指出逐步的准确性可能会掩盖生产环境中整体行为的偏差。
如果你只是自己使用模型而不对外提供服务,vLLM 真的值得用吗?
一名用户讨论了在 AMD 硬件上进行本地单用户推理时,使用 vLLM 与 llama.cpp 之间的权衡,质疑在非企业级环境中 vLLM 的性能优势是否足以弥补其带来的复杂性。
@LakshyAAAgrawal: 从丰富的文本反馈(错误、轨迹、部分推理)中学习,对于LLM优化来说,优于仅使用标量奖励。…
快速-慢速训练(FST)将上下文优化(通过GEPA)与通过强化学习进行的模型权重更新交替进行,在数学、代码和物理推理上实现了比单独使用RL高3倍的样本效率,同时保持了可塑性并实现了持续学习。
@ickma2311: 高效AI讲座13:LLM部署技术 该讲座帮助我很好地理解了AWQ、vLLM和FlashAttention…
一场关于LLM部署技术的讲座,涵盖AWQ、vLLM、FlashAttention、量化和激活平滑,以实现高效服务。