背景:在XX项目下,业务人员提出,希望在处理某些问题时,可以提供一个智能客服,例如接入chatGPT, 于是我在网上找一些资料,尝试在spring项目中接入chatGPT, 以实现这样一个智能客服的功能。
起初打算引入OpenAiChatClient,实现接入功能,但是后面发现一系列骚操作之后,买了外网手机号码,注册ask chatGPT之后还限速了,一分钟调用三次,完全不能实现对应的业务功能,后面就在TB买了key(会提供代理接口地址)。
话不多说上代码。
这里只使用了gpt-3.5-turbo模型,实际可以根据业务需要切换模型
package com.person.ai.service;
import com.alibaba.fastjson2.JSON;
import com.person.ai.model.Message;
import com.person.ai.model.RequestBody;
import com.person.ai.model.ResponseBody;
import io.micrometer.common.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Component
public class OpenAiUtils {
/**
* 请求地址
*/
@Value("${spring.ai.openai.base-url}")
private String url;
/**
* appKey
*/
@Value("${spring.ai.openai.api-key}")
private String appKey;
@Autowired
private RestTemplate restTemplate;
/**
* 获取提问内容
*
* @param content 提出的问题
* @return 返回的结果
*/
public String getAiRespondBody(String content) {
log.info("用户提问内容: {}", content);
List<Message> list = new ArrayList<>();
Message message = new Message();
message.setRole("user");
message.setContent(content);
list.add(message);
RequestBody requestBody = new RequestBody();
requestBody.setModel("gpt-3.5-turbo");
requestBody.setMessages(list);
requestBody.setStream(true);
requestBody.setTemperature(0.7);
String data = JSON.toJSONString(requestBody);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer " + appKey);
HttpEntity<String> requestEntity = new HttpEntity<>(data, headers);
StopWatch stopWatch = new StopWatch("test");
stopWatch.start();
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, requestEntity, String.class);
stopWatch.stop();
log.info("cost: {}", stopWatch.getTotalTimeSeconds());
String [] list1 = responseEntity.getBody().split("\n");
StringBuilder builder = new StringBuilder();
for (String s : list1) {
if (StringUtils.isBlank(s)) {
continue;
}
int index = s.indexOf("data: ");
String dataResp = s.substring(index + 6);
if (dataResp.equals("[DONE]")) {
break;
}
log.info("dataResp: {}", dataResp);
ResponseBody body = JSON.parseObject(dataResp, ResponseBody.class);
String outputContent = body.getChoices().get(0).getMessage().getContent();
if (StringUtils.isNotBlank(outputContent)) {
builder.append(outputContent);
}
}
return builder.toString().replaceAll("(.{50})", "$1\n");
}
}
测试结果:
http://127.0.0.1:8080/v1/ai/generate?message=输出一个100字的获奖发言稿
尊敬的评委们、亲爱的观众们,
非常感谢您们对我的认可和支持,我感到无比荣幸能够站在这里接受这个奖项。在人生的道路上,每一步都是不易
的,但正是有了您们的鼓励和指引,我才能够不断前行,勇敢追求梦想。这个奖项不仅仅是对我个人的肯定,更是
对我所从事的事业的认可。我将倍加珍惜这份荣耀,继续努力,为社会贡献更多的力量。再次感谢您们的支持与鼓
励!
谢谢!