产品概述
产品定价
客户价值
应用场景
变量名 | 定义方式 | 数据来源 | 默认值 |
data.question | 最后一条 role 为 user 的 content | 从数据集的一条完整对话记录(data.messages)中提取最后一个role: "user"的消息内容。 | None |
data.gt | 最后一条消息且 role 为 assistant 的 content | 从数据集的一条完整对话记录(data.messages)中提取最后一个role: "assistant"的消息内容。 | 最后一条 role 不为 assistant,默认为 None |
data.history | 对话历史(去除 question 和 gt 的剩余消息) | 从 data.messages 中过滤掉最后一个 user 和 assistant 消息后,剩余消息按顺序拼接的文本。 | 若为单轮对话,默认为 None |
字段名 | 定义与用途 |
data.ref_answer | 参考答案,对应于原数据中的 ref_answer 字段(如果原数据中不包含则返回 None) |
response.content | 被测模型的实际响应内容 |
data.其他用户定义的字段 | 评测数据的用户定义的数据字段都可以引用 |
response.其他被测模型返回的字段 | 被测模型返回的其他字段都可以被引用,常见的例如 response.reasoning_content、response.tool_calls |
"data": {"messages": [{"role": "user", "content": "牛顿第一定律的核心内容是什么?"},{"role": "assistant", "content": "任何物体都要保持匀速直线运动或静止状态,直到外力迫使它改变这种状态为止"}]}
"response": {"content": "牛顿第一定律表明:如果没有外力作用,物体将保持静止或匀速直线运动。","reasoning_content": "用户提问的是牛顿第一定律,我首先需要确定是什么学科..."}
"data": {"messages": [{"role": "system", "content": "你是由A公司研发的智能助手,能够精准回答用户问题。"},{"role": "user", "content": "你好,可以帮我解释一下广义相对论吗?"},{"role": "assistant", "content": "广义相对论是爱因斯坦提出的,引入了引力场与时空弯曲的关系。"},{"role": "user", "content": "那狭义相对论又是什么呢?"},{"role": "assistant", "content": "当物体运动速度接近光速时,时间、空间、质量与能量都将展现出与日常经验完全不同的规律,而光速是宇宙中一切物体速度的极限。"}]}
"response": {"content": "狭义相对论主要研究惯性系中的运动规律,包括时间膨胀和长度收缩。","reasoning_content": "用户问的是狭义相对论,应该说明核心内容。常见表述是:高速运动下的时空性质,如时间膨胀和长度收缩。"}
字段名 | 是否包含 | 字段说明 | 字段示例 |
messages | 是 | OpenAI对话格式 | "messages": [{"role": "user", "content": "你好"}, {"role": "assistant", "content": "你好,有什么可以帮助你"}, {"role": "user", "content": "12+12等于几"},{"role": "assistant", "content": "24"}] |
ref_answer | 通过用户数据集解析,原数据集中不存在该字段则为 None | 参考答案 | "答案等于24" |
gt | 若 messages 中最后一条数据 role 为 assistant,则取其 content 作为本字段 | 标准答案 | "24" |
question | 解析 messages 字段最后一个 role 为 user的 content 内容作为本字段 | 用户提问问题 | "12+12等于几" |
history | 剔除 messages 中的 gt 与 question 字段的剩余内容,根据平台 jinja 模板版渲染为字符串 | 用户提问历史消息 | "[USER] 你好 [BOT] 你好,有什么可以帮助你" |
其他字段 | 用户数据中的其他字段;用户也可在处理脚本中添加 | 自定义字段 | str | int | float | dict 等可JSON序列化的内容 |
字段名 | 是否包含 | 字段说明 | 字段示例 |
content | 是 | 大语言模型推理结果 | "答案等于24" |
reasoning_content | 如果推理框架支持思维链分开展示并返回,则包含;否则为None | 大语言模型推理思维链 CoT 内容 | "嗯,用户问的是“12+12等于几”,这个问题看起来很基础,但作为刚开始学习数学的人可能需要详细解释..." |
tool_calls | 若执行工具调用并返回本字段,则包含;否则为None | 大语言模型工具调用内容 | [{"id":"call_id","type":"function","function":{"name":"get_current_weather","arguments":"{\\"location\\": \\"San Francisco, USA\\", \\"format\\": \\"celsius\\"}"}}] |
其他字段 | 模型返回的其他字段;用户也可在处理脚本中添加 | 自定义字段 | str | int | float | dict 等可 JSON 序列化的内容 |
def preprocess(data: dict, resp: dict, **kwargs) -> bool | int | str | float | None:""":data: Dict,一个字典,包含以下关键信息:- 'messages': 多轮对话历史。- 'ref_answer': (可选) 参考答案。- 以及用户自定义的所有其他字段:resp: Dict, 大模型推理结果,包含以下内容:- content: 模型生成的回答内容- reasoning_content: 模型生成回答的推理过程(如果有)- tool_calls: 模型调用的工具列表(如果有)- 以及用户自定义的所有其他字段:**kwargs: 平台扩展字段,预处理可不提供:return: 预处理结果,可用于裁判模型评测jinja模版引用"""# --- 在此实现您的逻辑 ---pass
def preprocess(data: dict, resp: dict) -> bool | int | str | float | None:try:# 你的处理逻辑except Exception as e:print(f"[预处理脚本出错]:{e}")return 1 # 根据需求返回默认值
def preprocess(data: dict, resp: dict) -> bool:# 判断模型回复是否包含 reasoning_contentreturn resp['reasoning_content'] == ''
import redefault_cot_pairs = [('<think>', '</think>'), ('<Think>', '</Think>')]def remove_cot(text: str, cot_pairs=None) -> str:if cot_pairs is None:cot_pairs = default_cot_pairsret = textfor t0, t1 in cot_pairs:ret = re.sub(f"{t0}.*?{t1}", '', ret, flags=re.DOTALL)return ret.strip()def preprocess(data: dict, resp: dict) -> bool | int | str | float | None:field = 'clean'resp[field] = remove_cot(resp['content'])return resp[field]
def preprocess(data: dict, resp: dict) -> None:# 例如:将模型回复内容添加到 data 中if resp['content']:data['resp'] = resp['content']# 不影响评测判断,返回 Nonereturn None
字段名 | 是否包含 | 字段说明 | 字段示例 |
messages | 是 | OpenAI 对话格式 | [{"role": "system", "content": "You are a helpful assistant. 0827-adjustment" },{"role": "user","content": "你是一个裁判员,请对回答进行打分。\\n\\n\\n[历史信息和问题]\\n\\n<|im_start|>user\\n你好<|im_end|>\\n\\n\\n<|im_start|>assistant\\n你好,有什么可以帮助你<|im_end|>\\n\\n\\n<|im_start|>user\\n18+18等于几<|im_end|>\\n\\n\\n\\n[待评测模型的回答]\\n{'content': '18 + 18 = 36'}\\n\\n[参考答案]\\n答案等于24\\n\\n\\n请给出你的打分,最高分5,最低分1。"}] |
其他字段 | 模型返回的其他字段;用户也可在处理脚本中添加 | 自定义字段 | str | int | float | dict 等可JSON序列化的内容 |
字段名 | 是否包含 | 字段说明 | 字段示例 |
name | 是 | 裁判模型名称 | "deepseek" |
judge_template_content | 是 | 裁判模型打分模板 | """裁判员的打分模板,例如: 你是一个裁判员,请对回答进行打分。[历史信息和问题] {% for message in data.messages %} {{'<|im_start|>' + message['role'] + '\\n' + message['content'] + '<|im_end|>' + '\\n'}} {% endfor %} [待评测模型的回答] {{ response.content }} [参考答案] {{ data.ref_answer }} 请给出你的打分,最高分{{ max_score }},最低分{{ min_score }}。 """ |
generation_params | 不一定,根据用户配置解析 | 裁判模型推理参数 | {\\"temperature\\": 0.8, \\"top_p\\": 0.85} |
system_prompt | 不一定,根据用户配置解析 | 裁判模型推理system | "You are a helpful assistant. " |
def postprocess(judge_reqs: list[dict],judge_resps: list[dict],judge_models: list[dict],data: dict,resp: dict,**kwargs,) -> bool | int | str | float | None:""":param judge_reqs, 裁判模型的打分请求数据。:param judge_resps, 裁判模型的推理结果。:param judge_models, 裁判模型的相关配置。:return: 进行自定义的后处理逻辑,并返回一个用于最终评测结果判断、展示或统计的值,其类型应为 bool | int | str | float | None,以便进行指标计算。"""# --- 在此实现您的逻辑 ---pass
def postprocess(judge_reqs: list[dict],judge_resps: list[dict],judge_models: list[dict],data: dict,resp: dict,**kwargs,) -> bool | int | str | float | None:judge_req = kwargs.get('judge_req')judge_resp = kwargs.get('judge_resp')judge_model = kwargs.get('judge_model')
def postprocess(judge_reqs, judge_resps, judge_models, data, resp, **kwargs):scores = []for jr in judge_resps:try:# 假设裁判返回内容为 "该回答得分为4分" 或 "Score: 4"content = jr['content']score = int(content.strip().split(" ")[-2]) # 简单示例,请根据实际格式调整scores.append(score)except:continueif scores:return round(sum(scores) / len(scores), 2)return None
def postprocess(judge_reqs, judge_resps, judge_models, data, resp, **kwargs):positive_count = 0for jr in judge_resps:content = jr['content']if "good" in content or "correct" in content or "4" in content or "5" in content:positive_count += 1return positive_count > len(judge_resps) / 2 # 超过一半认为正确
def postprocess(judge_reqs, judge_resps, judge_models, data, resp, **kwargs):# 可在此处做数据存储、结构转换等,但不影响最终评测return None

import refrom typing import Optionalans_map = {"A>>B": 1,"A>B": 2,"A=B": 3,"B>A": 4,"B>>A": 5,}def parse_last_comparison(text: str) -> Optional[str]:pattern = r"\\[\\[(A>>B|A>B|A=B|B>A|B>>A)\\]\\]"matches = re.findall(pattern, text)return matches[-1] if matches else Nonedef postprocess(judge_reqs: list[dict],judge_resps: list[dict],judge_models: list[dict],data: dict,resp: dict,**kwargs,) -> Optional[int]:last_comparison = parse_last_comparison(judge_resps[-1]['content'])return ans_map.get(last_comparison)
import refrom typing import Optionalans_map = {"A>>B": 1,"A>B": 2,"A=B": 3,"B>A": 4,"B>>A": 5,}def parse_last_comparison(text: str) -> Optional[str]:pattern = r"\\[\\[(A>>B|A>B|A=B|B>A|B>>A)\\]\\]"matches = re.findall(pattern, text)return matches[-1] if matches else Nonedef postprocess(judge_reqs: list[dict],judge_resps: list[dict],judge_models: list[dict],data: dict,resp: dict,**kwargs,) -> Optional[int]:last_comparison = parse_last_comparison(judge_resps[-1]['content'])return ans_map.get(last_comparison)
文档反馈