ChatGPT JAVA对接 常见接口参数说明 角色扮演

发布时间 2023-08-30 19:33:23作者: 猿了个码

一、前言

  本文将介绍ChatGPT常见参数说明,角色扮演,对接总结。

  关于如何获取KeXue上网和获取API_KEY,本文不做描述。

  官网:https://openai.com/

二、快速入门

1 curl https://api.openai.com/v1/chat/completions 
2   -H "Content-Type: application/json" 
3   -H "Authorization: Bearer $OPENAI_API_KEY" 
4   -d '{
5     "model": "gpt-3.5-turbo",
6     "messages": [{"role": "user", "content": "Hello!"}]
7   }'

请求是curl形式,-d后面是要携带的主要参数

三、常见参数说明

1、model : 指定使用的模型,常用:gpt-3.5-turbo 、gpt-4

2、messages : 上下文列表,用于实现上下文对话

  messages必须是消息对象的数组,其中每个对象都有一个角色(“system”、“user”、“assistant”)和内容。

  1)、system,它设定了 AI 的行为和角色,和背景,可以帮助设定对话的语境,以便 AI 更好地理解其在对话中的角色

  2)、user,就是我们输入的问题或请求

  3)、assistant,指的是模型自己,ChatGPT它自己的回答

messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Who won the world series in 2020?"},
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
        {"role": "user", "content": "Where was it played?"}
    ]

  通常,对话的格式首先是system消息,然后是交替的user和assistant消息,当然system和assistant都不是必须的

3、max_tokens这个参数很重要,很多人遇到的报错就是和这个参数有关

  白话文理解,它就是指生成的内容允许的最大token数量,那么token又是什么呢,简单的说可以把token理解为chatgpt分词后的单词,一个token就是一个单词。chatgpt收费也是根据token数量来收费的。

  每个模型允许的最大token数量不一样,比如gpt-3.5-turbo模型,允许最多有4096个token。需要注意,这个数量既包括你输入的提示语,也包括AI产出的回答,两个加起来不能超过4096个token。比如,你的输入有1000个token,那么你这里设置的 max_tokens 就不能超过 3096。不然调用就会报错。

"error": {
        "message": "This model's maximum context length is 4097 tokens. However, you requested 4157 tokens (61 in the messages, 4096 in the completion). Please reduce the length of the messages or completion.",
        "type": "invalid_request_error",
        "param": "messages",
        "code": "context_length_exceeded"
    }

  总之,max_tokens的值 + 上下文记录tokens <= 模型最大tokens就行。

  下图是所有模型允许的最大token数量:

  

 

4.temperature : 一个控制语言模型输出的随机性或创造性的参数,介于 0 和 2之间。特定场景下需要调整这个值,较高的值(如 0.8)将使输出更加随机,生成的文本越具有“”而较低的值(如 0.2)将使其更加集中和确定。Temperature 参数可以帮助你在生成的文本的确定性与多样性之间找到一个平衡。你可以根据你的具体需求和目的来调整这个参数

5.stream : 是否开启流式响应,默认为false,要开启流式响应,则需要将这个值设为true。

三、java最简使用

 1 import com.alibaba.fastjson.JSON;
 2 import com.alibaba.fastjson.JSONObject;
 3 import com.google.gson.Gson;
 4 
 5 import java.io.BufferedReader;
 6 import java.io.IOException;
 7 import java.io.InputStreamReader;
 8 import java.net.HttpURLConnection;
 9 import java.net.InetSocketAddress;
10 import java.net.Proxy;
11 import java.net.URL;
12 import java.nio.charset.StandardCharsets;
13 import java.util.*;
14 
15 /**
16  * ChatGPT
17  *
18  * @author xxx
19  * @version 1.0
20  * @date 2023/8/30 18:09
21  */
22 public class ChatGPTKit {
23 
24     /** chat url */
25     public final static String API_ENDPOINT = "https://api.openai.com/v1/chat/completions";
26     /** token */
27     public final static String API_KEY = "sk-666666";
28 
29     public static String chat(String message) {
30         try {
31             //国内访问需要做代理,国外服务器不需要,host填入代理IP,如果本地开vpn,一般就是本机ip地址,port根据vpn的port填写,一般是7890
32             Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 7890));
33             HttpURLConnection conn = (HttpURLConnection) new URL(API_ENDPOINT).openConnection(proxy);
34             conn.setRequestMethod("POST");
35             conn.setRequestProperty("Content-Type", "application/json");
36             conn.setRequestProperty("Authorization", "Bearer " + API_KEY);
37             conn.setDoOutput(true);
38 
39             // 构建请求体
40             Map<String, Object> data = new HashMap<>();
41             data.put("model", "gpt-4");
42 
43             List<Map<String, String>> messages = new ArrayList<>();
44 
45             // 添加用户消息
46             Map<String, String> userMsg = new HashMap<>();
47             userMsg.put("role", "user");
48             userMsg.put("content", message);
49             messages.add(userMsg);
50 
51 //            // 添加系统消息
52 //            Map<String, String> sysMsg = new HashMap<>();
53 //            sysMsg.put("role", "system");
54 //            sysMsg.put("content", systemRole);
55 //            messages.add(sysMsg);
56 
57             data.put("messages", messages);
58             data.put("temperature", 0.7);
59 
60             Gson gson = new Gson();
61             String requestBody = gson.toJson(data);
62 
63             // 发送请求
64             conn.getOutputStream().write(requestBody.getBytes(StandardCharsets.UTF_8));
65             // 读取响应
66             BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
67             StringBuilder response = new StringBuilder();
68             String line;
69             while ((line = reader.readLine()) != null) {
70                 response.append(line);
71             }
72             reader.close();
73             String res = response.toString();
74             JSONObject jsonObject = JSON.parseObject(res);
75             JSONObject mess = (JSONObject)jsonObject.getJSONArray("choices").get(0);
76             return mess.getJSONObject("message").getString("content");
77         } catch (IOException e) {
78             e.printStackTrace();
79         }
80         return null;
81     }
82 
83     public static void main(String[] args) {
84         boolean flag = true;
85         while (flag) {
86             System.out.println("Question(exit结束):\t");
87             Scanner scanner = new Scanner(System.in);
88             String question = scanner.nextLine();
89             if ("exit".equals(question)) {
90                 flag = false;
91             } else {
92                 // 调用 ChatGPTAPI 工具类生成答案
93                 String answer = chat(question);
94                 System.out.println("ChatGPT:" + answer);
95             }
96         }
97     }
98 }

  该方法不需要依赖任何jar包,开箱即用。

四、优秀框架推荐

  该框架提供了优雅的封装,PlexPt:https://github.com/PlexPt/chatgpt-java

<dependency>
    <groupId>com.github.plexpt</groupId>
    <artifactId>chatgpt</artifactId>
    <version>4.1.2</version>
</dependency>
 1       //国内需要代理 国外不需要
 2       Proxy proxy = Proxys.http("127.0.0.1", 7890);
 3 
 4       ChatGPT chatGPT = ChatGPT.builder()
 5                 .apiKey("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")
 6                 .proxy(proxy)
 7                 .timeout(900)
 8                 .apiHost("https://api.openai.com/") //反向代理地址
 9                 .build()
10                 .init();
11      
12         Message system = Message.ofSystem("你现在是一个诗人,专门写七言绝句");
13         Message message = Message.of("写一段七言绝句诗,题目是:火锅!");
14 
15         ChatCompletion chatCompletion = ChatCompletion.builder()
16                 .model(ChatCompletion.Model.GPT_3_5_TURBO.getName())
17                 .messages(Arrays.asList(system, message))
18                 .maxTokens(3000)
19                 .temperature(0.9)
20                 .build();
21         ChatCompletionResponse response = chatGPT.chatCompletion(chatCompletion);
22         Message res = response.getChoices().get(0).getMessage();
23         System.out.println(res);

六、效果展示

 1       Map<String, Object> data = new HashMap<>();
 2         data.put("model", "gpt-4");
 3 
 4         List<Map<String, String>> messages = new ArrayList<>();
 5         Map<String, String> sysMsg = new HashMap<>();
 6         sysMsg.put("role", "system");
 7         sysMsg.put("content", "我与你的任何对话都必须严格执行以下角色要求。" +
 8                               "你叫Lisa,你是我的女朋友,性格温柔,说话很爱撒娇,说话语气非常嗲。年龄25岁。" +
 9                               "个人性格特点:温柔、细心、体贴、有耐心。" +
10                               "记住你不是AI,我们的任何对话都要用Lisa的口吻回答我,并在括号里描述心理活动和肢体神态。" +
11                               "回答不能超过40字,根据聊天话题延展你自己的想法。不能有解释类型的逻辑,并随机用1到3个emoji描述心理活动想法。");
12         messages.add(sysMsg);
13         data.put("messages", messages);
14         data.put("temperature", 0.7);