本文档描述了训练数据管理系统的API设计方案,提供完整的CRUD操作接口,支持分页查询、类型筛选、批量操作等功能。该系统旨在为AI训练数据提供统一的管理入口。
http://localhost:5000/api/v0/training_data/| API端点 | 方法 | 功能描述 | 
|---|---|---|
| /api/v0/training_data/query | POST | 分页查询训练数据(支持类型筛选和搜索) | 
| /api/v0/training_data/create | POST | 创建训练数据(支持单条和批量) | 
| /api/v0/training_data/delete | POST | 删除训练数据(支持批量删除) | 
| /api/v0/training_data/stats | GET | 获取训练数据统计信息 | 
端点: POST /api/v0/training_data/query
功能: 分页查询训练数据,支持类型筛选、搜索和排序功能。
| 参数名 | 类型 | 必填 | 默认值 | 说明 | 
|---|---|---|---|---|
| page | int | 否 | 1 | 页码(从1开始) | 
| page_size | int | 否 | 20 | 每页记录数(范围:1-100) | 
| training_data_type | string | 否 | null | 筛选类型:sql/documentation/ddl/error_sql | 
| sort_by | string | 否 | "id" | 排序字段:id/training_data_type | 
| sort_order | string | 否 | "desc" | 排序方向:asc/desc | 
| search_keyword | string | 否 | null | 搜索关键词(在question/content中搜索) | 
基础查询:
{
  "page": 1,
  "page_size": 20
}
筛选查询:
{
  "page": 1,
  "page_size": 20,
  "training_data_type": "sql",
  "search_keyword": "用户",
  "sort_by": "id",
  "sort_order": "desc"
}
{
  "code": 200,
  "success": true,
  "message": "查询成功,共找到 156 条记录",
  "data": {
    "records": [
      {
        "id": "uuid-123-sql",
        "training_data_type": "sql",
        "question": "查询所有用户信息",
        "content": "SELECT * FROM users",
        "created_at": "2024-06-24T10:30:00"
      },
      {
        "id": "uuid-456-doc",
        "training_data_type": "documentation", 
        "question": null,
        "content": "用户表包含用户的基本信息...",
        "created_at": "2024-06-24T11:00:00"
      }
    ],
    "pagination": {
      "page": 1,
      "page_size": 20,
      "total": 156,
      "total_pages": 8,
      "has_next": true,
      "has_prev": false
    },
    "filters_applied": {
      "training_data_type": "sql",
      "search_keyword": "用户"
    }
  }
}
端点: POST /api/v0/training_data/create
功能: 创建训练数据,支持单条和批量创建,支持四种数据类型。
单条记录:
{
  "data": {
    "training_data_type": "sql",
    "question": "查询所有用户信息",
    "sql": "SELECT * FROM users"
  }
}
批量记录:
{
  "data": [
    {
      "training_data_type": "sql",
      "question": "查询所有用户信息", 
      "sql": "SELECT * FROM users"
    },
    {
      "training_data_type": "documentation",
      "content": "用户表包含用户的基本信息..."
    },
    {
      "training_data_type": "ddl",
      "ddl": "CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(100));"
    },
    {
      "training_data_type": "error_sql",
      "question": "查询用户",
      "sql": "SELECT * FROM user"
    }
  ]
}
| 类型 | 必填字段 | 可选字段 | 说明 | 
|---|---|---|---|
| sql | sql | question | 如果不提供question会自动生成,SQL会进行语法检查 | 
| error_sql | question,sql | 无 | 错误的SQL示例,不进行语法检查 | 
| documentation | content | 无 | 文档内容,不进行格式检查 | 
| ddl | ddl | 无 | DDL语句,不进行语法检查 | 
{
  "code": 200,
  "success": true,
  "message": "操作成功",
  "data": {
    "response": "训练数据创建完成",
    "total_requested": 4,
    "successfully_created": 3,
    "failed_count": 1,
    "results": [
      {
        "index": 0,
        "success": true,
        "training_id": "uuid-123-sql",
        "type": "sql",
        "message": "SQL训练数据创建成功"
      },
      {
        "index": 1,
        "success": true,
        "training_id": "uuid-456-doc",
        "type": "documentation", 
        "message": "文档训练数据创建成功"
      },
      {
        "index": 2,
        "success": true,
        "training_id": "uuid-789-ddl",
        "type": "ddl",
        "message": "DDL训练数据创建成功"
      },
      {
        "index": 3,
        "success": false,
        "type": "error_sql",
        "error": "创建失败:缺少必填字段question",
        "message": "创建失败"
      }
    ],
    "summary": {
      "sql": 1,
      "documentation": 1,
      "ddl": 1,
      "error_sql": 0
    },
    "current_total_count": 159
  }
}
端点: POST /api/v0/training_data/delete
功能: 删除指定的训练数据记录,支持批量删除。
| 参数名 | 类型 | 必填 | 说明 | 
|---|---|---|---|
| ids | array[string] | 是 | 要删除的训练数据ID列表 | 
| confirm | boolean | 是 | 确认删除标志,必须为true | 
{
  "ids": ["uuid-123-sql", "uuid-456-doc", "uuid-789-ddl"],
  "confirm": true
}
{
  "code": 200,
  "success": true,
  "message": "删除操作完成",
  "data": {
    "response": "训练数据删除完成",
    "total_requested": 3,
    "successfully_deleted": 2,
    "failed_count": 1,
    "deleted_ids": ["uuid-123-sql", "uuid-456-doc"],
    "failed_ids": ["uuid-789-ddl"],
    "failed_details": [
      {
        "id": "uuid-789-ddl",
        "error": "记录不存在"
      }
    ],
    "current_total_count": 157
  }
}
端点: GET /api/v0/training_data/stats
功能: 获取训练数据的统计信息,用于监控和分析。
GET /api/v0/training_data/stats
{
  "code": 200,
  "success": true,
  "message": "统计信息获取成功",
  "data": {
    "response": "统计信息获取成功",
    "total_count": 156,
    "type_breakdown": {
      "sql": 45,
      "documentation": 38,
      "ddl": 52,
      "error_sql": 21
    },
    "type_percentages": {
      "sql": 28.85,
      "documentation": 24.36,
      "ddl": 33.33,
      "error_sql": 13.46
    },
    "last_updated": "2024-06-24T15:30:00"
  }
}
vn.get_training_data() 方法获取训练数据-sql → sql类型-doc → documentation类型-ddl → ddl类型-error_sql → error_sql类型vn.train(question=question, sql=sql) 或 vn.train(sql=sql)vn.train_error_sql(question=question, sql=sql)vn.train(documentation=content)vn.train(ddl=ddl)custompgvector/pgvector.py 中的 remove_training_data(id) 方法def paginate_data(data_list: list, page: int, page_size: int):
    """分页处理算法"""
    total = len(data_list)
    start_idx = (page - 1) * page_size
    end_idx = start_idx + page_size
    page_data = data_list[start_idx:end_idx]
    
    return {
        "data": page_data,
        "pagination": {
            "page": page,
            "page_size": page_size,
            "total": total,
            "total_pages": (total + page_size - 1) // page_size,
            "has_next": end_idx < total,
            "has_prev": page > 1
        }
    }
def filter_by_type(data_list: list, training_data_type: str):
    """按类型筛选算法"""
    if not training_data_type:
        return data_list
    
    return [
        record for record in data_list 
        if record.get('training_data_type') == training_data_type
    ]
def validate_sql_syntax(sql: str) -> tuple[bool, str]:
    """SQL语法检查(仅对sql类型)"""
    try:
        import sqlparse
        parsed = sqlparse.parse(sql.strip())
        
        if not parsed or not parsed[0].tokens:
            return False, "SQL语法错误:空语句"
        
        # 基本语法检查
        sql_upper = sql.strip().upper()
        if not any(sql_upper.startswith(keyword) for keyword in 
                  ['SELECT', 'INSERT', 'UPDATE', 'DELETE', 'CREATE', 'ALTER', 'DROP']):
            return False, "SQL语法错误:不是有效的SQL语句"
        
        return True, ""
    except Exception as e:
        return False, f"SQL语法错误:{str(e)}"
citu_app.py - 添加新的API路由common/result.py 中的标准响应格式训练数据管理API
├── vn.get_training_data()          # 查询数据源
├── vn.train()                      # 创建训练数据
├── vn.train_error_sql()            # 创建错误SQL
├── vn.remove_training_data()       # 删除数据
└── common/result.py                # 响应格式
步骤1:查看统计信息
GET /api/v0/training_data/stats
步骤2:查询现有数据
POST /api/v0/training_data/query
{
  "page": 1,
  "page_size": 50,
  "training_data_type": "sql"
}
步骤3:批量添加训练数据
POST /api/v0/training_data/create
{
  "data": [
    {
      "training_data_type": "sql",
      "question": "查询活跃用户",
      "sql": "SELECT * FROM users WHERE status = 'active'"
    },
    {
      "training_data_type": "documentation",
      "content": "用户状态字段说明:active表示活跃用户..."
    }
  ]
}
步骤4:清理无效数据
POST /api/v0/training_data/delete
{
  "ids": ["uuid-invalid-1", "uuid-invalid-2"],
  "confirm": true
}
适用于从其他系统批量导入训练数据,支持不同类型的混合导入。
适用于定期清理低质量或过时的训练数据,维护数据集质量。
| 版本 | 日期 | 更新内容 | 作者 | 
|---|---|---|---|
| 1.0 | 2024-06-24 | 初始版本设计 | AI Assistant | 
文档状态: 概要设计完成
下一步: 详细设计和开发实现