10分钟上手Easy Dataset API:构建LangChain自动化数据处理管道指南

【免费下载链接】easy-dataset A powerful tool for creating fine-tuning datasets for LLM 【免费下载链接】easy-dataset 项目地址: https://gitcode.com/gh_mirrors/ea/easy-dataset

在大语言模型(LLM)微调工作流中,高质量数据集的构建往往成为效率瓶颈。Easy Dataset作为一款专为LLM微调设计的数据处理工具,提供了从非结构化文档到结构化训练数据的完整解决方案。本文将详细解析Easy Dataset的API架构,展示如何通过其开放接口与LangChain构建端到端自动化数据处理管道,帮助开发者摆脱繁琐的手动操作,实现数据集构建的全流程自动化。

核心架构概览

Easy Dataset采用前后端分离架构,前端基于Next.js 14的App Router模式构建用户界面,后端通过RESTful API提供核心数据处理能力。系统核心模块包括文档解析器、智能文本分割器、问题生成器、答案合成器和数据集导出器,各模块通过标准化接口实现松耦合设计,便于集成到外部工作流中。

系统架构图

核心技术栈:

API接口设计规范

Easy Dataset的API遵循RESTful设计原则,所有接口均以/api为前缀,支持JSON格式的请求与响应。认证通过请求头Authorization字段实现,支持API密钥和会话令牌两种方式。基础URL为部署实例的根地址,本地开发环境默认地址为http://localhost:1717/api

接口命名规范

  • 资源路径使用名词复数形式(如/projects而非/project
  • 版本控制通过URL路径实现(如/api/v1/projects
  • 操作通过HTTP方法区分(GET查询、POST创建、PUT更新、DELETE删除)

标准响应格式

{
  "success": true,
  "data": {},
  "message": "操作成功消息",
  "timestamp": 1694567890123
}

核心API功能解析

1. 项目管理API

项目是Easy Dataset的基本操作单元,所有数据处理操作均在项目上下文中进行。项目管理API提供创建、查询、更新和删除项目的完整功能。

创建项目

// 请求示例
fetch('http://localhost:1717/api/projects', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_API_KEY'
  },
  body: JSON.stringify({
    name: '金融知识微调数据集',
    description: '基于银行理财产品说明书构建的QA数据集',
    modelConfig: {
      provider: 'ollama',
      model: 'llama3',
      temperature: 0.7
    }
  })
})
.then(response => response.json())
.then(data => console.log(data.data.projectId));

响应将返回新创建项目的唯一标识符projectId,后续所有操作均需通过该ID指定项目上下文。项目创建后,系统会自动生成标准目录结构,包括原始文件存储区、分割文本区、问题库和最终数据集目录。

项目列表查询

// 获取所有项目
fetch('http://localhost:1717/api/projects', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  }
})
.then(response => response.json())
.then(data => console.log(data.data.projects));

项目管理API完整文档

2. 文档处理API

文档处理是数据 pipeline 的起点,支持PDF、Markdown、DOCX等多种格式的文件上传与解析。系统会自动提取文本内容并进行初步清洗,去除无关格式信息。

上传文档

// 文档上传示例
const formData = new FormData();
formData.append('file', fileInput.files[0]);
formData.append('options', JSON.stringify({
  splitMethod: 'semantic',
  chunkSize: 500,
  overlap: 50
}));

fetch(`http://localhost:1717/api/projects/${projectId}/files`, {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  },
  body: formData
})
.then(response => response.json())
.then(data => console.log(data.data.fileId));

文档上传后,系统会自动触发文本分割流程。分割算法可通过splitMethod参数指定,支持基于字符数、段落、语义相似度等多种分割策略。高级用户可通过custom-split接口自定义分割规则自定义分割实现

文档列表查询

fetch(`http://localhost:1717/api/projects/${projectId}/files`, {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  }
})
.then(response => response.json())
.then(data => console.log(data.data.files));

处理后的文档内容可通过/chunks接口获取,每个文档会被分割为多个文本块(Chunk),每个块包含唯一ID、内容、页码和置信度分数等元数据。

3. 问题生成API

问题生成是Easy Dataset的核心功能,基于文本块内容自动生成高质量问题。系统采用两阶段生成策略:首先通过规则引擎提取实体和关键概念,再调用LLM生成多样化问题。

批量生成问题

// 请求示例
fetch(`http://localhost:1717/api/projects/${projectId}/questions/batch`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_API_KEY'
  },
  body: JSON.stringify({
    chunkIds: ['chunk123', 'chunk456'],
    count: 3, // 每个文本块生成问题数量
    types: ['fact', 'concept', 'application'], // 问题类型
    difficulty: 'medium' // 难度级别:easy/medium/hard
  })
})
.then(response => response.json())
.then(data => console.log(data.data.taskId));

问题生成是异步操作,接口会返回任务ID,可通过/tasks/{taskId}接口查询进度。生成的问题支持手动编辑,可通过/questions/{questionId}接口单独更新问题内容或标记为无效。

获取问题列表

fetch(`http://localhost:1717/api/projects/${projectId}/questions`, {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  }
})
.then(response => response.json())
.then(data => console.log(data.data.questions));

系统支持问题质量评分和筛选,通过/questions/quality接口可获取问题质量评估结果,包括语法正确性、信息完整性和难度等维度的评分问题质量评估实现

4. 答案生成API

答案生成模块负责为问题生成准确、详细的答案,支持Chain of Thought(CoT)格式,增强模型推理能力。答案生成支持指定模型、温度参数和最大长度等高级选项。

生成答案

// 请求示例
fetch(`http://localhost:1717/api/projects/${projectId}/answers/batch`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_API_KEY'
  },
  body: JSON.stringify({
    questionIds: ['q123', 'q456'],
    modelConfig: {
      provider: 'ollama',
      model: 'llama3:70b',
      temperature: 0.3,
      maxTokens: 1000,
      cot: true // 启用Chain of Thought
    }
  })
})
.then(response => response.json())
.then(data => console.log(data.data.taskId));

答案生成支持自定义提示词,通过systemPrompt参数可注入领域知识或格式约束。高级用户可通过自定义提示词接口管理提示词模板库。

获取答案详情

fetch(`http://localhost:1717/api/projects/${projectId}/answers/${answerId}`, {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  }
})
.then(response => response.json())
.then(data => console.log(data.data.answer));

与LangChain集成实战

集成架构设计

Easy Dataset与LangChain的集成采用API调用模式,通过LangChain的Tool接口封装Easy Dataset的API功能。核心集成点包括文档加载器、文本分割器、问题生成器和答案合成器,形成完整的数据处理流水线。

LangChain集成架构

完整集成示例

from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
from langchain.chat_models import ChatOpenAI
import requests
import json

# 初始化LLM
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")

# 封装Easy Dataset API工具
class EasyDatasetToolkit:
    def __init__(self, base_url, api_key):
        self.base_url = base_url
        self.headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        
    def create_project(self, name, description):
        url = f"{self.base_url}/api/projects"
        payload = {
            "name": name,
            "description": description,
            "modelConfig": {
                "provider": "openai",
                "model": "gpt-3.5-turbo",
                "temperature": 0.7
            }
        }
        response = requests.post(url, headers=self.headers, json=payload)
        return response.json()["data"]["projectId"]
        
    def upload_document(self, project_id, file_path):
        url = f"{self.base_url}/api/projects/{project_id}/files"
        files = {"file": open(file_path, "rb")}
        data = {"options": json.dumps({"splitMethod": "semantic"})}
        response = requests.post(url, headers={"Authorization": self.headers["Authorization"]}, 
                                files=files, data=data)
        return response.json()["data"]["fileId"]
        
    def generate_questions(self, project_id, chunk_ids):
        url = f"{self.base_url}/api/projects/{project_id}/questions/batch"
        payload = {
            "chunkIds": chunk_ids,
            "count": 3,
            "types": ["fact", "concept"]
        }
        response = requests.post(url, headers=self.headers, json=payload)
        return response.json()["data"]["taskId"]
        
    def export_dataset(self, project_id, format="alpaca"):
        url = f"{self.base_url}/api/projects/{project_id}/export"
        payload = {"format": format, "fileType": "jsonl"}
        response = requests.post(url, headers=self.headers, json=payload)
        return response.json()["data"]["downloadUrl"]

# 初始化工具集
easy_dataset = EasyDatasetToolkit(
    base_url="http://localhost:1717",
    api_key="YOUR_EASY_DATASET_API_KEY"
)

# 创建LangChain工具
tools = [
    Tool(
        name="CreateProject",
        func=easy_dataset.create_project,
        description="创建新的数据处理项目,需要项目名称和描述作为参数"
    ),
    Tool(
        name="UploadDocument",
        func=easy_dataset.upload_document,
        description="上传文档到指定项目,需要项目ID和文件路径作为参数"
    ),
    Tool(
        name="GenerateQuestions",
        func=easy_dataset.generate_questions,
        description="基于文本块生成问题,需要项目ID和文本块ID列表作为参数"
    ),
    Tool(
        name="ExportDataset",
        func=easy_dataset.export_dataset,
        description="导出数据集,支持alpaca和sharegpt格式,需要项目ID和格式参数"
    )
]

# 初始化智能体
agent = initialize_agent(
    tools, llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)

# 运行自动化流水线
result = agent.run("""
请完成以下任务:
1. 创建名为"机器学习基础"的项目,描述为"基于吴恩达机器学习课程笔记构建QA数据集"
2. 上传文档"/data/courses/machine-learning-notes.pdf"
3. 为所有文本块生成问题,每种类型生成2个问题
4. 导出为Alpaca格式的JSONL文件
""")

print(result)

关键集成点解析

  1. 文档加载器集成:通过LangChain的DocumentLoader接口封装Easy Dataset的文档上传API,支持从本地文件、URL或云存储加载文档。

  2. 文本分割器适配:Easy Dataset的智能分割算法可作为LangChain的TextSplitter实现,通过create_documents方法返回标准化文档对象。

  3. 工具调用优化:使用LangChain的LLMChain优化API调用逻辑,实现自动重试、超时处理和错误恢复,提高集成稳定性。

  4. 异步任务处理:针对问题生成等耗时操作,使用LangChain的AsyncTool接口实现异步调用,避免阻塞主流程。

完整集成示例代码可在LangChain集成演示中找到,包含更多高级特性如进度跟踪、错误处理和结果验证。

高级功能与最佳实践

1. 任务队列管理

长时间运行的操作(如批量问题生成、大型文档处理)通过任务队列异步执行。系统提供任务状态查询和结果回调机制,支持大规模数据处理场景。

任务状态查询

fetch(`http://localhost:1717/api/projects/${projectId}/tasks/${taskId}`, {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  }
})
.then(response => response.json())
.then(data => {
  console.log(`任务状态: ${data.data.status}`);
  console.log(`进度: ${data.data.progress}%`);
});

任务状态包括pending(等待中)、processing(处理中)、completed(完成)、failed(失败)和cancelled(已取消)五种状态。系统支持任务优先级设置和资源配额管理,通过任务管理API实现复杂的任务调度逻辑。

2. 数据集质量评估

Easy Dataset提供内置的数据集质量评估工具,从相关性、多样性、清晰度和一致性四个维度对生成的QA对进行评分。评估结果可用于筛选高质量数据或指导重新生成。

评估数据集

fetch(`http://localhost:1717/api/projects/${projectId}/datasets/${datasetId}/evaluate`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_API_KEY'
  },
  body: JSON.stringify({
    sampleSize: 100, // 抽样评估数量
    criteria: ["relevance", "diversity", "clarity"]
  })
})
.then(response => response.json())
.then(data => console.log(data.data.evaluationReport));

评估报告包含总体得分、各维度详细指标和改进建议。低质量的QA对会被标记并建议重新生成,提高数据集整体质量。评估算法实现可参考数据集评估模块

3. 性能优化建议

  • 批量操作优先:对于大量文件或文本块,优先使用批量API(如/batch端点)而非循环调用单个接口
  • 适当调整并发数:API默认限制并发请求为5个,可通过X-Concurrent-Requests头调整,建议根据服务器配置合理设置
  • 增量处理策略:大型文档采用分页加载和增量处理模式,避免内存溢出
  • 缓存中间结果:通过cache参数启用结果缓存,加速重复查询
  • 异步通知机制:使用Webhook接收任务完成通知,避免轮询查询

常见问题与解决方案

1. API调用失败排查流程

  1. 检查认证状态:确认API密钥有效且具有足够权限,可通过/api/auth/verify接口验证
  2. 验证请求格式:使用API测试工具(如Postman)验证请求格式和参数合法性
  3. 查看系统日志:服务器日志位于logs/app.log,包含详细错误信息
  4. 检查资源配额:确认未超出项目数量、文件大小或API调用频率限制
  5. 版本兼容性:确保客户端与服务器使用兼容的API版本,版本差异可能导致接口不兼容

2. 大规模数据处理建议

对于超过100个文档或10GB以上的数据集,建议采用以下策略:

  • 分阶段处理:按主题或来源分批上传文档,避免单次处理压力过大
  • 分布式部署:通过Docker Compose部署多实例,启用负载均衡部署配置
  • 资源优化:调整文本分割参数,增大块大小(如1000字符)减少块数量
  • 离线处理模式:使用命令行工具进行批量操作,绕过Web界面限制

3. 错误码参考

常见API错误码及解决方案:

错误码 描述 解决方案
400 请求参数错误 检查请求JSON格式和必填字段
401 未授权访问 验证API密钥或重新登录
403 权限不足 检查用户角色和项目访问权限
404 资源不存在 确认项目ID和资源路径正确
429 请求频率超限 减少请求频率或联系管理员提升配额
500 服务器内部错误 查看系统日志获取详细错误信息

完整错误码列表可参考API错误处理文档

总结与展望

Easy Dataset提供了一套全面的API接口,支持从非结构化文档到高质量LLM训练数据的全流程自动化。通过与LangChain的无缝集成,开发者可以快速构建定制化的数据处理管道,显著提升LLM微调工作流的效率和质量。

未来版本将重点增强以下方向:

  • 支持多模态数据处理(图像、表格、公式)
  • 引入数据集版本控制和协作功能
  • 提供更丰富的导出格式(支持Llama Factory、Alpaca-LoRA等微调框架)
  • 增强API的实时性和流式处理能力

无论您是构建企业级LLM应用的开发者,还是研究人员,Easy Dataset的开放API都能为您的工作流带来显著价值。通过本文介绍的方法,您可以在短时间内搭建起专业的数据集构建管道,将更多精力集中在模型调优和应用创新上。

完整API文档可通过访问项目文档站点获取,社区贡献的集成案例和扩展插件可在社区实践库中找到。如有任何问题或建议,欢迎通过项目GitHub仓库提交Issue或Pull Request。

【免费下载链接】easy-dataset A powerful tool for creating fine-tuning datasets for LLM 【免费下载链接】easy-dataset 项目地址: https://gitcode.com/gh_mirrors/ea/easy-dataset

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐