alibaba/spring-ai-alibaba · warning

数据集版本数据量为0或不存在: {}

Error message

数据集版本数据量为0或不存在: {}

What it means

In ExperimentServiceImpl.getResults, after loading the experiment, the code reads the dataset version's dataCount. If the dataset version row is missing or dataCount is null/0, it logs this warning and sets dataCount = 1 to avoid a divide-by-zero when computing average scores. Results are still returned but any per-item averages are skewed by this artificial divisor.

Source

Thrown at spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/service/impl/ExperimentServiceImpl.java:179

        experiment.setEvaluatorConfig(JSON.toJSONString(evaluatorConfigList));
        return experiment;
    }

    @Override
    public List<ExperimentEvaluatorResult> getResults(Long experimentId) {
        log.info("查询实验结果: {}", experimentId);
        
        // 先检查实验是否存在
        ExperimentDO experiment = experimentMapper.selectById(experimentId);
        if (experiment == null) {
            log.warn("实验不存在: {}", experimentId);
            return null;
        }

        Integer dataCount = datasetVersionMapper.selectById(experiment.getDatasetVersionId()).getDataCount();
        // 检查dataCount是否为null或0,避免除零异常
        if (dataCount == null || dataCount == 0) {
            log.warn("数据集版本数据量为0或不存在: {}", experiment.getDatasetVersionId());
            dataCount = 1; // 避免除零异常,设置默认值
        }


        // 正确解析 evaluatorConfig JSON 数组字符串为 List<EvaluatorConfig>
        List<EvaluatorConfig> evaluatorConfigList = JSON.parseArray(experiment.getEvaluatorConfig(), EvaluatorConfig.class);

        // 提取 evaluatorVersionId 列表
        List<Long> evaluatorList = evaluatorConfigList.stream()
                .map(e -> Long.valueOf(e.getEvaluatorVersionId()))
                .toList();

        // 使用stream map collect方式构建结果列表
        Integer finalDataCount = dataCount;
        return evaluatorList.stream().map(evaluatorVersionId -> {
            List<ExperimentResultDO> resultList = experimentResultMapper.selectByExperimentAndEvaluator(experimentId, evaluatorVersionId);
            //计算score的平均值,避免除零异常
            BigDecimal averageScore = BigDecimal.ZERO;

View on GitHub (pinned to f82da0b50f)

Solutions

  1. Check the dataset_version row for experiment.datasetVersionId — restore it or fix the reference.
  2. Ensure dataset versions have at least one item before running experiments; validate datasetCount on creation.
  3. Backfill dataCount for legacy rows created before the column existed.
  4. Treat reported averages with dataCount defaulted to 1 as unreliable and re-run the experiment with a populated dataset.

Example fix

// before
Integer dataCount = datasetVersionMapper.selectById(id).getDataCount(); // NPE if version missing

// after
DatasetVersionDO version = datasetVersionMapper.selectById(id);
if (version == null || version.getDataCount() == null || version.getDataCount() == 0) {
    log.warn("Dataset version missing or empty: {}", id);
    throw new ResponseStatusException(HttpStatus.CONFLICT, "Dataset version has no data: " + id);
}
Integer dataCount = version.getDataCount();
Defensive patterns

Strategy: validation

Validate before calling

DatasetVersionDO version = datasetVersionMapper.selectById(experiment.getDatasetVersionId());
if (version == null || version.getDataCount() == null || version.getDataCount() <= 0) {
    throw new IllegalStateException("Dataset version " + experiment.getDatasetVersionId() + " has no data");
}

Try / catch

try {
    return experimentService.getResults(id);
} catch (NullPointerException | IllegalStateException e) {
    // dataset version row missing (NPE inside service) or empty dataset
    throw new ResponseStatusException(HttpStatus.CONFLICT, "Experiment dataset has no data", e);
}

Prevention

When it happens

Trigger: Calling getResults for an experiment whose datasetVersionId points to a deleted/missing dataset_version row, or a version that was saved with 0 items (dataCount null or 0).

Common situations: Dataset version deleted while experiments referencing it remain; dataset uploaded empty; import produced zero rows; dataCount column never populated by an older schema/version.

Understand the failure class

Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.

Related errors


AI-assisted analysis of alibaba/spring-ai-alibaba@f82da0b50f (2026-09-09). Data as JSON: /api/errors/cd75a18544e8464c. Report an issue: GitHub.