java-chatgpt
1.
package com.demo.chatgpt.test;
import cn.hutool.core.collection.CollectionUtil;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.Maps;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@Slf4j
public class ChatGptApiTest {
//通过spring 的resttemplate调用chatgpt api
private static final RestTemplate restTemplate = new RestTemplate();
//openai的api key,可以写死或从配置文件读取,这里读取的环境变量
private static final String apiKey = System.getenv("OPENAI_API_KEY");
public static void main(String[] args) {
final String question = "google和openai比,哪个公司更有潜力";
final StringBuilder sb = new StringBuilder();
while (true){
//循环调用,将返回的内容附加到问题里,解决返回的答案被截断的问题
AIResponse response = getAiResponse(question+"\n A:"+sb);
if(response!= null ){
// 如果返回不为null,提取返回内容
sb.append(CollectionUtil.getFirst(response.getChoices()).getText());
}
if(response == null || CollectionUtil.getFirst(response.getChoices()).finish()){
//返回null,或者回答结束,退出循环
break;
}
}
log.info("result:{}",sb);
}
private static AIResponse getAiResponse(final String question){
final Map<String,Object> data = Maps.newHashMap();
data.put("model","text-davinci-003");
data.put("prompt",question);
data.put("temperature",0);
data.put("max_tokens",50);
log.info("apikey:{}",apiKey);
if(StringUtils.isBlank(apiKey)){
log.error("apikey is empty");
}else {
final URI uri = URI.create("https://api.openai.com/v1/completions");
MultiValueMap<String,String> headers = new HttpHeaders();
headers.add("Content-Type","application/json");
headers.add("Authorization","Bearer "+apiKey);
final RequestEntity<String> request = new RequestEntity<>(JsonUtils.toJson(data),headers,HttpMethod.POST, uri);
final ResponseEntity<AIResponse> responseEntity = restTemplate.exchange(request, AIResponse.class);
AIResponse responseEntityBody = responseEntity.getBody();
log.info("{}",responseEntity);
if(!Objects.isNull(responseEntityBody)){
final AIResponseChoice first = CollectionUtil.getFirst(responseEntityBody.getChoices());
if(!Objects.isNull(first)){
return responseEntityBody;
}
}else {
log.info("{}",responseEntity);
}
}
return null;
}
@Data
public static class AIResponse{
private List<AIResponseChoice> choices;
}
@Data
public static class AIResponseChoice{
private String text;
@JsonProperty("finish_reason")
private String finishReason;
public boolean finish(){
return !Objects.equals("length",finishReason);
}
}
}
2.
<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>client</artifactId>
<version>0.11.0</version>
</dependency>
public void sendMsg() {
// 消息列表
List<ChatMessage> list = new ArrayList<>();
// 给chatGPT定义一个身份,是一个助手
ChatMessage chatMessage = new ChatMessage();
chatMessage.setRole("system");
chatMessage.setContent("You are a helpful assistant.");
list.add(chatMessage);
// 定义一个用户身份,content是用户写的内容
ChatMessage userMessage = new ChatMessage();
userMessage.setRole("user");
userMessage.setContent("hello");
list.add(userMessage);
ChatCompletionRequest request = ChatCompletionRequest.builder()
.messages(list)
.model("gpt-3.5-turbo")
.build();
OpenAiService service = new OpenAiService("your token");
// chatCompletion 对象就是chatGPT响应的数据了
ChatCompletionResult chatCompletion = service.createChatCompletion(request);
}
3.
import java.io.IOException;
import java.util.Arrays;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ChatGPTExample {
private static final String API_ENDPOINT = "https://api.openai.com/v1/engines/davinci-codex/completions";
private static final String ACCESS_TOKEN = "<your-access-token>";
public static void main(String[] args) throws IOException {
// Create a new HTTP client
CloseableHttpClient httpClient = HttpClients.createDefault();
// Set the API request parameters
String prompt = "Hello, how are you today?";
int maxTokens = 60;
double temperature = 0.7;
double topP = 1.0;
double frequencyPenalty = 0.5;
double presencePenalty = 0.0;
// Create a new HTTP POST request
HttpPost httpPost = new HttpPost(API_ENDPOINT);
httpPost.addHeader("Content-Type", "application/json");
httpPost.addHeader("Authorization", "Bearer " + ACCESS_TOKEN);
// Set the request body as a JSON string
ObjectMapper objectMapper = new ObjectMapper();
String requestBody = objectMapper.writeValueAsString(
new ChatGPTRequest(prompt, maxTokens, temperature, topP, frequencyPenalty, presencePenalty));
httpPost.setEntity(new StringEntity(requestBody));
// Send the API request and parse the response
CloseableHttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
String responseBody = EntityUtils.toString(entity);
EntityUtils.consume(entity);
response.close();
JsonNode responseJson = objectMapper.readTree(responseBody);
String responseText = responseJson.get("choices").get(0).get("text").asText();
// Print the response text to the console
System.out.println("ChatGPT response: " + responseText);
// Close the HTTP client
httpClient.close();
}
static class ChatGPTRequest {
public String prompt;
public int max_tokens;
public double temperature;
public double top_p;
public double frequency_penalty;
public double presence_penalty;
public ChatGPTRequest(String prompt, int maxTokens, double temperature, double topP,
double frequencyPenalty, double presencePenalty) {
this.prompt = prompt;
this.max_tokens = maxTokens;
this.temperature = temperature;
this.top_p = topP;
this.frequency_penalty = frequencyPenalty;
this.presence_penalty = presencePenalty;
}
}
}
首先创建了一个HTTP客户端,然后设置了API的访问端点和访问密钥。接着,我们设置了对话的文本和一些生成对话的参数,并使用Jackson库将请求参数转换为JSON字符串。然后,我们创建了一个HTTP POST请求,并将JSON字符串设置为请求体。接着,我们使用HTTP客户端发送请求,并解析了响应。最后,我们使用Jackson库从响应JSON中提取生成的对话文本,并将其打印到控制台上。