# ner-generate-instruction-task **Repository Path**: ghh_/ner-generate-instruction-task ## Basic Information - **Project Name**: ner-generate-instruction-task - **Description**: NER 生成指令任务数据构造 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-04 - **Last Updated**: 2025-10-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## NER 任务指令数据构造 ### 1. 核心概念:什么是NER的指令数据? - 传统的NER数据格式通常是: ``` 句子: [“深”, “度”, “求”, “索”, “是”, “一”, “家”, “伟”, “大”, “的”, “公”, “司”] 标签: [“B-ORG”, “I-ORG”, “I-ORG”, “I-ORG”, “O”, “O”, “O”, “O”, “O”, “O”, “O”, “O”] ``` 而**指令数据**则是将任务包装成一个自然语言指令,要求模型理解并执行。其核心结构是: * **指令:** 明确告诉模型要做什么任务。 * **输入:** 需要处理的文本。 * **输出:** 模型应该生成的、符合指令要求的答案。 > 对于NER任务,指令数据的目标是让模型学会**根据指令的描述,从输入文本中找出特定类型的实体,并以指定的格式输出**。 ### 2. 指令数据构造步骤 #### 步骤一:定义实体类型和指令 首先,你需要明确你的NER任务要识别哪些实体。 * **通用实体:** 人名、地名、组织机构名、时间、日期、货币等。 * **领域特定实体:** 医疗领域的药品名、疾病名;金融领域的股票代码、金融产品;法律领域的法律条款等。 然后,为这些实体类型设计**清晰、无歧义**的指令。 **示例:** * **指令1(通用):** “请从给定的文本中找出所有的人名、地名和组织机构名。” * **指令2(特定):** “请找出以下医疗文本中提到的所有疾病名称和药物名称。” * **指令3(带格式要求):** “请从文本中提取所有的时间表达式,并以JSON列表的形式输出。” #### 步骤二:设计输出格式 输出格式至关重要,它决定了模型应该如何组织答案。常见的格式有: 1. **列表/JSON格式(最推荐):** * 结构清晰,易于程序解析。 * 示例输出:`{"人名": ["张三", "李四"], "组织机构": ["深度求索"]}` 2. **自然语言描述:** * 示例输出:“文本中提到的人名有张三和李四,组织机构有深度求索。” * 优点是人类易读,但不利于自动化处理。 3. **标记序列(不推荐用于指令):** * 类似于传统NER的BIO标签。这违背了指令学习的初衷,因为它要求模型理解复杂的标签体系,而不是执行自然语言指令。 #### 步骤三:收集或创建文本数据 * **来源:** 公开数据集(如MSRA, CoNLL-2003)、网络爬取、业务日志、人工编写等。 * **要求:** 文本应包含你定义的实体类型,并且最好能覆盖不同的语言风格和上下文。 #### 步骤四:标注与配对 将**指令**、**输入文本**和**期望输出**组合成一个完整的样本。 * **人工标注:** 对于高质量数据,由标注人员阅读指令和文本,然后按照指定的输出格式写出答案。 * **自动转换:** 如果你已有传统的BIO格式标注数据,可以编写脚本将其转换为指令格式。 #### 步骤五:数据清洗与验证 * **一致性检查:** 确保所有样本的输出格式都严格遵循要求。 * **准确性检查:** 核对实体是否被正确识别和分类。 * **指令多样性:** 对于同一实体类型,可以使用多种不同表述的指令,以增强模型的泛化能力。 ### 3. 格式示例 下面提供几个不同复杂度的示例。 #### 示例1:基础单轮指令 ```json { "instruction": "请从给定的文本中识别出所有的人名、地名和组织机构名,并以JSON格式输出。", "input": "苹果公司首席执行官蒂姆·库克近日访问了中国的北京,并与清华大学进行了交流。", "output": "{\n \"人名\": [\"蒂姆·库克\"],\n \"地名\": [\"北京\", \"中国\"],\n \"组织机构\": [\"苹果公司\", \"清华大学\"]\n}" } ``` #### 示例2:带明确格式要求的指令 ```json { "instruction": "你是一个信息提取助手。请从下面的新闻文本中找出所有提到的公司名和日期。请严格按照以下JSON格式输出:{\"公司\": [...], \"日期\": [...]}", "input": "昨日,特斯拉股价大涨。与此同时,微软宣布将于下周五发布新财报。", "output": "{\n \"公司\": [\"特斯拉\", \"微软\"],\n \"日期\": [\"下周五\"]\n}" } ``` #### 示例3:多轮对话指令(更复杂,更接近真实应用) ```json [ { "role": "user", "content": "接下来我会给你一些句子,请你帮我找出里面的人名和地名。明白了吗?" }, { "role": "assistant", "content": "明白了。请提供文本,我会帮您找出其中的人名和地名。" }, { "role": "user", "content": "第一句:李白和杜甫在长安城相遇。" }, { "role": "assistant", "content": "{\n \"人名\": [\"李白\", \"杜甫\"],\n \"地名\": [\"长安城\"]\n}" }, { "role": "user", "content": "第二句:苏轼曾被贬至惠州。" }, { "role": "assistant", "content": "{\n \"人名\": [\"苏轼\"],\n \"地名\": [\"惠州\"]\n}" } ] ``` ### 4. 最佳实践与注意事项 1. **指令清晰明确:** 避免使用“东西”、“等等”模糊词汇。明确实体类型的定义和边界(例如,“北京大学”是一个组织机构,而不是地名)。 2. **输出格式标准化:** 在整个数据集中保持输出格式的一致性。JSON是最佳选择,因为它结构化且通用。 3. **处理实体重叠和嵌套:** 提前规划如何处理一个词属于多个实体的情况(如“北京大学出版社”既包含地名“北京”又包含组织机构“大学出版社”)。 4. **处理无实体情况:** 确保指令数据中包含一些没有目标实体的文本,并教会模型如何正确响应(如输出空列表 `[]` 或 `{}`)。 5. **增加负样本:** 包含一些指令模糊或文本中存在歧义的样本,以增强模型的鲁棒性。 6. **规模与多样性:** 指令数据的数量和质量直接决定模型性能。确保数据覆盖足够的领域、语言风格和指令表达方式。 ### 5. 进阶技巧 * **思维链:** 对于复杂实体,可以让模型先“思考”再输出。 * **指令:** “先分析句子结构,然后找出所有的医疗手术名称。” * **输出:** “句子主要描述了手术过程。其中,‘冠状动脉搭桥术’是一个标准的医疗手术名称。最终答案是:['冠状动脉搭桥术']” * **少样本学习:** 在指令中提供一两个例子,**让模型进行类比学习**。 * **指令:** “请找出文本中的产品名。例如:输入‘我喜欢用iPhone和MacBook’,输出[‘iPhone’, ‘MacBook’]。现在请处理:...” 通过以上步骤和原则, - 你就可以系统地构造出高质量的NER指令数据,用于微调大语言模型,使其成为一个强大的、能够理解复杂指令的命名实体识别工具。