SpringBoot3.0整合chatGPT的完整步骤

目录
  • 导读
  • 新建父项目
    • 1、快速新建父项目
    • 2、在pom.xml中引入SpringBoot3.0
    • 3、删除父项目的src文件夹
  • 新建openai-spring-boot-starter模块
    • 1、新增模块
    • 2、在模块中引入相关依赖
    • 3、定义模块外部属性有那些
    • 4、实现核心业务逻辑
    • 5、配置自动装配
  • 新建openai-starter-test模块
    • 新增模块
    • 导入依赖
    • 创建启动类
    • 配置属性
    • 编写测试类
    • 运行报错
  • 总结

导读

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
    @Override
    public 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: 8080

openai:
  token: 你的token
  timeout: 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 {

    /**
     * 测试问答
     */
    @Test
    public void testQA(){
        List<CompletionChoice> questionAnswer = OpenAiUtils.getQuestionAnswer("重庆今天的天气怎么样?");
        for (CompletionChoice completionChoice : questionAnswer) {
            System.out.println(completionChoice.getText());
        }
    }

    /**
     * 测试面试题生成
     */
    @Test
    public 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 {

    /**
     * 测试问答
     */
    @Test
    public void testQA(){
        List<CompletionChoice> questionAnswer = OpenAiUtils.getQuestionAnswer("重庆今天的天气怎么样?");
        for (CompletionChoice completionChoice : questionAnswer) {
            System.out.println(completionChoice.getText());
        }
    }

    /**
     * 测试面试题生成
     */
    @Test
    public void testInterview(){
        List<CompletionChoice> results = OpenAiUtils.getInterviewQuestion("redis");
        for (CompletionChoice completionChoice : results) {
            System.out.println(completionChoice.getText());
        }
    }

}

运行报错

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

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

总结

到此这篇关于SpringBoot3.0整合chatGPT的文章就介绍到这了,更多相关SpringBoot3.0整合chatGPT内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 如何调用chatGPT实现代码机器人

    目录 获取chatGPT登录Token信息 一.通过Httpclient实现调用chatGPT 二.通过hutool实现调用chatGPT 最近chatGPT也是非常的火爆,相信大家都看到了,现在提供一种Java调用chatGPT的方法,我们主要通过两个工具来实现,一就是httpclient,二就是hutool,你觉得那种好理解你就用那种即可! 获取chatGPT登录Token信息 1.需要拥有chatGPT账号,进入官网需要科学上网自行解决! 官网:ChatGPT 注册需使用国外手机号! 视频

  • SpringBoot3.0自定stater模块的操作流程(chatGPT提供的49种场景)

    目录 导读 新建父项目 1.快速新建父项目 2.在pom.xml中引入SpringBoot3.0 3.删除父项目的src文件夹 新建openai-starter-test模块 新增模块 导入依赖 创建启动类 配置属性 编写测试类 运行报错 导读 导读 | 12月总体来说互联网的技术圈是非常热闹的,chatGPT爆火,SpringBoot3.0发布等重磅陆消息续进入大家的视线,而本文作者将以技术整合的角度,带大家把最火的两个技术整合在一起.读完本文,你将熟悉SpringBoot3.0自定state

  • 利用OpenAI ChatGPT进行编码尝试体验

    ChatGPT 是一种以类似聊天的方式进行交互的人工智能网络,从名字上看起来像是另一个“聊天机器人”,但实际上已经远超聊天的范畴了,当要求它编写一些代码时,结果相等震撼,它可以写出一些意想不到的连贯代码,而这些代码对于开发者很有启发. 开始要求它使用 JavaScript 编写一个散列(HASH)密码的函数.具体一点就是编写一个 JavaScript 函数,它接受密码的字符串输入并输出散列(HASH)密码. function hashPassword(password) { return cry

  • 使用ChatGPT来自动化Python任务

    目录 1.概述 2.内容 2.1 使用ChatGPT来绘制线性回归 2.2 使用Python给微信发信息 2.3 使用Python发送电子邮件 2.4 使用Python开发一个爬虫程序 3.总结 1.概述 最近,比较火热的ChatGPT很受欢迎.今天,笔者为大家来介绍一下ChatGPT能做哪些事情. 2.内容 ChatGPT是一款由OpenAI开发的专门从事对话的AI聊天机器人.它的目标是让AI系统更加自然的与之交互,但它也可以在我们编写代码的时候提供一些帮助. 2.1 使用ChatGPT来绘制

  • vscode使用chatGPT 的方法

    目录 vscode使用chatGPT 一.下载chatPGT 二.使用 三.现在来看看它写的怎样 vscode使用chatGPT 一.下载chatPGT 在拓展中找到chatGPT,我这里下载的是中文版 二.使用 1.使用快捷键 ctrl+shift+p进行查找 chatGPT 2.点击请输入问题 3.输入你的问题,回车,这样它就会进行代码的编写 4.等一会儿就会给你结果啦 三.现在来看看它写的怎样 生成的代码 import smtplib # 设置发送方的邮件服务器和端口号 smtp_serv

  • 手把手教你在Python里使用ChatGPT

    目录 前言 知识点 实现 代码 后话 前言 近来chatGPT挺火的,也试玩了一下,确实挺有意思.这里记录一下在Python中如何去使用chatGPT. 本篇文章的实现100%基于 chatGPT,我是搬运工无疑了!!! 本片文章比较简单. 知识点 pip install openai 看看 chatGPT的表现: 使用python编写一段发送网络请求的代码 python如何md5 也有抽风的表现: 小明妈妈大小明20岁,20年后小明妈妈大小明多少岁? 一个蛋糕切成8块我吃不完,切成4块刚刚好?

  • SpringBoot3.0整合chatGPT的完整步骤

    目录 导读 新建父项目 1.快速新建父项目 2.在pom.xml中引入SpringBoot3.0 3.删除父项目的src文件夹 新建openai-spring-boot-starter模块 1.新增模块 2.在模块中引入相关依赖 3.定义模块外部属性有那些 4.实现核心业务逻辑 5.配置自动装配 新建openai-starter-test模块 新增模块 导入依赖 创建启动类 配置属性 编写测试类 运行报错 总结 导读 12月总体来说互联网的技术圈是非常热闹的,chatGPT爆火,SpringBo

  • Spring Boot整合Redis的完整步骤

    前言 实际 开发 中 缓存 处理是必须的,不可能我们每次客户端去请求一次 服务器 ,服务器每次都要去 数据库 中进行查找,为什么要使用缓存?说到底是为了提高系统的运行速度.将用户频繁访问的内容存放在离用户最近,访问速度最 快的 地方,提高用户的响 应速度,今天先来讲下在 springboot 中整合 redis 的详细步骤. 一.Spring Boot对Redis的支持 Spring对Redis的支持是使用Spring Data Redis来实现的,一般使用Jedis或者lettuce(默认),

  • SpringBoot整合Xxl-Job的完整步骤记录

    一.下载Xxl-Job源代码并导入本地并运行 Github地址: https://github.com/xuxueli/xxl-job 中文文档地址: https://www.xuxueli.com/xxl-job/ 1.使用Idea或Eclipse导入 2.执行sql脚本(红色标记处) 3.运行xxl-job-admin(xxl-job后台管理,主要方便管理各种各样的任务) 注意:在运行之前,需要把2的sql脚本执行完毕,并修改数据库连接池. 正常启动,访问地址为:http://localho

  • Spring Boot整合Swagger2的完整步骤详解

    前言 swagger,中文"拽"的意思.它是一个功能强大的api框架,它的集成非常简单,不仅提供了在线文档的查阅, 而且还提供了在线文档的测试.另外swagger很容易构建restful风格的api. 一.Swagger概述 Swagger是一组围绕OpenAPI规范构建的开源工具,可帮助设计.构建.记录和使用REST API. 简单说下,它的出现就是为了方便进行测试后台的restful形式的接口,实现动态的更新,当我们在后台的接口 修改了后,swagger可以实现自动的更新,而不需要

  • win10安装tensorflow-gpu1.8.0详细完整步骤

    在整个安装的过程中也遇到了很多的坑,故此做个记录,争取下次不再犯! 我的整个基本配置如下: 电脑环境如下:win10(64位)+CPU:E5-2603 +GPU:GTX 1070 需要安装的软件如下:Anaconda3-4.2.0-Windows-x86_64(python 3.5.2) + tensorflow-gpu 1.8 + CUDA 9.0 + cuDNN v7.1 for CUDA9.0 若你想在自己的windows上安装tensorflow-gpu,一般化也可以遵循如下的步骤. 1

  • SpringBoot2.0整合WebSocket代码实例

    这篇文章主要介绍了SpringBoot2.0整合WebSocket代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 之前公司的某个系统为了实现推送技术,所用的技术都是Ajax轮询,这种方式浏览器需要不断的向服务器发出请求,显然这样会浪费很多的带宽等资源,所以研究了下WebSocket,本文将详细介绍下. 一.什么是WebSocket? WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议,能更好的节省服务器资

  • SpringBoot整合MongoDB的实现步骤

    目录 一.技术介绍 1.MongoDB是什么? 二.使用步骤 1.引入maven库 2.具体使用示例 3.配置文件 4.单元测试 总结 一.技术介绍 1.MongoDB是什么? MongoDB(来自于英文单词"Humongous",中文含义为"庞大")是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数据库.作为一个适用于敏捷开发的数据库,MongoDB的数据模式可以随着应用程序的发展而灵活地更新.与此同时,它也为开发人员 提供了传统数据库的功能:二级索引,

  • SpringBoot整合chatGPT的项目实践

    目录 1 添加依赖 2 创建相关文件 2.1 实体类:OpenAi.java 2.2 配置类:OpenAiProperties.java 2.3 核心业务逻辑OpenAiUtils.java 2.4 自动配置类OpenAiAutoConfiguration.java 2.5 在resources文件夹下的META-INF/spring.factories文件中增加配置 2.6 在yml文件上配置token 3 编写测试类 4 补充 4.1 添加依赖 4.2 添加代码 5 总结 1 添加依赖 <!

  • PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析

    文件上传分为两个部分,HTML显示部分和PHP处理部分,HTML部分主要是让用户来选择所要上传的文件,然后通过PHP中的$_FILES,我们可以把文件上传到服务器的指定目录. 1.客户端页面 客户端的配置 1.表单页面 2.表单发送方式为post 3.表单form中添加enctype="multipart/form-data" <body> <form action="doaction.php" method="post" en

随机推荐