DefaultOpenAiServiceImpl.java 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package jnpf.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.TypeReference;
  4. import com.unfbx.chatgpt.OpenAiClient;
  5. import com.unfbx.chatgpt.entity.chat.ChatCompletion;
  6. import com.unfbx.chatgpt.entity.chat.ChatCompletionResponse;
  7. import com.unfbx.chatgpt.entity.chat.Message;
  8. import jnpf.config.AiProperties;
  9. import jnpf.constant.MsgCode;
  10. import jnpf.constants.AiConstants;
  11. import jnpf.exception.DataException;
  12. import jnpf.model.ai.AiFormModel;
  13. import jnpf.service.OpenAiService;
  14. import jnpf.util.StringUtil;
  15. import lombok.AllArgsConstructor;
  16. import lombok.extern.slf4j.Slf4j;
  17. import java.util.Arrays;
  18. import java.util.List;
  19. import java.util.stream.Collectors;
  20. /**
  21. * OpenAi 实现类
  22. *
  23. * @author JNPF开发平台组
  24. * @copyright 引迈信息技术有限公司
  25. * @date 2024/10/9 14:39
  26. */
  27. @Slf4j
  28. @AllArgsConstructor
  29. public class DefaultOpenAiServiceImpl implements OpenAiService {
  30. private OpenAiClient openAiClient;
  31. private AiProperties aiProperties;
  32. @Override
  33. public String completion(String prompt) {
  34. Message sendMessage = Message.builder().role(Message.Role.USER).content(prompt).build();
  35. ChatCompletion chatCompletion;
  36. if (StringUtil.isNotEmpty(prompt) && prompt.toLowerCase().contains("jnpf")) {
  37. Message sysMessage = Message.builder().role(Message.Role.SYSTEM).content(AiConstants.CHAT_PRE_QUETION).build();
  38. chatCompletion = getDefaultChatComletion(sysMessage, sendMessage);
  39. } else {
  40. chatCompletion = getDefaultChatComletion(sendMessage);
  41. }
  42. ChatCompletionResponse chatCompletionResponse = openAiClient.chatCompletion(chatCompletion);
  43. return chatCompletionResponse.getChoices().stream().map(chatChoice -> chatChoice.getMessage().getContent()).collect(Collectors.joining());
  44. }
  45. @Override
  46. public String generatorModelStr(String businessName) {
  47. Message sysMessage = Message.builder().role(Message.Role.SYSTEM).content(AiConstants.GEN_MODEL_QUETION).build();
  48. String userTemplate = "当前业务需求是:";
  49. Message sendMessage = Message.builder().role(Message.Role.USER).content(userTemplate + businessName).build();
  50. ChatCompletion chatCompletion = getDefaultChatComletion(sysMessage, sendMessage);
  51. ChatCompletionResponse chatCompletionResponse = openAiClient.chatCompletion(chatCompletion);
  52. return chatCompletionResponse.getChoices().stream().map(chatChoice -> chatChoice.getMessage().getContent()).collect(Collectors.joining());
  53. }
  54. @Override
  55. public List<AiFormModel> generatorModelVO(String prompt) {
  56. String result = "";
  57. List<AiFormModel> aiFormModels;
  58. try {
  59. result = generatorModelStr(prompt);
  60. int startIndex = result.indexOf("[");
  61. int endIndex = result.lastIndexOf("]");
  62. if (startIndex != -1 && endIndex != -1 && startIndex < endIndex) {
  63. result = result.substring(startIndex, endIndex + 1).trim();
  64. }
  65. aiFormModels = JSON.parseObject(result, new TypeReference<List<AiFormModel>>() {
  66. });
  67. } catch (Exception e) {
  68. log.error("AI表单生成转换失败: {}, {}", result, e.getMessage());
  69. throw new DataException(MsgCode.SYS181.get());
  70. }
  71. return aiFormModels;
  72. }
  73. @Override
  74. public String completion(Message... messages) {
  75. ChatCompletion chatCompletion = getDefaultChatComletion(messages);
  76. ChatCompletionResponse chatCompletionResponse = openAiClient.chatCompletion(chatCompletion);
  77. return chatCompletionResponse.getChoices().stream().map(chatChoice -> chatChoice.getMessage().getContent()).collect(Collectors.joining());
  78. }
  79. private ChatCompletion getDefaultChatComletion(Message... messages) {
  80. AiProperties.ChatOption chatOption = aiProperties.getChat();
  81. return ChatCompletion.builder()
  82. .model(chatOption.getMode())
  83. .temperature(chatOption.getTemperature())
  84. .topP(chatOption.getTopP())
  85. .seed(chatOption.getSeed())
  86. .maxTokens(chatOption.getMaxTokens())
  87. .messages(Arrays.asList(messages)).build();
  88. }
  89. }