Repository: modelscope/evalscope
Issue: mmlu本地评测报错
Root cause: Configuration Error

## 自查清单

在提交 issue 之前，请确保您已完成以下步骤:
- [√] 我已仔细阅读了[相关使用说明文档](https://evalscope.readthedocs.io/zh-cn/latest/get_started/parameters.html)
- [√] 我已查看了[常见问题解答](https://evalscope.readthedocs.io/zh-cn/latest/get_started/faq.html)
- [√] 我已搜索并查看了现有的 issues，确认这不是一个重复的问题

## 问题描述

我先用
modelscope download --dataset cais/mmlu --local_dir ./data/mmlu
下载了mmlu数据集，然后使用以下脚本启动
def run_test_no_think():
    from evalscope import TaskConfig, run_task
    task_cfg = TaskConfig(
        model='Qwen3-0.6B',
        api_url='http://0.0.0.0:8000/v1/chat/completions',
        eval_type='service',
        datasets=['mmlu'],
        dataset_args={
            'mmlu': {
                'local_path': './data/mmlu',
            },
        },
        eval_batch_size=16,
        generation_config={
            'max_tokens': 20000,  # 最大生成token数，建议设置为较大值避免输出截断
            'temperature': 0.7,  # 采样温度 (qwen 报告推荐值)
            'top_p': 0.8,  # top-p采样 (qwen 报告推荐值)
            'top_k': 20,  # top-k采样 (qwen 报告推荐值)
            'n': 1,
            'chat_template_kwargs': {'enable_thinking': False}  # 关闭思考模式
        },
        stream=False,
    )

    run_task(task_cfg=task_cfg)

run_test_no_think()

报错如下，发现没能正确加载数据集：
Traceback (most recent call last):
  File "/mnt/data/tam-workdir/zhinan/eval_api.py", line 27, in <module>
    run_test_no_think()
  File "/mnt/data/tam-workdir/zhinan/eval_api.py", line 25, in run_test_no_think
    run_task(task_cfg=task_cfg)
  File "/usr/local/lib/python3.11/site-packages/evalscope/run.py", line 31, in run_task
    return run_single_task(task_cfg, run_time)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/evalscope/run.py", line 44, in run_single_task
    result = evaluate_model(task_cfg, outputs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/evalscope/run.py", line 131, in evaluate_model
    res_dict = evaluator.eval()
               ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/evalscope/evaluator/evaluator.py", line 455, in eval
    prompts = self.load_dataset()
              ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/evalscope/evaluator/evaluator.py", line 76, in load_dataset
    prompts = self.data_adapter.gen_prompts(data_dict=dataset)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/evalscope/benchmarks/data_adapter.py", line 260, in gen_prompts
    few_shot_data = self.get_fewshot_examples([item for item in sub_data_dict[self.train_split]],
                                                                ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
KeyError: 'train'

## EvalScope 版本（必填）
v0.17.1

## 使用的工具
- [√] Native / 原生框架
- [ ] Opencompass backend
- [ ] VLMEvalKit backend
- [ ] RAGEval backend
- [ ] Perf / 模型推理压测工具
- [ ] Arena / 竞技场模式


请更新evalscope到 1.0.0 版本

`def run_test_no_think():
    from evalscope import TaskConfig, run_task
    task_cfg = TaskConfig(
        model='Qwen3-0.6B',
        api_url='http://0.0.0.0:8000/v1',
        eval_type='server',
        datasets=['mmlu'],
        dataset_args={
            'mmlu': {
                'local_path': './data/mmlu',
            },
        },
        eval_batch_size=16,
        generation_config={
            'max_tokens': 20000,  # 最大生成token数，建议设置为较大值避免输出截断
            'temperature': 0.7,  # 采样温度 (qwen 报告推荐值)
            'top_p': 0.8,  # top-p采样 (qwen 报告推荐值)
            'top_k': 20,  # top-k采样 (qwen 报告推荐值)
            'n': 1,
            'chat_template_kwargs': {'enable_thinking': False}  # 关闭思考模式
        },
        stream=False,
    )

    run_task(task_cfg=task_cfg)

run_test_no_think()`

更新了1.0.0，可以读取本地数据集了，但观察服务端输出仍会输出思考内容,swift版本3.5.3，vllm0.8.5

<img width="4478" height="1448" alt="Image" src="https://github.com/user-attachments/assets/2fbcc35c-dfd0-4e65-b709-de909a0c5c8e" />

generation config需要这样写，相应的文档我也更新一下：
```python
generation_config={
'max_tokens': 20000, # 最大生成token数，建议设置为较大值避免输出截断
'temperature': 0.7, # 采样温度 (qwen 报告推荐值)
'top_p': 0.8, # top-p采样 (qwen 报告推荐值)
'top_k': 20, # top-k采样 (qwen 报告推荐值)
'extra_body':{'chat_template_kwargs': {'enable_thinking': False}} # 关闭思考模式
},
```

修改config后在配置中正常加载了思考参数
<img width="716" height="464" alt="Image" src="https://github.com/user-attachments/assets/9a61c3f6-6c1a-4d16-b010-6eab298363e6" />
但是实际请求还是会生成思考内容
<img width="4486" height="606" alt="Image" src="https://github.com/user-attachments/assets/fe41e490-f843-4bc7-a2fa-54a084ab9074" />

你的模型服务是vllm拉起的吗，还是什么其他方式

是vllm拉的

我直接用vllm拉起的服务，设置extra body没问题诶，你是通过swift的deploy拉起的服务吗

是的swift版本3.5.3，vllm0.8.5
CUDA_VISIBLE_DEVICES=0,1,2,3 swift deploy \
    --model /Qwen/Qwen3-0.6B \
    --infer_backend vllm \
    --served_model_name Qwen3-0.6B \
    --tensor_parallel_size 4

直接用vllm命令拉起试试

直接用vllm拉没输出思考内容，正常输出结果了，但是我发现
dataset_args={
            'mmlu': {
                'local_path': './data/mmlu',
            },
            'few_shot_num': 0,
        },
这里设置few_shot_num没起作用，还是会有五个样本作为示例

<img width="4494" height="646" alt="Image" src="https://github.com/user-attachments/assets/e546d6bd-6df1-4d38-928c-9be2c14038f0" />

参数写的不对，few shot num在mmlu里面：
```python
dataset_args={
'mmlu': {
'local_path': './data/mmlu',
'few_shot_num': 0,
}
},
```

> 如果EvalScope对您有所帮助，欢迎给我们点个STAR以示支持，谢谢！

def run_test_no_think():
    from evalscope import TaskConfig, run_task
    task_cfg = TaskConfig(
        model='Qwen3-0.6B',
        api_url='http://127.0.0.1:8000/v1/chat/completions',
        eval_type='service',
        datasets=['cmmlu'],
        dataset_args={
            'cmmlu': {
                'local_path': './data/cmmlu',
                'few_shot_num': 0,
            },
        },
        eval_batch_size=1,
        generation_config={
            'max_tokens': 2000, # 最大生成token数，建议设置为较大值避免输出截断
            'temperature': 0, # 采样温度 (qwen 报告推荐值)
            'top_p': 0.8, # top-p采样 (qwen 报告推荐值)
            'top_k': 20, # top-k采样 (qwen 报告推荐值)
            'n': 1,  # 每个请求产生的回复数量
            'system_message': "You are a helpful assistant.",
            'extra_body':{'chat_template_kwargs': {'enable_thinking': False}} # 关闭思考模式
        },
        stream=False,
    )

    run_task(task_cfg=task_cfg)

run_test_no_think()

更新到了代码仓库的2.0.0版本，运行时报错：
ValueError: Model API 'service' is not registered. Available model APIs: ['mock_llm', 'openai_api', 'server', 'llm_ckpt', 'checkpoint', 'text2image', 'image_editing']

换成openai_api后，与我的自己写的请求得到的结果相差非常大，以下是我的请求：
# Copyright (c) Alibaba, Inc. and its affiliates.
import os

from openai import OpenAI

def infer(client, model: str, messages):
    # 打印完整对话上下文（可选）
    for msg in messages:
        print(f"[{msg['role']}]: {msg['content']}")
    
    resp = client.chat.completions.create(
        model=model,
        messages=messages,
        max_tokens=2000,
        temperature=0,
        top_p=0.8
    )
    response = resp.choices[0].message.content
    print(f'response: {response}')
    return response

def run_client(host: str = '127.0.0.1', port: int = 8000):
    client = OpenAI(
        api_key='EMPTY',
        base_url=f'http://{host}:{port}/v1',
    )
    model = client.models.list().data[0].id
    print(f'model: {model}')

    messages = [
        {'role': 'system', 'content': 'You are a helpful assistant.'},
        {'role': 'user', 'content': '**User**: 回答下面的单项选择题，请选出其中的正确答案。你的回答的最后一行应该是这样的格式：\"答案：LETTER\"（不带引号），其中 LETTER 是 A,B,C,D 中的一个。请在回答前进行一步步思考。\n\n问题：气相型循环的特点是\n选项：\nA) 速度较慢，循环较为完全\nB) 速度快，循环不完全\nC) 速度较慢，循环不完全\nD) 速度快，循环比较完全\n'}
    ]
    infer(client, model, messages)


if __name__ == '__main__':
    run_client(port=8000)

以下是我的请求得到的结果：
<img width="2978" height="440" alt="Image" src="https://github.com/user-attachments/assets/04408616-77de-4b2b-8c4f-3f8cb0e2b80a" />

但是跑cmmlu得到的content为空：
{"index": 160, "input": "**User**: 回答下面的单项选择题，请选出其中的正确答案。你的回答的最后一行应该是这样的格式：\"答案：LETTER\"（不带引号），其中 LETTER 是 A,B,C,D 中的一个。请在回答前进行一步步思考。\n\n问题：气相型循环的特点是\n选项：\nA) 速度较慢，循环较为完全\nB) 速度快，循环不完全\nC) 速度较慢，循环不完全\nD) 速度快，循环比较完全\n", "target": "D", "sample_score": {"score": {"value": {"acc": 0.0}, "extracted_prediction": "", "prediction": "", "explanation": null, "metadata": {}, "main_score_name": null}, "sample_id": 160, "group_id": 160, "sample_metadata": {"subject": "agronomy"}}}

运行`evalscope app`命令，看一下模型的输出，看起来是模型输出没有正确获取到

> 运行`evalscope app`命令，看一下模型的输出，看起来是模型输出没有正确获取到

我怀疑是思考模式设置的问题，即便设置为非思考，对模型输出的捕获是否需要依赖捕获<think>标签？如果我现在训练后的模型不输出think标签，会不会导致答案捕获为空？

<img width="1386" height="1388" alt="Image" src="https://github.com/user-attachments/assets/6671694f-9d6f-465a-8a2b-69824668349d" />

你的模型是官方的0.6B模型吗，输出看起来不太对啊，有很多为空的内容，而且格式也有问题，多了很多 ` 

> 你的模型是官方的0.6B模型吗，输出看起来不太对啊，有很多为空的内容，而且格式也有问题，多了很多 `

我是微调后的0.6B-Base模型，我自己的请求输出的是正常内容，见上面的回复，但跑测评就是content很怪。

0.6B-Base模型没有经过SFT，目前的评测都是针对chat模型设计的

我也遇到了同样的问题：需要评测frames数据集，
evalscope eval \
 --model /model_path \
 --api-url http://127.0.0.1:8801/v1/chat/completions \
 --eval-type server \
 --datasets frames \
 --limit 2 \
 --judge-model-args '{"api_key": "ms-xxx", "api_url": "https://api-inference.modelscope.cn/v1/", "model_id": "Qwen/Qwen3-235B-A22B", "extra_body": {"enable_thinking": false}, "stream": false}'  
首先报错ERROR: Error occurred during Qwen/Qwen3-235B-A22B@https://api-inference.modelscope.cn/v1/ LLM judge evaluation: Error code: 400 - {'error': {'code': 'invalid_parameter_error', 'message': 'parameter.enable_thinking must be set to false for non-streaming calls', 'param': None, 'type': 'invalid_request_error'}, 'request_id': '57f6656d-8f8d-4597-939c-239e59b4bd34'}
加上这行
 --generation-config '{"do_sample":true,"temperature":0.6,"max_new_tokens":512,"extra_body":{"chat_template_kwargs":{"enable_thinking": false}}}' 
然后报错并没有解决：
- evalscope - ERROR: Error occurred during Qwen/Qwen3-235B-A22B@https://api-inference.modelscope.cn/v1/ LLM judge evaluation: Error code: 400 - {'error': {'code': 'invalid_parameter_error', 'message': 'parameter.enable_thinking must be set to false for non-streaming calls', 'param': None, 'type': 'invalid_request_error'}, 'request_id': '2c94a1db-42f5-4a4e-87c8-d325fdc5c9a1'}


@xwpaul3 如果你用的是modelscope提供的API，我测试了这样写没问题，用命令行的话需要转为对应的json字符串格式：
```python
'judge_model_args': {
      'model_id': 'qwen3-235b-a22b',
      'api_url': 'https://dashscope.aliyuncs.com/compatible-mode/v1',
      'api_key': env.get('DASHSCOPE_API_KEY'),
      'generation_config': {
          'temperature': 0.0,
          'max_tokens': 4096,
          'extra_body': {'enable_thinking': False}
      }
  },
```


> [@xwpaul3](https://github.com/xwpaul3) 如果你用的是modelscope提供的API，我测试了这样写没问题，用命令行的话需要转为对应的json字符串格式：
> 
> 'judge_model_args': {
>       'model_id': 'qwen3-235b-a22b',
>       'api_url': 'https://dashscope.aliyuncs.com/compatible-mode/v1',
>       'api_key': env.get('DASHSCOPE_API_KEY'),
>       'generation_config': {
>           'temperature': 0.0,
>           'max_tokens': 4096,
>           'extra_body': {'enable_thinking': False}
>       }
>   },

问题已解决，谢谢。不过目前出现了调用次数过多的问题，能否绕开，最好是用本地模型做裁判模型
evalscope - ERROR: Error occurred during Qwen/Qwen2.5-VL-72B-Instruct@https://api-inference.modelscope.cn/v1/ LLM judge evaluation: Error code: 429 - {'errors': {'message': 'Request limit exceeded.', 'request_id': '5146f0df-1b2b-4e6f-90cb-4320653d868e'}}


> 感谢你的反馈！我们将关闭此问题。如果您有任何疑问，请随时重新打开它。如果EvalScope对您有所帮助，欢迎给我们点个STAR以示支持，谢谢！