欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot3.0整合chatGPT的完整步驟

 更新時(shí)間:2023年08月09日 15:46:28   作者:miukoo  
ChatGPT是OpenAI推出的一個(gè)語(yǔ)言模型系統(tǒng),它能夠?qū)崟r(shí)回答用戶(hù)提問(wèn),包括聊天、糾正語(yǔ)法錯(cuò)誤,甚至是寫(xiě)代碼、寫(xiě)劇本等,由于可玩性很高,迅速在全球范圍內(nèi)風(fēng)靡起來(lái),下面這篇文章主要給大家介紹了關(guān)于SpringBoot3.0整合chatGPT的完整步驟,需要的朋友可以參考下

導(dǎo)讀

12月總體來(lái)說(shuō)互聯(lián)網(wǎng)的技術(shù)圈是非常熱鬧的,chatGPT爆火,SpringBoot3.0發(fā)布等重磅陸消息續(xù)進(jìn)入大家的視線(xiàn),而本文作者將以技術(shù)整合的角度,帶大家把最火的兩個(gè)技術(shù)整合在一起。讀完本文,你將熟悉SpringBoot3.0自定stater模塊的操作流程,并熟悉OpenAi為chatGPT提供的49種場(chǎng)景。

項(xiàng)目項(xiàng)目我已經(jīng)提交GITEE:https://gitee.com/miukoo/openai-spring 歡迎Star

新建父項(xiàng)目

我們這個(gè)項(xiàng)目分為starter和test兩個(gè)模塊,因此需要一個(gè)父項(xiàng)目來(lái)包裹。

1、快速新建父項(xiàng)目

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

  • 項(xiàng)目的父工程設(shè)置成SpringBoot3.0
  • 在項(xiàng)目中定義openai的版本并導(dǎo)入(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、刪除父項(xiàng)目的src文件夾

新建openai-spring-boot-starter模塊

openai-spring-boot-starter 模塊主要用來(lái)封裝openai的核心api,該模塊就是springboot自定starter的標(biāo)準(zhǔn)5步:

  • 新建模塊
  • 在模塊中引入相關(guān)依賴(lài)
  • 定義模塊外部屬性有那些
  • 實(shí)現(xiàn)核心業(yè)務(wù)邏輯
  • 配置自動(dòng)裝配

1、新增模塊

注意模塊名稱(chēng)的規(guī)范:非官方starter命名規(guī)則為 模塊名稱(chēng)+'-spring-boot-starter’結(jié)尾

2、在模塊中引入相關(guān)依賴(lài)

<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必須導(dǎo)入的依賴(lài) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- 這個(gè)包可以用來(lái)支持自定義屬性的輸入提示 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- 導(dǎo)入openai依賴(lài),版本在父項(xiàng)目中已經(jīng)約束 -->
        <dependency>
            <groupId>com.theokanning.openai-gpt3-java</groupId>
            <artifactId>client</artifactId>
        </dependency>
    </dependencies>

</project>

3、定義模塊外部屬性有那些

通過(guò)@ConfigurationProperties配置一個(gè)類(lèi),這個(gè)類(lèi)中的屬性將從外部的application.yml中讀取。在這里OpenAi需要兩個(gè)屬性需要配置,一是token秘鑰,一是timeout超時(shí)時(shí)間。關(guān)于timeout可以配置時(shí)間長(zhǎng)一點(diǎn),因?yàn)镺penAi在國(guó)外有些慢。

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;
    // 超時(shí)時(shí)間
    Integer timeout;

    // 設(shè)置屬性時(shí)同時(shí)設(shè)置給OpenAiUtils
    @Override
    public void afterPropertiesSet() throws Exception {
        OpenAiUtils.OPENAPI_TOKEN = token;
        OpenAiUtils.TIMEOUT = timeout;
    }
}

4、實(shí)現(xiàn)核心業(yè)務(wù)邏輯

核心業(yè)務(wù)邏輯指的就是你自定義這個(gè)starter可以提供給其它模塊那些api使用;在這里我們直接通過(guò)一個(gè)靜態(tài)類(lèi)工具OpenAiUtils,這樣在引入該模塊后,其它模塊直接可調(diào)用該靜態(tài)工具類(lèi),使用便捷一些。

同時(shí)在這個(gè)類(lèi)中提供openai官方49種場(chǎng)景想對(duì)應(yīng)的方法。

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.*;

/**
 * 調(diào)用OpenAi的49中方法
 */
public class OpenAiUtils {
    public static final Map<String, OpenAi> PARMS = new HashMap<>();

    static {
        PARMS.put("OpenAi01", new OpenAi("OpenAi01", "問(wèn)&答", "依據(jù)現(xiàn)有知識(shí)庫(kù)問(wèn)&答", "text-davinci-003", "Q: %s\nA:", 0.0, 1.0, 1.0, 0.0, 0.0, "\n"));
        PARMS.put("OpenAi02", new OpenAi("OpenAi02", "語(yǔ)法糾正", "將句子轉(zhuǎn)換成標(biāo)準(zhǔn)的英語(yǔ),輸出結(jié)果始終是英文", "text-davinci-003", "%s", 0.0, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi03", new OpenAi("OpenAi03", "內(nèi)容概況", "將一段話(huà),概況中心", "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的代碼", "一句話(huà)生成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", "程序命令生成", "一句話(huà)生成程序的命令,目前支持操作系統(tǒng)指令比較多", "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", "語(yǔ)言翻譯", "把一種語(yǔ)法翻譯成其它幾種語(yǔ)言", "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國(guó)際API生成", "一句話(huà)生成Stripe國(guó)際支付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語(yǔ)句生成", "依據(jù)上下文中的表信息,生成SQL語(yǔ)句", "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", "結(jié)構(gòu)化生成", "對(duì)于非結(jié)構(gòu)化的數(shù)據(jù)抽取其中的特征生成結(jié)構(gòu)化的表格", "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", "信息分類(lèi)", "把一段信息繼續(xù)分類(lèi)", "text-davinci-003", "%s\n分類(lèi):", 0.0, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi11", new OpenAi("OpenAi11", "Python代碼解釋", "把代碼翻譯成文字,用來(lái)解釋程序的作用", "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", "文字轉(zhuǎn)表情符號(hào)", "將文本編碼成表情服務(wù)", "text-davinci-003", "轉(zhuǎn)換文字為表情。\n%s:", 0.8, 1.0, 1.0, 0.0, 0.0, "\n"));
        PARMS.put("OpenAi13", new OpenAi("OpenAi13", "時(shí)間復(fù)雜度計(jì)算", "求一段代碼的時(shí)間復(fù)雜度", "text-davinci-003", "%s\n\"\"\"\n函數(shù)的時(shí)間復(fù)雜度是", 0.0, 1.0, 1.0, 0.0, 0.0, "\n"));
        PARMS.put("OpenAi14", new OpenAi("OpenAi14", "程序代碼翻譯", "把一種語(yǔ)言的代碼翻譯成另外一種語(yǔ)言的代碼", "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", "高級(jí)情緒評(píng)分", "支持批量列表的方式檢查情緒", "text-davinci-003", "對(duì)下面內(nèi)容進(jìn)行情感分類(lèi):\n%s\"\n情緒評(píng)級(jí):", 0.0, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi16", new OpenAi("OpenAi16", "代碼解釋", "對(duì)一段代碼進(jìn)行解釋", "code-davinci-002", "代碼:\n%s\n\"\"\"\n上面的代碼在做什么:\n1. ", 0.0, 1.0, 1.0, 0.0, 0.0, "\"\"\""));
        PARMS.put("OpenAi17", new OpenAi("OpenAi17", "關(guān)鍵字提取", "提取一段文本中的關(guān)鍵字", "text-davinci-003", "抽取下面內(nèi)容的關(guān)鍵字:\n%s", 0.5, 1.0, 1.0, 0.8, 0.0, ""));
        PARMS.put("OpenAi18", new OpenAi("OpenAi18", "問(wèn)題解答", "類(lèi)似解答題", "text-davinci-003", "Q: %s\nA: ?", 0.0, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi19", new OpenAi("OpenAi19", "廣告設(shè)計(jì)", "給一個(gè)產(chǎn)品設(shè)計(jì)一個(gè)廣告", "text-davinci-003", "為下面的產(chǎn)品創(chuàng)作一個(gè)創(chuàng)業(yè)廣告,用于投放到抖音上:\n產(chǎn)品:%s.", 0.5, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi20", new OpenAi("OpenAi20", "產(chǎn)品取名", "依據(jù)產(chǎn)品描述和種子詞語(yǔ),給一個(gè)產(chǎn)品取一個(gè)好聽(tīng)的名字", "text-davinci-003", "產(chǎn)品描述: %s.\n種子詞: %s.\n產(chǎn)品名稱(chēng): ", 0.8, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi21", new OpenAi("OpenAi21", "句子簡(jiǎn)化", "把一個(gè)長(zhǎng)句子簡(jiǎn)化成一個(gè)短句子", "text-davinci-003", "%s\nTl;dr: ", 0.7, 1.0, 1.0, 0.0, 1.0, ""));
        PARMS.put("OpenAi22", new OpenAi("OpenAi22", "修復(fù)代碼Bug", "自動(dòng)修改代碼中的bug", "code-davinci-002", "##### 修復(fù)下面代碼的bug\n### %s\n %s\n###  %s\n", 0.0, 1.0, 1.0, 0.0, 0.0, "###"));
        PARMS.put("OpenAi23", new OpenAi("OpenAi23", "表格填充數(shù)據(jù)", "自動(dòng)為一個(gè)表格生成數(shù)據(jù)", "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", "語(yǔ)言聊天機(jī)器人", "各種開(kāi)發(fā)語(yǔ)言的兩天機(jī)器人", "code-davinci-002", "You: %s\n%s機(jī)器人:", 0.0, 1.0, 1.0, 0.5, 0.0, "You: "));
        PARMS.put("OpenAi25", new OpenAi("OpenAi25", "機(jī)器學(xué)習(xí)機(jī)器人", "機(jī)器學(xué)習(xí)模型方面的機(jī)器人", "text-davinci-003", "You: %s\nML機(jī)器人:", 0.3, 1.0, 1.0, 0.5, 0.0, "You: "));
        PARMS.put("OpenAi26", new OpenAi("OpenAi26", "清單制作", "可以列出各方面的分類(lèi)列表,比如歌單", "text-davinci-003", "列出10%s:", 0.5, 1.0, 1.0, 0.52, 0.5, "11.0"));
        PARMS.put("OpenAi27", new OpenAi("OpenAi27", "文本情緒分析", "對(duì)一段文字進(jìn)行情緒分析", "text-davinci-003", "推斷下面文本的情緒是積極的, 中立的, 還是消極的.\n文本: \"%s\"\n觀點(diǎ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語(yǔ)句", "無(wú)上下文,語(yǔ)句描述生成SQL", "text-davinci-003", "%s", 0.3, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi30", new OpenAi("OpenAi30", "抽取聯(lián)系信息", "從文本中抽取聯(lián)系方式", "text-davinci-003", "從下面文本中抽取%s:\n%s", 0.0, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi31", new OpenAi("OpenAi31", "程序語(yǔ)言轉(zhuǎn)換", "把一種語(yǔ)言轉(zhuǎn)成另外一種語(yǔ)言", "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", "顏色生成", "依據(jù)描述生成對(duì)應(yīng)顏色", "text-davinci-003", "%s:\nbackground-color: ", 0.0, 1.0, 1.0, 0.0, 0.0, ";"));
        PARMS.put("OpenAi34", new OpenAi("OpenAi34", "程序文檔生成", "自動(dòng)為程序生成文檔", "code-davinci-002", "# %s\n \n%s\n# 上述代碼的詳細(xì)、高質(zhì)量文檔字符串:\n\"\"\"", 0.0, 1.0, 1.0, 0.0, 0.0, "#\"\"\""));
        PARMS.put("OpenAi35", new OpenAi("OpenAi35", "段落創(chuàng)作", "依據(jù)短語(yǔ)生成相關(guān)文短", "text-davinci-003", "為下面短語(yǔ)創(chuàng)建一個(gè)中文段:\n%s:\n", 0.5, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi36", new OpenAi("OpenAi36", "代碼壓縮", "把多行代碼簡(jiǎn)單的壓縮成一行", "code-davinci-002", "將下面%s代碼轉(zhuǎn)成一行:\n%s\n%s一行版本:", 0.0, 1.0, 1.0, 0.0, 0.0, ";"));
        PARMS.put("OpenAi37", new OpenAi("OpenAi37", "故事創(chuàng)作", "依據(jù)一個(gè)主題創(chuàng)建一個(gè)故事", "text-davinci-003", "主題: %s\n故事創(chuàng)作:", 0.8, 1.0, 1.0, 0.5, 0.0, ""));
        PARMS.put("OpenAi38", new OpenAi("OpenAi38", "人稱(chēng)轉(zhuǎn)換", "第一人稱(chēng)轉(zhuǎn)第3人稱(chēng)", "text-davinci-003", "把下面內(nèi)容從第一人稱(chēng)轉(zhuǎn)為第三人稱(chēng) (性別女):\n%s\n", 0.0, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi39", new OpenAi("OpenAi39", "摘要說(shuō)明", "依據(jù)筆記生成摘要說(shuō)明", "text-davinci-003", "將下面內(nèi)容轉(zhuǎn)換成將下%s摘要:\n%s", 0.0, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi40", new OpenAi("OpenAi40", "頭腦風(fēng)暴", "給定一個(gè)主題,讓其生成一些主題相關(guān)的想法", "text-davinci-003", "頭腦風(fēng)暴一些關(guān)于%s的想法:", 0.6, 1.0, 1.0, 1.0, 1.0, ""));
        PARMS.put("OpenAi41", new OpenAi("OpenAi41", "ESRB文本分類(lèi)", "按照ESRB進(jìn)行文本分類(lèi)", "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", "提綱生成", "按照提示為相關(guān)內(nèi)容生成提綱", "text-davinci-003", "為%s提綱:", 0.3, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi43", new OpenAi("OpenAi43", "美食制作(后果自負(fù))", "依據(jù)美食名稱(chēng)和材料生成美食的制作步驟", "text-davinci-003", "依據(jù)下面成分和美食,生成制作方法:\n%s\n成分:\n%s\n制作方法:", 0.3, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi44", new OpenAi("OpenAi44", "AI聊天", "與AI機(jī)器進(jìn)行聊天", "text-davinci-003", "Human: %s", 0.9, 1.0, 1.0, 0.0, 0.6, "Human:AI:"));
        PARMS.put("OpenAi45", new OpenAi("OpenAi45", "擺爛聊天", "與諷刺機(jī)器進(jìn)行聊天", "text-davinci-003", "Marv不情愿的回答問(wèn)題.\nYou:%s\nMarv:", 0.5, 0.3, 1.0, 0.5, 0.0, ""));
        PARMS.put("OpenAi46", new OpenAi("OpenAi46", "分解步驟", "把一段文本分解成幾步來(lái)完成", "text-davinci-003", "為下面文本生成次序列表,并增加列表數(shù)子: \n%s\n", 0.3, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi47", new OpenAi("OpenAi47", "點(diǎn)評(píng)生成", "依據(jù)文本內(nèi)容自動(dòng)生成點(diǎn)評(píng)", "text-davinci-003", "依據(jù)下面內(nèi)容,進(jìn)行點(diǎn)評(píng):\n%s\n點(diǎn)評(píng):", 0.5, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi48", new OpenAi("OpenAi48", "知識(shí)學(xué)習(xí)", "可以為學(xué)習(xí)知識(shí)自動(dòng)解答", "text-davinci-003", "%s", 0.3, 1.0, 1.0, 0.0, 0.0, ""));
        PARMS.put("OpenAi49", new OpenAi("OpenAi49", "面試", "生成面試題", "text-davinci-003", "創(chuàng)建10道%s相關(guān)的面試題(中文):\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();
    }

    /**
     * 問(wèn)答
     *
     * @param question
     * @return
     */
    public static List<CompletionChoice> getQuestionAnswer(String question) {
        OpenAi openAi = PARMS.get("OpenAi01");
        return getAiResult(openAi, String.format(openAi.getPrompt(), question));
    }

    /**
     * 語(yǔ)法糾錯(cuò)
     *
     * @param text
     * @return
     */
    public static List<CompletionChoice> getGrammarCorrection(String text) {
        OpenAi openAi = PARMS.get("OpenAi02");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 將一段話(huà),概況中心
     *
     * @param text
     * @return
     */
    public static List<CompletionChoice> getSummarize(String text) {
        OpenAi openAi = PARMS.get("OpenAi03");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 一句話(huà)生成OpenAi的代碼
     *
     * @param text
     * @return
     */
    public static List<CompletionChoice> getOpenAiApi(String text) {
        OpenAi openAi = PARMS.get("OpenAi04");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 一句話(huà)生成程序的命令,目前支持操作系統(tǒng)指令比較多
     *
     * @param text
     * @return
     */
    public static List<CompletionChoice> getTextToCommand(String text) {
        OpenAi openAi = PARMS.get("OpenAi05");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 把一種語(yǔ)法翻譯成其它幾種語(yǔ)言
     *
     * @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));
    }

    /**
     * 一句話(huà)生成Stripe國(guó)際支付API
     *
     * @param text
     * @return
     */
    public static List<CompletionChoice> getStripeApi(String text) {
        OpenAi openAi = PARMS.get("OpenAi07");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }


    /**
     * 依據(jù)上下文中的表信息,生成SQL語(yǔ)句
     *
     * @param databaseType 數(shù)據(jù)庫(kù)類(lèi)型
     * @param tables       上午依賴(lài)的表和字段 Employee(id, name, department_id)
     * @param text         SQL描述
     * @param sqlType      sql類(lèi)型,比如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));
    }

    /**
     * 對(duì)于非結(jié)構(gòu)化的數(shù)據(jù)抽取其中的特征生成結(jié)構(gòu)化的表格
     *
     * @param text 非結(jié)構(gòu)化的數(shù)據(jù)
     * @return
     */
    public static List<CompletionChoice> getUnstructuredData(String text) {
        OpenAi openAi = PARMS.get("OpenAi09");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 把一段信息繼續(xù)分類(lèi)
     *
     * @param text 要分類(lèi)的文本
     * @return
     */
    public static List<CompletionChoice> getTextCategory(String text) {
        OpenAi openAi = PARMS.get("OpenAi10");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 把一段信息繼續(xù)分類(lèi)
     *
     * @param codeType 代碼類(lèi)型,比如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));
    }

    /**
     * 將文本編碼成表情服務(wù)
     *
     * @param text 文本
     * @return
     */
    public static List<CompletionChoice> getTextEmoji(String text) {
        OpenAi openAi = PARMS.get("OpenAi12");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 求一段代碼的時(shí)間復(fù)雜度
     *
     * @param code 代碼
     * @return
     */
    public static List<CompletionChoice> getTimeComplexity(String code) {
        OpenAi openAi = PARMS.get("OpenAi13");
        return getAiResult(openAi, String.format(openAi.getPrompt(), code));
    }


    /**
     * 把一種語(yǔ)言的代碼翻譯成另外一種語(yǔ)言的代碼
     *
     * @param fromLanguage 要翻譯的代碼語(yǔ)言
     * @param toLanguage   要翻譯成的代碼語(yǔ)言
     * @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()));
    }

    /**
     * 對(duì)一段代碼進(jìn)行解釋
     *
     * @param code 文本
     * @return
     */
    public static List<CompletionChoice> getExplainCOde(String code) {
        OpenAi openAi = PARMS.get("OpenAi16");
        return getAiResult(openAi, String.format(openAi.getPrompt(), code));
    }

    /**
     * 提取一段文本中的關(guān)鍵字
     *
     * @param text 文本
     * @return
     */
    public static List<CompletionChoice> getTextKeywords(String text) {
        OpenAi openAi = PARMS.get("OpenAi17");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 事實(shí)回答答題
     *
     * @param text 文本
     * @return
     */
    public static List<CompletionChoice> getFactualAnswering(String text) {
        OpenAi openAi = PARMS.get("OpenAi18");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 給一個(gè)產(chǎn)品設(shè)計(jì)一個(gè)廣告
     *
     * @param text 文本
     * @return
     */
    public static List<CompletionChoice> getAd(String text) {
        OpenAi openAi = PARMS.get("OpenAi19");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 依據(jù)產(chǎn)品描述和種子詞語(yǔ),給一個(gè)產(chǎn)品取一個(gè)好聽(tīng)的名字
     *
     * @param productDescription 產(chǎn)品描述
     * @param seedWords          種子詞語(yǔ)
     * @return
     */
    public static List<CompletionChoice> getProductName(String productDescription, String seedWords) {
        OpenAi openAi = PARMS.get("OpenAi20");
        return getAiResult(openAi, String.format(openAi.getPrompt(), productDescription, seedWords));
    }

    /**
     * 把一個(gè)長(zhǎng)句子簡(jiǎn)化成一個(gè)短句子
     *
     * @param text 長(zhǎng)句子
     * @return
     */
    public static List<CompletionChoice> getProductName(String text) {
        OpenAi openAi = PARMS.get("OpenAi21");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 自動(dòng)修改代碼中的bug
     *
     * @param codeType 語(yǔ)言類(lèi)型
     * @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));
    }

    /**
     * 自動(dòng)為一個(gè)表格生成數(shù)據(jù)
     *
     * @param rows    生成的行數(shù)
     * @param headers 數(shù)據(jù)表頭,格式如:姓名| 年齡|性別|生日
     * @return
     */
    public static List<CompletionChoice> getFillData(int rows, String headers) {
        OpenAi openAi = PARMS.get("OpenAi23");
        return getAiResult(openAi, String.format(openAi.getPrompt(), rows, headers));
    }

    /**
     * 各種開(kāi)發(fā)語(yǔ)言的兩天機(jī)器人
     *
     * @param question             你的問(wèn)題
     * @param programmingLanguages 語(yǔ)言 比如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));
    }

    /**
     * 機(jī)器學(xué)習(xí)模型方面的機(jī)器人
     *
     * @param question 你的問(wèn)題
     * @return
     */
    public static List<CompletionChoice> getMLChatbot(String question) {
        OpenAi openAi = PARMS.get("OpenAi25");
        return getAiResult(openAi, String.format(openAi.getPrompt(), question));
    }

    /**
     * 可以列出各方面的分類(lèi)列表,比如歌單
     *
     * @param text 清單描述
     * @return
     */
    public static List<CompletionChoice> getListMaker(String text) {
        OpenAi openAi = PARMS.get("OpenAi26");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 對(duì)一段文字進(jìn)行情緒分析
     *
     * @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));
    }

    /**
     * 無(wú)上下文,語(yǔ)句描述生成SQL
     *
     * @param text
     * @return
     */
    public static List<CompletionChoice> getSQL(String text) {
        OpenAi openAi = PARMS.get("OpenAi29");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 從文本中抽取聯(lián)系方式
     *
     * @param extractContent 抽取內(nèi)容描述
     * @param text
     * @return 從下面文本中抽取郵箱和電話(huà):\n教育行業(yè)A股IPO第一股(股票代碼 003032)\n全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000    舉報(bào)郵箱: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));
    }

    /**
     * 把一種語(yǔ)言轉(zhuǎn)成另外一種語(yǔ)言代碼
     *
     * @param fromCodeType 當(dāng)前代碼類(lèi)型
     * @param toCodeType   轉(zhuǎn)換的代碼類(lèi)型
     * @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));
    }

    /**
     * 依據(jù)描述生成對(duì)應(yīng)顏色
     *
     * @param text
     * @return
     */
    public static List<CompletionChoice> getMoodToColor(String text) {
        OpenAi openAi = PARMS.get("OpenAi33");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 自動(dòng)為程序生成文檔
     *
     * @param codeType 語(yǔ)言
     * @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));
    }

    /**
     * 依據(jù)短語(yǔ)生成相關(guān)文短
     *
     * @param text 短語(yǔ)
     * @return
     */
    public static List<CompletionChoice> getCreateAnalogies(String text) {
        OpenAi openAi = PARMS.get("OpenAi35");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 把多行代碼簡(jiǎn)單的壓縮成一行
     *
     * @param codeType 語(yǔ)言
     * @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));
    }

    /**
     * 依據(jù)一個(gè)主題創(chuàng)建一個(gè)故事
     *
     * @param topic 創(chuàng)作主題
     * @return
     */
    public static List<CompletionChoice> getStory(String topic) {
        OpenAi openAi = PARMS.get("OpenAi37");
        return getAiResult(openAi, String.format(openAi.getPrompt(), topic));
    }

    /**
     * 第一人稱(chēng)轉(zhuǎn)第3人稱(chēng)
     *
     * @param text
     * @return
     */
    public static List<CompletionChoice> getStoryCreator(String text) {
        OpenAi openAi = PARMS.get("OpenAi38");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 依據(jù)筆記生成摘要說(shuō)明
     *
     * @param scene 生成的摘要場(chǎng)景
     * @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));
    }

    /**
     * 給定一個(gè)主題,讓其生成一些主題相關(guān)的想法
     *
     * @param topic 頭腦風(fēng)暴關(guān)鍵詞
     * @return
     */
    public static List<CompletionChoice> getIdeaGenerator(String topic) {
        OpenAi openAi = PARMS.get("OpenAi40");
        return getAiResult(openAi, String.format(openAi.getPrompt(), topic));
    }

    /**
     * 按照ESRB進(jìn)行文本分類(lèi)
     *
     * @param text 文本
     * @return
     */
    public static List<CompletionChoice> getESRBRating(String text) {
        OpenAi openAi = PARMS.get("OpenAi41");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 按照提示為相關(guān)內(nèi)容生成提綱
     *
     * @param text 場(chǎng)景,比如 數(shù)據(jù)庫(kù)軟件生成大學(xué)畢業(yè)論文
     * @return
     */
    public static List<CompletionChoice> getEssayOutline(String text) {
        OpenAi openAi = PARMS.get("OpenAi42");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 依據(jù)美食名稱(chēng)和材料生成美食的制作步驟
     *
     * @param name        美食名稱(chēng)
     * @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機(jī)器進(jìn)行聊天
     *
     * @param question
     * @return
     */
    public static List<CompletionChoice> getAiChatbot(String question) {
        OpenAi openAi = PARMS.get("OpenAi44");
        return getAiResult(openAi, String.format(openAi.getPrompt(), question));
    }

    /**
     * 與諷刺機(jī)器進(jìn)行聊天,聊天的機(jī)器人是一種消極情緒
     *
     * @param question
     * @return
     */
    public static List<CompletionChoice> getMarvChatbot(String question) {
        OpenAi openAi = PARMS.get("OpenAi45");
        return getAiResult(openAi, String.format(openAi.getPrompt(), question));
    }

    /**
     * 把一段文本分解成幾步來(lái)完成
     *
     * @param text
     * @return
     */
    public static List<CompletionChoice> getTurnDirection(String text) {
        OpenAi openAi = PARMS.get("OpenAi46");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 依據(jù)文本內(nèi)容自動(dòng)生成點(diǎn)評(píng)
     *
     * @param text
     * @return
     */
    public static List<CompletionChoice> getReviewCreator(String text) {
        OpenAi openAi = PARMS.get("OpenAi47");
        return getAiResult(openAi, String.format(openAi.getPrompt(), text));
    }

    /**
     * 可以為學(xué)習(xí)知識(shí)自動(dòng)解答
     *
     * @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、配置自動(dòng)裝配

這一步是非常關(guān)鍵的,你的項(xiàng)目能在其他模塊啟動(dòng)的時(shí)候就能夠用,就必須配置這一步,而這一步有兩小步:

  • 編寫(xiě)自動(dòng)裝配類(lèi)
  • 配置自動(dòng)裝配類(lèi)

編寫(xiě)自動(dòng)裝配類(lèi),參考代碼:

package cn.gjsm.miukoo.config;

import cn.gjsm.miukoo.properties.OpenAiProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * 自動(dòng)配置類(lèi)
 */
@Configuration
@EnableConfigurationProperties(OpenAiProperties.class)
public class OpenAiAutoConfiguration {
}

配置自動(dòng)裝配類(lèi):

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

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

新建openai-starter-test模塊

經(jīng)過(guò)上述五部我們就完成了chatGPT的stater的封裝,接下來(lái)我們創(chuàng)建一個(gè)模塊來(lái)測(cè)試。

新增模塊

測(cè)試模塊的名稱(chēng)最好是以test結(jié)尾

導(dǎo)入依賴(lài)

在測(cè)試模塊中直接可以導(dǎo)入我們封裝好的openai-spring-boot-starter,當(dāng)然還有測(cè)試spring-boot-starter-test依賴(lài)。

<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>

創(chuàng)建啟動(dòng)類(lèi)

我們計(jì)劃使用SpringBoot去測(cè)試,因此需要?jiǎng)?chuàng)建一個(gè)啟動(dòng)類(lèi)

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);
    }
}

配置屬性

在測(cè)試模塊的application.yml中,我們需要配置,我們?cè)趏penai-spring-boot-starter中定義的兩個(gè)屬性

server:
  port: 8080

openai:
  token: 你的token
  timeout: 5000

編寫(xiě)測(cè)試類(lèi)

我們?cè)跍y(cè)試包下,新建一個(gè)測(cè)試類(lèi),即可直接調(diào)用我們?cè)趕tater中封裝的OpenAiUtils工具類(lèi),通過(guò)其來(lái)完成chatGPT功能調(diào)用。

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 {

    /**
     * 測(cè)試問(wèn)答
     */
    @Test
    public void testQA(){
        List<CompletionChoice> questionAnswer = OpenAiUtils.getQuestionAnswer("重慶今天的天氣怎么樣?");
        for (CompletionChoice completionChoice : questionAnswer) {
            System.out.println(completionChoice.getText());
        }
    }

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

}

tater中封裝的OpenAiUtils工具類(lèi),通過(guò)其來(lái)完成chatGPT功能調(diào)用。

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 {

    /**
     * 測(cè)試問(wèn)答
     */
    @Test
    public void testQA(){
        List<CompletionChoice> questionAnswer = OpenAiUtils.getQuestionAnswer("重慶今天的天氣怎么樣?");
        for (CompletionChoice completionChoice : questionAnswer) {
            System.out.println(completionChoice.getText());
        }
    }

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

}

運(yùn)行報(bào)錯(cuò)

如果你運(yùn)行代碼,出現(xiàn)下面錯(cuò)誤,不應(yīng)緊張,那是英文springboot3.0需要jdk17的版本

選中父項(xiàng)目右鍵打開(kāi)項(xiàng)目配置創(chuàng)建,修改JDK為17版本即可,重新運(yùn)行即可正常。

總結(jié) 

到此這篇關(guān)于SpringBoot3.0整合chatGPT的文章就介紹到這了,更多相關(guān)SpringBoot3.0整合chatGPT內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合Dozer映射框架流程詳解

    SpringBoot整合Dozer映射框架流程詳解

    dozer是用來(lái)兩個(gè)對(duì)象之間屬性轉(zhuǎn)換的工具,有了這個(gè)工具之后,我們將一個(gè)對(duì)象的所有屬性值轉(zhuǎn)給另一個(gè)對(duì)象時(shí),就不需要再去寫(xiě)重復(fù)的set和get方法了,下面介紹下SpringBoot中Dozer的使用,感興趣的朋友一起看看吧
    2022-07-07
  • RocketMQ消息拉取過(guò)程詳解

    RocketMQ消息拉取過(guò)程詳解

    這篇文章主要為大家介紹了RocketMQ消息拉取過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 一篇文章帶你解決 IDEA 每次新建項(xiàng)目 maven home directory 總是改變的問(wèn)題

    一篇文章帶你解決 IDEA 每次新建項(xiàng)目 maven home directory 總是改變的問(wèn)題

    這篇文章主要介紹了一篇文章帶你解決 IDEA 每次新建項(xiàng)目 maven home directory 總是改變的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Hibernate中實(shí)現(xiàn)增刪改查的步驟詳解

    Hibernate中實(shí)現(xiàn)增刪改查的步驟詳解

    本篇文章主要介紹了Hibernate中實(shí)現(xiàn)增刪改查的步驟與方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • Java中synchronized用法匯總

    Java中synchronized用法匯總

    使用 synchronized 無(wú)需手動(dòng)執(zhí)行加鎖和釋放鎖的操作,我們只需要聲明 synchronized 關(guān)鍵字就可以了,JVM 層面會(huì)幫我們自動(dòng)的進(jìn)行加鎖和釋放鎖的操作,我們今天重點(diǎn)來(lái)看一下synchronized 的幾種用法
    2022-04-04
  • Maven打包沒(méi)有指定主類(lèi)問(wèn)題(xxx.jar中沒(méi)有主清單屬性)

    Maven打包沒(méi)有指定主類(lèi)問(wèn)題(xxx.jar中沒(méi)有主清單屬性)

    這篇文章主要介紹了Maven打包沒(méi)有指定主類(lèi)問(wèn)題(xxx.jar中沒(méi)有主清單屬性),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 淺談Java高并發(fā)解決方案以及高負(fù)載優(yōu)化方法

    淺談Java高并發(fā)解決方案以及高負(fù)載優(yōu)化方法

    這篇文章主要介紹了淺談Java高并發(fā)解決方案以及高負(fù)載優(yōu)化方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java中使用HashMap時(shí)指定初始化容量性能解析

    Java中使用HashMap時(shí)指定初始化容量性能解析

    這篇文章主要為大家介紹了Java中使用HashMap時(shí)指定初始化容量性能解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Java編程通過(guò)list接口實(shí)現(xiàn)數(shù)據(jù)的增刪改查代碼示例

    Java編程通過(guò)list接口實(shí)現(xiàn)數(shù)據(jù)的增刪改查代碼示例

    這篇文章是介紹Java編程基礎(chǔ)方面的內(nèi)容,涉及l(fā)ist接口的操作,通過(guò)list接口實(shí)現(xiàn)對(duì)數(shù)據(jù)的增刪改查的相關(guān)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • Spring注入方式有哪些

    Spring注入方式有哪些

    你知道Spring的注入方式有哪幾種嗎?這篇文章主要為大家詳細(xì)介紹了Spring的注入方式,感興趣的小伙伴們可以參考一下
    2016-09-09

最新評(píng)論