如果想有文档开发基础想直接搭建gpt,看完前情提要直接往下来看GPT篇章就行了
如果基础不牢我的建议是,看完xfg的视频+自己跟着文档操作一遍,很快就能弄懂了
资料+前情提要
参考的视频
【小傅哥】《ChatGPT AI 问答助手》第5节:整合知识星球与ChatGPT,完成自动化回答_哔哩哔哩_bilibili
使用的免费转发GPT
是一个git??项目,里面有快速开始和使用文档
chatanywhere/GPT_API_free: Free ChatGPT API Key,免费ChatGPT API,支持GPT4 API(免费),ChatGPT国内可用免费转发API,直连无需代理。可以搭配ChatBox等软件/插件使用,极大降低接口使用成本。国内即可无限制畅快聊天。 (github.com)
发出请求 - ChatAnywhere API 帮助文档 (apifox.cn)
密钥的申请
请求头
领取到我们的密钥key之后
我们可以使用帮助文档来快速申请
首先我们要在请求头上加东西
Authorization 加我们的密钥
Bearer xxxxx(这个是我们的密钥,必须是Bearer加一个空格开头,空格后面加我们的申请的密钥)
Content-Type 我们直接写application/json就行了,指定我们的格式
JSON转换网站
JSON在线 | JSON解析格式化—SO JSON在线工具
可以在线帮我们转换
而且冗杂的JSON格式直接给我们可视化成清晰可见的格式
而且还能帮我们生成Java实体类让我们能够成功使用
用到的依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.51</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.14.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager --><dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.0.3</version></dependency><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-api --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-api</artifactId><version>3.141.59</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.14</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>4.5.10</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.27</version></dependency></dependencies>
(基础)模拟使用请求获取知识星球的评论的消息和进行评论
发起请求得到我们的评论的内容
这是我跟着xfg的教程来模拟的
但是xfg的教程是我们自己创建一个知识星球来自己提问,教我们怎么拿到类型然后使用
所以,这个东西的使用是一个道理,我直接使用我们的评论区来代替
用控制台拿到我们的网络的详细信息
这个是我们的评论的请求的URL
这个是我们的Coookie
这个是我们的Content-Type
我们在测试类写这样的代码
把对应的参数的值弄进去
解释一下下面的逻辑
我们跟着上面来发起请求,请求会得到一个CloseableHttpResponse对象
然后打印我们的得到的JSON字符串
@Testvoid query() throws IOException {CloseableHttpClient httpclient = HttpClientBuilder.create().build();HttpGet get = new HttpGet("https://api.zsxq.com/v2/topics/8855151145211512/comments?sort=asc&count=30&with_sticky=tru");get.addHeader("cookie", "zsxq_access_token=D8F2CE33-78AD-388F-9E35-3E70AAC9FFA8_BA82B67DD0480B20; zsxqsessionid=38f3e5defa68fa7ba92f64ace1a5f820; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22582528585455854%22%2C%22first_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkwMjRmNTFkODQ1ZDEtMGRhZWYzNmRhMjRmMTUtMjYwMDFjNTEtMTMyNzEwNC0xOTAyNGY1MWQ4NjEyNjIiLCIkaWRlbnRpdHlfbG9naW5faWQiOiI1ODI1Mjg1ODU0NTU4NTQifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%22582528585455854%22%7D%2C%22%24device_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%7D; abtest_env=beta");get.addHeader("Content-Type", "application/json;charset=utf-8");CloseableHttpResponse response = httpclient.execute(get);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String res = EntityUtils.toString(response.getEntity());System.out.println(res);} else {System.out.println(response.getStatusLine().getStatusCode());}
然后我们的控制台成功输出了
这样子观看很不美观,所以我们找到我们的JSON转换网站进行格式化,这样观感就好很多了
用Java代码去进行评论
我们还是和之前一样,去发起评论然后看看网络的变化
payload载荷可以得到我们返回数据的详细信息
然后复制出来,得到我们的返回格式是这样子的
开始模拟发起评论
主要的不同在于
我们把那个JSON格式复制过来
然后修改了里面的text的内容,修改成了 玩原神是这样子的
这个就是我们的评论
然后我们整理一下我们的post请求里面的内容,然后执行
执行,我们成功了说明评论成功
而且我们得到的网络内容,和我们在浏览器控制台得到的是一样的
打开知识星球的评论,发现我们已经评论成功了
这个是我们的测试类的代码
@Testvoid answer() throws IOException {CloseableHttpClient httpclient = HttpClientBuilder.create().build();HttpPost post=new HttpPost("https://api.zsxq.com/v2/topics/8855151145211512/comments?sort=asc&count=30&with_sticky=true");post.addHeader("cookie", "zsxq_access_token=D8F2CE33-78AD-388F-9E35-3E70AAC9FFA8_BA82B67DD0480B20; zsxqsessionid=38f3e5defa68fa7ba92f64ace1a5f820; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22582528585455854%22%2C%22first_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkwMjRmNTFkODQ1ZDEtMGRhZWYzNmRhMjRmMTUtMjYwMDFjNTEtMTMyNzEwNC0xOTAyNGY1MWQ4NjEyNjIiLCIkaWRlbnRpdHlfbG9naW5faWQiOiI1ODI1Mjg1ODU0NTU4NTQifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%22582528585455854%22%7D%2C%22%24device_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%7D; abtest_env=beta");post.addHeader("Content-Type", "application/json;charset=UTF-8");String paramJson="{\n" +" \"req_data\": {\n" +" \"text\": \"玩原神是这样子的\\n\",\n" +" \"image_ids\": [],\n" +" \"mentioned_user_ids\": []\n" +" }\n" +"}";StringEntity stringEntity = new StringEntity(paramJson,ContentType.create("text/json", "UTF-8"));post.setEntity(stringEntity);CloseableHttpResponse response = httpclient.execute(post);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String res = EntityUtils.toString(response.getEntity());System.out.println(res);} else {System.out.println(response.getStatusLine().getStatusCode());}
}
(进阶)封装好实体类+Java代码方法发起请求
重点
payload里的内容,是我们发起请求时的类型
Preview里面是我们的返回值的类型
实体类(得到评论区消息)
点开我们的评论区的详细页面
复制到JSON在线解析,我们来看
发现我们的返回体有两个字段
一个是succeded
一个是resp_data
然后里面还有很多东西
我们让它来生成实体类,然后把这个实体类都弄到我们的Java代码里面去
这个是我们的返回类型,其他都是小类型
JsonProperties的使用
让我们和JSON字段的名字一一对应,有时候不完全一样的话我们对应不上导致赋值为null
package com.example.chataidoamin.model;import com.example.chataidoamin.Resp.Resp_data;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;@Data
public class Aggregates {private boolean succeeded;@JsonProperty("resp_data")private Resp_data respData;public boolean isSucceeded() {return succeeded;}public void setSucceeded(boolean succeeded) {this.succeeded = succeeded;}public Resp_data getRespData() {return respData;}public void setRespData(Resp_data respData) {this.respData = respData;}
}
JsonFormat的使用
如果日期类型和返回的类型不对应,我们也会赋值失败
package com.example.chataidoamin.POJO;import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;@Data
public class Comment
{@JsonProperty("comment_id")private long comment_id;@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")private String create_time;private Owner owner;private String text;private int likes_count;private int rewards_count;private boolean sticky;}
package com.example.chataidoamin.POJO;import lombok.Data;import java.math.BigDecimal;@Data
public class Owner
{private BigDecimal user_id;private String name;private String avatar_url;private String location;}
package com.example.chataidoamin.Req;import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;import java.util.List;@Data
public class Req_data {@JsonProperty("text")private String text;@JsonProperty("image_ids")private List<String> image_ids;public Req_data(String text, List<String> image_ids, List<String> mentioned_user_ids) {this.text = text;this.image_ids = image_ids;this.mentioned_user_ids = mentioned_user_ids;}@JsonProperty("mentioned_user_ids")private List<String> mentioned_user_ids;}
以上就是弄好了我们的实体类
业务代码
写一个接口
我们先写我们的query()方法,也就是我们先写发起请求
我们弄个实现类来写,然后结合之前测试类的东西来进行修改
例如我们的get请求我们的topics后面的数字我们换成一个形参
然后我们的Cookie也弄成一个形参
这样子就简洁了很多
主要是这个Java类型的转换
要是实体类没写好会导致里面有一些转换内容为null的
Value注解的使用
我们把全局参数弄到配置文件里面
然后在测试类里面注入
开始测试
然后我们可以拿到我们的评论List<Comment>
也就是这些
这样子我们就能成功拿到我们的评论消息了
实体类(发起评论)
这个是我们发起评论的时候的参数类型
之前我们的rep_data
现在我们的返回类型是resp_data
我们和之前一样来生成实体,然后步骤是一样的
就只加多了一个东西
也就是我们的请求头里的user-agent
说明这个请求是浏览器后去的
开始测试
评论成功了
测试类代码
package com.example.chataidoamin;
import com.alibaba.fastjson2.JSON;
import com.example.chataidoamin.POJO.Comment;
import com.example.chataidoamin.model.Aggregates;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.junit.jupiter.api.Test;
import com.example.chataidoamin.Service.zsxqApi;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;import java.io.IOException;
import java.util.List;
import java.util.UUID;@SpringBootTest
public class Test1 {@Value("${chatai-api.topicsid}")private String topics_id;@Value("${chatai-api.cookie}")private String cookie;@ResourcezsxqApi api;@Testvoid aa(){System.out.println(topics_id);System.out.println(cookie);}//使用我们的封装起来的函数@Testvoid test() throws IOException {//拿到我们的评论的信息Aggregates query = api.query(topics_id, cookie);System.out.println(query);List<Comment> comments = query.getRespData().getComments();for(Comment cm:comments){long commentId = cm.getComment_id();String text = cm.getText();System.out.println(text+commentId);}
//回答问题评论api.answer(topics_id, cookie, "这个是我们的自动回答,我们随机回答的ID是:" + UUID.randomUUID().toString());}@Testvoid answer() throws IOException {CloseableHttpClient httpclient = HttpClientBuilder.create().build();HttpPost post=new HttpPost("https://api.zsxq.com/v2/topics/8855151145211512/comments?sort=asc&count=30&with_sticky=true");post.addHeader("cookie", "zsxq_access_token=D8F2CE33-78AD-388F-9E35-3E70AAC9FFA8_BA82B67DD0480B20; zsxqsessionid=38f3e5defa68fa7ba92f64ace1a5f820; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22582528585455854%22%2C%22first_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkwMjRmNTFkODQ1ZDEtMGRhZWYzNmRhMjRmMTUtMjYwMDFjNTEtMTMyNzEwNC0xOTAyNGY1MWQ4NjEyNjIiLCIkaWRlbnRpdHlfbG9naW5faWQiOiI1ODI1Mjg1ODU0NTU4NTQifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%22582528585455854%22%7D%2C%22%24device_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%7D; abtest_env=beta");post.addHeader("Content-Type", "application/json;charset=UTF-8");String paramJson="{\n" +" \"req_data\": {\n" +" \"text\": \"玩原神是这样子的\\n\",\n" +" \"image_ids\": [],\n" +" \"mentioned_user_ids\": []\n" +" }\n" +"}";StringEntity stringEntity = new StringEntity(paramJson,ContentType.create("text/json", "UTF-8"));post.setEntity(stringEntity);CloseableHttpResponse response = httpclient.execute(post);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String res = EntityUtils.toString(response.getEntity());System.out.println(res);} else {System.out.println(response.getStatusLine().getStatusCode());}}@Testvoid query() throws IOException {CloseableHttpClient httpclient = HttpClientBuilder.create().build();HttpGet get = new HttpGet("https://api.zsxq.com/v2/topics/8855151145211512/comments?sort=asc&count=30&with_sticky=tru");get.addHeader("cookie", "zsxq_access_token=D8F2CE33-78AD-388F-9E35-3E70AAC9FFA8_BA82B67DD0480B20; zsxqsessionid=38f3e5defa68fa7ba92f64ace1a5f820; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22582528585455854%22%2C%22first_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkwMjRmNTFkODQ1ZDEtMGRhZWYzNmRhMjRmMTUtMjYwMDFjNTEtMTMyNzEwNC0xOTAyNGY1MWQ4NjEyNjIiLCIkaWRlbnRpdHlfbG9naW5faWQiOiI1ODI1Mjg1ODU0NTU4NTQifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%22582528585455854%22%7D%2C%22%24device_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%7D; abtest_env=beta");get.addHeader("Content-Type", "application/json;charset=utf-8");CloseableHttpResponse response = httpclient.execute(get);System.out.println(response);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String res = EntityUtils.toString(response.getEntity());System.out.println(res);Aggregates aggregates = JSON.parseObject(res, Aggregates.class);System.out.println(JSON.parseObject(res,Aggregates.class));System.out.println(aggregates);} else {System.out.println(response.getStatusLine().getStatusCode());}}@Testvoid query1() throws IOException {CloseableHttpClient httpclient = HttpClientBuilder.create().build();HttpGet get = new HttpGet("https://api.zsxq.com/v2/topics/8855151145211512/comments?sort=asc&count=30&with_sticky=tru");get.addHeader("cookie", "zsxq_access_token=D8F2CE33-78AD-388F-9E35-3E70AAC9FFA8_BA82B67DD0480B20; zsxqsessionid=38f3e5defa68fa7ba92f64ace1a5f820; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22582528585455854%22%2C%22first_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkwMjRmNTFkODQ1ZDEtMGRhZWYzNmRhMjRmMTUtMjYwMDFjNTEtMTMyNzEwNC0xOTAyNGY1MWQ4NjEyNjIiLCIkaWRlbnRpdHlfbG9naW5faWQiOiI1ODI1Mjg1ODU0NTU4NTQifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%22582528585455854%22%7D%2C%22%24device_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%7D; abtest_env=beta");get.addHeader("Content-Type", "application/json;charset=utf-8");CloseableHttpResponse response = httpclient.execute(get);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String res = EntityUtils.toString(response.getEntity());System.out.println(res); // 打印返回的 JSON 数据// 转换 JSON 数据到 Aggregates 类Aggregates aggregates = JSON.parseObject(res, Aggregates.class);System.out.println(aggregates);} else {System.out.println(response.getStatusLine().getStatusCode());}}}
GPT
测试密钥
发出请求 - ChatAnywhere API 帮助文档 (apifox.cn)
弄到key之后直接根据帮助文档来使用
复制我这个就行了,那个是shell命令的,在window命令行里面会换行
里面的Authorization参数换成自己的密钥
curl https://api.chatanywhere.tech/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer xxxx(换成自己的密钥)" -d "{\"model\":\"gpt-3.5-turbo\",\"messages\":[{\"role\":\"user\",\"content\":\"写一个冒泡排序\"}],\"temperature\":0.7}"
如果还是错误那么就复制官网的然后让ai帮你写
我命令行执行成功了,那么说明就没错
然后自己用ApiFox执行一下
根据我的资料+前情提要里面配置一下请求头和密钥
可以的话那么密钥就没问题,正式进行java代码的编写了
参数类型
这个是我们的发起请求的类型
这个是我们的得到返回值的类型
执行思路
所以步骤和之前一样
我现在只弄了聊天窗口接口,右边有示例类型,反正可以跟着来
然后思路和之前一样,都是把那种参数弄成实体类,主要是返回参数,不然我们无法拿到数据
你看我gpt包下面那些都是我们的实体类
写接口和实现类
接口
实现类
其实观察你会发现
我们发起请求的类型及其简单,我们是
model 指定要问的gpt类型
role 判断是用户的提问还是ai的回答
content是文本内容
但是我自己弄了一下,失败了,然后观察了一下之前curl的代码
发现给我们的api示例文档漏了一个temperature参数
所以我们在Java实体类加上就行了,可能不加也行?你自己去试试吧,反正我能跑起来就行了
实现类代码
package com.example.chataidoamin.Service.ServiceImpl;import com.alibaba.fastjson2.JSON;
import com.example.chataidoamin.Service.IOpenAI;
import com.example.chataidoamin.gpt.AIAnswer;
import com.example.chataidoamin.gpt.Choices;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.util.List;@Service
public class OpenAIImpl implements IOpenAI {@Value("${chatai-api.openAiKey}")String openAiKey;//question参数是我们的提问的问题@Overridepublic String doChatGPT(String question) throws IOException {CloseableHttpClient httpClient = HttpClientBuilder.create().build();//我们发起请求的网址HttpPost post=new HttpPost("https://api.chatanywhere.tech/v1/chat/completions");//我们的密钥post.addHeader("Authorization",openAiKey);//我们的响应类型post.addHeader("Content-Type","application/json");//我们的提问的问题变成提问gpt的JSON格式String parseJson="{\n" +" \"model\": \"gpt-3.5-turbo\",\n" +" \"messages\": [\n" +" {\n" +" \"role\": \"user\",\n" +" \"content\": \""+question+"\"\n" +" }\n" +" ],\n" +" \"temperature\": 0.7\n" +"}";StringEntity stringEntity=new StringEntity(parseJson, ContentType.create("application/json","utf-8"));post.setEntity(stringEntity);CloseableHttpResponse response = httpClient.execute(post);if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){//得到我们的响应的JSONString res = EntityUtils.toString(response.getEntity());//这个是我们的返回类型的实体类AIAnswer aiAnswer = JSON.parseObject(res, AIAnswer.class);StringBuilder answers=new StringBuilder();List<Choices> choices = aiAnswer.getChoices();for(Choices cs:choices){//拼接我们的文章的内容answers.append(cs.getMessage().getContent());}//返回我们的回答内容
return answers.toString();}else{System.out.println(response.getStatusLine().getStatusCode());//抛出异常,我们的异常状态码throw new RuntimeException("Error Code is "+response.getStatusLine().getStatusCode());}}
}
接口形式
ok,搞定,发现能成功执行