From 5854e1b6e13ca6fe79a672296d1dfb4398be5857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=AF=E5=9F=BA=E9=AD=81?= <1412414664@qq.com> Date: Mon, 22 Jun 2026 23:36:24 +0800 Subject: [PATCH] fix: load eval jsonl files with utf-8 bom --- .../promptflow/evals/evaluate/_evaluate.py | 12 +++++------ .../tests/evals/unittests/test_evaluate.py | 20 ++++++++++++++++++- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/promptflow-evals/promptflow/evals/evaluate/_evaluate.py b/src/promptflow-evals/promptflow/evals/evaluate/_evaluate.py index 578236c527f..f50c7b0cd15 100644 --- a/src/promptflow-evals/promptflow/evals/evaluate/_evaluate.py +++ b/src/promptflow-evals/promptflow/evals/evaluate/_evaluate.py @@ -191,12 +191,12 @@ def _validate_and_load_data(target, data, evaluators, output_path, azure_ai_proj if not isinstance(evaluation_name, str): raise ValueError("evaluation_name must be a string.") - try: - initial_data_df = pd.read_json(data, lines=True) - except Exception as e: - raise ValueError( - f"Failed to load data from {data}. Please validate it is a valid jsonl data. Error: {str(e)}." - ) from e + try: + initial_data_df = pd.read_json(data, lines=True, encoding="utf-8-sig") + except Exception as e: + raise ValueError( + f"Failed to load data from {data}. Please validate it is a valid jsonl data. Error: {str(e)}." + ) from e return initial_data_df diff --git a/src/promptflow-evals/tests/evals/unittests/test_evaluate.py b/src/promptflow-evals/tests/evals/unittests/test_evaluate.py index 8f5d38db1d3..9283eec34c7 100644 --- a/src/promptflow-evals/tests/evals/unittests/test_evaluate.py +++ b/src/promptflow-evals/tests/evals/unittests/test_evaluate.py @@ -11,7 +11,12 @@ from promptflow.client import PFClient from promptflow.evals._constants import DEFAULT_EVALUATION_RESULTS_FILE_NAME from promptflow.evals.evaluate import evaluate -from promptflow.evals.evaluate._evaluate import _aggregate_metrics, _apply_target_to_data, _rename_columns_conditionally +from promptflow.evals.evaluate._evaluate import ( + _aggregate_metrics, + _apply_target_to_data, + _rename_columns_conditionally, + _validate_and_load_data, +) from promptflow.evals.evaluate._utils import _apply_column_mapping, _trace_destination_from_project_scope from promptflow.evals.evaluators import ( ContentSafetyEvaluator, @@ -123,6 +128,19 @@ def test_evaluate_invalid_jsonl_data(self, mock_model_config, invalid_jsonl_file assert "Failed to load data from " in exc_info.value.args[0] assert "Please validate it is a valid jsonl data" in exc_info.value.args[0] + def test_validate_and_load_data_accepts_utf8_sig_jsonl(self, tmp_path): + data_file = tmp_path / "evaluate_test_data_utf8_sig.jsonl" + data_file.write_text( + '{"question": "How are you?", "answer": "Fine", "ground_truth": "Fine"}\n', + encoding="utf-8-sig", + ) + + data = _validate_and_load_data(None, str(data_file), {"g": F1ScoreEvaluator()}, None, None, None) + + assert data.to_dict(orient="records") == [ + {"question": "How are you?", "answer": "Fine", "ground_truth": "Fine"} + ] + def test_evaluate_missing_required_inputs(self, missing_columns_jsonl_file): with pytest.raises(ValueError) as exc_info: evaluate(data=missing_columns_jsonl_file, evaluators={"g": F1ScoreEvaluator()})