# my_ml_NER **Repository Path**: allenchennn/my_ml_ner ## Basic Information - **Project Name**: my_ml_NER - **Description**: Label Studio 命名实体识别:label studio+deepseek+label-studio-ml - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-10-14 - **Last Updated**: 2025-12-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: Label-Studio-ML ## README # Label Studio 命名实体识别(NER)集成 DeepSeek LLM 推理引擎 ## 一、项目简介 基于 [Label Studio(LS)]([Label Studio Documentation — Data Labeling](https://labelstud.io/guide)) 的命名实体识别标注任务,集成[label-studio-ml-backend](https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2FHumanSignal%2Flabel-studio-ml-backend)自建推理逻辑,集成 OpenAI 接口兼容的大模型服务 [DeepSeek](https://gitee.com/link?target=https%3A%2F%2Fdeepseek.com%2F),实现自动化文本NER识别预测,并以标准格式回传结果至 Label Studio,可用于主动学习、批量辅助标注等场景。 ## 二、模型开发 **备注:部分信息做了隐私处理用“`\*`”代替。** ### 1、本demo目录结构 参考LS文本分类目录结构,此处省略(主要关注env文件和model文件)。 ### 2、安装(如安装则忽略) 安装label-studio-ml-backend,见官网 ``` git clone https://github.com/HumanSignal/label-studio-ml-backend.git cd label-studio-ml-backend/ pip install -e . ``` ### 3、新建ML后端 ``` label-studio-ml create my_ml_NER ``` ### 4、添加环境变量 **备注:**添加环境变量是为了后续模型启动后可以读取远端Label Studio的部署地址来获取内部文件信息。 1)第一种方式:直接在终端命令中设置环境变量(暂时) ``` # Label Studio的部署地址和端口 set LABEL_STUDIO_URL=http://***.***.***.***:8080 # Label Studio的Legacy Token set LABEL_STUDIO_API_KEY=***************************** ``` 2)第二种方式:创建`.env`文件,并加载`.env` .env文件: ``` LABEL_STUDIO_URL=http://***.***.***.***:8080 LABEL_STUDIO_API_KEY=***************************** OPENAI_API_KEY=sk-************** ``` 这里用的第二种方式model.py ``` from dotenv import load_dotenv # 确保环境变量可读取 load_dotenv() ``` ### 5、主要文件结构介绍 打开 .\my_ml_NER\model.py 文件,根据需要进行修改: - `predict()`:在这里定义你的预测逻辑 - `fit()`:在这里定义你的训练逻辑(可选)=====>由于我这里只是针对预测,所以这里保持不动。 ### 6、model方法逻辑简述 #### 0)初始化客户端 ``` # 加载环境变量 load_dotenv() logger = logging.getLogger(__name__) # 验证env是否生效 # logger.info(f"读取的 LS 地址是:{os.environ.get('LABEL_STUDIO_URL')}") client = OpenAI( api_key=os.environ.get("OPENAI_API_KEY"), # 替换为你的API密钥 base_url="https://api.deepseek.com", # deepseek 作为兼容 OpenAI API 的替代服务 ) ``` #### 1)get_labels(self) **获取标签列表** - 通过 `self.label_interface` 拿到任务界面配置。 - 用 `get_first_tag_occurence('Labels', 'Text')` 找到第一个 “Labels-Text” 组合对应的 `from_name`。 - 再用 `get_tag(from_name)` 获取该标签定义,返回其中的 `labels`。 **逻辑** - 解析前端标注配置,返回可用的标签列表(如实体类型集合),供预测阶段选择。 ------ #### 2)setup(self) **配置模型参数** - 调用 `self.set("model_version", "0.0.1")`。 ------ #### 3)predict(self, tasks, context=None, **kwargs) -> ModelResponse **结构** 1. **解析标签配置** - 通过 `label_interface` 再次获取 `from_name, to_name, value` 和标签列表 `labels`。 2. **遍历任务** - 对每个 `task`,从 `task['data'][value]` 取出待处理文本或文件路径。 - 若是文件路径(以 `/data/` 开头),用 `self.get_local_path(...)` 下载到本地并读取文本;否则用 `self.preload_task_data(...)` 获取纯文本。 3. **构造 system prompt** - 用中文说明 NER 的要求:只返回 JSON 数组(或对象中含 `entities` 字段),元素包含 `start/end/text/labels/score`。 4. **调用 DeepSeek** - 使用 `client.chat.completions.create(...)`,`model="deepseek-chat"`,温度为 0,并指定 `response_format={'type': 'json_object'}` 强制结构化输出。 5. **解析模型输出** - 读取 `response.choices[0].message.content`。 - `json.loads` 解析;如果是 `{"entities":[...]}` 则取其中的列表。 6. **对每个实体做位置对齐与结果组装** - 读出 `text/labels/score/start/end`。 - 为防止模型返回的 `start/end` 不准:用 `re.finditer` 在原文中查找 `entity_text` 的所有出现位置,并用 `used_offsets` 控制第几次出现的偏移;若找不到则回退使用原始 `start/end`。 - 统一把 `labels` 转为列表。 - 组装为 Label Studio 的预测 `result` 结构:包含 `from_name/to_name/type/value(...)`。 7. **打包预测** - 将当前任务的所有实体结果列表放入 `prediction_result = {"model_version":..., "result":[...]}`,累积到 `predictions`。 8. **返回** - `return ModelResponse(predictions=predictions)`。 ### 7、启动模型 ``` label-studio-ml start .\my_ml_NER ``` ``` (label-studio-ml) D:\v_desktop\Annotation_platform\label-studio-ml-backend>label-studio-ml start .\my_ml_NER * Serving Flask app 'label_studio_ml.api' * Debug mode: off [2025-10-14 09:49:12,953] [INFO] [werkzeug::_log::97] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on all addresses (0.0.0.0) * Running on http://127.0.0.1:9090 * Running on http://192.168.0.103:9090 [2025-10-14 09:49:12,953] [INFO] [werkzeug::_log::97] Press CTRL+C to quit ``` ### 8、Label Studio NER模板 ``` ``` ## 三、其他 ### 1、测试数据 2025年,全球科技产业发生了巨大的变革。苹果公司(Apple Inc.)发布了新一代iPhone 16,并在全球范围内举行了发布会,吸引了成千上万的科技爱好者和媒体记者。发布会在纽约的乔布斯剧院举行,由苹果公司首席执行官蒂姆·库克(Tim Cook)主持。在此次发布会上,苹果公司宣布与微软公司达成了一项战略合作协议,双方将共同开发下一代人工智能技术。这一消息让整个科技行业为之一振,微软的股价上涨了15%。此外,英特尔公司也宣布将于2026年推出其最新款处理器——Intel Core i15,预计将彻底改变个人计算设备的性能表现。与此同时,谷歌(Google)则宣布将加大在自动驾驶技术方面的投资,并计划在2027年之前推出一款完全自主驾驶的电动汽车。业内专家认为,随着这些技术的进步,未来五年内全球科技行业将迎来一次大规模的创新浪潮,影响各行各业的发展。 ### 2、测试结果 ![image-20251014100558351](img/image-20251014100558351.png)