from dataflow.utils.registry import PROMPT_REGISTRY from dataflow.core.prompt import PromptABC @PROMPT_REGISTRY.register() class TextCleaningPrompt(PromptABC): """ 用于清洗文本中的非内容性信息片段 """ def __init__(self): self.question_prompt_template = """你是一名数据清洗专家。请从以下题目文本中识别所有与问题实质无关的非内容性信息片段,这些片段应被完全移除。 【非内容性信息定义】(应删除): - 题号、例号、习题编号(如 "1.1"、"例3"、"Problem 2.4"、"习题2-5"); - 章节标记(如 "§2.1"、"Chapter 3"); - 考试元数据:包括分数、学校、年份等组合标注(如 "(10分,北京交通大学,2003)"、"(20分,2007年)"、"(清华大学,2010)"); - 模板残留(如 "[图]"、"【此处填空】"、"<在此作答>"); - 与本题逻辑无关的交叉引用(如 "如上题所述"、"参考例4"),**除非该引用是解题所必需的前提**。 【重要内容定义】(必须保留,禁止删除): - **图片引用**:包括 Markdown 图片语法(如 `![图2-1](question_images/xxx.jpg)`)、纯路径(如 `question_images/xxx.jpg`)、图注(如 "图2-1"、"如图所示"); - 所有物理条件、变量、公式、单位、逻辑描述(如 "G铰"、"几何不变体系"); - 若题干中提及"例X"是作为**定义或前提**(如"如例1.2中定义的模型"),则保留;否则(如开头的"例1")应删除。 【重要规则】: 1. **不要重写、不要改写、不要总结**原始文本; 2. **仅输出需要删除的子字符串**,多个片段用 `||` 分隔; 3. 如果没有非内容性信息,输出 `NONE`; 4. **必须原样输出片段**(包括空格、括号、标点、中文顿号等); 5. **特别注意**:任何包含 `question_images/` 的路径、`![...](...)` 结构、或"图X-X"形式的图标识,**一律不得删除**; 6. 考试元数据(如"(10分,北京交通大学,2003)")**必须整段删除**,包括括号。 7. **务必保留必要的前提信息。** 8. **删除后的问题,一定还能构成一个完整的问题**。输出前请三思。 例如对于"In Exercises 3-6, calculate the size of the set.\n4. {{x|x is a prime number less than 10}}", 这个必要的前缀不应该被删除,你要删除的内容应该是 " In Exercises 3-6, || 4."。 如果你对这一点感到困惑、为难,请**务必保留更多内容,而不是删除**。 9. 应**最小化**删除与题目无关的文本,不要过分删除。如果你有任何疑问,请优先选择保留,甚至直接输出 `NONE`。 题目文本:{text} 请输出待删除的片段(用 `||` 分隔)或 `NONE`:""" self.answer_prompt_template = """你是一名数据清洗专家。请从以下答案文本中识别所有与答案实质无关的非内容性信息片段,这些片段应被完全移除。 【非内容性信息定义】: - 答案引导词(如 "答:"、"答案:"、"Solution:"、"解:"); - 习题引用(如 "(见习题2.3)"、"同例4"、"参考教材P30"); - 模板残留(如 "[计算过程略]"、"{{result}}"); - 与答案结论无关的附加说明(如 "详见附录"); - 其他非答案核心内容的元信息。 【重要规则】: 1. 不要重写、不要改写、不要总结原始文本; 2. 仅输出需要删除的子字符串,多个片段用 `||` 分隔; 3. 如果没有非内容性信息,输出 `NONE`; 4. 必须原样输出片段(包括冒号、空格、括号等)。 答案文本:{text} 请输出待删除的片段(用 `||` 分隔)或 `NONE`:""" def build_question_prompt(self, text): """构建问题文本清洗的提示""" return self.question_prompt_template.format(text=text) def build_answer_prompt(self, text): """构建答案文本清洗的提示""" return self.answer_prompt_template.format(text=text)