fyl080801/llm-labeled

★ 0Forks 0TypeScriptGitHub ↗Compare

README

LLM 自动标注系统

基于本地 LLM 的智能数据标注工具,支持自定义标签、批量处理、多种标注类型。


✨ 特性

  • 🤖 智能提示词生成 - 一句话自动生成专业级标注配置,零门槛使用
  • 🎯 灵活的标签定义 - 支持动态类别、自定义提示词、多种标注类型
  • 📦 8+预设模板 - 覆盖电商、金融、客服、内容审核等常见场景
  • ⚡ 高性能批量处理 - 智能批量优化,性能提升 85%
  • 🔐 结构化输出 - 使用 JSON Schema 保证输出格式
  • 📊 多种标注类型 - 置信度、分类、提取、排序、生成
  • 🎓 Few-shot 学习 - 支持示例引导,提升准确率
  • 🚀 简单易用 - RESTful API,开箱即用

🚀 快速开始

安装

# 克隆项目
git clone <repo-url>
cd llm-ds-label

# 安装依赖
npm install

# 配置环境变量
cp .env.example .env
# 编辑 .env 文件,配置 LLM endpoint

# 编译
npm run build

# 启动服务
npm run serve

服务启动在 http://localhost:3000

快速测试

# 测试 API
curl -X POST http://localhost:3000/api/label \
  -H 'Content-Type: application/json' \
  -d '{
    "content": "这个产品很好,非常满意",
    "labelDefinition": {
      "records": {
        "情感": ["正面", "负面", "中性"]
      }
    }
  }'

详细快速开始指南请查看 QUICKSTART.md


📚 文档

核心文档

示例

  • examples/scenario-examples.md - 三大场景 12 个示例
    • 用户情感分析(3个)
    • 商品品类识别(3个)
    • 金融场景分析(6个)

🎯 核心功能

0. 智能提示词生成器 ⭐(零门槛)

普通用户不需要设计提示词,只需一句话描述需求:

# 生成标注配置
curl -X POST http://localhost:3000/api/prompt/generate \
  -H 'Content-Type: application/json' \
  -d '{
    "description": "我要分析电商评论是正面还是负面"
  }'

# 自动返回完整的labelDefinition配置

响应:

{
  "success": true,
  "data": {
    "labelDefinition": {
      "name": "电商评论情感分析",
      "records": {"情感": ["正面", "负面", "中性"]},
      "promptTemplate": "你是专业的电商评论分析师...",
      "systemPrompt": "你是一位拥有10年经验的电商客服主管...",
      "labelType": "classification"
    }
  }
}

立即使用生成的配置:

# 生成 → 使用
LABEL_DEF=$(curl -s -X POST http://localhost:3000/api/prompt/generate \
  -H 'Content-Type: application/json' \
  -d '{"description": "分析评论情感"}' | jq '.data.labelDefinition')

curl -X POST http://localhost:3000/api/label \
  -H 'Content-Type: application/json' \
  -d "{
    \"content\": \"这个产品很好\",
    \"labelDefinition\": $LABEL_DEF
  }"

详细使用指南:docs/PROMPT_GENERATOR_GUIDE.md


1. 统一的 API 设计

POST /api/label          // 单条标注
POST /api/batch          // 批量标注

{
  "content": "待标注文本",
  "labelDefinition": {
    "records": {
      "类别名": ["标签1", "标签2", "标签3"]
    },
    "promptTemplate": "自定义提示词(可选)",
    "systemPrompt": "角色设定(可选)",
    "examples": [],
    "labelType": "classification",
    "config": {
      "maxLabels": 1,
      "includeConfidence": true
    }
  }
}

2. 灵活的标注类型

置信度模式(默认)

{
  "labelType": "confidence"
}

输出:

{
  "情感": {
    "正面": 0.95,
    "负面": 0.03,
    "中性": 0.02
  }
}

分类模式(只返回最高标签)

{
  "labelType": "classification",
  "config": {
    "maxLabels": 1,
    "includeConfidence": true
  }
}

输出:

{
  "情感": {
    "label": "正面",
    "confidence": 0.95
  }
}

信息提取模式

{
  "labelType": "extraction",
  "customSchema": {
    "type": "object",
    "properties": {
      "产品名称": {"type": "string"},
      "价格": {"type": "string"}
    }
  }
}

输出:

{
  "产品名称": "iPhone 15 Pro",
  "价格": "9999元"
}

3. 批量优化

import { createBatchOptimizer } from './src/core/batch-optimizer.js';

const optimizer = createBatchOptimizer(labeler);
const { results, stats } = await optimizer.labelBatchOptimized(
  items,
  labelDefinition,
  {
    maxBatchSize: 50,
    batchThreshold: 5,
  }
);

// 性能提升:85%
// 20条数据:60秒 → 9秒

详细说明请查看 docs/BATCH_OPTIMIZATION.md


🔧 配置

环境变量

# LLM 配置
LLM_PROVIDER=litellm
LLM_MODEL=lm_studio/glm-4.7
LLM_ENDPOINT=http://10.19.80.14:30400/
LLM_API_KEY=sk-xxx

# API 配置
API_PORT=3000
API_HOST=0.0.0.0

LabelDefinition 完整结构

interface LabelDefinition {
  // 基本信息
  name?: string;
  version?: string;

  // 标签定义(必需)
  records: {
    [categoryName: string]: string[];
  };

  // 自定义功能(全部可选)
  promptTemplate?: string;        // 自定义提示词
  systemPrompt?: string;           // 系统提示词(角色设定)
  customSchema?: object;           // 自定义 JSON Schema
  examples?: FewShotExample[];    // Few-shot 示例
  labelType?: LabelType;          // 标注类型
  config?: LabelConfig;           // 配置选项

  // 元数据
  metadata?: {
    description?: string;
    created?: string;
    [key: string]: any;
  };
}

📊 使用场景

1. 用户情感分析

curl -X POST http://localhost:3000/api/label \
  -H 'Content-Type: application/json' \
  -d '{
    "content": "物流慢但质量好",
    "labelDefinition": {
      "records": {
        "情感": ["正面", "负面", "中性"],
        "购买意向": ["高", "中", "低"]
      },
      "promptTemplate": "你是电商分析师。请分析:{content}",
      "systemPrompt": "你是某平台10年经验的专家。"
    }
  }'

2. 商品品类识别

curl -X POST http://localhost:3000/api/label \
  -H 'Content-Type: application/json' \
  -d '{
    "content": "Apple iPhone 15 Pro Max 智能手机",
    "labelDefinition": {
      "records": {
        "一级品类": ["手机数码", "电脑办公", "家用电器"],
        "品牌": ["苹果", "华为", "小米"]
      }
    }
  }'

3. 金融产品分类

curl -X POST http://localhost:3000/api/label \
  -H 'Content-Type: application/json' \
  -d '{
    "content": "招商银行睿远稳进混合型基金,风险等级R3",
    "labelDefinition": {
      "records": {
        "产品大类": ["基金", "银行理财", "保险", "信托"],
        "风险等级": ["R1低风险", "R2中低风险", "R3中风险", "R4中高风险", "R5高风险"]
      },
      "labelType": "classification",
      "config": {
        "maxLabels": 1,
        "includeConfidence": true
      }
    }
  }'

更多示例请查看 examples/scenario-examples.md


🛠️ 开发

项目结构

llm-ds-label/
├── src/
│   ├── api/              # API 路由和控制器
│   ├── core/             # 核心逻辑
│   │   ├── llm-client.ts
│   │   ├── labeler.ts
│   │   ├── prompt-builder.ts
│   │   └── batch-optimizer.ts
│   ├── models/           # 类型定义
│   ├── processors/       # 数据处理器
│   └── utils/            # 工具函数
├── scripts/              # 测试脚本
├── examples/             # 使用示例
└── docs/                 # 文档

可用脚本

# 编译
npm run build

# 启动服务
npm run serve

# 开发模式
npm run dev:api

# 测试
npm run test:api:quick           # API 快速测试
npm run test:unified-api         # 统一 API 测试
npm run test:batch-optimizer     # 批量优化测试

# 示例测试
cd examples && ./test-scenarios.sh

📈 性能

批量处理性能对比

数据量 逐条处理 批量优化 性能提升
10条 30秒 7秒 +77%
20条 60秒 9秒 +85%
50条 150秒 15秒 +90%
100条 300秒 30秒 +90%

❓ 常见问题

Q: promptTemplate 和 systemPrompt 是必须的吗?

A: 不是必须的,两个字段都是可选的。简单场景只用 promptTemplate,专业场景可以分开使用(systemPrompt 设定角色,promptTemplate 描述任务)。

Q: 如何只返回置信度最高的标签?

A: 使用 labelType: "classification" 并设置 includeConfidence: true:

{
  "labelType": "classification",
  "config": {
    "maxLabels": 1,
    "includeConfidence": true
  }
}

输出:

{
  "产品大类": {
    "label": "基金",
    "confidence": 0.98
  }
}

Q: 批量处理如何提升性能?

A: 使用批量优化功能,将多条语料合并成一次 LLM 调用:

import { createBatchOptimizer } from './src/core/batch-optimizer.js';

const optimizer = createBatchOptimizer(labeler);
const { results } = await optimizer.labelBatchOptimized(items, labelDef);

性能提升可达 85-90%。


📄 License

MIT


🤝 贡献

欢迎提交 Issue 和 Pull Request!


立即开始使用 LLM 自动标注系统! 🚀

Issues