一、需要良好的网络
二、需要在OpenAI官网https://openai.com/注册用户,并获取一个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 com.fasterxml.jackson.databind.ObjectMapper; import com.theokanning.openai.client.OpenAiApi; import com.theokanning.openai.service.OpenAiService; import okhttp3.OkHttpClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import retrofit2.Retrofit; import java.net.InetSocketAddress; import java.net.Proxy; import java.time.Duration; @Component 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 InetSocketAddress(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 InetSocketAddress(proxyHost, proxyPort)); // Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(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 com.example.springbootest3_2.controller; import com.example.springbootest3_2.config.AiServiceFactory; import com.theokanning.openai.completion.chat.*; import com.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.net.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); ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest .builder() .model("gpt-3.5-turbo") .messages(messages) .temperature(0.5) // .n(1) // .maxTokens(50) // .logitBias(new HashMap<>()) .build(); ChatCompletionResult chatCompletionResult=service.createChatCompletion(chatCompletionRequest); List<ChatCompletionChoice> compList=chatCompletionResult.getChoices(); StringBuilder sb = new StringBuilder(); for (ChatCompletionChoice comp : compList) { sb.append(comp.getMessage().getContent()); } return sb.toString(); } }