Java调用openai微调Fine-tuning实战示例

注: 建议先看微调文档, 遵从官网给出的规则。例如: jsonl训练文件至少有10个例子, 否则报错

官网微调文档https://platform.openai.com/docs/guides/fine-tuning官网微调APIhttps://platform.openai.com/docs/api-reference/fine-tuning

1. 实现步骤
  

1. 准备好jsonl数据集2. 上传jsonl数据集3. 创建微调模型4. 检索微调模型5. 使用微调模型

2. 实现代码

1. 准备好jsonl数据集

psychology.jsonl
{"messages": [{"role": "system", "content": "你是一位专业的心理咨询师"}, {"role": "user", "content": "我总是感到焦虑和不安,我该怎么处理"}, {"role": "assistant", "content": "你可以尝试一些放松技巧,例如深呼吸、渐进性肌肉放松等来减轻焦虑感。此外,也可以寻求心理咨询师的帮助,通过认知行为疗法等方式来管理焦虑情绪。"}]}
{"messages": [{"role": "system", "content": "你是一位专业的心理咨询师"}, {"role": "user", "content": "我觉得自己的时间管理很糟糕,我该如何改善?"}, {"role": "assistant", "content": "你可以尝试制定一个明确的目标和计划,合理安排时间,并坚持执行。此外,也可以学习一些时间管理技巧,例如优先级排序、任务分解等。"}]}
{"messages": [{"role": "system", "content": "你是一位专业的心理咨询师"}, {"role": "user", "content": "我感到很孤独和无助,我应该怎么做?"}, {"role": "assistant", "content": "你可以主动参与社交活动,结交新朋友,拓展人际关系。同时,也可以通过心理咨询师寻求支持,学习一些社交技巧和应对孤独的方法。"}]}
{"messages": [{"role": "system", "content": "你是一位专业的心理咨询师"}, {"role": "user", "content": "您最近感到压力很大吗?"}, {"role": "assistant", "content": "是的,最近工作上的任务很重,让我感到有些压力。"}]}
{"messages": [{"role": "system", "content": "你是一位专业的心理咨询师"}, {"role": "user", "content": "您经常感到焦虑吗?"}, {"role": "assistant", "content": "有时候会感到焦虑,特别是在面对一些重要的决定时。"}]}
{"messages": [{"role": "system", "content": "你是一位专业的心理咨询师"}, {"role": "user", "content": "您如何处理负面情绪?"}, {"role": "assistant", "content": "我会通过运动、听音乐或者和朋友聊天来释放情绪。"}]}
{"messages": [{"role": "system", "content": "你是一位专业的心理咨询师"}, {"role": "user", "content": "您认为自己的自尊心强吗?"}, {"role": "assistant", "content": "我的自尊心适中,既不过分自卑,也不过分自大。"}]}
{"messages": [{"role": "system", "content": "你是一位专业的心理咨询师"}, {"role": "user", "content": "您最近有什么进步的事情吗?"}, {"role": "assistant", "content": "我最近在学习一门新技能,感觉自己在不断进步。"}]}
{"messages": [{"role": "system", "content": "你是一位专业的心理咨询师"}, {"role": "user", "content": "您如何处理和同事之间的冲突?"}, {"role": "assistant", "content": "我会先冷静下来,然后尝试和同事进行沟通,找到解决问题的方法"}]}
{"messages": [{"role": "system", "content": "你是一位专业的心理咨询师"}, {"role": "user", "content": "您对自己的未来有什么规划吗?"}, {"role": "assistant", "content": "有的,我希望在未来几年内能够晋升到更高的职位,并在专业领域有所建树。"}]}
{"messages": [{"role": "system", "content": "你是一位专业的心理咨询师"}, {"role": "user", "content": "您觉得自己是一个乐观的人吗?"}, {"role": "assistant", "content": "大多数时候是乐观的,但也有时候会感到沮丧和失落。"}]}
{"messages": [{"role": "system", "content": "你是一位专业的心理咨询师"}, {"role": "user", "content": "您觉得自己的沟通能力强吗?"}, {"role": "assistant", "content": "我认为我的沟通能力还不错,能够有效地表达自己的想法和意见。"}]}
{"messages": [{"role": "system", "content": "你是一位专业的心理咨询师"}, {"role": "user", "content": "您有什么兴趣爱好吗?"}, {"role": "assistant", "content": "我喜欢阅读、旅行和看电影,这些是我放松和充实自己的方式。"}]}

2. 上传jsonl数据集
https://api.openai.com/v1/files
返回文件上传id: file-2GkrLPCM7Zqx6boYmoE3FIPK

    /*** 文件上传** @param file      jsonl文件* @param purpose   fine-tune* @return*/@PostMapping("/uploadFile")public AjaxResult uploadFile(MultipartFile file, String purpose){return openAiService.uploadFile(file, purpose);}/*** 文件上传** @param multipartFile* @param purpose* @return*/@Overridepublic AjaxResult uploadFile(MultipartFile multipartFile, String purpose) {OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(ConstantUtils.CONNECT_TIMEOUT, TimeUnit.SECONDS).writeTimeout(ConstantUtils.WRITE_TIMEOUT, TimeUnit.SECONDS).readTimeout(ConstantUtils.READ_TIMEOUT, TimeUnit.SECONDS).build();client = OpenAiClient.builder()//支持多key传入,请求时候随机选择.apiKey(Arrays.asList(ConstantUtils.OPENAI_API_KEY))//自定义key的获取策略:默认KeyRandomStrategy.keyStrategy(new KeyRandomStrategy()).okHttpClient(okHttpClient).build();// 获取后缀名String fileSuffix = multipartFile.getOriginalFilename();// 最后上传生成的文件名String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + fileSuffix;// 本地File file = new File("C:\\text\\"+finalFileName);// 线上
//        File file = new File("/www/wwwroot/project/cxAI/openai-demo/text/"+finalFileName);try {multipartFile.transferTo(file);} catch (IOException e) {e.printStackTrace();}UploadFileResponse response = client.uploadFile(file);log.info("文件上传: {}", response.getId());return AjaxResult.success(response);}

输出结果: 
{"msg": "操作成功","code": 200,"data": {"id": "file-2GkrLPCM7Zqx6boYmoE3FIPK","bytes": 3922,"filename": "1705286610498568psychology.jsonl","object": "file","purpose": "fine-tune","status": "processed","created_at": 1705286612,"status_details": null}
}

3. 创建微调模型
https://api.openai.com/v1/fine_tuning/jobs
返回微调模型id: ftjob-aNVvpcUepOGFpqctrNZTq1kP

    /*** 创建微调模型** @param trainingFile* @param model* @return*/@PostMapping("/fineTuneJob")public AjaxResult fineTuneJob(String trainingFile, String model){return openAiService.fineTuneJob(trainingFile, model);}/*** 创建微调模型** @param trainingFile* @param model* @return*/@Overridepublic AjaxResult fineTuneJob(String trainingFile, String model) {OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(ConstantUtils.CONNECT_TIMEOUT, TimeUnit.SECONDS).writeTimeout(ConstantUtils.WRITE_TIMEOUT, TimeUnit.SECONDS).readTimeout(ConstantUtils.READ_TIMEOUT, TimeUnit.SECONDS).build();client = OpenAiClient.builder()//支持多key传入,请求时候随机选择.apiKey(Arrays.asList(ConstantUtils.OPENAI_API_KEY))//自定义key的获取策略:默认KeyRandomStrategy.keyStrategy(new KeyRandomStrategy()).okHttpClient(okHttpClient).build();FineTuneJobResponse response = client.fineTuneJob(trainingFile);log.info("创建微调模型: {}", response.getId());return AjaxResult.success(response);}

输出结果: 
{"msg": "操作成功","code": 200,"data": {"id": "ftjob-aNVvpcUepOGFpqctrNZTq1kP","created_at": 1705286939,"error": null,"fine_tuned_model": null,"finished_at": null,"hyperparameters": {"nepochs": "auto","batch_size": "auto","learning_rate_multiplier": "auto","n_epochs": "auto"},"model": "gpt-3.5-turbo-1106","object": "fine_tuning.job","organization_id": "org-alYnskSd8W2bhEJiu0XKoD3a","result_files": [],"status": "validating_files","trained_tokens": null,"training_file": "file-2GkrLPCM7Zqx6boYmoE3FIPK","validation_file": null,"data": null}
}

4. 检索微调模型

https://api.openai.com/v1/fine_tuning/jobs/{fine_tuning_job_id }
返回模型fine_tuned_model: ft:gpt-3.5-turbo-1106:0101-ii-50-5000-203::8h7Ohlvf
注: fine_tuned_model需要等待创建微调模型的返回 (openai文档概述: 开始微调工作后,可能需要一些时间才能完成。您的作业可能排在我们系统中的其他作业后面,训练模型可能需要几分钟或几小时,具体取决于模型和数据集大小。)

    /*** 检索微调模型** @param fineTuningJobId* @return*/@GetMapping("/retrieveFineTuningJob/{fineTuningJobId}")public AjaxResult RetrieveFineTuningJob(@PathVariable String fineTuningJobId){return openAiService.RetrieveFineTuningJob(fineTuningJobId);}/*** 检索微调模型** @param fineTuningJobId* @return*/@Overridepublic AjaxResult RetrieveFineTuningJob(String fineTuningJobId) {OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(ConstantUtils.CONNECT_TIMEOUT, TimeUnit.SECONDS).writeTimeout(ConstantUtils.WRITE_TIMEOUT, TimeUnit.SECONDS).readTimeout(ConstantUtils.READ_TIMEOUT, TimeUnit.SECONDS).build();client = OpenAiClient.builder()//支持多key传入,请求时候随机选择.apiKey(Arrays.asList(ConstantUtils.OPENAI_API_KEY))//自定义key的获取策略:默认KeyRandomStrategy.keyStrategy(new KeyRandomStrategy()).okHttpClient(okHttpClient).build();FineTuneJobResponse response = client.retrieveFineTuneJob(fineTuningJobId);log.info("检索微调模型: {}", response.getModel());return AjaxResult.success(response);}

输出结果: 

{"msg": "操作成功","code": 200,"data": {"id": "ftjob-aNVvpcUepOGFpqctrNZTq1kP","created_at": 1705286939,"error": null,"fine_tuned_model": "ft:gpt-3.5-turbo-1106:0101-ii-50-5000-203::8h7Ohlvf","finished_at": 1705287231,"hyperparameters": {"nepochs": "7","batch_size": "1","learning_rate_multiplier": "2","n_epochs": "7"},"model": "gpt-3.5-turbo-1106","object": "fine_tuning.job","organization_id": "org-alYnskSd8W2bhEJiu0XKoD3a","result_files": ["file-cxmqzQjJbg9sIzXgwDkxG4nO"],"status": "succeeded","trained_tokens": 7672,"training_file": "file-2GkrLPCM7Zqx6boYmoE3FIPK","validation_file": null,"data": null}
}

5. 使用微调模型

https://api.openai.com/v1/chat/completions
和之前调用API一样, 把model设置成检索微调模型返回的fine_tuned_model

    /*** 使用微调模型** @param systemContent* @param userContent* @return*/@PostMapping("/fineTuneJobModelChat")public AjaxResult fineTuneJobModelChat(String systemContent, String userContent, String ftjob){return openAiService.fineTuneJobModelChat(systemContent, userContent, ftjob);}/*** 使用微调模型** @param systemContent* @param userContent* @param ftjob* @return*/@Overridepublic AjaxResult fineTuneJobModelChat(String systemContent, String userContent, String ftjob) {String text = this.getText(userContent, systemContent, true, ftjob);log.info("微调模型: {}", text);return AjaxResult.success(text);}

输出结果: 

以上已列出微调的实现流程以及核心代码, 相信小伙伴们可以轻松实现! 当然, 如需要完整代码的小伙伴可以留言或者私信我

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/623653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin 内联函数

内联函数 在JVM中每次函数调用,都会进行 操作栈 操作(栈帧),会增加内存使用和开销。 另外传入的 lambda 函数 参数,也会 内存分配(创建类和对象)。 inline 使用 内联(inline&#x…

当前vscode环境下 多进程多线程运行情况探究

我的代码 其中在“打开图片时”、“进入子进程之前”、“子进程join前”、“进入子进程区域后”,“子进程join后”、“进入子线程区域后”分别打印了进程线程的编号和数量。 # -*- coding: utf-8 -*-# Form implementation generated from reading ui file test2.…

如何在Intellij-idea如何编译maven工程

在 IntelliJ IDEA 中编译 Maven 工程,你需要遵循以下步骤: 打开 IntelliJ IDEA:首先,启动 IntelliJ IDEA。 打开 Maven 项目:在欢迎界面上,选择 "Get from Version Control",然后选择…

好书推荐丨AI时代Python量化交易实战:ChatGPT让量化交易插上翅膀(北大社)

文章目录 写在前面关键点内容简介作者简介推荐理由粉丝福利写在后面 写在前面 本期博主给大家推荐一本Python量化交易实战类书籍: ChatGPT让量化交易师率飞起来! 金融量化交易新模式一本专注于帮助交易师在AI时代实现晋级、提高效率的图书书中介绍了如…

【Rust日报】2024-01-12 将 Rust 引入 Git 项目

将 Rust 引入 Git 项目 去年年底的假期里,Taylor Blau 花了一些时间思考如何将 Rust 引入 Git 项目。 将 Rust 引入 Linux 内核的重要工作正在进行中。在他们既定的目标中,他认为有一些可能与 Git 项目相关: 由于语言的安全保证,内…

ssm基于vue的儿童教育网站的设计与实现论文

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,视频信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大…

python3的几个大坑

我是做Object C的,最近在做网络爬虫。学习python2。最近遇到三个大坑。 第一:None和[]没有关系 我百度出来一篇文章说,[],‘’,{}也是None类型。害的我这个菜鸟不轻。实际是[]和None没有毛关系。 第二:remove是按照值移…

开启C++之旅(上):探索命名空间与函数特性(缺省参数和函数重载)

之前浅显的讲解了数据结构的部分内容:数据结构专栏 那么今天我们迎来了新的起点:C的探索之旅 文章目录 1.命名空间1.1引入命名冲突1.2命名空间1.2.1命名空间的定义1.2.2命名空间的使用 2.c的输入与输出3.缺省参数3.1概念3.2缺省参数分类 4.函数重载4.1概…

【计算机二级考试C语言】C变量

C 变量 变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。 变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下…

12-桥接模式(Bridge)

意图 将抽象部分与它的实现部分分离,使他们可以独立地变化 个人理解 一句话概括就是只要是在抽象类中聚合了某个接口或者抽象类,就是使用了桥接模式。 抽象类A中聚合了抽象类B(或者接口B),A的子类的方法中在相同的场…

基于elementUI的el-table组件实现按住某一行数据上下滑动选中/选择或取消选中/选择鼠标经过的行

实现代码 <template><div :class"$options.name"><el-tablestyle"user-select: none"ref"table":data"tableData":row-class-name"row_class_name"mousedown.native"mousedownTable"row-click&q…

[力扣 Hot100]Day5 盛最多水的容器

题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

2、BERT:自然语言处理的变革者

请参考之前写的&#xff1a;2、什么是BERT&#xff1f;-CSDN博客文章浏览阅读826次&#xff0c;点赞19次&#xff0c;收藏22次。BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是Google在2018年提出的一种自然语言处理&#xff08;NLP&…

基于STM32F103和OLED的智能饮水机系统设计

标题&#xff1a;基于STM32F103和OLED的智能饮水机系统设计 摘要&#xff1a; 随着人们健康意识的提高&#xff0c;智能饮水机成为了现代生活中不可或缺的设备之一。本论文旨在设计并实现一种基于STM32F103和OLED的智能饮水机系统&#xff0c;该系统能够监测和管理饮水机的状态…

Spring Boot整理-Spring Boot是什么?

Spring Boot 是一个开源的 Java 基础框架,它旨在简化基于 Spring 的应用开发。其核心特点在于“约定优于配置”的设计哲学,意味着它提供了一系列默认配置,从而帮助开发者更快地启动和运行新的 Spring 应用。Spring Boot 的主要特点包括: 自动配置:Spring Boot 可以根据项目…

linux安装QQ(官方正版)

QQ官网上有支持linux系统的版本&#xff0c;所以去官网直接下载正版就好。 安装步骤&#xff1a; 1.进入官网&#xff1a;https://im.qq.com/linuxqq/index.shtml 2.选择版本&#xff1a;X86版下载dep 如下所示&#xff1a; 3.下载qq安装包&#xff1a; 4.使用命令安装qq s…

MySQL substring_index 分割字符串

row1&#xff1a; abcsev.com.cn; 123seeco.com; efsevloal.com; dddseobal.com row2&#xff1a; AAAAse23vloal.com; BBBBseo234bal.com 把同一個Column的字符串&#xff0c;通過分隔符分割后逐行插入數據庫。 substring_index 定位是位置的左边&#xff0c;或者右边。而不能…

Android 事件分发机制详解(下)

2.3 View事件分发机制 从上面 ViewGroup 事件分发机制知道&#xff0c;View事件分发机制从 dispatchTouchEvent() 开始 源码分析 /*** 源码分析&#xff1a;View.dispatchTouchEvent&#xff08;&#xff09;*/public boolean dispatchTouchEvent(MotionEvent event) { if …

系列四十八、通用pom

一、通用pom 1.1、基于maven构建聚合项目的父pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation…

国科大-自然语言处理复习

自然语言处理复习 实体关系联合抽取流水线式端到端方法 检索式问答系统流水线方式信息检索&#xff08;IR&#xff09;阶段阅读理解&#xff08;RC&#xff09;阶段基于证据强度的重排基于证据覆盖的重排结合不同类型的聚合 端到端方式Retriever-Reader的联合学习基于预训练的R…