OpenAI接口调用示例

最近为公司做了一个ChatGPT工具,这里展示一下OpenAI接口的调用

前提条件

访问OpenAI官网(国内需要翻墙)的账号,需要sk
地址:https://platform.openai.com

依赖

使用开源工具调用OpenAI接口,依赖如下:

        <dependency>
            <groupId>com.unfbx</groupId>
            <artifactId>chatgpt-java</artifactId>
            <version>1.1.2-beta0</version>
        </dependency>

代码示例


import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;

import com.unfbx.chatgpt.OpenAiClient;
import com.unfbx.chatgpt.entity.chat.ChatChoice;
import com.unfbx.chatgpt.entity.chat.ChatCompletion;
import com.unfbx.chatgpt.entity.chat.ChatCompletionResponse;
import com.unfbx.chatgpt.entity.chat.Message;
import com.unfbx.chatgpt.function.KeyRandomStrategy;
import com.unfbx.chatgpt.interceptor.OpenAILogger;
import com.unfbx.chatgpt.interceptor.OpenAiResponseInterceptor;
import com.unfbx.chatgpt.utils.TikTokensUtil;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import okhttp3.logging.HttpLoggingInterceptor;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 请求OpenAI接口示例
 */
@Slf4j
public class OpenAIDemo {

    public static void main(String[] args) {
        getOpenAiResult("你好");
    }

    private static OpenAiResult getOpenAiResult(String questionContent) {
        OpenAiClient openAiClient = builderOpenAiClient();
        //聊天模型:gpt-3.5
        Message message = Message.builder().role(Message.Role.USER).content(questionContent).build();
        ChatCompletion chatCompletion = ChatCompletion
            .builder()
            .messages(Collections.singletonList(message))
            .model(ChatCompletion.Model.GPT_3_5_TURBO_0613.getName()) //指定模型
            .build();
        ChatCompletionResponse chatCompletionResponse = openAiClient.chatCompletion(chatCompletion);
        List<ChatChoice> choices = chatCompletionResponse.getChoices();
        //获取请求的tokens数量
        long tokens = chatCompletion.tokens();
        //这种方式也可以
//        long tokens = TikTokensUtil.tokens(chatCompletion.getModel(),messages);
        log.info("Message集合文本:【{}】", questionContent);
        log.info("本地计算的请求的tokens数{}", tokens);
        log.info("本地计算的返回的tokens数{}", TikTokensUtil.tokens(chatCompletion.getModel(), chatCompletionResponse.getChoices().get(0).getMessage().getContent()));
        log.info("Open AI 官方计算的总的tokens数{}", chatCompletionResponse.getUsage().getTotalTokens());
        log.info("Open AI 官方计算的请求的tokens数{}", chatCompletionResponse.getUsage().getPromptTokens());
        log.info("Open AI 官方计算的返回的tokens数{}", chatCompletionResponse.getUsage().getCompletionTokens());
        OpenAiResult result = new OpenAiResult();
        result.setChatCompletion(chatCompletion)
            .setChatCompletionResponse(chatCompletionResponse)
            .setLocalToken(tokens)
            .setCompletionTokens(chatCompletionResponse.getUsage().getCompletionTokens())
            .setTotalTokens(chatCompletionResponse.getUsage().getTotalTokens())
            .setPromptTokens(chatCompletionResponse.getUsage().getPromptTokens());
        if (CollUtil.isNotEmpty(choices)) {
            result.setContent(choices.get(0).getMessage().getContent());
            log.info("Open AI 官方计算的返回的结果{}", result.getContent());
        }
        return result;
    }

    private static OpenAiClient builderOpenAiClient() {
        Map<String, String> proxyUser = setProxyUser();
        //可以为null
        Proxy proxy = new Proxy(Proxy.Type.HTTP,
            new InetSocketAddress(proxyUser.get("PROXY_HOST"), Integer.valueOf(proxyUser.get("PROXY_PORT"))));
        //设置socks代理服务器ip端口
        Authenticator proxyAuthenticator = new Authenticator() {
            @Override
            public Request authenticate(Route route, Response response) throws IOException {
                String credential = Credentials.basic(proxyUser.get("PROXY_USERNAME"), proxyUser.get("PROXY_PASSWORD"));
                return response.request().newBuilder()
                    .header("Proxy-Authorization", credential)
                    .build();
            }
        };

        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new OpenAILogger());
        //!!!!千万别再生产或者测试环境打开BODY级别日志!!!!
        //!!!生产或者测试环境建议设置为这三种级别:NONE,BASIC,HEADERS,!!!
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
        OkHttpClient okHttpClient = new OkHttpClient
            .Builder()
            .proxy(proxy)
            .proxyAuthenticator(proxyAuthenticator)
            .addInterceptor(httpLoggingInterceptor)
            .addInterceptor(new OpenAiResponseInterceptor())
            .connectTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS)
            .build();
        OpenAiClient openAiClient = OpenAiClient.builder()
            //支持多key传入,请求时候随机选择 openAiSk
            .apiKey(Arrays.asList("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"))
//            .apiKey(Arrays.asList("sk-########"))
            //自定义key的获取策略:默认KeyRandomStrategy
            .keyStrategy(new KeyRandomStrategy())
            .okHttpClient(okHttpClient)
            //自己做了代理就传代理地址
//                .apiHost("https://自己代理的服务器地址/")
            .build();

        return openAiClient;
    }

/**
*因为国内不能直接访问OpenAI接口,必须通过翻墙工具访问
*/
    private static Map<String, String> setProxyUser() {
        Map<String, String> proxyUser = MapUtil.newHashMap();
        proxyUser.put("PROXY_USERNAME", "****");
        proxyUser.put("PROXY_PASSWORD", "****");
        proxyUser.put("PROXY_HOST", "****");
        proxyUser.put("PROXY_PORT", "****");
        return proxyUser;
    }
}

import com.unfbx.chatgpt.entity.chat.ChatCompletion;
import com.unfbx.chatgpt.entity.chat.ChatCompletionResponse;
import lombok.Data;
import lombok.experimental.Accessors;


@Data
@Accessors(chain = true)
public class OpenAiResult {

    /**
     * 本地接口请求信息
     */
    private ChatCompletion chatCompletion;


    /**
     * OpenAI接口返回信息对象
     */
    private ChatCompletionResponse chatCompletionResponse;

    /**
     * 本地请求计算的token
     */
    private long localToken;
    /**
     * OpenAI接口返回信息
     */
    private String content;

    /**
     * 官方计算的请求的tokens数
     */
    private long promptTokens;
    /**
     * 官方计算的返回的tokens数{
     */
    private long completionTokens;

    /**
     * 官方计算的总的tokens数
     */
    private long totalTokens;
}

调用结果

在这里插入图片描述

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

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

相关文章

使用yum/dnf管理软件包

本章主要介绍使用 yum 对软件包进行管理。 yum 的介绍搭建yum源创建私有仓库yum客户端的配置yum的基本使用使用第三方yum源 使用rpm安装包时经常会遇到一个问题就是包依赖&#xff0c;如下所示。 [rootrhel03 ~]# rpm -ivh /mnt/AppStream/Packages/httpd-2.4.37-41.modulee…

mysql原理--B+树索引

1.没有索引的查找 1.1.在一个页中的查找 (1). 以主键为搜索条件 可以在 页目录 中使用二分法快速定位到对应的槽&#xff0c;然后再遍历该槽对应分组中的记录即可快速找到指定的记录。 (2). 以其他列作为搜索条件 这种情况下只能从 最小记录 开始依次遍历单链表中的每条记录&am…

Python爬虫实战之爬取京东商品数据并实实现数据可视化

文章目录 一、开发工具二、环境搭建三、原理简介四、数据可视化关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 …

《人工智能导论》知识思维导图梳理【1~5章节】

文章目录 说明第一章 绪论人工只能概述 第二章 知识表示和知识图谱一阶谓词逻辑和知识表示法产生式表示和框架表示法 第三章 确定性推理方法推理的基本概念自然演绎推理归结演绎推理谓词公式化子句集鲁宾孙归结原理归结反演归结反演求解问题 第四章 不确定性推理方法似然推理可…

博世汽车产业转型,裁1500人 | 百能云芯

博世&#xff08;Bosch&#xff09;&#xff0c;作为全球领先的汽车零部件制造商&#xff0c;近日宣布了一项战略性的组织调整计划&#xff0c;以更好地适应不断演变的汽车行业需求和技术革新。根据《路透社》的报道&#xff0c;博世计划在2025年底之前&#xff0c;在其位于德国…

读书笔记 | 自我管理的关键是提高执行力

哈喽啊&#xff0c;你好&#xff0c;我是雷工&#xff01; 有句话说&#xff0c;能管好自己才是真的本事。 自我管理&#xff0c;管好自己很重要。 我们之所以懂得这么多的道理&#xff0c;却依然过不好这一生&#xff1f; 很大部分原因是因为管不住自己&#xff0c;做不到。 …

智能优化算法应用:基于头脑风暴算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于头脑风暴算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于头脑风暴算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.头脑风暴算法4.实验参数设定5.算法结果6.…

NoSuchColumnFamilyException: org.apache.hadoop.hbase.regionserv

问题 在IDEA运行HBASE脚本时出现如下报错&#xff1a; org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException: org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException: Column family table does not exist in region hbase:meta,,1.1588230740 i…

【人工智能 | 知识表示方法】状态空间法 语义网络,良好的知识表示是解题的关键!(笔记总结系列)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

伪原创是什么意思?深度解析什么是伪原创

在信息爆炸的今天&#xff0c;人们对于内容的需求也愈发庞大。在这个背景下&#xff0c;一种名为“伪原创”的概念逐渐引起了人们的关注。究竟什么是伪原创&#xff1f;这是一个值得深入挖掘的话题。 一、什么是伪原创 在文字创作领域&#xff0c;原创是指作者独创的、未曾存…

gitee对接使用

1.创建一个文件夹 2.进入Gitee接受对方项目编辑 3.打开终端初始化一开始创建的文件夹 git init 3.1打开终端 3.2输入git.init 4.克隆对方的项目 4.1进入Gitee复制对方项目的路径 4.2在编辑器终端内克隆对方项目 git clone 网址 如此你的编辑器就会出现对方的项目 …

RocketMQ-RocketMQ高性能核心原理节点(流程图)

NamesrvServer启动流程图&#xff1a; namesrvServer启动简图&#xff1a; Broker服务启动过程流程图 Broker服务启动过程流程简图

at least 1 bean which qualifies as autowire candidate

No qualifying bean of type com. spdbcccdl.mapper.dl.DatabaseDaoavailable: expected at least 1 bean which qualifies as autowire candidate.

Swift “黑魔法”之动态获取类实例隐藏属性的值

概览 在 Swift 代码的调试中,我们时常惊叹调试器的无所不能:对于大部分“黑盒”类实例的内容,调试器也都能探查的一清二楚。 想要自己在运行时也能轻松找到 Thread 实例“私有”属性的值吗(比如 seqNum)? 在本篇博文中您将学到如下内容: 概览1. 借我,借我,一双慧眼吧…

if - else 实现点击展开 / 折叠

在前端开发过程中&#xff0c;我们经常需要使用到点击展开/折叠的按钮。 此案例是一个数组嵌套数组的效果展示&#xff0c;使用的是v-if else 来实现的展开效果。 一、实现方法 if...else&#xff1a;当指定条件为真&#xff0c;if 语句会执行一段语句。如果条件为假&#x…

【BI】FineBI功能学习路径-20231211

FineBI功能学习路径 https://help.fanruan.com/finebi/doc-view-1757.html 编辑数据概述 1.1 调整数据结构 1.2 简化数据 2.1上下合并 2.2其他表添加列 2.3左右合并 新增分析指标 函数参考 https://help.fanruan.com/finereport/doc-view-1897.html 数值函数 日期函数 文…

ESP8266模块(CH340)零基础实战

USB数据线连接ESP8266模块到电脑 先按住FLASH键,再按一下RST键,然后松开 此时电脑可识别出CH340 COM接口 CH340芯片厂商网址: wch.cn 传输比特率9600 win11自带驱动 下载Arduino IDE

动态规划:区间dp

让字符串成为回文串的最少插入次数 暴力递归 int f1(string s, int l, int r) {if (l r)return 0;if (l 1 r)return s[l] s[r] ? 0 : 1;if (s[l] s[r])return f1(s, l 1, r - 1);elsereturn min(f1(s, l, r - 1), f1(s, l 1, r)) 1; } 记忆化搜索 const int N5555;…

mysql 链接超时的几个参数详解

mysql5.7版本中&#xff0c;先查看超时设置参数&#xff0c;我们这里只关注需要的超时参数&#xff0c;并不是全都讲解 show variables like %timeout%; connect_timeout 指的是连接过程中握手的超时时间,在5.0.52以后默认为10秒&#xff0c;之前版本默认是5秒&#xff0c;主…