一、需要良好的网络
二、需要在OpenAI官网https://openai.***/注册用户,并获取一个api-key,sk开头的
验证是否可用网站:http://tools.lbbit.top/check_key_valid/
三、spring boot 配置文件
openai.proxyHost=127.0.0.1
openai.proxyPort=7890
openai.keys=sk-xxxxxxxxxx
openai.proxy=https://xxxxxxx/
四、新建配置类AiServiceFactory
import ***.fasterxml.jackson.databind.ObjectMapper;
import ***.theokanning.openai.client.OpenAiApi;
import ***.theokanning.openai.service.OpenAiService;
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.***ponent;
import retrofit2.Retrofit;
import java.***.I***SocketAddress;
import java.***.Proxy;
import java.time.Duration;
@***ponent
public class AiServiceFactory {
@Value("${openai.proxyHost}")
private String proxyHost;
/**
* 代理端口
*/
@Value("${openai.proxyPort}")
private Integer proxyPort;
/**
* openai apikey
*/
@Value("${openai.keys}")
private String token;
@Value("${openai.proxy}")
private String proxyIp;
private static final Duration DEFAULT_TIMEOUT = Duration.ofSeconds(10L);
public OpenAiService createService() {
ObjectMapper mapper = OpenAiService.defaultObjectMapper();
// 设置代理
Proxy proxy = new Proxy(Proxy.Type.HTTP, new I***SocketAddress(proxyHost, proxyPort));
OkHttpClient client = OpenAiService.defaultClient(token, DEFAULT_TIMEOUT).newBuilder()
.proxy(proxy)
.build();
Retrofit retrofit = OpenAiService.defaultRetrofit(client, mapper).newBuilder().baseUrl(proxyIp).build();
return new OpenAiService(retrofit.create(OpenAiApi.class), client.dispatcher().executorService());
}
}
如果需要中转站代理的话,该类里面的方法如下
public OpenAiService createService() {
ObjectMapper mapper = OpenAiService.defaultObjectMapper();
// 设置代理
// Proxy proxy = new Proxy(Proxy.Type.HTTP, new I***SocketAddress(proxyHost, proxyPort));
// Proxy proxy = new Proxy(Proxy.Type.HTTP, new I***SocketAddress(proxyIp, 8080));
OkHttpClient client = OpenAiService.defaultClient(token, DEFAULT_TIMEOUT).newBuilder()
// .proxy(proxy)
.build();
Retrofit retrofit = OpenAiService.defaultRetrofit(client, mapper).newBuilder().baseUrl(proxyIp).build();
//代理服务器,中转站
return new OpenAiService(retrofit.create(OpenAiApi.class), client.dispatcher().executorService());
}
五、测试控制器,当然也可以写进service层
package ***.example.springbootest3_2.controller;
import ***.example.springbootest3_2.config.AiServiceFactory;
import ***.theokanning.openai.***pletion.chat.*;
import ***.theokanning.openai.service.OpenAiService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.***.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@RestController
public class OpenAiController {
@Resource
private AiServiceFactory aiServiceFactory;
@PostMapping("/testChat")
public String testChat(@RequestBody Map<String,String> params) throws UnsupportedEncodingException {
OpenAiService service = aiServiceFactory.createService();
final List<ChatMessage> messages = new ArrayList<>();
final ChatMessage systemMessage = new ChatMessage(ChatMessageRole.USER.value(),
URLDecoder.decode(params.get("contents"),
"UTF-8"));
messages.add(systemMessage);
Chat***pletionRequest chat***pletionRequest = Chat***pletionRequest
.builder()
.model("gpt-3.5-turbo")
.messages(messages)
.temperature(0.5)
// .n(1)
// .maxTokens(50)
// .logitBias(new HashMap<>())
.build();
Chat***pletionResult chat***pletionResult=service.createChat***pletion(chat***pletionRequest);
List<Chat***pletionChoice> ***pList=chat***pletionResult.getChoices();
StringBuilder sb = new StringBuilder();
for (Chat***pletionChoice ***p : ***pList) {
sb.append(***p.getMessage().getContent());
}
return sb.toString();
}
}