本文介绍: 实例化完成之后呢,我们添加一个调用的方法 chatCompletion,返回值就是我们请求的response。现在已经完成了java版本的ChatGPT的client。这样就完成了一个ChatGPTClient的一个实例化。5 )添加 ChatGPTClient。4 )创建 ChatApi 接口。3 )entity 目录。再来添加一个init方法。1 )核心代码结构设计。2 ) pom 文件。3 )util 目录。
Java版的GPT的Client
<?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="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>gpt-client</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.19</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.33</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp-sse</artifactId>
<version>3.14.9</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>3.14.9</version>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>converter-jackson</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>adapter-rxjava2</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.knuddels</groupId>
<artifactId>jtokkit</artifactId>
<version>0.4.0</version>
</dependency>
</dependencies>
</project>
package com.xxx.gpt.client.entity;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.xxx.gpt.client.util.TokensUtil;
import lombok.Builder;
import lombok.Data;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
@Data
@Builder
@Slf4j
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ChatCompletion implements Serializable {
@NonNull
@Builder.Default
private String model = Model.GPT_3_5_TURBO_0613.getName();
@NonNull
private List<Message> messages;
/**
* 使用什么取样温度,0到2之间。越高越奔放。越低越保守。
* <p>
* 不要同时改这个和topP
*/
@Builder.Default
private double temperature = 0.9;
/**
* 0-1
* 建议0.9
* 不要同时改这个和temperature
*/
@JsonProperty("top_p")
@Builder.Default
private double topP = 0.9;
/**
* auto
*/
String function_call;
List<ChatFunction> functions;
/**
* 结果数。
*/
@Builder.Default
private Integer n = 1;
/**
* 是否流式输出.
* default:false
*/
@Builder.Default
private boolean stream = false;
/**
* 停用词
*/
private List<String> stop;
/**
* 3.5 最大支持4096
* 4.0 最大32k
*/
@JsonProperty("max_tokens")
private Integer maxTokens;
@JsonProperty("presence_penalty")
private double presencePenalty;
/**
* -2.0 ~~ 2.0
*/
@JsonProperty("frequency_penalty")
private double frequencyPenalty;
@JsonProperty("logit_bias")
private Map logitBias;
/**
* 用户唯一值,确保接口不被重复调用
*/
private String user;
public int countTokens() {
return TokensUtil.tokens(this.model, this.messages);
}
}
package com.xxx.gpt.client.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class ChatCompletionResponse implements Serializable {
private String id;
private String object;
private long created;
private String model;
private List<ChatChoice> choices;
private Usage usage;
}
ChatChoice.java
package com.xxx.gpt.client.entity;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class ChatChoice implements Serializable {
private long index;
/**
* 请求参数stream为true返回是delta
*/
@JsonProperty("delta")
private Message delta;
@JsonProperty("message")
private Message message;
@JsonProperty("finish_reason")
private String finishReason;
}
3 )util 目录
Proxys.java
package com.xxx.gpt.client.util;
import java.net.InetSocketAddress;
import java.net.Proxy;
public class Proxys {
public static Proxy http(String ip, int port) {
return new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ip, port));
}
public static Proxy socks5(String ip, int port) {
return new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(ip, port));
}
}
4 )创建 ChatApi 接口
- 在ChatAPI里面,我们就添加我们需要去访问的 Open AI 的接口
- 接口是post请求,接口的URI是
v1/chat/completions
- 返回值是我们刚刚创建的实体类
ChatCompletionResponse
,参数是ChatCompleination
- 这是我们要访问的chatAPI它的核心的接口
ChatApi.java
package com.xxx.gpt.client;
import com.xxx.gpt.client.entity.ChatCompletion;
import com.xxx.gpt.client.entity.ChatCompletionResponse;
import io.reactivex.Single;
import retrofit2.http.Body;
import retrofit2.http.POST;
public interface ChatApi {
String CHAT_GPT_API_HOST = "https://api.openai.com/";
@POST("v1/chat/completions")
Single<ChatCompletionResponse> chatCompletion(@Body ChatCompletion chatCompletion);
}
ChatGPTClient.java
package com.xxx.gpt.client;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.http.ContentType;
import cn.hutool.http.Header;
import com.alibaba.fastjson.JSON;
import com.xxx.gpt.client.entity.BaseResponse;
import com.xxx.gpt.client.entity.ChatCompletion;
import com.xxx.gpt.client.entity.ChatCompletionResponse;
import com.xxx.gpt.client.entity.Message;
import io.reactivex.Single;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.jackson.JacksonConverterFactory;
import java.net.Proxy;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Slf4j
@Getter
@Setter
@Builder
public class ChatGPTClient {
private String apiKey;
private List<String> apiKeyList;
@Builder.Default
private String apiHost = ChatApi.CHAT_GPT_API_HOST;
private ChatApi apiClient;
private OkHttpClient okHttpClient;
/**
* 超时 默认300
*/
@Builder.Default
private long timeout = 300;
/**
* okhttp 代理
*/
@Builder.Default
private Proxy proxy = Proxy.NO_PROXY;
public ChatGPTClient init() {
OkHttpClient.Builder client = new OkHttpClient.Builder();
client.addInterceptor(chain -> {
Request original = chain.request();
String key = apiKey;
if (apiKeyList != null && !apiKeyList.isEmpty()) {
key = RandomUtil.randomEle(apiKeyList);
}
Request request = original.newBuilder()
.header(Header.AUTHORIZATION.getValue(), "Bearer " + key)
.header(Header.CONTENT_TYPE.getValue(), ContentType.JSON.getValue())
.method(original.method(), original.body())
.build();
return chain.proceed(request);
}).addInterceptor(chain -> {
Request original = chain.request();
Response response = chain.proceed(original);
if (!response.isSuccessful()) {
String errorMsg = response.body().string();
log.error("请求异常:{}", errorMsg);
BaseResponse baseResponse = JSON.parseObject(errorMsg, BaseResponse.class);
if (Objects.nonNull(baseResponse.getError())) {
log.error(baseResponse.getError().getMessage());
throw new RuntimeException(baseResponse.getError().getMessage());
}
throw new RuntimeException(errorMsg);
}
return response;
});
client.connectTimeout(timeout, TimeUnit.SECONDS);
client.writeTimeout(timeout, TimeUnit.SECONDS);
client.readTimeout(timeout, TimeUnit.SECONDS);
if (Objects.nonNull(proxy)) {
client.proxy(proxy);
}
OkHttpClient httpClient = client.build();
this.okHttpClient = httpClient;
this.apiClient = new Retrofit.Builder()
.baseUrl(this.apiHost)
.client(okHttpClient)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(JacksonConverterFactory.create())
.build()
.create(ChatApi.class);
return this;
}
public ChatCompletionResponse chatCompletion(ChatCompletion chatCompletion) {
Single<ChatCompletionResponse> chatCompletionResponse =
this.apiClient.chatCompletion(chatCompletion);
return chatCompletionResponse.blockingGet();
}
public String chat(String message) {
ChatCompletion chatCompletion = ChatCompletion.builder()
.messages(Arrays.asList(Message.of(message)))
.build();
ChatCompletionResponse response = this.chatCompletion(chatCompletion);
return response.getChoices().get(0).getMessage().getContent();
}
}
6 )添加测试类
ChatGPTClientTest.java
package com.xxx.gpt.client.test;
import com.xxx.gpt.client.ChatGPTClient;
import com.xxx.gpt.client.entity.ChatCompletion;
import com.xxx.gpt.client.entity.ChatCompletionResponse;
import com.xxx.gpt.client.entity.Message;
import com.xxx.gpt.client.entity.Model;
import com.xxx.gpt.client.util.Proxys;
import org.junit.Before;
import org.junit.Test;
import java.net.Proxy;
import java.util.Arrays;
public class ChatGPTClientTest {
private ChatGPTClient chatGPTClient;
@Before
public void before() {
Proxy proxy = Proxys.socks5("127.0.0.1", 7890);
chatGPTClient = ChatGPTClient.builder()
.apiKey("sk-6kchn0DjDasdsdfdqOJqkc3aIso5ct")
.timeout(900)
.proxy(proxy)
.apiHost("https://api.openai.com/")
.build()
.init();
}
@Test
public void chat() {
Message system = Message.ofSystem("你是一个作家,学习过很多古诗");
Message message = Message.of("写一首关于青春的七言绝句");
ChatCompletion chatCompletion = ChatCompletion.builder()
.model(Model.GPT_3_5_TURBO.getName())
.messages(Arrays.asList(system, message))
.maxTokens(3000)
.temperature(0.9)
.build();
ChatCompletionResponse response = chatGPTClient.chatCompletion(chatCompletion);
Message res = response.getChoices().get(0).getMessage();
System.out.println(res.getContent());
}
// @Test
public void tokens() {
Message system = Message.ofSystem("你是一个作家,学习过很多古诗");
Message message = Message.of("写一首关于青春的七言绝句");
ChatCompletion chatCompletion1 = ChatCompletion.builder()
.model(Model.GPT_3_5_TURBO.getName())
.messages(Arrays.asList(system, message))
.maxTokens(3000)
.temperature(0.9)
.build();
ChatCompletion chatCompletion2 = ChatCompletion.builder()
.model(Model.TEXT_DAVINCI_003.getName())
.messages(Arrays.asList(system, message))
.maxTokens(3000)
.temperature(0.9)
.build();
System.out.println(chatCompletion1.countTokens());
System.out.println(chatCompletion2.countTokens());
}
}
- 根据前面我们看到的API的文档,构建 Prompt(message)
- 我们构造一个system角色的一个message
- 接下来构造我们的request参数
- 这里完成了让GPT根据 Prompt 创作了一首诗歌
- 以上是 Java 版本的GPT相关核心代码(网上搜集)
- 可以作为转换成其他编程语言实现的参考
原文地址:https://blog.csdn.net/Tyro_java/article/details/134748994
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_33416.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。