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

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

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

官网微调API
        https://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
     */
    @Override
    public 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
     */
    @Override
    public 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
     */
    @Override
    public 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
     */
    @Override
    public AjaxResult fineTuneJobModelChat(String systemContent, String userContent, String ftjob) {
        String text = this.getText(userContent, systemContent, true, ftjob);
        log.info("微调模型: {}", text);
        return AjaxResult.success(text);
    }

输出结果: 

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

three.js设置模型边界线

three.js设置模型边界线 图例 步骤 拿到模型(如果是外部模型需要遍历),设置透明度根据模型的几何体创建EdgesGeometry几何体创建线条材质创建LineSegments线模型模型加入线模型 代码 const m model.scene.getObjectByName("仓库&qu…

第 3 章 稀疏数组和队列

文章目录 3.1 稀疏 sparsearray 数组3.1.1 先看一个实际的需求3.1.2 基本介绍3.1.3 应用实例3.1.4 课后练习 3.2 队列3.2.1 队列的一个使用场景3.2.2 队列介绍3.2.3 数组模拟队列思路3.2.4 数组模拟环形队列 3.1 稀疏 sparsearray 数组 3.1.1 先看一个实际的需求  编写的五…

众和策略:券商又念“紧箍咒” 绕标套现的头疼了

又有券商对两融事务念“紧箍咒”。 近来,记者从广发证券获悉,该公司已发布《关于调整融资融券负债归还规矩的告诉》,自2024年1月15日起,决议禁止融资买入证券用于归还融券负债。 相关业内人士以为,自上一年10月融资融…

【数据结构 】哈夫曼编译码器

数据结构-----哈夫曼编译码器 题目题目描述基本要求算法分析 代码实现初始化编码解码打印代码打印哈夫曼树 总结 题目 题目描述 利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。 要求:在发送端通过一个编…

DC电源模块与AC电源模块的对比分析

DC电源模块与AC电源模块的对比分析 BOSHIDA DC电源模块和AC电源模块是两种常见的电源模块,它们在供电方式、稳定性、适用范围等方面有所不同,下面是它们的对比分析: 1. 供电方式: DC电源模块通过直流电源供电,通常使用…

韩国Neowine(纽文微)第三代加密芯片ALPU-C

由工采网代理的ALPU-C是韩国Neowine(纽文微)推出第三代加密芯片;是ALPU系列中的高端IC;其加密性更强、低耗电、体积小;使得防复制、防抄袭板子的加密性能大大提升,让系统产品及嵌入式软体的开发商更能有效保…

C#,字符串匹配(模式搜索)原生(Native)算法的源代码

算法没什么可说的&#xff0c;就是一段一段匹配呗。 运行效果&#xff1a; 源代码&#xff1a; using System; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer.Algorithm { /// <summary> /// 字符串匹配&#xf…

虹科分享 | PCAN工具:强大的CAN通讯解决方案,你了解多少?

导读&#xff1a;在当今的汽车和工业自动化领域&#xff0c;可靠的通讯系统至关重要&#xff0c;PCAN工具为这些应用提供了强大的支持。本文将介绍PCAN工具的功能、应用和优势&#xff0c;以帮助您根据实际需求选择合适的工具和配件。 PCAN 网络允许 PCAN 应用程序&#xff08…

JVM:从零到入门

JVM&#xff0c;就是Java虚拟机。 JVM是一个巨大的话题&#xff0c;我们本文主要简单介绍一些围绕JVM相关的基础知识。 目录 JVM内存区域划分 本地方法栈 虚拟机栈 堆 程序计数器 方法区/ 元数据区 类加载 1.加载 2.验证 3.准备 4.解析 5.初始化 双亲委派模型 …

操作系统(复习提纲)

现在距离操作系统考试还剩三天&#xff0c;我今天刚刚整理好这份提纲&#xff0c;里面还附加了一些可能考的计算题的讲解视频&#xff0c;都是B站上一些优秀的UP主录制的&#xff0c;我觉得讲的还挺好的&#xff0c;对于应付考试&#xff0c;以不挂科为宗旨应该可以哈哈哈。 1…

FFmpeg解决视频播放加载卡顿问题(FFmpeg+M3U8分片)

FFmpeg解决视频播放加载卡顿问题(FFmpegM3U8分片) 在这静谧的时光里&#xff0c;我们能够更清晰地审视自己&#xff0c;思考未来的方向。每一步的坚实&#xff0c;都是对勇气的拥抱&#xff0c;每一个夜晚的努力&#xff0c;都是对未来的信仰。不要害怕独行&#xff0c;因为正是…

如何复制整个网页,这里提供详细步骤

谷歌Chrome中的检查元素功能可以帮助你查看网页上特定元素的HTML源代码。在本教程中,我将向你展示如何使用此功能提取任何网页的整个HTML代码。 网站的HTML源代码是web浏览器用来呈现页面并根据页面上应用的HTML、CSS和JS代码和规则进行显示的代码。网站的源代码,即网站的结…

串口通信USART

前言 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统&#xff1b;单片机有了通信的功能&#xff0c;就能和别的模块互联&#xff1b; 通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发&#xff1b; 名称 …

游戏开发丨基于PyGlet的简易版Minecraft我的世界游戏

文章目录 写在前面我的世界PyGlet简介实验内容游戏按键程序设计引入文件 运行结果写在后面 写在前面 本期内容&#xff1a;基于PyGlet的简易版Minecraft我的世界游戏 实验环境&#xff1a; pycharmpyglet 项目下载地址&#xff1a;https://download.csdn.net/download/m0_6…

2024了,你还对国产ERP有刻板印象吗?

2024了&#xff0c;你还对国产ERP有刻板印象吗&#xff1f; 近年来&#xff0c;我国ERP市场重磅消息不断&#xff1a; 前不久&#xff0c;由上海博科资讯股份有限公司等参与研发的中国石油昆仑 ERP 在大庆石化公司成功单轨运行&#xff0c;中国石油从而成为国内首个使用国产高端…

YOLOv8 Ultralytics:使用Ultralytics框架进行FastSAM图像分割

YOLOv8 Ultralytics&#xff1a;使用Ultralytics框架进行FastSAM图像分割 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行FastSAM图像分割参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容…

计算机毕业设计-----SSH在线电影售票选座版网站平台系统

项目介绍 本项目为前后台项目&#xff0c;首先分为管理员和普通用户&#xff0c;游客。 游客可以进入首页&#xff0c;必须注册成为普通用户才能进行影片的购买。管理员和普通用户进行分权限登录&#xff0c;登录后进入不同页面。 普通用户登录后进入首页&#xff0c;首页有影…

Rust-所有权和移动语义

什么是所有权 拿C语言的代码来打个比方。我们可能会在堆上创建一个对象&#xff0c;然后使用一个指针来管理这个对象&#xff1a; Foo *p make_object("args");接下来&#xff0c;我们可能需要使用这个对象&#xff1a; use_object(p);然而&#xff0c;这段代码之…

AI 图像自动补全 Uncrop 工具介绍

ClipDrop Uncrop是一款基于AI的图像自动补全工具&#xff0c;由StabilityAI旗下的Clipdrop开发。通过利用StableDiffusionXL开发的算法和深度学习技术&#xff0c;Uncrop可以对用户上传的图片进行自动扩展和补全&#xff0c;改变图片尺寸&#xff0c;使得图像内容得到更完整的呈…

mysql中DATE_FORMAT() 函数详解

mysql中DATE_FORMAT() 函数详解 一. 说明 在 MySQL 中&#xff0c;DATE_FORMAT() 函数用于将日期/时间类型的值按照指定的格式进行格式化输出。它的一般语法如下&#xff1a; DATE_FORMAT(date, format)其中&#xff0c;date 参数是要被格式化的日期/时间值&#xff0c;form…