SpringBoot整合chatGPT的項(xiàng)目實(shí)踐
1 添加依賴
<!-- 導(dǎo)入openai依賴 -->
<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>client</artifactId>
<version>0.8.1</version>
</dependency>
2 創(chuàng)建相關(guān)文件
2.1 實(shí)體類:OpenAi.java
package com.wkf.workrecord.tools.openai;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author wuKeFan
* @date 2023-02-10 15:40:22
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OpenAi {
String id;
String name;
String desc;
String model;
// 提示模板
String prompt;
// 創(chuàng)新采樣
Double temperature;
// 情緒采樣
Double topP;
// 結(jié)果條數(shù)
Double n = 1d;
// 頻率處罰系數(shù)
Double frequencyPenalty;
// 重復(fù)處罰系數(shù)
Double presencePenalty;
// 停用詞
String stop;
}2.2 配置類:OpenAiProperties.java
package com.wkf.workrecord.tools.openai;
import lombok.Data;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @author wuKeFan
* @date 2023-02-10 15:25:32
*/
@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;
}
}2.3 核心業(yè)務(wù)邏輯OpenAiUtils.java
package com.wkf.workrecord.tools.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.*;
/**
* @author wuKeFan
* @date 2023-02-10 15:32:18
*/
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)容概況", "將一段話,概況中心", "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", "程序命令生成", "一句話生成程序的命令,目前支持操作系統(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生成", "一句話生成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", "信息分類", "把一段信息繼續(xù)分類", "text-davinci-003", "%s\n分類:", 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)行情感分類:\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)題解答", "類似解答題", "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è)好聽的名字", "text-davinci-003", "產(chǎn)品描述: %s.\n種子詞: %s.\n產(chǎn)品名稱: ", 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ī)器人", "各種開發(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", "清單制作", "可以列出各方面的分類列表,比如歌單", "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", "人稱轉(zhuǎn)換", "第一人稱轉(zhuǎn)第3人稱", "text-davinci-003", "把下面內(nèi)容從第一人稱轉(zhuǎn)為第三人稱 (性別女):\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文本分類", "按照ESRB進(jìn)行文本分類", "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ù)美食名稱和材料生成美食的制作步驟", "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));
}
/**
* 將一段話,概況中心
*
* @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));
}
/**
* 一句話生成程序的命令,目前支持操作系統(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));
}
/**
* 一句話生成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ù)類型
* @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));
}
/**
* 對(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ù)分類
*
* @param text 要分類的文本
* @return
*/
public static List<CompletionChoice> getTextCategory(String text) {
OpenAi openAi = PARMS.get("OpenAi10");
return getAiResult(openAi, String.format(openAi.getPrompt(), text));
}
/**
* 把一段信息繼續(xù)分類
*
* @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));
}
/**
* 將文本編碼成表情服務(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è)好聽的名字
*
* @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ǔ)言類型
* @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));
}
/**
* 各種開發(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));
}
/**
* 可以列出各方面的分類列表,比如歌單
*
* @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 從下面文本中抽取郵箱和電話:\n教育行業(yè)A股IPO第一股(股票代碼 003032)\n全國(guó)咨詢/投訴熱線: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)前代碼類型
* @param toCodeType 轉(zhuǎn)換的代碼類型
* @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));
}
/**
* 第一人稱轉(zhuǎn)第3人稱
*
* @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)行文本分類
*
* @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ù)美食名稱和材料生成美食的制作步驟
*
* @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機(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));
}
}2.4 自動(dòng)配置類OpenAiAutoConfiguration.java
package com.wkf.workrecord.tools.openai;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* 自動(dòng)配置類
* @author wuKeFan
* @date 2023-02-10 15:34:01
*/
@Configuration
@EnableConfigurationProperties(OpenAiProperties.class)
public class OpenAiAutoConfiguration {
}
2.5 在resources文件夾下的META-INF/spring.factories文件中增加配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.wkf.workrecord.tools.openai.OpenAiAutoConfiguration
2.6 在yml文件上配置token
openai: token: 你的token timeout: 5000
3 編寫測(cè)試類
package com.wkf.workrecord.study;
import com.theokanning.openai.completion.CompletionChoice;
import com.wkf.workrecord.tools.openai.OpenAiUtils;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
/**
* openAi測(cè)試類
* @author wuKeFan
* @date 2023-02-10 15:37:01
*/
@Slf4j
@SpringBootTest
public class OpenAiTest {
/**
* openAi接口請(qǐng)求API
*/
@Test
public void test() {
List<CompletionChoice> questionAnswer = OpenAiUtils.getQuestionAnswer("使用SpringBoot框架進(jìn)行Http請(qǐng)求的詳細(xì)代碼");
for (CompletionChoice completionChoice : questionAnswer) {
System.out.println(completionChoice.getText());
}
List<CompletionChoice> openAiApi = OpenAiUtils.getOpenAiApi("使用SpringBoot框架進(jìn)行Http請(qǐng)求");
for (CompletionChoice completionChoice : openAiApi) {
System.out.println(completionChoice.getText());
}
}
}4 補(bǔ)充
如果使用上述方法出現(xiàn)超時(shí)錯(cuò)誤的,可以使用這個(gè)方法
4.1 添加依賴
<!-- openAi 最新版依賴 -->
<dependency>
<groupId>com.unfbx</groupId>
<artifactId>chatgpt-java</artifactId>
<version>1.0.6</version>
</dependency>
4.2 添加代碼
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 7890));
//日志輸出可以不添加
//HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new OpenAILogger());
//httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OpenAiClient openAiClient = OpenAiClient.builder()
.apiKey("sk-***********************************************")
.connectTimeout(50)
.writeTimeout(50)
.readTimeout(50)
.proxy(proxy)
//.interceptor(Collections.singletonList(httpLoggingInterceptor))
.apiHost("https://api.openai.com/")
.build();
CompletionResponse completions = openAiClient.completions("你是openAi嗎");
Arrays.stream(completions.getChoices()).forEach(System.out::println);5 總結(jié)
以上就是SpringBoot整合chatGPT的項(xiàng)目實(shí)踐的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot整合chatGPT的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- java調(diào)用chatgpt接口來(lái)實(shí)現(xiàn)專屬于自己的人工智能助手
- ChatGPT用于OA聊天助手導(dǎo)致訪問(wèn)量服務(wù)宕機(jī)
- 詳解微信小程序如何實(shí)現(xiàn)類似ChatGPT的流式傳輸
- ChatGPT編程秀之跨越認(rèn)知邊界
- python借助ChatGPT讀取.env實(shí)現(xiàn)文件配置隔離保障私有數(shù)據(jù)安全
- ChatGPT前端編程秀之別拿編程語(yǔ)言不當(dāng)語(yǔ)言
- 有了ChatGPT編程我們還需要使用那么多庫(kù)嗎
- LangChain簡(jiǎn)化ChatGPT工程復(fù)雜度使用詳解
相關(guān)文章
深度優(yōu)先與廣度優(yōu)先Java實(shí)現(xiàn)代碼示例
這篇文章主要介紹了深度優(yōu)先與廣度優(yōu)先Java實(shí)現(xiàn)代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之二叉樹
這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之二叉樹,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01
Java使用application.property讀取文件里面的值
本文通過(guò)實(shí)例代碼給大家介紹了Java使用application.property讀取文件里面的值,需要的朋友可以參考下2018-10-10
Java操作redis實(shí)現(xiàn)增刪查改功能的方法示例
這篇文章主要介紹了Java操作redis實(shí)現(xiàn)增刪查改功能的方法,涉及java操作redis數(shù)據(jù)庫(kù)的連接、設(shè)置、增刪改查、釋放資源等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
Spring?createBeanInstance實(shí)例化Bean
這篇文章主要為大家介紹了Spring?createBeanInstance實(shí)例化Bean源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Java數(shù)組轉(zhuǎn)換為L(zhǎng)ist的四種方式
這篇文章主要介紹了Java開發(fā)技巧數(shù)組轉(zhuǎn)List的四種方式總結(jié),每種方式結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
windows定時(shí)器配置執(zhí)行java jar文件的方法詳解
這篇文章主要給大家介紹了關(guān)于windows定時(shí)器配置執(zhí)行java jar文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

