From 4df64be8313ec29283046c16163fd15c1ff359f1 Mon Sep 17 00:00:00 2001 From: xming521 <1223398803@qq.com> Date: Thu, 12 Jun 2025 11:37:58 +0800 Subject: [PATCH] =?UTF-8?q?fix=20text=20cleandata=EF=BC=8Cadd=20=E9=A3=8E?= =?UTF-8?q?=E6=A0=BC=E4=BB=A3=E8=A1=A8=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- weclone/data/clean/strategies.py | 13 +++++-- weclone/prompts/clean_data.py | 60 ++++++-------------------------- 2 files changed, 20 insertions(+), 53 deletions(-) diff --git a/weclone/data/clean/strategies.py b/weclone/data/clean/strategies.py index 481088a..d5a190e 100644 --- a/weclone/data/clean/strategies.py +++ b/weclone/data/clean/strategies.py @@ -7,7 +7,7 @@ from typing import Any, Dict, List import pandas as pd from langchain_core.prompts import PromptTemplate -from weclone.data.models import QaPair, QaPairScore, QaPairV2 +from weclone.data.models import QaPairScore, QaPairV2 from weclone.prompts.clean_data import CLEAN_PROMPT from weclone.utils.log import logger @@ -36,7 +36,7 @@ class CleaningStrategy(ABC): class LLMCleaningStrategy(CleaningStrategy): """使用大模型进行数据清洗的策略""" - def judge(self, data: List[QaPair] | List[QaPairV2]) -> None: + def judge(self, data: List[QaPairV2]) -> None: """ 调用llm打分,并将分数直接赋值给传入的QaPair。 """ @@ -46,7 +46,14 @@ class LLMCleaningStrategy(CleaningStrategy): inputs = [] prompt_template = PromptTemplate.from_template(CLEAN_PROMPT) for qa in data: - inputs.append(prompt_template.invoke({"id": qa.id, "Q": qa.instruction, "A": qa.output}).text) # type: ignore + messages_str = "" + for msg in qa.messages: + if msg.role == "user": + messages_str += f"Q: {msg.content}\n" + elif msg.role == "assistant": + messages_str += f"A: {msg.content}\n" + prompt_value = prompt_template.invoke({"id": qa.id, "messages": messages_str.strip()}) + inputs.append(prompt_value.to_string()) outputs = vllm_infer( inputs, self.make_dataset_config["model_name_or_path"], diff --git a/weclone/prompts/clean_data.py b/weclone/prompts/clean_data.py index 2cddca2..eac5a57 100644 --- a/weclone/prompts/clean_data.py +++ b/weclone/prompts/clean_data.py @@ -3,70 +3,30 @@ CLEAN_PROMPT = """ 你是一个数据质量评估员。 # 任务 -你的任务是评估下面提供的【回答 A】相对于【问题/上下文 Q】的**逻辑性**和**相关性**。目标是识别并帮助过滤掉那些回答与问题**明显不匹配**、**逻辑严重混乱**的数据对。请根据以下核心评估点给出一个1到5的整数分数,并将该分数与原始 `id` 一起输出。 +你的任务是评估下面提供的聊天记录的**逻辑性**、**相关性**以及**风格代表性**。目标是识别并过滤掉那些回答与问题**明显不匹配**、**逻辑严重混乱**的样本,筛选出具有人类聊天风格独特性与辨识度的样本。请根据以下核心评估点给出一个1到5的整数分数,并将该分数与原始 `id` 一起输出。 **重要考量:** 1. **简短回答的有效性:** 请注意,诸如“好的”、“是的”、“收到”、“嗯”、“知道了”等简短的肯定、确认或应答,在合适的语境下是完全**有逻辑且相关的**。**不要仅仅因为回答简短就将其评为低分。** 只有当这类简短回答与【问题/上下文 Q】**明显不符**时,才应考虑低分。 2. **处理错别字和自我纠正:** 聊天记录中可能包含常见的打字错误(错别字)或用户先打错字随后又自行纠正的情况(例如,发送“我想去1楼”紧接着又发送“*2楼”进行更正)。在评估时,请**聚焦于用户想要表达的最终意图和信息的核心内容**,而**不应仅仅因为存在错别字或纠正过程就判定为低质量**。。 - # 核心评估点 (请在心中衡量) 1. **相关性 (Relevance):** 【回答 A】是否直接回应或恰当地衔接了【问题/上下文 Q】?它是在回答问题,还是完全跑题了?只有当【回答 A】与【问题/上下文 Q】**明显矛盾**、**完全不着边际**(即使考虑上下文也无法合理化),或简短回答**明显不适用于**该【问题/上下文 Q】时,才给予低分。 2. **逻辑性 (Coherence):** 【回答 A】本身是否符合基本的逻辑?结合【问题/上下文 Q】来看,这个问答对是否构成了一个符合逻辑的交流片段?是否存在明显的矛盾、混乱的内容?只有当【回答 A】**自身逻辑混乱**、**与Q存在无法解释的矛盾**时,才给予低分。 +3. **风格代表性** (Style Representativeness): 评估【回答 A】(以及可能的【问题/上下文 Q】)是否展现了自然、独特的人类对话风格特征。它是否仅仅是功能性的信息传递,还是带有个性化的色彩?关注点包括但不限于:是否体现了特定的语气(如友好、幽默、不耐烦、正式、脏话),是否包含口头禅、俚语、网络用语(如“yyds”、“绝绝子”)、表情符号 Emoji、颜文字、标点符号的特殊使用如“!!!”、“???”、“~”等表达、特定的缩写或短语、非标准的但一致的表达方式(如方言词汇、个人口癖)?如果包含请给予5分,不包含给予5分以下分数 + # 评分标准 (1-5分) -* **1分 (极差):** 完全不相关;逻辑严重混乱/矛盾。 -* **2分 (差):** 相关性很低;存在明显的逻辑问题或不连贯。 -* **3分 (中等):** 相关性一般(可能部分跑题或回应不充分);逻辑上勉强说得通但不够流畅或有瑕疵。 -* **4分 (良好):** 相关性好,回答了问题或恰当衔接;逻辑清晰。 -* **5分 (优秀):** 相关性强,回应精准;逻辑严谨流畅。 +* **1分 (极差):** 聊天记录中的问答内容完全不相关;逻辑严重混乱/矛盾。 +* **2分 (差):** 大部分问答相关性很低;存在明显的逻辑问题或不连贯。 +* **3分 (中等):** 问答相关性一般(可能部分问答跑题或回应不充分);逻辑上勉强说得通但不够流畅或有瑕疵。 +* **4分 (良好):** 大部分问答相关性好,回答了问题或恰当衔接,逻辑清晰。 +* **5分 (优秀):** 问答相关性强,逻辑流畅,包含了显著的、具有辨识度的人类聊天的常用特征(例如情感情绪表达、口头禅、表情符号组合、特有的句子结构、鲜明的语气) # 输入数据 -```json +``` {{ "id": "{id}", - "Q": "{Q}", - "A": "{A}" -}} - -# 输出要求 -请严格按照以下 JSON 格式输出,包含原始的 id 和你给出的1到5的整数评分 score,不要包含任何其他文字、解释或标签。 -{{ - "id": "<这里填入输入数据中的id值>", - "score": <这里填入1到5的整数评分> -}} -""" - - -CLEAN_PROMPT_V2 = """ -# 角色 -你是一个数据质量评估员。 - -# 任务 -你的任务是评估下面提供的对话内容的**逻辑性**和**相关性**。目标是识别并帮助过滤掉那些回答与问题**明显不匹配**、**逻辑严重混乱**的数据对。请根据以下核心评估点给出一个1到5的整数分数,并将该分数与原始 `id` 一起输出。 - -**重要考量:** -1. **简短回答的有效性:** 请注意,诸如“好的”、“是的”、“收到”、“嗯”、“知道了”等简短的肯定、确认或应答,在合适的语境下是完全**有逻辑且相关的**。**不要仅仅因为回答简短就将其评为低分。** 只有当这类简短回答与【问题/上下文 Q】**明显不符**时,才应考虑低分。 -2. **处理错别字和自我纠正:** 聊天记录中可能包含常见的打字错误(错别字)或用户先打错字随后又自行纠正的情况(例如,发送“我想去1楼”紧接着又发送“*2楼”进行更正)。在评估时,请**聚焦于用户想要表达的最终意图和信息的核心内容**,而**不应仅仅因为存在错别字或纠正过程就判定为低质量**。。 - - -# 核心评估点 (请在心中衡量) -1. **相关性 (Relevance):** 【回答 A】是否直接回应或恰当地衔接了【问题/上下文 Q】?它是在回答问题,还是完全跑题了?只有当【回答 A】与【问题/上下文 Q】**明显矛盾**、**完全不着边际**(即使考虑上下文也无法合理化),或简短回答**明显不适用于**该【问题/上下文 Q】时,才给予低分。 -2. **逻辑性 (Coherence):** 【回答 A】本身是否符合基本的逻辑?结合【问题/上下文 Q】来看,这个问答对是否构成了一个符合逻辑的交流片段?是否存在明显的矛盾、混乱的内容?只有当【回答 A】**自身逻辑混乱**、**与Q存在无法解释的矛盾**时,才给予低分。 - -# 评分标准 (1-5分) -* **1分 (极差):** 完全不相关;逻辑严重混乱/矛盾。 -* **2分 (差):** 相关性很低;存在明显的逻辑问题或不连贯。 -* **3分 (中等):** 相关性一般(可能部分跑题或回应不充分);逻辑上勉强说得通但不够流畅或有瑕疵。 -* **4分 (良好):** 相关性好,回答了问题或恰当衔接;逻辑清晰。 -* **5分 (优秀):** 相关性强,回应精准;逻辑严谨流畅。 - -# 输入数据 -```json -{{ - "id": "{id}", - "Q": "{Q}", - "A": "{A}" + "messages": "{messages}", }} # 输出要求