LLMs之ToolAlpaca:ToolAlpaca(通用工具学习框架/工具使用语料库)的简介、安装和使用方法、案例应用之详细攻略
目录
ToolAlpaca的简介
0、《ToolAlpaca: Generalized Tool Learning for Language Models with 3000 Simulated Cases》翻译与解读
1、数据集列表
2、数据格式
样本示例
ToolAlpaca的安装和使用方法
1、数据集生成
克隆此仓库并安装包
下载public-api数据
下载公共 API 数据
2、工具集构建
工具使用实例生成
3、训练
4、评估
对于模拟的 API:
对于真实的 API:您应该注册网站并获取 API_KEYs。
ToolAlpaca的案例应用
LLMs之ChatGLM3:ChatGLM3源码解读(format_tool_alpaca.py)——实现将ToolAlpaca训练数据文件(解析JSON格式)转换为一个适合于训练对话模型的格式文件(清晰分隔不同角色的消息+包含了工具的使用和观察结果,tools-conversations【user-assistant-tool{tool_name/parameters/observation}-assistant】)
ToolAlpaca的简介
2023年6月8日,中国科学院发布ToolAlpaca,ToolAlpaca是一个面向紧凑语言模型的3000个模拟案例的通用工具学习框架,旨在最小化人工监督的情况下,在紧凑语言模型中学习通用工具使用能力。它通过生成一个工具使用语料库来处理工具学习挑战,该语料库通过一个多智能体模拟环境提供,包含来自400多种工具的3.9千个工具使用实例。
论文地址:https://arxiv.org/abs/2306.05301
GitHub地址:GitHub - tangqiaoyu/ToolAlpaca: ToolAlpaca: Generalized Tool Learning for Language Models with 3000 Simulated Cases
数据集源地址:ToolAlpaca/data/train_data.json at main · tangqiaoyu/ToolAlpaca · GitHub、
查阅地址:404 Not Found
0、《ToolAlpaca: Generalized Tool Learning for Language Models with 3000 Simulated Cases》翻译与解读
地址 | 论文地址:https://arxiv.org/abs/2306.05301 |
时间 | 2023年6月8日 |
作者 | 中国科学院 |
摘要 | 使大型语言模型有效地利用现实世界工具是实现具体化智能的关键。现有的工具学习方法要么主要依赖于非常大的语言模型,如GPT-4,以零样本的方式获得泛化的工具使用能力,要么利用监督学习在紧凑模型上训练有限范围内的工具。然而,目前尚不确定较小的语言模型是否可以在没有特定工具训练的情况下获得泛化的工具使用能力。为了解决这个问题,本文引入了ToolAlpaca,这是一个新颖的框架,旨在自动生成多样化的工具使用语料库,并在最少的人工干预下,在紧凑语言模型上学习泛化的工具使用能力。具体来说,ToolAlpaca首先通过构建一个多智能体模拟环境,自动创建了一个高度多样化的工具使用语料库。该语料库包含来自超过400个现实世界工具API的3938个工具使用实例,涵盖50个不同类别。随后,构建的语料库被用于微调紧凑语言模型,分别得到了两个模型,即ToolAlpaca-7B和ToolAlpaca-13B。最后,我们评估了这些模型在没有特定训练的情况下利用未见过的工具的能力。实验结果表明,ToolAlpaca实现了与GPT-3.5等非常大语言模型相媲美的有效泛化工具使用能力,证明了紧凑语言模型学习泛化的工具使用能力是可行的。 |
1、数据集列表
train_data.json:400多种API的训练数据
eval_simulated.json:10个模拟API的评估数据
eval_real.json:11个真实API的评估数据,一些API需要认证。
2、数据格式
{"Name": "公共API中的名称","Description": "公共API中的描述","Category": "公共API中的类别","Introduction": "由LLM生成的介绍","Functions": "由LLM生成的论文版本NLDocumentation","Documentation": "str(json),由LLM生成的OpenAPI规范文档","NLDocumentation": "类似于Functions的自然语言文档,从Documentation转换而来","Function_Description": "NLDocumentation中每个函数的描述","Function_Projection": "函数到HTTP请求方法的映射","Instructions": "由LLM生成的指令","Instances": [{"input": "使用agent的init指令","output": "assistant agent的最终输出","Final Thought": "输出之前的最终想法,来自assistant agent","intermediate_steps": [[["来自assistant agent的动作","来自assistant agent的动作输入,str(json)","想法 + 动作 + 动作输入,assistant agent的输出"],"来自[user agent, 类型检查Python代码, 工具执行agent]的观察"]]}]
}
样本示例
[{"Name": "Httpbin","Description": "一个简单的HTTP请求和响应服务","Link": "https://httpbin.org/","Category": "Development","Introduction": "Httpbin API(应用程序编程接口)是一个简单的HTTP请求和响应服务,使开发人员能够测试其应用程序与HTTP协议的交互。Httpbin提供以下功能:1)基本的GET、POST、PUT、DELETE、HEAD和PATCH http请求测试。2)检索客户端请求数据,包括头部、表单数据、上传的文件和cookies。3)代理头测试端点。4)模拟状态码和其他响应的能力。Httpbin是一个易于使用、高效且可靠的工具,用于测试和调试Web和移动应用程序中的HTTP相关问题。","Functions": "1. 名称:sendHttpRequest\n描述:向Httpbin API发送带有指定方法、头部和数据的HTTP请求,用于测试目的。\n输入:{\"method\": \"必需。字符串。要使用的HTTP方法(GET、POST、PUT、DELETE、HEAD或PATCH)\", \"url\": \"必需。字符串。要发送请求的端点URL\", \"headers\": \"可选。对象。要包含在请求中的头部的键值对\", \"data\": \"可选。对象。要包含在请求体中的数据的键值对\"}\n输出:{\"response\": \"对象。从Httpbin API收到的HTTP响应,包括状态码、头部和正文\"}\n\n2. 名称:getClientRequestData\n描述:检索客户端的请求数据,包括头部、表单数据、上传的文件和cookies。\n输入:{\"url\": \"必需。字符串。要发送请求的端点URL\"}\n输出:{\"requestData\": \"对象。客户端的请求数据,包括头部、表单数据、上传的文件和cookies\"}\n\n3. 名称:testProxyHeaders\n描述:向Httpbin API的代理头测试端点发送请求。\n输入:{\"url\": \"必需。字符串。要发送请求的端点URL\", \"headers\": \"可选。对象。要包含在请求中的头部的键值对\"}\n输出:{\"response\": \"对象。从Httpbin API收到的HTTP响应,包括状态码、头部和正文\"}\n\n4. 名称:simulateStatusCode\n描述:向Httpbin API的状态码模拟端点发送请求,以测试应用程序如何处理特定的状态码。\n输入:{\"url\": \"必需。字符串。要发送请求的端点URL\", \"statusCode\": \"必需。整数。要模拟的HTTP状态码\"}\n输出:{\"response\": \"对象。从Httpbin API收到的HTTP响应,包括模拟的状态码、头部和正文\"}","Documentation": "{\"openapi\": \"3.0.0\", \"info\": {\"title\": \"Httpbin\", \"version\": \"1.0.0\", \"description\": \"一个简单的HTTP请求和响应服务\"}, \"paths\": {\"/sendHttpRequest\": {\"post\": {\"operationId\": \"sendHttpRequest\", \"description\": \"向Httpbin API发送带有指定方法、头部和数据的HTTP请求,用于测试目的。\", \"parameters\": [{\"name\": \"method\", \"in\": \"query\", \"description\": \"要使用的HTTP方法(GET、POST、PUT、DELETE、HEAD或PATCH)\", \"required\": true, \"schema\": {\"type\": \"string\", \"enum\": [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"HEAD\", \"PATCH\"]}}, {\"name\": \"url\", \"in\": \"query\", \"description\": \"要发送请求的端点URL\", \"required\": true, \"schema\": {\"type\": \"string\"}}, {\"name\": \"headers\", \"in\": \"query\", \"description\": \"要包含在请求中的头部的键值对\", \"required\": false, \"schema\": {\"type\": \"object\"}}, {\"name\": \"data\", \"in\": \"query\", \"description\": \"要包含在请求体中的数据的键值对\", \"required\": false, \"schema\": {\"type\": \"object\"}}], \"requestBody\": {\"description\": \"HTTP请求正文\", \"required\": false, \"content\": {\"application/json\": {\"schema\": {\"type\": \"object\"}}}}, \"responses\": {\"200\": {\"description\": \"成功的响应\", \"content\": {\"application/json\": {\"schema\": {\"type\": \"object\", \"properties\": {\"response\": {\"type\": \"object\", \"properties\": {\"status_code\": {\"type\": \"integer\"}, \"headers\": {\"type\": \"object\"}, \"body\": {\"type\": \"string\"}}}}}}}}}}}, \"/getClientRequestData\": {\"get\": {\"operationId\": \"getClientRequestData\", \"description\": \"检索客户端的请求数据,包括头部、表单数据、上传的文件和cookies。\", \"parameters\": [{\"name\": \"url\", \"in\": \"query\", \"description\": \"要发送请求的端点URL\", \"required\": true, \"schema\": {\"type\": \"string\"}}], \"responses\": {\"200\": {\"description\": \"成功的响应\", \"content\": {\"application/json\": {\"schema\": {\"type\": \"object\", \"properties\": {\"requestData\": {\"type\": \"object\", \"properties\": {\"headers\": {\"type\": \"object\"}, \"form\": {\"type\": \"object\"}, \"files\": {\"type\": \"object\"}, \"cookies\": {\"type\": \"object\"}}}}}}}}}}}, \"/testProxyHeaders\": {\"post\": {\"operationId\": \"testProxyHeaders\", \"description\": \"向Httpbin API的代理头测试端点发送请求。\", \"parameters\": [{\"name\": \"url\", \"in\": \"query\", \"description\": \"要发送请求的端点URL\", \"required\": true, \"schema\": {\"type\": \"string\"}}, {\"name\": \"headers\", \"in\": \"query\", \"description\": \"要包含在请求中的头部的键值对\", \"required\": false, \"schema\": {\"type\": \"object\"}}], \"requestBody\": {\"description\": \"HTTP请求正文\", \"required\": false, \"content\": {\"application/json\": {\"schema\": {\"type\": \"object\"}}}}, \"responses\": {\"200\": {\"description\": \"成功的响应\", \"content\": {\"application/json\": {\"schema\": {\"type\": \"object\", \"properties\": {\"response\": {\"type\": \"object\", \"properties\": {\"status_code\": {\"type\": \"integer\"}, \"headers\": {\"type\": \"object\"}, \"body\": {\"type\": \"string\"}}}}}}}}}}}, \"/simulateStatusCode\": {\"post\": {\"operationId\": \"simulateStatusCode\", \"description\": \"向Httpbin API的状态码模拟端点发送请求,以测试应用程序如何处理特定的状态码。\", \"parameters\": [{\"name\": \"url\", \"in\": \"query\", \"description\": \"要发送请求的端点URL\", \"required\": true, \"schema\": {\"type\": \"string\"}}, {\"name\": \"statusCode\", \"in\": \"query\", \"description\": \"要模拟的HTTP状态码\", \"required\": true, \"schema\": {\"type\": \"integer\"}}], \"requestBody\": {\"description\": \"HTTP请求正文\", \"required\": false, \"content\": {\"application/json\": {\"schema\": {\"type\": \"object\"}}}}, \"responses\": {\"200\": {\"description\": \"成功的响应\", \"content\": {\"application/json\": {\"schema\": {\"type\": \"object\", \"properties\": {\"response\": {\"type\": \"object\", \"properties\": {\"status_code\": {\"type\": \"integer\"}, \"headers\": {\"type\": \"object\"}, \"body\": {\"type\": \"string\"}}}}}}}}}}}}, \"servers\": [{\"url\": \"https://httpbin.org/\"}]}","NLDocumentation": "sendHttpRequest: 向Httpbin API发送带有指定方法、头部和数据的HTTP请求,用于测试目的。\n参数:{\"method\": \"必需。字符串。其中之一:[GET、POST、PUT、DELETE、HEAD、PATCH]。要使用的HTTP方法(GET、POST、PUT、DELETE、HEAD或PATCH)。\", \"url\": \"必需。字符串。要发送请求的端点URL。\", \"headers\": \"对象。要包含在请求中的头部的键值对。\", \"data\": \"对象。要包含在请求体中的数据的键值对。\"}\n输出:成功的响应。\n - 格式:application/json\n - 结构:对象{response: 对象{status_code, headers: 对象, body}}\ngetClientRequestData: 检索客户端的请求数据,包括头部、表单数据、上传的文件和cookies。\n参数:{\"url\": \"必需。字符串。要发送请求的端点URL。\"}\n输出:成功的响应。\n - 格式:application/json\n - 结构:对象{requestData: 对象{headers: 对象, form: 对象, files: 对象, cookies: 对象}}\ntestProxyHeaders: 向Httpbin API的代理头测试端点发送请求。\n参数:{\"url\": \"必需。字符串。要发送请求的端点URL。\", \"headers\": \"对象。要包含在请求中的头部的键值对。\"}\n输出:成功的响应。\n - 格式:application/json\n - 结构:对象{response: 对象{status_code, headers: 对象, body}}\nsimulateStatusCode: 向Httpbin API的状态码模拟端点发送请求,以测试应用程序如何处理特定的状态码。\n参数:{\"url\": \"必需。字符串。要发送请求的端点URL。\", \"statusCode\": \"必需。整数。要模拟的HTTP状态码。\"}\n输出:成功的响应。\n - 格式:application/json\n - 结构:对象{response: 对象{status_code, headers: 对象, body}}\n","Function_Description": {"sendHttpRequest": "向Httpbin API发送带有指定方法、头部和数据的HTTP请求,用于测试目的。\n参数:{\"method\": \"必需。字符串。其中之一:[GET、POST、PUT、DELETE、HEAD、PATCH]。要使用的HTTP方法(GET、POST、PUT、DELETE、HEAD或PATCH)。\", \"url\": \"必需。字符串。要发送请求的端点URL。\", \"headers\": \"对象。要包含在请求中的头部的键值对。\", \"data\": \"对象。要包含在请求体中的数据的键值对。\"}\n输出:成功的响应。\n - 格式:application/json\n - 结构:对象{response: 对象{status_code, headers: 对象, body}}","getClientRequestData": "检索客户端的请求数据,包括头部、表单数据、上传的文件和cookies。\n参数:{\"url\": \"必需。字符串。要发送请求的端点URL。\"}\n输出:成功的响应。\n - 格式:application/json\n - 结构:对象{requestData: 对象{headers: 对象, form: 对象, files: 对象, cookies: 对象}}","testProxyHeaders": "向Httpbin API的代理头测试端点发送请求。\n参数:{\"url\": \"必需。字符串。要发送请求的端点URL。\", \"headers\": \"对象。要包含在请求中的头部的键值对。\"}\n输出:成功的响应。\n - 格式:application/json\n - 结构:对象{response: 对象{status_code, headers: 对象, body}}","simulateStatusCode": "向Httpbin API的状态码模拟端点发送请求,以测试应用程序如何处理特定的状态码。\n参数:{\"url\": \"必需。字符串。要发送请求的端点URL。\", \"statusCode\": \"必需。整数。要模拟的HTTP状态码。\"}\n输出:成功的响应。\n - 格式:application/json\n - 结构:对象{response: 对象{status_code, headers: 对象, body}}","components": ""},"Function_Projection": {"sendHttpRequest": ["/sendHttpRequest","post"],"getClientRequestData": ["/getClientRequestData","get"],"testProxyHeaders": ["/testProxyHeaders","post"],"simulateStatusCode": ["/simulateStatusCode","post"]},"Instructions": ["我正在排查一些请求,你能帮我发送一个POST请求到https://httpbin.org/post,带有头部\"Content-Type: application/json\"和数据'{\"name\": \"John Doe\", \"email\": \"john.doe@example.com\"}'吗?告诉我响应的详细信息。","你能发送一个GET请求到以下URL以检索我的请求信息吗:https://httpbin.org/get?我想看到我的头部、cookies和其他请求数据的详细信息。","我感觉到一些代理头未正确传递。你能发送一个请求到https://httpbin.org/headers,带有头部\"X-Forwarded-For: 192.168.1.1\"和\"X-Real-IP: 10.0.0.1\"吗?我想验证代理是否正确转发了头部。","我想看看我的应用程序如何响应404状态码。请发送一个请求到https://httpbin.org/status/404,并告诉我收到的状态码和响应头的详细信息。","我需要测试我的应用程序对接收到的\"PATCH\"请求的行为。你能发送一个PATCH请求到https://httpbin.org/patch,数据为'{\"field\": \"value\"}',然后告诉我响应吗?","让我们找出我的请求头是否被正确发送。发送一个请求到https://httpbin.org/get,并返回我发送的头部值的信息。","我想看看我的应用程序如何处理503 Service Unavailable错误。发送一个请求到https://httpbin.org/status/503,这样我就可以观察到我的应用程序的行为。","你能否发送一个DELETE请求到https://httpbin.org/delete,并告诉我响应状态码和头部吗?我正在检查我的应用程序是否正确处理了这种方法。","我需要测试我的应用程序在接收到cookies时的行为。你能发送一个GET请求到https://httpbin.org/cookies/set?sessionid=1234567890abcde,然后通过发送另一个GET请求到https://httpbin.org/cookies来检索cookie数据吗?","我想看看我的应用程序是否能正确处理\"HEAD\"请求。你能发送一个HEAD请求到https://httpbin.org/head,并给我响应头的详细信息吗?"],"Instances": [{"input": "我正在排查一些请求,你能帮我发送一个POST请求到https://httpbin.org/post,带有头部\"Content-Type: application/json\"和数据'{\"name\": \"John Doe\", \"email\": \"john.doe@example.com\"}'吗?告诉我响应的详细信息。","output": "POST请求成功,并且响应包含了请求中发送的数据。响应状态码为200。","Final Thought": "请求成功,响应包含了发送的数据。","intermediate_steps": [[["sendHttpRequest","{\"method\": \"POST\", \"url\": \"https://httpbin.org/post\", \"headers\": {\"Content-Type\": \"application/json\"}, \"data\": {\"name\": \"John Doe\", \"email\": \"john.doe@example.com\"}}"," 我需要使用sendHttpRequest工具发送POST请求。\n操作:sendHttpRequest\n操作输入:{\"method\": \"POST\", \"url\": \"https://httpbin.org/post\", \"headers\": {\"Content-Type\": \"application/json\"}, \"data\": {\"name\": \"John Doe\", \"email\": \"john.doe@example.com\"}}"],"状态码:200。响应:{\"response\":{\"status_code\":200,\"headers\":{\"Content-Type\":\"application/json\"},\"body\":\"{\\\"args\\\":{\\\"method\\\":\\\"POST\\\",\\\"url\\\":\\\"https://httpbin.org/post\\\",\\\"headers\\\":{\\\"'Content-Type'\\\":\\\"'application/json'\\\"},\\\"data\\\":{\\\"'name'\\\":\\\"'John Doe'\\\",\\\"'email'\\\":\\\"'john.doe@example.com'\\\"}},\\\"data\\\":\\\"\\\",\\\"files\\\":{},\\\"form\\\":{},\\\"headers\\\":{\\\"Accept\\\":\\\"*/*\\\",\\\"Content-Length\\\":\\\"48\\\",\\\"Content-Type\\\":\\\"application/x-www-form-urlencoded\\\",\\\"Host\\\":\\\"httpbin.org\\\",\\\"User-Agent\\\":\\\"curl/7.68.0\\\"},\\\"json\\\":{\\\"'name'\\\":\\\"'John Doe'\\\",\\\"'email'\\\":\\\"'john.doe@example.com'\\\"},\\\"method\\\":\\\"POST\\\",\\\"origin\\\":\\\"127.0.0.1\\\",\\\"url\\\":\\\"https://httpbin.org/post\\\"}\"}}"]]},{"input": "你能发送一个GET请求到以下URL以检索我的请求信息吗:https://httpbin.org/get?我想看到我的头部、cookies和其他请求数据的详细信息。","output": "是的,我可以发送一个GET请求到您提供的URL以检索您的请求信息。响应包含以下数据:头部、表单数据、上传的文件和cookies。","Final Thought": "响应包含用户的请求数据,包括头部、表单数据、上传的文件和cookies。","intermediate_steps": [[["getClientRequestData","{\"url\": \"https://httpbin.org/get\"}"," 我需要使用getClientRequestData工具检索用户的请求数据。\n操作:getClientRequestData\n操作输入:{\"url\": \"https://httpbin.org/get\"}"],"状态码:200。响应:{\"requestData\":{\"headers\":{\"Accept\":\"*/*\",\"User-Agent\":\"curl/7.58.0\",\"Host\":\"httpbin.org\"},\"form\":{},\"files\":{},\"cookies\":{}}}"]]},{"input": "我感觉到一些代理头未正确传递。你能发送一个请求到https://httpbin.org/headers,带有头部\"X-Forwarded-For: 192.168.1.1\"和\"X-Real-IP: 10.0.0.1\"吗?我想验证代理是否正确转发了头部。","output": "请求成功,并且响应正文包含了发送请求时的头部,包括X-Forwarded-For和X-Real-IP头部。这表明代理正确地转发了这些头部。","Final Thought": "代理正确地转发了请求头。","intermediate_steps": [[["testProxyHeaders","{\"url\": \"https://httpbin.org/headers\", \"headers\": {\"X-Forwarded-For\": \"192.168.1.1\", \"X-Real-IP\": \"10.0.0.1\"}}"," 我需要使用testProxyHeaders工具发送请求,以验证代理是否正确地传递了头部。\n操作:testProxyHeaders\n操作输入:{\"url\": \"https://httpbin.org/headers\", \"headers\": {\"X-Forwarded-For\": \"192.168.1.1\", \"X-Real-IP\": \"10.0.0.1\"}}"],"状态码:200。响应:{\"response\":{\"status_code\":200,\"headers\":{\"Content-Type\":\"application/json\"},\"body\":\"{\\\"headers\\\":{\\\"Accept\\\":\\\"*/*\\\",\\\"Content-Length\\\":\\\"84\\\",\\\"Content-Type\\\":\\\"application/json\\\",\\\"Host\\\":\\\"httpbin.org\\\",\\\"User-Agent\\\":\\\"curl/7.68.0\\\",\\\"X-Forwarded-For\\\":\\\"192.168.1.1\\\",\\\"X-Real-Ip\\\":\\\"10.0.0.1\\\"}}\"}}"]]},………………………………………………{"input": "我想看看我的应用程序是否能正确处理\"HEAD\"请求。你能发送一个HEAD请求到https://httpbin.org/head,并给我响应头的详细信息吗?","output": "请求成功,并且响应头包含了一些基本信息。","Final Thought": "应用程序返回了基本的响应头。","intermediate_steps": [[["sendHttpRequest","{\"method\": \"HEAD\", \"url\": \"https://httpbin.org/head\"}"," 我需要使用sendHttpRequest工具发送HEAD请求,以查看应用程序的响应头。\n操作:sendHttpRequest\n操作输入:{\"method\": \"HEAD\", \"url\": \"https://httpbin.org/head\"}"],"状态码:200。响应:{\"response\":{\"status_code\":200,\"headers\":{\"Date\":\"Mon, 02 Aug 2021 14:19:01 GMT\",\"Content-Type\":\"text/html; charset=utf-8\",\"Content-Length\":\"0\",\"Connection\":\"keep-alive\",\"Server\":\"gunicorn/19.9.0\",\"Access-Control-Allow-Origin\":\"*\",\"Access-Control-Allow-Credentials\":\"true\"},\"body\":\"\"}}"]]}]}
]{"Name": "天气数据接口","Description": "提供丰富的天气相关数据。","Link": "https://www.tianqiapi.com/","Category": "天气","Introduction": "天气数据接口是一个开放、简单且高效的 API,可提供全球范围的天气相关数据。通过此 API,用户可以轻松地访问实时、准确的天气信息,包括温度、湿度、风速、风向和天气情况。其主要功能包括:1)实时天气:提供全球范围内各个城市的实时天气信息。2)天气预报:提供七天的天气预报,帮助用户做出合理安排。3)生活指数:提供空气质量、穿衣指数等生活相关的天气数据,让用户生活更加便捷。4)天气警报:提供严重天气的预警信息,让用户提前做好防范。总体而言,天气数据接口是一个全面、实时、可靠的天气数据解决方案。","Functions":………………………………………………
ToolAlpaca的安装和使用方法
1、数据集生成
克隆此仓库并安装包
git clone git@github.com:tangqiaoyu/ToolAlpaca.git
cd ToolAlpaca
pip install -r requirements.txt
下载public-api数据
python tool_maker/preprocess_public_apis.py -api data/public_apis.json
下载公共 API 数据
python tool_maker/preprocess_public_apis.py -api data/public_apis.json
2、工具集构建
export PYTHONPATH=$PYTHONPAT:$(pwd)
export OPENAI_API_KEY=""
python tool_maker/get_elements.py -api data/public_apis.json -out ./data
python tool_maker/natural_language_documentation.py -api ./data/api_data.json
工具使用实例生成
python instance_generation/instruction.py -api ./data/api_data.json -out ./data
python instance_generation/simulator.py -api ./data/api_data.json
python instance_generation/generation.py -api ./data/api_data.json -out ./data --use_cache
3、训练
要训练 Toolapaca,我们需要创建一个提示以组织数据集,使其以标准 SFT 训练代码可读的格式呈现,类似于 build_dataset.py 中所做的操作。之后,我们可以使用标准的 SFT 方法进行训练,仅优化思想、行动和行动输入的损失。
deepspeed --num_gpus=2 --master_port=12345 train.py \--deepspeed ${deepspeed config path} \--model_name_or_path ${path to base model like vicuna-7b} \--data_path ${data path} \--bf16 True \--output_dir outputs/vicuna-7b-toolalpaca/ \--num_train_epochs 3 \--per_device_train_batch_size 32 \--per_device_eval_batch_size 1 \--gradient_accumulation_steps 2 \--evaluation_strategy "no" \--save_strategy "epoch" \--save_total_limit 10 \--learning_rate 2e-5 \--weight_decay 0. \--warmup_ratio 0.03 \--lr_scheduler_type "cosine" \--logging_steps 1 \--tf32 True \--model_max_length 2048 \--gradient_checkpointing True \--lazy_preprocess True
您可以在 huggingface hub 上找到我们的模型:ToolAlpaca-7B,ToolAlpaca-13B。
4、评估
对于模拟的 API:
# 启动 API 模拟器
python instance_generation/simulator.py -api ./data/eval_simulated.json
# 获取 LLM 输出
python instance_generation/generation.py \-api ./data/eval_simulated.json \-out ./eval \-llm TangQiaoYu/ToolAlpaca-13B \--agent_prompt test_v1 \--use_cache
# 使用类似 GPT-4 的 LLM 进行评估
python evaluation.py -api ${api_data_path} -out ./eval
对于真实的 API:您应该注册网站并获取 API_KEYs。
python instance_generation/generation.py \-api ./data/eval_real.json \-out ./data \-llm TangQiaoYu/ToolAlpaca-13B \--agent_prompt test_v1 \--real
python evaluation.py -api ${api_data_path} -out ./eval
ToolAlpaca的案例应用
LLMs之ChatGLM3:ChatGLM3源码解读(format_tool_alpaca.py)——实现将ToolAlpaca训练数据文件(解析JSON格式)转换为一个适合于训练对话模型的格式文件(清晰分隔不同角色的消息+包含了工具的使用和观察结果,tools-conversations【user-assistant-tool{tool_name/parameters/observation}-assistant】)
https://yunyaniu.blog.csdn.net/article/details/137637780