国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java調(diào)用chatgpt接口,實現(xiàn)專屬于自己的人工智能助手

這篇具有很好參考價值的文章主要介紹了java調(diào)用chatgpt接口,實現(xiàn)專屬于自己的人工智能助手。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

今天突然突發(fā)奇想,就想要用java來調(diào)用chatget的接口,實現(xiàn)自己的聊天機器人,但是網(wǎng)上找文章,屬實是少的可憐(可能是不讓發(fā)吧)。找到了一些文章,但是基本都是通過調(diào)用別人的庫來完成的,導(dǎo)入其他的jar還有不低的學(xué)習(xí)成本,于是就自己使用HttpClient5寫了一個,在這里講解一下思路。

導(dǎo)包

對于http調(diào)用,我使用的是比較流行的httpclient5,然后直接創(chuàng)建了一個springboot項目,方便以后對外提供接口。

    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.5.3</version>
    </parent>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents.client5/httpclient5 -->
        <dependency>
            <groupId>org.apache.httpcomponents.client5</groupId>
            <artifactId>httpclient5</artifactId>
            <version>5.2.1</version>
        </dependency>

    </dependencies>

基本說明

在編寫代碼之前,這個先給出HttpClient的Api文檔 api文檔

java chatgpt,java小程序,java,chatgpt,人工智能,http,https

我們在編寫代碼之前需要了解官方提供的接口如何進行訪問以及返回的結(jié)果是什么

請求參數(shù)

官方文檔地址為 文檔,請求參數(shù)必須填寫的內(nèi)容如下

{
  "model": "gpt-3.5-turbo",
  "messages": [{"role": "user", "content": "Hello!"}]
}

一個是model,一個是messages。model根據(jù)自己的情況來選擇,聊天的話就是gpt-3.5-turbo,下面的messages里面包含n個對象,每個對象有role和content,role表示角色,content表示內(nèi)容。
下面為官方文檔中的解釋

java chatgpt,java小程序,java,chatgpt,人工智能,http,https

簡單理解就是我們要問問題,role就是user。如果要實現(xiàn)連續(xù)對話,那么就將返回的返回內(nèi)容設(shè)置到messages中,role設(shè)置為返回的role。

響應(yīng)參數(shù)

下面直接給出響應(yīng)的內(nèi)容

{
 'id': 'chatcmpl-6p9XYPYSTTRi0xEviKjjilqrWU2Ve',
 'object': 'chat.completion',
 'created': 1677649420,
 'model': 'gpt-3.5-turbo',
 'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87},
 'choices': [
   {
    'message': {
      'role': 'assistant',
      'content': 'The 2020 World Series was played in Arlington, Texas at the Globe Life Field, which was the new home stadium for the Texas Rangers.'},
    'finish_reason': 'stop',
    'index': 0
   }
  ]
}

我們問問題的答案就在choices.message下的content中,而role就代表了chatGpt扮演的角色。看到這我們就應(yīng)該知道該干嘛了吧肯定是創(chuàng)建對應(yīng)的VO類啊。

創(chuàng)建請求和響應(yīng)的VO類

下面5個類就對應(yīng)了我們發(fā)送和接收的各種信息

ChatGptMessage類

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ChatGptMessage {
        String role;
        String content;
}

ChatGptRequestParameter 類

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ChatGptRequestParameter {

    String model = "gpt-3.5-turbo";

    List<ChatGptMessage> messages = new ArrayList<>();

    public void addMessages(ChatGptMessage message) {
        this.messages.add(message);
    }

}

ChatGptResponseParameter 類

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ChatGptResponseParameter {

    String id;
    String object;
    String created;
    String model;
    Usage usage;
    List<Choices> choices;
}

Choices 類

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Choices {

    ChatGptMessage message;
    String finish_reason;
    Integer index;
}

Usage 類

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Usage {

    String prompt_tokens;
    String completion_tokens;
    String total_tokens;
}

代碼編寫

不說廢話,首先創(chuàng)建一個CustomChatGpt類

public class CustomChatGpt {

}

然后定義一些成員屬性

    /**
     * 自己chatGpt的ApiKey
     */
    private String apiKey;
    /**
     * 使用的模型
     */
    private String model = "gpt-3.5-turbo-0301";
    /**
     * 對應(yīng)的請求接口
     */
    private String url = "https://api.openai.com/v1/chat/completions";
    /**
     * 默認編碼
     */
    private Charset charset = StandardCharsets.UTF_8;
        /**
     * 創(chuàng)建一個ChatGptRequestParameter,用于攜帶請求參數(shù)
     */
    private ChatGptRequestParameter chatGptRequestParameter = new ChatGptRequestParameter();

提供一個ApiKey的構(gòu)造器,創(chuàng)建該對象必須要傳入ApiKey

    public CustomChatGpt(String apiKey) {
        this.apiKey = apiKey;
    }

定義一個響應(yīng)超時時間

    /**
     * 響應(yīng)超時時間,毫秒
     */
    private int responseTimeout = 10000;

    public void setResponseTimeout(int responseTimeout) {
        this.responseTimeout = responseTimeout;
    }

編寫一個getAnswer方法,要求傳入一個CloseableHttpClient和一個問題

    public String getAnswer(CloseableHttpClient client, String question) {
    
    }

繼續(xù)實現(xiàn)方法,下面會完成一些參數(shù)的創(chuàng)建和設(shè)置

        // 創(chuàng)建一個HttpPost
        HttpPost httpPost = new HttpPost(url);
        // 創(chuàng)建一個ObjectMapper,用于解析和創(chuàng)建json
        ObjectMapper objectMapper = new ObjectMapper();
        // 設(shè)置請求參數(shù)
        chatGptRequestParameter.addMessages(new ChatGptMessage("user", question));
        HttpEntity httpEntity = null;
        try {
            // 對象轉(zhuǎn)換為json字符串
            httpEntity = new StringEntity(objectMapper.writeValueAsString(chatGptRequestParameter), charset);
        } catch (JsonProcessingException e) {
            System.out.println(question + "->json轉(zhuǎn)換異常");
            return null;
        }
        httpPost.setEntity(httpEntity);

下面會完成一些配置的設(shè)置

        // 設(shè)置請求頭
        httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
        // 設(shè)置登錄憑證
        httpPost.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + apiKey);

        // 用于設(shè)置超時時間
        RequestConfig config = RequestConfig
                .custom()
                .setResponseTimeout(responseTimeout, TimeUnit.MILLISECONDS)
                .build();
        httpPost.setConfig(config);

下面代碼會提交請求,解析響應(yīng),最后返回對應(yīng)問題的答案

        try {
            // 提交請求
            return client.execute(httpPost, response -> {
                // 得到返回的內(nèi)容
                String resStr = EntityUtils.toString(response.getEntity(), charset);
                // 轉(zhuǎn)換為對象
                ChatGptResponseParameter responseParameter = objectMapper.readValue(resStr, ChatGptResponseParameter.class);
                String ans = "";
                // 遍歷所有的Choices(一般都只有一個)
                for (Choices choice : responseParameter.getChoices()) {
                    ChatGptMessage message = choice.getMessage();
                    chatGptRequestParameter.addMessages(new ChatGptMessage(message.getRole(), message.getContent()));
                    String s = message.getContent().replaceAll("\n+", "\n");
                    ans += s;
                }
                // 返回信息
                return ans;
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 發(fā)生異常,移除剛剛添加的ChatGptMessage
        chatGptRequestParameter.getMessages().remove(chatGptRequestParameter.getMessages().size()-1);
        return "您當前的網(wǎng)絡(luò)無法訪問";

下面給出這個類的完整代碼

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ttpfx.vo.ChatGptMessage;
import com.ttpfx.vo.ChatGptRequestParameter;
import com.ttpfx.vo.ChatGptResponseParameter;
import com.ttpfx.vo.Choices;
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.HttpHeaders;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.io.entity.StringEntity;

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;

/**
 * @author ttpfx
 * @date 2023/3/23
 */
public class CustomChatGpt {
    /**
     * 自己chatGpt的ApiKey
     */
    private String apiKey;
    /**
     * 使用的模型
     */
    private String model = "gpt-3.5-turbo-0301";
    /**
     * 對應(yīng)的請求接口
     */
    private String url = "https://api.openai.com/v1/chat/completions";
    /**
     * 默認編碼
     */
    private Charset charset = StandardCharsets.UTF_8;


    /**
     * 創(chuàng)建一個ChatGptRequestParameter,用于攜帶請求參數(shù)
     */
    private ChatGptRequestParameter chatGptRequestParameter = new ChatGptRequestParameter();

    /**
     * 相應(yīng)超時時間,毫秒
     */
    private int responseTimeout = 1000;

    public void setResponseTimeout(int responseTimeout) {
        this.responseTimeout = responseTimeout;
    }

    public CustomChatGpt(String apiKey) {
        this.apiKey = apiKey;
    }

    public String getAnswer(CloseableHttpClient client, String question) {

        // 創(chuàng)建一個HttpPost
        HttpPost httpPost = new HttpPost(url);
        // 創(chuàng)建一個ObjectMapper,用于解析和創(chuàng)建json
        ObjectMapper objectMapper = new ObjectMapper();

        // 設(shè)置請求參數(shù)
        chatGptRequestParameter.addMessages(new ChatGptMessage("user", question));
        HttpEntity httpEntity = null;
        try {
            // 對象轉(zhuǎn)換為json字符串
            httpEntity = new StringEntity(objectMapper.writeValueAsString(chatGptRequestParameter), charset);
        } catch (JsonProcessingException e) {
            System.out.println(question + "->json轉(zhuǎn)換異常");
            return null;
        }
        httpPost.setEntity(httpEntity);


        // 設(shè)置請求頭
        httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
        // 設(shè)置登錄憑證
        httpPost.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + apiKey);

        // 用于設(shè)置超時時間
        RequestConfig config = RequestConfig
                .custom()
                .setResponseTimeout(responseTimeout, TimeUnit.MILLISECONDS)
                .build();
        httpPost.setConfig(config);
        try {
            // 提交請求
            return client.execute(httpPost, response -> {
                // 得到返回的內(nèi)容
                String resStr = EntityUtils.toString(response.getEntity(), charset);
                // 轉(zhuǎn)換為對象
                ChatGptResponseParameter responseParameter = objectMapper.readValue(resStr, ChatGptResponseParameter.class);
                String ans = "";
                // 遍歷所有的Choices(一般都只有一個)
                for (Choices choice : responseParameter.getChoices()) {
                    ChatGptMessage message = choice.getMessage();
                    chatGptRequestParameter.addMessages(new ChatGptMessage(message.getRole(), message.getContent()));
                    String s = message.getContent().replaceAll("\n+", "\n");
                    ans += s;
                }
                // 返回信息
                return ans;
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 發(fā)生異常,移除剛剛添加的ChatGptMessage
        chatGptRequestParameter.getMessages().remove(chatGptRequestParameter.getMessages().size()-1);
        return "您當前的網(wǎng)絡(luò)無法訪問";
    }
}

使用

下面就是測試代碼,我們只需要傳入一個CloseableHttpClient 和 question 即可

public class Test {
    public static void main(String[] args) throws IOException {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        String apiKey = "自己的ApiKey";
        CustomChatGpt customChatGpt = new CustomChatGpt(apiKey);
        // 根據(jù)自己的網(wǎng)絡(luò)設(shè)置吧
        customChatGpt.setResponseTimeout(20000);
        while (true) {
            System.out.print("\n請輸入問題(q退出):");
            String question = new Scanner(System.in).nextLine();
            if ("q".equals(question)) break;
            long start = System.currentTimeMillis();
            String answer = customChatGpt.getAnswer(httpClient, question);
            long end = System.currentTimeMillis();
            System.out.println("該回答花費時間為:" + (end - start) / 1000.0 + "秒");
            System.out.println(answer);
        }
        httpClient.close();
    }
}

下面為運行圖片

java chatgpt,java小程序,java,chatgpt,人工智能,http,https
java chatgpt,java小程序,java,chatgpt,人工智能,http,https

最后說明

對于ApiKey,只能說難者不會,會者不難,這個沒辦法教。

如果代碼無法運行,或者運行速度及其緩慢,請使用代理,在HttpClient里面可以很輕松的使用代理

        String proxyIp = "127.0.0.1";
        int proxyPort = 7890;
        HttpHost httpHost = new HttpHost(proxyIp, proxyPort);

上面就是一個示例,對于代理,這里也就無法繼續(xù)進行說明了。

如果我們完成了上面的功能,是不是就能夠?qū)ν馓峁┙涌冢缓髮懸粋€自己的網(wǎng)頁端的ChatGpt或者弄一個聊天機器人呢?當然沒問題啊


2023/3/27 23:27更新

很多人找我要這個小程序的demo,其實源代碼上面都已經(jīng)給出了。既然有人問,那么就給出這個demo的github地址 git地址

使用指令 git clone https://github.com/c-ttpfx/chatGPT.git 可以輕松的下載到本地


2023/3/31 19:54更新
上面這個代碼大家應(yīng)該發(fā)現(xiàn)了問題,就是返回很慢,原因就是我們請求不是異步的,是等待所有答案都給出了再返回,所以速度很慢,并且容易出現(xiàn)超時。

解決方法就是使用異步請求,大家請參照 使用chatgpt實現(xiàn)微信聊天小程序(秒回復(fù)),github開源(附帶鏈接) ,基本可以實現(xiàn)秒回復(fù)

2023/3/31 14:40更新
最新的代碼已經(jīng)支持代理,參考使用chatgpt實現(xiàn)微信聊天小程序(秒回復(fù)),github開源(附帶鏈接)文章來源地址http://www.zghlxwxcb.cn/news/detail-778942.html

到了這里,關(guān)于java調(diào)用chatgpt接口,實現(xiàn)專屬于自己的人工智能助手的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 在筆記本上搭建一個屬于自己的ChatGPT

    隨著ChatGPT的流行,許多開發(fā)者想要嘗試搭建一個ChatGPT服務(wù),本文對如何在電腦上搭建進行入門。 1.安裝Python和必要的庫 首先,需要在你的筆記本上安裝Python和必要的庫。你可以從Python官方網(wǎng)站(https://www.python.org/downloads/)下載最新版本的Python,然后使用pip安裝以下必要的庫

    2024年02月11日
    瀏覽(18)
  • 兩小時搭建屬于自己的chatGPT(ChatGLM)免硬件(白嫖)

    兩小時搭建屬于自己的chatGPT(ChatGLM)免硬件(白嫖)

    目錄 準備(注冊): 搭建: API模式: 測試: 總結(jié): 注冊modelscope(底層阿里云)免費使用服務(wù)器 https://modelscope.cn/ 按照圖片里的選擇(選擇其他好像不能創(chuàng)建成功) 可以白嫖60多個小時的配置 8核 32GB 顯存16G 預(yù)裝 ModelScope Library 預(yù)裝鏡像 ubuntu20.04-cuda11.3.0-py37-torch1.11.0-tf1.15.5-1.5.0 Cha

    2024年02月05日
    瀏覽(25)
  • 基于開源的 ChatGPT Web UI 項目,快速構(gòu)建屬于自己的 ChatGPT 站點

    基于開源的 ChatGPT Web UI 項目,快速構(gòu)建屬于自己的 ChatGPT 站點

    作為一個技術(shù)博主,了不起比較喜歡各種折騰,之前給大家介紹過 ChatGPT 接入微信,釘釘和知識星球(如果沒看過的可以翻翻前面的文章),最近再看開源項目的時候,發(fā)現(xiàn)了一個 ChatGPT Web UI 項目。 想著剛好之前沒有將 ChatGPT 接入過 Web UI ,有了這個開源項目可以拿來使用,

    2023年04月10日
    瀏覽(29)
  • 十分鐘教你部署一個屬于自己的chatgpt網(wǎng)站-(源碼)

    下面是一個簡單的十分鐘教程,教你如何部署一個屬于自己的ChatGPT網(wǎng)站,包括以下幾個步驟: 獲取GPT-3 API密鑰:為了使用GPT-3 API接口,我們需要先獲取API密鑰。在OpenAI官網(wǎng)上申請賬戶并訂閱GPT-3服務(wù)后,即可獲得API密鑰。 創(chuàng)建Flask應(yīng)用程序:Flask是一款Python Web框架,我們可以

    2024年02月05日
    瀏覽(28)
  • 使用ChatGPT加個人微信公眾號打造屬于自己的AI助手

    使用ChatGPT加個人微信公眾號打造屬于自己的AI助手

    相信現(xiàn)在不少人已經(jīng)體驗過ChatGPT,并被它的智能程度所折服。ChatGPT可以高效的完成許多事,但就目前來說使用還是限制不少,如何進一步使用它和如何更加方便使用它是現(xiàn)在許多人的思考問題。在此,給各位介紹一下如何使用微信公眾號和ChatGPT打造成一個方便的個人助手。

    2023年04月17日
    瀏覽(27)
  • 本地搭建屬于自己的ChatGPT:基于PyTorch+ChatGLM-6b+Streamlit+QDrant+DuckDuckGo

    本地搭建屬于自己的ChatGPT:基于PyTorch+ChatGLM-6b+Streamlit+QDrant+DuckDuckGo

    本地部署chatglm及緩解時效性問題的思路: 模型使用chatglm-6b 4bit,推理使用hugging face,前端應(yīng)用使用streamlit或者gradio。 微調(diào)對顯存要求較高,還沒試驗??梢越Y(jié)合LoRA進行微調(diào)。 緩解時效性問題:通過本地數(shù)據(jù)庫或者搜索引擎獲取特有數(shù)據(jù)或者實時數(shù)據(jù)作為生成模型的上下文

    2024年02月02日
    瀏覽(19)
  • 5分鐘實現(xiàn)調(diào)用ChatGPT接口API實現(xiàn)多輪問答

    5分鐘實現(xiàn)調(diào)用ChatGPT接口API完成多輪問答 最近ChatGPT也是火爆異常啊,在親自使用了幾個月之后,我發(fā)現(xiàn)這東西是真的好用,實實在在地提高了生產(chǎn)力。那么對于開發(fā)人員來說,有時候可能需要在自己的代碼里加入這樣一個智能問答的功能,我最近就出現(xiàn)了這樣的想法和需求,

    2024年02月03日
    瀏覽(32)
  • Java自定義類:打造屬于自己的編程世界

    Java自定義類:打造屬于自己的編程世界

    ?????CSDN主頁:夏志121的主頁 ??專欄地址:Java核心技術(shù)專欄 目錄 一、自定義類示例 二、隱式參數(shù)與顯式參數(shù) 三、封裝的優(yōu)點 ????????自定義類是Java中 最基本、也是最重要的 組成部分之一,使用者可以根據(jù)需求創(chuàng)建自己的數(shù)據(jù)類型,從而更加 高效 地構(gòu)建程序。 ?

    2024年02月05日
    瀏覽(22)
  • Python調(diào)用Open-AI接口實現(xiàn)ChatGPT

    一、前言 近年來,人工智能技術(shù)的廣泛應(yīng)用,為社會帶來了自動化和智能化的效率提升。自然語言處理技術(shù)的快速發(fā)展也提供了更多的人工智能應(yīng)用場景。本文將介紹如何使用Python編程語言,結(jié)合Open-AI接口實現(xiàn)ChatGPT的簡單應(yīng)用。 二、介紹 ChatGPT是一個能夠執(zhí)行在線對話的人

    2024年02月10日
    瀏覽(27)
  • [最新]Java SpringBoot請求調(diào)用OpenAI(ChatGPT3/3.5/4)相關(guān)接口核心方法(附100個OpenAI/ChatGPT key)

    前言 當下,OpenAI 存在著許多令人驚嘆的技術(shù),如 ChatGPT3/3.5/4,它們能夠生成高質(zhì)量的文章、翻譯語言、自動生成代碼,并且在許多領(lǐng)域都取得了廣泛的應(yīng)用。本文將向您介紹如何使用 Java HttpClient 調(diào)用 OpenAI 的 ChatGPT3/3.5/4 接口(如果需要支持Spring,并提供了 100 個 OpenAI/Chat

    2023年04月11日
    瀏覽(43)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包