微调LLM提升工具调用能力的ShareGPT数据格式

1. 引入

我们做LLM微调,最常见的是Alpaca格式的数据,Alpaca是最简单、最通用的指令微调格式。它没有对话历史,只有 指令 (Instruction) + 输入 (Input) + 输出 (Output),适合单轮指令学习。

如果我们想微调LLM更好的做工具调用等Agent功能,要怎么做呢?

2. ShareGPT格式

相比 Alpaca 格式的数据集,ShareGPT格式支持更多的角色种类,例如 human、gpt、observation、function 等等。它们构成一个对象列表呈现在 conversations 列中。注意其中 human 和 observation 必须出现在奇数位置,gpt 和 function 必须出现在偶数位置。默认所有的 gpt 和 function 会被用于学习(参考1)。

如下是一个ShareGPT格式的多轮对话数据样例:

json 复制代码
[
  {
    "system": "你是贴心中文助手,回答简洁通俗",
    "conversations": [
      {"from": "human", "value": "推荐一部国产动画"},
      {"from": "gpt", "value": "《长安三万里》画面唯美,诗词氛围感拉满。"},
      {"from": "human", "value": "还有短篇吗?"},
      {"from": "gpt", "value": "《中国奇谭》,每一集独立小故事。"}
    ]
  }
]

3. 带工具调用的ShareGPT格式

根据参考2,我们可以看到这样的数据格式:

json 复制代码
[
  {
    "conversations": [
      {
        "from": "human",
        "value": "我需要为John Doe生成一张发票。他购买了2个苹果,每个$1,以及3根香蕉,每根$0.5。"
      },
      {
        "from": "function_call",
        "value": "{\"name\": \"generate_invoice\", \"arguments\": {\"customer_name\": \"约翰·多伊\", \"items\": [{\"name\": \"苹果\", \"quantity\": 2, \"price\": 1}, {\"name\": \"香蕉\", \"quantity\": 3, \"price\": 0.5}]}}"
      },
      {
        "from": "observation",
        "value": "{\"invoice_id\": \"INV12345\", \"customer_name\": \"约翰·多伊\", \"items\": [{\"name\": \"苹果\", \"quantity\": 2, \"price\": 1, \"total\": 2}, {\"name\": \"香蕉\", \"quantity\": 3, \"price\": 0.5, \"total\": 1.5}], \"total\": 3.5, \"status\": \"生成\"}"
      },
      {
        "from": "gpt",
        "value": "发票已成功生成。发票编号为INV12345。约翰·多伊的总金额为$3.5。发票包含2个苹果,总金额为$2,以及3根香蕉,总金额为$1.5。"
      }
    ],
    "tools": "[{\"name\": \"generate_invoice\", \"description\": \"生成发票\", \"parameters\": {\"type\": \"object\", \"properties\": {\"customer_name\": {\"type\": \"string\", \"description\": \"客户名称\"}, \"items\": {\"type\": \"array\", \"items\": {\"type\": \"object\", \"properties\": {\"name\": {\"type\": \"string\", \"description\": \"The item name\"}, \"quantity\": {\"type\": \"integer\", \"description\": \"The quantity of the item\"}, \"price\": {\"type\": \"number\", \"description\": \"The price per unit\"}}, \"required\": [\"name\", \"quantity\", \"price\"]}}}, \"required\": [\"customer_name\", \"items\"]}}, {\"name\": \"generate_password\", \"description\": \"生成随机密码\", \"parameters\": {\"type\": \"object\", \"properties\": {\"length\": {\"type\": \"integer\", \"description\": \"密码的长度\"}}, \"required\": [\"length\"]}}]"
  }
  ]

这是一个带工具调用(Function Calling)的 ShareGPT 对话格式,专门用来训练大模型学会调用工具 / 函数(比如生成发票、查天气、调用 API)。

上面这个数据样例,抽象出来,它的结构是这样的:

json 复制代码
[
  {
    "conversations": [ 对话流程:用户提问 → 模型调用工具 → 工具返回结果 → 模型回答 ],
    "tools": [ 告诉模型:你可以用哪些函数 ]
  }
]

4. 总结

本文介绍了三种用于LLM微调的数据格式,各有侧重:

(1). Alpaca格式:最简单通用的指令微调格式,包含"指令+输入+输出"三元组,适合单轮指令学习,但不支持对话历史。

(2). ShareGPT格式 :支持多轮对话,包含多种角色(human、gpt、observation、function等),对话以对象列表形式呈现在conversations列中,其中human和observation必须出现在奇数位置,gpt和function必须出现在偶数位置。

(3). 带工具调用的ShareGPT格式 :在ShareGPT格式基础上扩展,专门用于训练大模型进行工具调用(Function Calling)。数据包含conversations(对话流程:用户提问→模型调用工具→工具返回结果→模型回答)和tools(可用的函数列表)两部分,使模型能够学习如何调用外部工具/API。

这三种格式从简单到复杂,分别适用于不同的微调场景:基础指令学习、多轮对话能力训练、以及工具调用/Agent功能开发。

5. 参考

  1. https://github.com/hiyouga/LlamaFactory/blob/main/data/README_zh.md
  2. https://github.com/hiyouga/LlamaFactory/blob/main/data/glaive_toolcall_zh_demo.json
相关推荐
搜yyzk66810 小时前
智能电话机器人:1天千通电话,高效低成本
人工智能
fthux14 小时前
装闭 RenoPit 源码解析(09):AnalysisEngine装修闭坑分析主流程
人工智能·ai·开源·github·open source·renopit
敏编程14 小时前
开源项目 NextBand:探索融合健康传感、语音交互与 AI Agent 的下一代可穿戴设备
人工智能
小田学Python14 小时前
Agent 的运行范式:ReAct(Reasoning+Acting)
大模型·react·ai agent·工具调用
ovO14 小时前
我按下“发送”之后:DeepSeek Harness 如何把一次请求变成 1,177 个增量片段
人工智能·开源·deepseek
昨日之日200614 小时前
LTX-2.5:更清晰、更可控、同步音画、多镜头连贯的AI视频神器
人工智能·音视频
九硕智慧建筑一体化厂家14 小时前
数字化管控落地,直流照明构筑安全照明体系
运维·人工智能·笔记·安全·智慧城市
江厌0114 小时前
本地部署DeepSeek显卡怎么选?我把显存计算公式和实测记录写下来了
人工智能·百度·联想工作站·代理商推荐·渠道对比·工作站
小席是个热心肠15 小时前
AI相关的自我学习
java·人工智能·学习
FII工业富联科技服务15 小时前
工业AI自治的演进趋势:从内容生成到Agent驱动的工厂运营范式转变
人工智能