SpringBoot3.0整合chatGPT

article/2024/12/22 11:28:42

导读

导读 | 12月总体来说互联网的技术圈是非常热闹的,chatGPT爆火,SpringBoot3.0发布等重磅陆消息续进入大家的视线,而本文作者将以技术整合的角度,带大家把最火的两个技术整合在一起。读完本文,你将熟悉SpringBoot3.0自定stater模块的操作流程,并熟悉OpenAi为chatGPT提供的49种场景。

项目项目我已经提交GITEE:https://gitee.com/miukoo/openai-spring 欢迎Star

新建父项目

我们这个项目分为starter和test两个模块,因此需要一个父项目来包裹。

1、快速新建父项目

在这里插入图片描述

2、在pom.xml中引入SpringBoot3.0

  • 项目的父工程设置成SpringBoot3.0
  • 在项目中定义openai的版本并导入(com.theokanning.openai-gpt3-java)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modules><module>openai-spring-boot-starter</module><module>openai-starter-test</module></modules><packaging>pom</packaging><modelVersion>4.0.0</modelVersion><groupId>cn.gjsm</groupId><artifactId>openai-spring</artifactId><version>1.0-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.sourceEncoding>UTF-8</project.reporting.sourceEncoding><openai-version>0.8.1</openai-version></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.0</version></parent><dependencyManagement><dependencies><dependency><groupId>com.theokanning.openai-gpt3-java</groupId><artifactId>client</artifactId><version>${openai-version}</version></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
</project>

3、删除父项目的src文件夹

新建openai-spring-boot-starter模块

openai-spring-boot-starter 模块主要用来封装openai的核心api,该模块就是springboot自定starter的标准5步:

  • 新建模块
  • 在模块中引入相关依赖
  • 定义模块外部属性有那些
  • 实现核心业务逻辑
  • 配置自动装配

1、新增模块

注意模块名称的规范:非官方starter命名规则为 模块名称+'-spring-boot-starter’结尾

在这里插入图片描述

2、在模块中引入相关依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><packaging>pom</packaging><parent><artifactId>openai-spring</artifactId><groupId>cn.gjsm</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>cn.gjsm</groupId><artifactId>openai-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- 自定义starter必须导入的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- 这个包可以用来支持自定义属性的输入提示 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!-- 导入openai依赖,版本在父项目中已经约束 --><dependency><groupId>com.theokanning.openai-gpt3-java</groupId><artifactId>client</artifactId></dependency></dependencies></project>

3、定义模块外部属性有那些

通过@ConfigurationProperties配置一个类,这个类中的属性将从外部的application.yml中读取。在这里OpenAi需要两个属性需要配置,一是token秘钥,一是timeout超时时间。关于timeout可以配置时间长一点,因为OpenAi在国外有些慢。

package cn.gjsm.miukoo.properties;import cn.gjsm.miukoo.utils.OpenAiUtils;
import lombok.Data;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;@Data
@ConfigurationProperties(prefix = "openai")
public class OpenAiProperties implements InitializingBean {// 秘钥String token;// 超时时间Integer timeout;// 设置属性时同时设置给OpenAiUtils@Overridepublic void afterPropertiesSet() throws Exception {OpenAiUtils.OPENAPI_TOKEN = token;OpenAiUtils.TIMEOUT = timeout;}
}

4、实现核心业务逻辑

核心业务逻辑指的就是你自定义这个starter可以提供给其它模块那些api使用;在这里我们直接通过一个静态类工具OpenAiUtils,这样在引入该模块后,其它模块直接可调用该静态工具类,使用便捷一些。

同时在这个类中提供openai官方49种场景想对应的方法。

package cn.gjsm.miukoo.utils;import cn.gjsm.miukoo.pojos.OpenAi;
import com.theokanning.openai.OpenAiService;
import com.theokanning.openai.completion.CompletionChoice;
import com.theokanning.openai.completion.CompletionRequest;
import org.springframework.util.StringUtils;import java.util.*;/*** 调用OpenAi的49中方法*/
public class OpenAiUtils {public static final Map<String, OpenAi> PARMS = new HashMap<>();static {PARMS.put("OpenAi01", new OpenAi("OpenAi01", "问&答", "依据现有知识库问&答", "text-davinci-003", "Q: %s\nA:", 0.0, 1.0, 1.0, 0.0, 0.0, "\n"));PARMS.put("OpenAi02", new OpenAi("OpenAi02", "语法纠正", "将句子转换成标准的英语,输出结果始终是英文", "text-davinci-003", "%s", 0.0, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi03", new OpenAi("OpenAi03", "内容概况", "将一段话,概况中心", "text-davinci-003", "Summarize this for a second-grade student:\n%s", 0.7, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi04", new OpenAi("OpenAi04", "生成OpenAi的代码", "一句话生成OpenAi的代码", "code-davinci-002", "\"\"\"\nUtil exposes the following:\nutil.openai() -> authenticates & returns the openai module, which has the following functions:\nopenai.Completion.create(\n    prompt=\"<my prompt>\", # The prompt to start completing from\n    max_tokens=123, # The max number of tokens to generate\n    temperature=1.0 # A measure of randomness\n    echo=True, # Whether to return the prompt in addition to the generated completion\n)\n\"\"\"\nimport util\n\"\"\"\n%s\n\"\"\"\n\n", 0.0, 1.0, 1.0, 0.0, 0.0, "\"\"\""));PARMS.put("OpenAi05", new OpenAi("OpenAi05", "程序命令生成", "一句话生成程序的命令,目前支持操作系统指令比较多", "text-davinci-003", "Convert this text to a programmatic command:\n\nExample: Ask Constance if we need some bread\nOutput: send-msg `find constance` Do we need some bread?\n\n%s", 0.0, 1.0, 1.0, 0.2, 0.0, ""));PARMS.put("OpenAi06", new OpenAi("OpenAi06", "语言翻译", "把一种语法翻译成其它几种语言", "text-davinci-003", "Translate this into %s:\n%s", 0.3, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi07", new OpenAi("OpenAi07", "Stripe国际API生成", "一句话生成Stripe国际支付API", "code-davinci-002", "\"\"\"\nUtil exposes the following:\n\nutil.stripe() -> authenticates & returns the stripe module; usable as stripe.Charge.create etc\n\"\"\"\nimport util\n\"\"\"\n%s\n\"\"\"", 0.0, 1.0, 1.0, 0.0, 0.0, "\"\"\""));PARMS.put("OpenAi08", new OpenAi("OpenAi08", "SQL语句生成", "依据上下文中的表信息,生成SQL语句", "code-davinci-002", "### %s SQL tables, 表字段信息如下:\n%s\n#\n### %s\n %s", 0.0, 1.0, 1.0, 0.0, 0.0, "# ;"));PARMS.put("OpenAi09", new OpenAi("OpenAi09", "结构化生成", "对于非结构化的数据抽取其中的特征生成结构化的表格", "text-davinci-003", "A table summarizing, use Chinese:\n%s\n", 0.0, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi10", new OpenAi("OpenAi10", "信息分类", "把一段信息继续分类", "text-davinci-003", "%s\n分类:", 0.0, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi11", new OpenAi("OpenAi11", "Python代码解释", "把代码翻译成文字,用来解释程序的作用", "code-davinci-002", "# %s \n %s \n\n# 解释代码作用\n\n#", 0.0, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi12", new OpenAi("OpenAi12", "文字转表情符号", "将文本编码成表情服务", "text-davinci-003", "转换文字为表情。\n%s:", 0.8, 1.0, 1.0, 0.0, 0.0, "\n"));PARMS.put("OpenAi13", new OpenAi("OpenAi13", "时间复杂度计算", "求一段代码的时间复杂度", "text-davinci-003", "%s\n\"\"\"\n函数的时间复杂度是", 0.0, 1.0, 1.0, 0.0, 0.0, "\n"));PARMS.put("OpenAi14", new OpenAi("OpenAi14", "程序代码翻译", "把一种语言的代码翻译成另外一种语言的代码", "code-davinci-002", "##### 把这段代码从%s翻译成%s\n### %s\n    \n   %s\n    \n### %s", 0.0, 1.0, 1.0, 0.0, 0.0, "###"));PARMS.put("OpenAi15", new OpenAi("OpenAi15", "高级情绪评分", "支持批量列表的方式检查情绪", "text-davinci-003", "对下面内容进行情感分类:\n%s\"\n情绪评级:", 0.0, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi16", new OpenAi("OpenAi16", "代码解释", "对一段代码进行解释", "code-davinci-002", "代码:\n%s\n\"\"\"\n上面的代码在做什么:\n1. ", 0.0, 1.0, 1.0, 0.0, 0.0, "\"\"\""));PARMS.put("OpenAi17", new OpenAi("OpenAi17", "关键字提取", "提取一段文本中的关键字", "text-davinci-003", "抽取下面内容的关键字:\n%s", 0.5, 1.0, 1.0, 0.8, 0.0, ""));PARMS.put("OpenAi18", new OpenAi("OpenAi18", "问题解答", "类似解答题", "text-davinci-003", "Q: %s\nA: ?", 0.0, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi19", new OpenAi("OpenAi19", "广告设计", "给一个产品设计一个广告", "text-davinci-003", "为下面的产品创作一个创业广告,用于投放到抖音上:\n产品:%s.", 0.5, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi20", new OpenAi("OpenAi20", "产品取名", "依据产品描述和种子词语,给一个产品取一个好听的名字", "text-davinci-003", "产品描述: %s.\n种子词: %s.\n产品名称: ", 0.8, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi21", new OpenAi("OpenAi21", "句子简化", "把一个长句子简化成一个短句子", "text-davinci-003", "%s\nTl;dr: ", 0.7, 1.0, 1.0, 0.0, 1.0, ""));PARMS.put("OpenAi22", new OpenAi("OpenAi22", "修复代码Bug", "自动修改代码中的bug", "code-davinci-002", "##### 修复下面代码的bug\n### %s\n %s\n###  %s\n", 0.0, 1.0, 1.0, 0.0, 0.0, "###"));PARMS.put("OpenAi23", new OpenAi("OpenAi23", "表格填充数据", "自动为一个表格生成数据", "text-davinci-003", "spreadsheet ,%s rows:\n%s\n", 0.5, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi24", new OpenAi("OpenAi24", "语言聊天机器人", "各种开发语言的两天机器人", "code-davinci-002", "You: %s\n%s机器人:", 0.0, 1.0, 1.0, 0.5, 0.0, "You: "));PARMS.put("OpenAi25", new OpenAi("OpenAi25", "机器学习机器人", "机器学习模型方面的机器人", "text-davinci-003", "You: %s\nML机器人:", 0.3, 1.0, 1.0, 0.5, 0.0, "You: "));PARMS.put("OpenAi26", new OpenAi("OpenAi26", "清单制作", "可以列出各方面的分类列表,比如歌单", "text-davinci-003", "列出10%s:", 0.5, 1.0, 1.0, 0.52, 0.5, "11.0"));PARMS.put("OpenAi27", new OpenAi("OpenAi27", "文本情绪分析", "对一段文字进行情绪分析", "text-davinci-003", "推断下面文本的情绪是积极的, 中立的, 还是消极的.\n文本: \"%s\"\n观点:", 0.0, 1.0, 1.0, 0.5, 0.0, ""));PARMS.put("OpenAi28", new OpenAi("OpenAi28", "航空代码抽取", "抽取文本中的航空diam信息", "text-davinci-003", "抽取下面文本中的航空代码:\n文本:\"%s\"\n航空代码:", 0.0, 1.0, 1.0, 0.0, 0.0, "\n"));PARMS.put("OpenAi29", new OpenAi("OpenAi29", "生成SQL语句", "无上下文,语句描述生成SQL", "text-davinci-003", "%s", 0.3, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi30", new OpenAi("OpenAi30", "抽取联系信息", "从文本中抽取联系方式", "text-davinci-003", "从下面文本中抽取%s:\n%s", 0.0, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi31", new OpenAi("OpenAi31", "程序语言转换", "把一种语言转成另外一种语言", "code-davinci-002", "#%s to %s:\n%s:%s\n\n%s:", 0.0, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi32", new OpenAi("OpenAi32", "好友聊天", "模仿好友聊天", "text-davinci-003", "You: %s\n好友:", 0.5, 1.0, 1.0, 0.5, 0.0, "You:"));PARMS.put("OpenAi33", new OpenAi("OpenAi33", "颜色生成", "依据描述生成对应颜色", "text-davinci-003", "%s:\nbackground-color: ", 0.0, 1.0, 1.0, 0.0, 0.0, ";"));PARMS.put("OpenAi34", new OpenAi("OpenAi34", "程序文档生成", "自动为程序生成文档", "code-davinci-002", "# %s\n \n%s\n# 上述代码的详细、高质量文档字符串:\n\"\"\"", 0.0, 1.0, 1.0, 0.0, 0.0, "#\"\"\""));PARMS.put("OpenAi35", new OpenAi("OpenAi35", "段落创作", "依据短语生成相关文短", "text-davinci-003", "为下面短语创建一个中文段:\n%s:\n", 0.5, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi36", new OpenAi("OpenAi36", "代码压缩", "把多行代码简单的压缩成一行", "code-davinci-002", "将下面%s代码转成一行:\n%s\n%s一行版本:", 0.0, 1.0, 1.0, 0.0, 0.0, ";"));PARMS.put("OpenAi37", new OpenAi("OpenAi37", "故事创作", "依据一个主题创建一个故事", "text-davinci-003", "主题: %s\n故事创作:", 0.8, 1.0, 1.0, 0.5, 0.0, ""));PARMS.put("OpenAi38", new OpenAi("OpenAi38", "人称转换", "第一人称转第3人称", "text-davinci-003", "把下面内容从第一人称转为第三人称 (性别女):\n%s\n", 0.0, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi39", new OpenAi("OpenAi39", "摘要说明", "依据笔记生成摘要说明", "text-davinci-003", "将下面内容转换成将下%s摘要:\n%s", 0.0, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi40", new OpenAi("OpenAi40", "头脑风暴", "给定一个主题,让其生成一些主题相关的想法", "text-davinci-003", "头脑风暴一些关于%s的想法:", 0.6, 1.0, 1.0, 1.0, 1.0, ""));PARMS.put("OpenAi41", new OpenAi("OpenAi41", "ESRB文本分类", "按照ESRB进行文本分类", "text-davinci-003", "Provide an ESRB rating for the following text:\\n\\n\\\"%s\"\\n\\nESRB rating:", 0.3, 1.0, 1.0, 0.0, 0.0, "\n"));PARMS.put("OpenAi42", new OpenAi("OpenAi42", "提纲生成", "按照提示为相关内容生成提纲", "text-davinci-003", "为%s提纲:", 0.3, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi43", new OpenAi("OpenAi43", "美食制作(后果自负)", "依据美食名称和材料生成美食的制作步骤", "text-davinci-003", "依据下面成分和美食,生成制作方法:\n%s\n成分:\n%s\n制作方法:", 0.3, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi44", new OpenAi("OpenAi44", "AI聊天", "与AI机器进行聊天", "text-davinci-003", "Human: %s", 0.9, 1.0, 1.0, 0.0, 0.6, "Human:AI:"));PARMS.put("OpenAi45", new OpenAi("OpenAi45", "摆烂聊天", "与讽刺机器进行聊天", "text-davinci-003", "Marv不情愿的回答问题.\nYou:%s\nMarv:", 0.5, 0.3, 1.0, 0.5, 0.0, ""));PARMS.put("OpenAi46", new OpenAi("OpenAi46", "分解步骤", "把一段文本分解成几步来完成", "text-davinci-003", "为下面文本生成次序列表,并增加列表数子: \n%s\n", 0.3, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi47", new OpenAi("OpenAi47", "点评生成", "依据文本内容自动生成点评", "text-davinci-003", "依据下面内容,进行点评:\n%s\n点评:", 0.5, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi48", new OpenAi("OpenAi48", "知识学习", "可以为学习知识自动解答", "text-davinci-003", "%s", 0.3, 1.0, 1.0, 0.0, 0.0, ""));PARMS.put("OpenAi49", new OpenAi("OpenAi49", "面试", "生成面试题", "text-davinci-003", "创建10道%s相关的面试题(中文):\n", 0.5, 1.0, 10.0, 0.0, 0.0, ""));}public static String OPENAPI_TOKEN = "";public static Integer TIMEOUT = null;/*** 获取ai** @param openAi* @param prompt* @return*/public static List<CompletionChoice> getAiResult(OpenAi openAi, String prompt) {if (TIMEOUT == null || TIMEOUT < 1000) {TIMEOUT = 3000;}OpenAiService service = new OpenAiService(OPENAPI_TOKEN, TIMEOUT);CompletionRequest.CompletionRequestBuilder builder = CompletionRequest.builder().model(openAi.getModel()).prompt(prompt).temperature(openAi.getTemperature()).maxTokens(1000).topP(openAi.getTopP()).frequencyPenalty(openAi.getFrequencyPenalty()).presencePenalty(openAi.getPresencePenalty());if (!StringUtils.isEmpty(openAi.getStop())) {builder.stop(Arrays.asList(openAi.getStop().split(",")));}CompletionRequest completionRequest = builder.build();return service.createCompletion(completionRequest).getChoices();}/*** 问答** @param question* @return*/public static List<CompletionChoice> getQuestionAnswer(String question) {OpenAi openAi = PARMS.get("OpenAi01");return getAiResult(openAi, String.format(openAi.getPrompt(), question));}/*** 语法纠错** @param text* @return*/public static List<CompletionChoice> getGrammarCorrection(String text) {OpenAi openAi = PARMS.get("OpenAi02");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 将一段话,概况中心** @param text* @return*/public static List<CompletionChoice> getSummarize(String text) {OpenAi openAi = PARMS.get("OpenAi03");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 一句话生成OpenAi的代码** @param text* @return*/public static List<CompletionChoice> getOpenAiApi(String text) {OpenAi openAi = PARMS.get("OpenAi04");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 一句话生成程序的命令,目前支持操作系统指令比较多** @param text* @return*/public static List<CompletionChoice> getTextToCommand(String text) {OpenAi openAi = PARMS.get("OpenAi05");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 把一种语法翻译成其它几种语言** @param text* @return*/public static List<CompletionChoice> getTranslatesLanguages(String text, String translatesLanguages) {if (StringUtils.isEmpty(translatesLanguages)) {translatesLanguages = "  1. French, 2. Spanish and 3. English";}OpenAi openAi = PARMS.get("OpenAi06");return getAiResult(openAi, String.format(openAi.getPrompt(), translatesLanguages, text));}/*** 一句话生成Stripe国际支付API** @param text* @return*/public static List<CompletionChoice> getStripeApi(String text) {OpenAi openAi = PARMS.get("OpenAi07");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 依据上下文中的表信息,生成SQL语句** @param databaseType 数据库类型* @param tables       上午依赖的表和字段 Employee(id, name, department_id)* @param text         SQL描述* @param sqlType      sql类型,比如SELECT* @return*/public static List<CompletionChoice> getStripeApi(String databaseType, List<String> tables, String text, String sqlType) {OpenAi openAi = PARMS.get("OpenAi08");StringJoiner joiner = new StringJoiner("\n");for (int i = 0; i < tables.size(); i++) {joiner.add("# " + tables);}return getAiResult(openAi, String.format(openAi.getPrompt(), databaseType, joiner.toString(), text, sqlType));}/*** 对于非结构化的数据抽取其中的特征生成结构化的表格** @param text 非结构化的数据* @return*/public static List<CompletionChoice> getUnstructuredData(String text) {OpenAi openAi = PARMS.get("OpenAi09");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 把一段信息继续分类** @param text 要分类的文本* @return*/public static List<CompletionChoice> getTextCategory(String text) {OpenAi openAi = PARMS.get("OpenAi10");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 把一段信息继续分类** @param codeType 代码类型,比如Python* @param code     要解释的代码* @return*/public static List<CompletionChoice> getCodeExplain(String codeType, String code) {OpenAi openAi = PARMS.get("OpenAi11");return getAiResult(openAi, String.format(openAi.getPrompt(), codeType, code));}/*** 将文本编码成表情服务** @param text 文本* @return*/public static List<CompletionChoice> getTextEmoji(String text) {OpenAi openAi = PARMS.get("OpenAi12");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 求一段代码的时间复杂度** @param code 代码* @return*/public static List<CompletionChoice> getTimeComplexity(String code) {OpenAi openAi = PARMS.get("OpenAi13");return getAiResult(openAi, String.format(openAi.getPrompt(), code));}/*** 把一种语言的代码翻译成另外一种语言的代码** @param fromLanguage 要翻译的代码语言* @param toLanguage   要翻译成的代码语言* @param code         代码* @return*/public static List<CompletionChoice> getTranslateProgramming(String fromLanguage, String toLanguage, String code) {OpenAi openAi = PARMS.get("OpenAi14");return getAiResult(openAi, String.format(openAi.getPrompt(), fromLanguage, toLanguage, fromLanguage, code, toLanguage));}/*** 支持批量列表的方式检查情绪** @param texts 文本* @return*/public static List<CompletionChoice> getBatchTweetClassifier(List<String> texts) {OpenAi openAi = PARMS.get("OpenAi15");StringJoiner stringJoiner = new StringJoiner("\n");for (int i = 0; i < texts.size(); i++) {stringJoiner.add((i + 1) + ". " + texts.get(i));}return getAiResult(openAi, String.format(openAi.getPrompt(), stringJoiner.toString()));}/*** 对一段代码进行解释** @param code 文本* @return*/public static List<CompletionChoice> getExplainCOde(String code) {OpenAi openAi = PARMS.get("OpenAi16");return getAiResult(openAi, String.format(openAi.getPrompt(), code));}/*** 提取一段文本中的关键字** @param text 文本* @return*/public static List<CompletionChoice> getTextKeywords(String text) {OpenAi openAi = PARMS.get("OpenAi17");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 事实回答答题** @param text 文本* @return*/public static List<CompletionChoice> getFactualAnswering(String text) {OpenAi openAi = PARMS.get("OpenAi18");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 给一个产品设计一个广告** @param text 文本* @return*/public static List<CompletionChoice> getAd(String text) {OpenAi openAi = PARMS.get("OpenAi19");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 依据产品描述和种子词语,给一个产品取一个好听的名字** @param productDescription 产品描述* @param seedWords          种子词语* @return*/public static List<CompletionChoice> getProductName(String productDescription, String seedWords) {OpenAi openAi = PARMS.get("OpenAi20");return getAiResult(openAi, String.format(openAi.getPrompt(), productDescription, seedWords));}/*** 把一个长句子简化成一个短句子** @param text 长句子* @return*/public static List<CompletionChoice> getProductName(String text) {OpenAi openAi = PARMS.get("OpenAi21");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 自动修改代码中的bug** @param codeType 语言类型* @param code     代码* @return*/public static List<CompletionChoice> getBugFixer(String codeType, String code) {OpenAi openAi = PARMS.get("OpenAi22");return getAiResult(openAi, String.format(openAi.getPrompt(), codeType, code, codeType));}/*** 自动为一个表格生成数据** @param rows    生成的行数* @param headers 数据表头,格式如:姓名| 年龄|性别|生日* @return*/public static List<CompletionChoice> getFillData(int rows, String headers) {OpenAi openAi = PARMS.get("OpenAi23");return getAiResult(openAi, String.format(openAi.getPrompt(), rows, headers));}/*** 各种开发语言的两天机器人** @param question             你的问题* @param programmingLanguages 语言 比如Java JavaScript* @return*/public static List<CompletionChoice> getProgrammingLanguageChatbot(String question, String programmingLanguages) {OpenAi openAi = PARMS.get("OpenAi24");return getAiResult(openAi, String.format(openAi.getPrompt(), question, programmingLanguages));}/*** 机器学习模型方面的机器人** @param question 你的问题* @return*/public static List<CompletionChoice> getMLChatbot(String question) {OpenAi openAi = PARMS.get("OpenAi25");return getAiResult(openAi, String.format(openAi.getPrompt(), question));}/*** 可以列出各方面的分类列表,比如歌单** @param text 清单描述* @return*/public static List<CompletionChoice> getListMaker(String text) {OpenAi openAi = PARMS.get("OpenAi26");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 对一段文字进行情绪分析** @param text* @return*/public static List<CompletionChoice> getTweetClassifier(String text) {OpenAi openAi = PARMS.get("OpenAi27");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 抽取文本中的航空代码信息** @param text* @return*/public static List<CompletionChoice> getAirportCodeExtractor(String text) {OpenAi openAi = PARMS.get("OpenAi28");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 无上下文,语句描述生成SQL** @param text* @return*/public static List<CompletionChoice> getSQL(String text) {OpenAi openAi = PARMS.get("OpenAi29");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 从文本中抽取联系方式** @param extractContent 抽取内容描述* @param text* @return 从下面文本中抽取邮箱和电话:\n教育行业A股IPO第一股(股票代码 003032)\n全国咨询/投诉热线:400-618-4000    举报邮箱:mc@itcast.cn*/public static List<CompletionChoice> getExtractContactInformation(String extractContent, String text) {OpenAi openAi = PARMS.get("OpenAi30");return getAiResult(openAi, String.format(openAi.getPrompt(), extractContent, text));}/*** 把一种语言转成另外一种语言代码** @param fromCodeType 当前代码类型* @param toCodeType   转换的代码类型* @param code* @return*/public static List<CompletionChoice> getTransformationCode(String fromCodeType, String toCodeType, String code) {OpenAi openAi = PARMS.get("OpenAi31");return getAiResult(openAi, String.format(openAi.getPrompt(), fromCodeType, toCodeType, fromCodeType, code, toCodeType));}/*** 模仿好友聊天** @param question* @return*/public static List<CompletionChoice> getFriendChat(String question) {OpenAi openAi = PARMS.get("OpenAi32");return getAiResult(openAi, String.format(openAi.getPrompt(), question));}/*** 依据描述生成对应颜色** @param text* @return*/public static List<CompletionChoice> getMoodToColor(String text) {OpenAi openAi = PARMS.get("OpenAi33");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 自动为程序生成文档** @param codeType 语言* @param code* @return*/public static List<CompletionChoice> getCodeDocument(String codeType, String code) {OpenAi openAi = PARMS.get("OpenAi34");return getAiResult(openAi, String.format(openAi.getPrompt(), codeType, code));}/*** 依据短语生成相关文短** @param text 短语* @return*/public static List<CompletionChoice> getCreateAnalogies(String text) {OpenAi openAi = PARMS.get("OpenAi35");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 把多行代码简单的压缩成一行** @param codeType 语言* @param code* @return*/public static List<CompletionChoice> getCodeLine(String codeType, String code) {OpenAi openAi = PARMS.get("OpenAi36");return getAiResult(openAi, String.format(openAi.getPrompt(), codeType, code, codeType));}/*** 依据一个主题创建一个故事** @param topic 创作主题* @return*/public static List<CompletionChoice> getStory(String topic) {OpenAi openAi = PARMS.get("OpenAi37");return getAiResult(openAi, String.format(openAi.getPrompt(), topic));}/*** 第一人称转第3人称** @param text* @return*/public static List<CompletionChoice> getStoryCreator(String text) {OpenAi openAi = PARMS.get("OpenAi38");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 依据笔记生成摘要说明** @param scene 生成的摘要场景* @param note  记录的笔记* @return*/public static List<CompletionChoice> getNotesToSummary(String scene, String note) {OpenAi openAi = PARMS.get("OpenAi39");return getAiResult(openAi, String.format(openAi.getPrompt(), note));}/*** 给定一个主题,让其生成一些主题相关的想法** @param topic 头脑风暴关键词* @return*/public static List<CompletionChoice> getIdeaGenerator(String topic) {OpenAi openAi = PARMS.get("OpenAi40");return getAiResult(openAi, String.format(openAi.getPrompt(), topic));}/*** 按照ESRB进行文本分类** @param text 文本* @return*/public static List<CompletionChoice> getESRBRating(String text) {OpenAi openAi = PARMS.get("OpenAi41");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 按照提示为相关内容生成提纲** @param text 场景,比如 数据库软件生成大学毕业论文* @return*/public static List<CompletionChoice> getEssayOutline(String text) {OpenAi openAi = PARMS.get("OpenAi42");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 依据美食名称和材料生成美食的制作步骤** @param name        美食名称* @param ingredients 美食食材* @return*/public static List<CompletionChoice> getRecipeCreator(String name, List<String> ingredients) {OpenAi openAi = PARMS.get("OpenAi43");StringJoiner joiner = new StringJoiner("\n");for (String ingredient : ingredients) {joiner.add(ingredient);}return getAiResult(openAi, String.format(openAi.getPrompt(), name, joiner.toString()));}/*** 与AI机器进行聊天** @param question* @return*/public static List<CompletionChoice> getAiChatbot(String question) {OpenAi openAi = PARMS.get("OpenAi44");return getAiResult(openAi, String.format(openAi.getPrompt(), question));}/*** 与讽刺机器进行聊天,聊天的机器人是一种消极情绪** @param question* @return*/public static List<CompletionChoice> getMarvChatbot(String question) {OpenAi openAi = PARMS.get("OpenAi45");return getAiResult(openAi, String.format(openAi.getPrompt(), question));}/*** 把一段文本分解成几步来完成** @param text* @return*/public static List<CompletionChoice> getTurnDirection(String text) {OpenAi openAi = PARMS.get("OpenAi46");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 依据文本内容自动生成点评** @param text* @return*/public static List<CompletionChoice> getReviewCreator(String text) {OpenAi openAi = PARMS.get("OpenAi47");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 可以为学习知识自动解答** @param text* @return*/public static List<CompletionChoice> getStudyNote(String text) {OpenAi openAi = PARMS.get("OpenAi48");return getAiResult(openAi, String.format(openAi.getPrompt(), text));}/*** 生成面试题** @param text* @return*/public static List<CompletionChoice> getInterviewQuestion(String text) {OpenAi openAi = PARMS.get("OpenAi49");System.out.println(String.format(openAi.getPrompt(), text));return getAiResult(openAi, String.format(openAi.getPrompt(), text));}}

5、配置自动装配

这一步是非常关键的,你的项目能在其他模块启动的时候就能够用,就必须配置这一步,而这一步有两小步:

  • 编写自动装配类
  • 配置自动装配类

编写自动装配类,参考代码:

package cn.gjsm.miukoo.config;import cn.gjsm.miukoo.properties.OpenAiProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;/*** 自动配置类*/
@Configuration
@EnableConfigurationProperties(OpenAiProperties.class)
public class OpenAiAutoConfiguration {
}

配置自动装配类:

在resources文件夹下的META-INF/spring.factories文件中配置:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.gjsm.miukoo.config.OpenAiAutoConfiguration

新建openai-starter-test模块

经过上述五部我们就完成了chatGPT的stater的封装,接下来我们创建一个模块来测试。

新增模块

测试模块的名称最好是以test结尾

在这里插入图片描述

导入依赖

在测试模块中直接可以导入我们封装好的openai-spring-boot-starter,当然还有测试spring-boot-starter-test依赖。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>openai-spring-boot-starter</artifactId><groupId>cn.gjsm</groupId><version>1.0-SNAPSHOT</version><relativePath>../openai-spring-boot-starter/pom.xml</relativePath></parent><modelVersion>4.0.0</modelVersion><groupId>cn.gjsm</groupId><artifactId>openai-starter-test</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>cn.gjsm</groupId><artifactId>openai-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

创建启动类

我们计划使用SpringBoot去测试,因此需要创建一个启动类

package cn.gjsm.miukoo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class OpenAiApplication {public static void main(String[] args) {SpringApplication.run(OpenAiApplication.class, args);}
}

配置属性

在测试模块的application.yml中,我们需要配置,我们在openai-spring-boot-starter中定义的两个属性

server:port: 8080openai:token: 你的tokentimeout: 5000

编写测试类

我们在测试包下,新建一个测试类,即可直接调用我们在stater中封装的OpenAiUtils工具类,通过其来完成chatGPT功能调用。

package cn.gjsm.miukoo;import cn.gjsm.miukoo.utils.OpenAiUtils;
import com.theokanning.openai.completion.CompletionChoice;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
public class OpenAiTest {/*** 测试问答*/@Testpublic void testQA(){List<CompletionChoice> questionAnswer = OpenAiUtils.getQuestionAnswer("重庆今天的天气怎么样?");for (CompletionChoice completionChoice : questionAnswer) {System.out.println(completionChoice.getText());}}/*** 测试面试题生成*/@Testpublic void testInterview(){List<CompletionChoice> results = OpenAiUtils.getInterviewQuestion("redis");for (CompletionChoice completionChoice : results) {System.out.println(completionChoice.getText());}}}

tater中封装的OpenAiUtils工具类,通过其来完成chatGPT功能调用。

package cn.gjsm.miukoo;import cn.gjsm.miukoo.utils.OpenAiUtils;
import com.theokanning.openai.completion.CompletionChoice;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
public class OpenAiTest {/*** 测试问答*/@Testpublic void testQA(){List<CompletionChoice> questionAnswer = OpenAiUtils.getQuestionAnswer("重庆今天的天气怎么样?");for (CompletionChoice completionChoice : questionAnswer) {System.out.println(completionChoice.getText());}}/*** 测试面试题生成*/@Testpublic void testInterview(){List<CompletionChoice> results = OpenAiUtils.getInterviewQuestion("redis");for (CompletionChoice completionChoice : results) {System.out.println(completionChoice.getText());}}}

运行报错

如果你运行代码,出现下面错误,不应紧张,那是英文springboot3.0需要jdk17的版本

在这里插入图片描述

选中父项目右键打开项目配置创建,修改JDK为17版本即可,重新运行即可正常。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/VpurxJXq.shtml

相关文章

【生活工作经验 十】ChatGPT模型对话初探

最近探索了下全球大火的ChatGPT&#xff0c;想对此做个初步了解 一篇博客 当今社会&#xff0c;自然语言处理技术得到了迅速的发展&#xff0c;人工智能技术也越来越受到关注。其中&#xff0c;基于深度学习的大型语言模型&#xff0c;如GPT&#xff08;Generative Pre-train…

【尝鲜版】ChatGPT插件开发指南

3月23日&#xff0c;OpenAI官方发布了一则公告&#xff0c;宣告ChatGPT已经支持了插件功能&#xff0c;现在处于内测阶段。插件的意义不仅仅在于功能的扩展&#xff0c;它直接让ChatGTP拥有了联网的能力&#xff01;简直是猛兽出笼、蛟龙出海&#xff0c;要让ChatGPT大杀特杀啊…

chatgpt赋能python:Python编写股票软件-从入门到实战

Python编写股票软件-从入门到实战 股票是金融市场中重要的交易品种&#xff0c;每个交易者都希望通过各种工具和分析方法更好地掌握股价动态、分析趋势并做出交易决策。Python作为一种强大的开发语言&#xff0c;具有简单易学、高效、稳定的特点&#xff0c;并且在数据分析和科…

ChatGPT为什么可以取代那么多职位?

最近的ChatGPT段子满天飞&#xff0c;以至于&#xff0c;不聊ChatGPT咱都不好意思在社交媒体上发言了。 这种力度的出圈&#xff0c;各种长期离线好友&#xff0c;甚至我妈都来问我&#xff0c;这是啥玩意啊&#xff1f; “十年老友&#xff0c;不请自来”&#xff1f;这架势&…

ChatGPT Plus 插件最全解读

前言&#xff1a; OpenAI放出大招&#xff0c;向所有ChatGPT Plus用户开放联网功能和众多插件&#xff0c;允许ChatGPT访问互联网并使用70个第三方插件。 本批第三方插件能够全方位覆盖衣食住行、社交、工作以及学习等日常所需&#xff0c;基本上能够扮演24小时私人助理的角色…

突发!谷歌版“ChatGPT”开放测试,直面硬刚微软Bing

谷歌在 2 月份发布了其 Bard 对话式 AI 后&#xff0c;一直在努力改进聊天机器人的回答&#xff0c;因为它在 Twitter 上首次亮相时就传播了错误信息。最近该公司将生成式 AI 功能添加到几乎所有服务中&#xff0c;而对 Bard 聊天机器人的访问仍然是少数人的专属。 3月21日深夜…

聚观早报 |微软正式将ChatGPT引入必应;百度将于3月上线ChatGPT

今日要闻&#xff1a;微软正式将ChatGPT引入必应&#xff1b;抖音否认3月全国上线外卖服务&#xff1b;百度将于3月上线ChatGPT产品&#xff1b;印尼跃升成全球第二大钴生产国&#xff1b;特斯拉在德国喜获“开年红” 微软正式将ChatGPT引入必应 2 月 8 日&#xff0c;据 CNE…

不写代码就能开发应用,微软借助 ChatGPT,正在打造一个全新的商业软件帝国!...

整理 | 苏宓 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; “再也不能愉快地‘摸鱼’了&#xff0c;因为继续下去&#xff0c;无论是销售&#xff0c;还是程序员&#xff0c;周报、月报里的内容和目标达成率可能都是 ChatGPT 干的&#xff0c;不过这也似乎让大家…

微软开源“傻瓜式”类ChatGPT模型训练工具,成本大大降低,速度提升15倍

当地时间 4 月 12 日&#xff0c;微软宣布开源 DeepSpeed-Chat&#xff0c;帮助用户轻松训练类 ChatGPT 等大语言模型。 据悉&#xff0c;Deep Speed Chat 是基于微软 Deep Speed 深度学习优化库开发而成&#xff0c;具备训练、强化推理等功能&#xff0c;还使用了 RLHF&#x…

颠覆历史!ChatGPT官方app正式登录美国苹果商店

人工智能研究公司OpenAI在官网宣布&#xff0c;其在美国推出了聊天机器人ChatGPT的iPhone应用&#xff0c;并承诺未来也将为安卓手机提供相同的服务。 官网还附带了该应用在苹果App Store上的链接。页面显示&#xff0c;这款名为“OpenAI ChatGPT”的应用仅适用于苹果手机iPhon…

苹果微软等科技巨头紧急叫停,chatgpt翻车了?(文末附联名信)

一、千名大佬集体叫停GPT研发 3月29日&#xff0c;一封联名信刷爆了各大媒体热榜&#xff0c;上面有一千多位大佬签名&#xff0c;其中包括埃隆马斯克、约书亚本吉奥&#xff08;Yoshua Bengio&#xff0c;2018年图灵奖获得者&#xff09;和史蒂夫沃兹尼亚克&#xff08;Steve…

前苹果工程师吐槽:“Siri” 代码过时且复杂,不可能变得像 ChatGPT 一样强大...

【CSDN 编者按】在将生成式人工智能引入 Siri 上&#xff0c;苹果的前工程师约翰伯基并不看好&#xff0c;他认为 Siri 不可能像 ChatGPT 一样强大。 原文链接&#xff1a;How Siri, Alexa and Google Assistant Lost the AI Race - The New York Times (nytimes.com) 未经授权…

苹果限制员工使用ChatGPT等外部AI工具,只因担心泄密!

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 众所周知&#xff0c;今天 OpenAI 官方推出了 iOS 平台的 ChatGPT 应用程序。 然而&#xff0c;在路透社和华尔街日报的报道中&#xff0c;却提及了另外一则与之相关消息——苹果已经通…

微软支持的ChatGPT激增,但不要低估苹果和谷歌

微软和 OpenAI 可能在 AI 聊天机器人爆炸式增长的市场中具有先发优势&#xff0c;但不要排除其他一些可以访问大量 AI 训练数据的科技巨头&#xff0c;例如 Apple 和 Google。 通过其对 ChatGPT 开发商 OpenAI 的早期和持续支持&#xff0c;微软在AI 军备竞赛中目前处于领先地…

来自 ChatGPT 的威胁?谷歌、百度纷纷入局,苹果被迫“开卷”

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 近年来&#xff0c;AIGC 应用可谓是多处开花&#xff0c;成为了科技巨头的“必争之地”。 随着 ChatGPT 在互联网上“高热不下”&#xff0c;除了拍案叫绝的聊天能力以及惊人的准确率备…

“我把 ChatGPT 和苹果的 Siri 组了个队,发现无敌了!”

【CSDN 编者按】ChatGPT 的问世&#xff0c;带来了前所未有的智能应用新方式。如果“AIAI”&#xff0c;会碰撞出什么样的火花&#xff1f;近日&#xff0c;国外一名 Web 高级工程师 Mate Marschalko 将 ChatGPT 和 Siri 人工智能语言助手进行了结合&#xff0c;万万没想到&…

ChatGPT正式登陆iOS平台

6天前&#xff0c;ChatGPT在美区App Store中上架了官方App&#xff0c;累计下载量已经突破 50 万次&#xff0c;OpenAI 的 ChatGPT 应用在上架之后&#xff0c;其热度远超必应聊天等聊天机器人&#xff0c;以及其它使用 GPT-4 的第三方应用。 3.5是免费的&#xff0c;GPT4是收…

聚观早报 | 苹果2024年放弃高通;腾讯回应进军类 ChatGPT

今日要闻&#xff1a;苹果2024年放弃高通&#xff1b;腾讯回应进军类 ChatGPT&#xff1b;小米发布无线AR眼镜探索版&#xff1b;50%的美国企业已在使用ChatGPT&#xff1b;Snap推出ChatGPT驱动的聊天机器人 苹果2024年放弃高通 高通公司 CEO 兼总裁克里斯蒂亚诺・安蒙&#…

聚观早报 | ChatGPT登顶美区iOS免费榜;库克不满苹果首款MR设备

今日要闻&#xff1a;ChatGPT登顶美区iOS免费榜&#xff1b;库克不满苹果首款MR设备&#xff1b;索尼正开发小尺寸折叠屏手机&#xff1b;万达辟谣大规模裁员&#xff1b;智能仿生手让截肢者重获手心的温度 ChatGPT登顶美区iOS免费榜 ChatGPT 在 iOS 美区免费 App 排行榜上位列…

手把手带你利用苹果手机使用美区礼品卡升级ChatGPT Plus,轻松搞定!

大家好&#xff0c;我是五竹。 昨天用苹果手机尝试了一下&#xff0c;借助App Store&#xff08;苹果应用商店&#xff09;升级 Plus&#xff0c;成功了&#xff01;一共升级了三个号&#xff01;有两个一气呵成&#xff0c;轻松搞定。最后一个可能触发风控了&#xff0c;但第…