大模型應用:基于Golang實現GPT模型API調用

在這里插入圖片描述

1.背景

當前OpenAI提供了開放接口,支持通過api的方式調用LLM進行文本推理、圖片生成等能力,但目前官方只提供了Python SDK。為了后續更方便集成和應用,可以采用Golang對核心推理調用接口進行封裝,提供模型調用能力。

2.相關準備

官方OpenAPI文檔:https://platform.openai.com/docs/overview

  1. 首先需要注冊OpenAI賬號,并且創建OpenAPI Key:https://platform.openai.com/api-keys,賬號內需要充值5美元用于API調用計費。充值需要有美聯儲值卡,可以選擇找代充,也可以直接買已有的賬號,鏈接:https://eylink.cn/
  2. OpenAPI官方調用域名為:https://api.openai.com,國內需要開啟全局科學上網才可調用,可以用代理域名:https://api.openai-proxy.com
  3. OpenAPI調用模型計費規則以消耗的Tokens計費:https://openai.com/api/pricing/
    1. gpt-3.5-turbo:2美元/百萬Tokens
    2. gpt-4-turbo:40美元/百萬Tokens
    3. gpt-4o:20美元/百萬Tokens

3.實現代碼

代碼地址已上傳:https://github.com/pbrong/llm_hub/blob/master/pkg/llm_caller/gpt_caller.go

  • helper.go
package llm_callerimport "context"var (_ LLMCaller = &gptLLMCaller{}
)type LLMCaller interface {Call(ctx context.Context, userPrompt string) (completions string, err error)
}type Message struct {Role    string `json:"role"`Content string `json:"content"`
}type GptCompletion struct {Created int `json:"created"`Usage   struct {CompletionTokens int `json:"completion_tokens"`PromptTokens     int `json:"prompt_tokens"`TotalTokens      int `json:"total_tokens"`} `json:"usage"`Model   string `json:"model"`ID      string `json:"id"`Choices []struct {FinishReason string `json:"finish_reason"`Index        int    `json:"index"`Message      struct {Role    string `json:"role"`Content string `json:"content"`} `json:"message"`} `json:"choices"`SystemFingerprint interface{} `json:"system_fingerprint"`Object            string      `json:"object"`
}
  • gpt_caller.go
package llm_callerimport ("context""encoding/json""fmt""llm_hub/conf""llm_hub/pkg/http"
)const (// 請求路徑CompletionsURL = "/v1/chat/completions"// 可用模型Gpt35TurboModel = "gpt-3.5-turbo"
)type gptLLMCaller struct {openAiKey   stringsystemText  stringtemperature float64maxTokens   int64
}func NewGptLLMCaller(ctx context.Context, systemText string, temperature float64, maxTokens int64) (*gptLLMCaller, error) {return &gptLLMCaller{openAiKey:   conf.LLMHubConfig.Openai.Key,systemText:  systemText,temperature: temperature,maxTokens:   maxTokens,}, nil
}func (caller *gptLLMCaller) Call(ctx context.Context, userPrompt string) (completion string, err error) {reqURL := conf.LLMHubConfig.Openai.Host + CompletionsURLbody := map[string]interface{}{"model":       Gpt35TurboModel,"temperature": caller.temperature,"stream":      false,"max_tokens":  caller.maxTokens,"messages":    nil,}body["messages"] = buildPromptMessages(caller.systemText, userPrompt)headers := buildAuthHeaders(caller.openAiKey)resp, err := http.PostWithHeader(reqURL, body, headers)if err != nil {return "", fmt.Errorf("GPT調用失敗, err = %v", err)}var gptCompletion GptCompletion_ = json.Unmarshal(resp, &gptCompletion)if len(gptCompletion.Choices) > 0 {completion = gptCompletion.Choices[0].Message.Content}return completion, nil
}func buildAuthHeaders(key string) map[string]string {headers := map[string]string{"Authorization": "Bearer " + key,}return headers
}func buildPromptMessages(system string, user string) []*Message {var messages []*Messagemessages = append(messages, &Message{Role:    "system",Content: system,})messages = append(messages, &Message{Role:    "user",Content: user,})return messages
}
  • 測試:gpt_caller_test.go
package llm_callerimport ("context""github.com/stretchr/testify/assert""llm_hub/conf""testing"
)func Test_gptLLMCaller_Call(t *testing.T) {conf.Init()ctx := context.Background()caller, err := NewGptLLMCaller(ctx, "hello gpt-3.5-turbo", 0.5, 128)assert.Nil(t, err)completion, err := caller.Call(ctx, "hello world")assert.Nil(t, err)t.Logf("gpt call success, completion = %v", completion)
}

成功實現gpt-3.5.turbo模型調用:

2024/05/26 22:17:11 post with header, url = https://api.openai-proxy.com/v1/chat/completions, request = {"max_tokens": 128,"messages": [{"role": "system","content": "hello gpt-3.5-turbo"},{"role": "user","content": "hello world"}],"model": "gpt-3.5-turbo","stream": false,"temperature": 0.5
}, response = {"id": "chatcmpl-9T8yMDeJDEHKyN70Skk3prHvHZBkz","object": "chat.completion","created": 1716733030,"model": "gpt-3.5-turbo-0125","choices": [{"index": 0,"message": {"role": "assistant","content": "Hello! How can I assist you today?"},"logprobs": null,"finish_reason": "stop"}],"usage": {"prompt_tokens": 23,"completion_tokens": 9,"total_tokens": 32},"system_fingerprint": null
}gpt_caller_test.go:17: gpt call success, completion = Hello! How can I assist you today?
--- PASS: Test_gptLLMCaller_Call (1.31s)
PASS

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/16179.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16179.shtml
英文地址,請注明出處:http://en.pswp.cn/web/16179.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spark運行模式詳解

Spark概述 Spark 可以在多種不同的運行模式下執行,每種模式都有其自身的特點和適用場景。 部署Spark集群大體上分為兩種模式:單機模式與集群模式。大多數分布式框架都支持單機模式,方便開發者調試框架的運行環境。但是在生產環境中&#xff…

軟件web化的趨勢

引言 在信息技術飛速發展的今天,軟件Web化已成為一個不可忽視的趨勢。所謂軟件Web化,即將傳統的桌面應用軟件轉變為基于Web的應用程序,使用戶能夠通過瀏覽器進行訪問和使用。傳統軟件通常需要在用戶的計算機上進行安裝和運行,而W…

Cadence OrCAD學習筆記(3)capture使用技巧_1

本期介紹capture的一些使用技巧。資料來源于小破站up主硬小二 1、導出像Visio規格的圖紙 2、全局修改元件屬性 然后保存、關閉即可。 3、導出BOM 4、導出網表 5、元件自動編號 6、capture軟件和allegro關聯 7、新建原理圖symbol 以上為添加封裝庫的路徑 如果要創建多部分的sy…

積累|新質生產力之地方發展的不同賽道

“不要搞一種模式”。任何事物都是共性和個性的統一,也就是矛盾普遍性和特殊性的統一。就發展新質生產力而言,既要遵循新質生產力的普遍規律和共同特征,又要充分考慮各地、各產業的實際情況和特殊性,準確把握共性與個性。 總述 …

神器EasyRecovery2024中文電腦版下載!讓數據恢復不再難

在數字化時代,數據就是我們的財富。無論是重要的工作報告,還是那些珍貴的生活瞬間照片,或是我們與朋友間的聊天記錄,都儲存在我們的電腦或手機中。然而,有時候,意外總是突如其來,電腦突然崩潰&a…

C++Qt操作Lotus Domino數據庫 Lotus Domino C++連接Lotus Domino C++快速開發Lotus Domino

java連接domino C#連接domino python連接domino go連接domino,delphi連接domino Excel連接domino Flutter、微信小程序連接domino C 操作 Lotus Domino 數據庫:自動化與效率的結合 引言 在企業級應用中,Lotus Domino 提供了一個強大的協作平臺&#xff0…

【Linux】TCP協議【下一】{三次握手/四次揮手的深度解讀==狀態變化}

文章目錄 本篇知識需要有TCP協議【中】的知識!詳情點擊👇1.測試一:服務器start函數不定義任何行為(不調用accept)的三次握手狀態變化int listen(int sockfd, int backlog);的backlog參數全連接隊列當全連接隊列已滿&am…

BGP策略實驗(路徑屬性和選路規則)

要求: 1、使用preval策略,確保R4通過R2到達192.168.10.0/24 2、使用AS Path策略,確保R4通過R3到達192.168.11.0/24 3、配置MED策略,確保R4通過R3到達192.168.12.0/24 4、使用Local Preference策略,確保R1通過R2到達19…

Python輕松玩轉excel操作指導

目錄 一、一圖概覽 二、表格操作 三、內容操作 四、單元格操作 五、Pandas實現表格操作 六、常見場景示例 一、一圖概覽 ? ?本文主要對openpyxl庫的常用表格操作進行了梳理,熟練的運用后可極大地提升工作效率。 二、表格操作 #創建一個表格sheet.xlsx #…

LINQ(四) ——使用LINQ進行對象類型初始化

總目錄 C# 語法總目錄 上一篇:LINQ(三) ——查詢表達式/into關鍵字 LINQ 四 ——使用LINQ進行對象類型初始化 6. 使用LINQ進行對象初始化6.1 對象類型 6. 使用LINQ進行對象初始化 6.1 對象類型 需要聲明定義一個對象類,然后使用select 配合new關鍵字進…

C++編程揭秘:虛表機制與ABI兼容性的實例剖析

前言: 假設你的應用程序引用的一個庫某天更新了,雖然 API 和調用方式基本沒變,但你需要重新編譯你的應用程序才能使用這個庫,那么一般說這個庫是源碼兼容(Source compatible);反之,如…

C語言指針相關知識(第五篇章)(非常詳細版)

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、sizeof和strlen對比二、數組之間的比較(依據strlen和sizeof來呈現)(一)、一維整型數組(二&#…

Value-Based Reinforcement Learning(2)

Temporal Difference (TD) Learning 上節已經提到了如果我們有DQN,那么agent就知道每一步動作如何做了,那么DQN如何訓練那?這里面使用TD算法。 簡略分析: 是的估計 是的估計 所以: Deep Re…

對vue3/core源碼ref.ts文件API的認識過程

對toRef()API的認識的過程: 最開始認識toRef()是從vue3源碼中的ref.ts看見的,右側GPT已經舉了例子 然后根據例子,在控制臺輸出ref對象是什么樣子的: 這就是ref對象了,我們根據對象中有沒有__v_isRef來判斷是不是一個ref對象,當對象存在且__v_isRef true的時候他就判定為是一個…

Linux-組管理和權限管理

1 Liunx組的基本介紹: 在Linux中的每個用戶必須屬于一個組,不能獨立于組外。在Linux中每個文件都有所有者、所在組、其他組的概念 所有者所在組其它組改變用戶所在的組 2 文件/目錄的所有者 一般文件的創建者,誰創建了該文件,就…

Docker in Docker(DinD)原理與實踐

隨著云計算和容器化技術的快速發展,Docker作為開源的應用容器引擎,已經成為企業部署和管理應用程序的首選工具。然而,在某些場景下,我們可能需要在Docker容器內部再運行一個Docker環境,即Docker in Docker(…

002 CentOS 7.9 redis-7.2.5安裝及配置

https://github.com/redis/redis https://redis.io/insight/#insight-form 安裝及配置 在CentOS 7.9上安裝和配置Redis 7.2.5版本,可以遵循以下詳細步驟: 一、準備工作 確保安裝包已準備好: 確認您已經下載了redis-7.2.5.tar.gz安裝包&a…

從程序被SQL注入來MyBatis 再談 #{} 與 ${} 的區別

緣由 最近在的一個項目上面,發現有人在給我搞 SQL 注入,我真的想說我那么點資源測試用的阿里云服務器,個人估計哈,估計能抗住他的請求。狗頭.png 系統上面的截圖 數據庫截圖 說句實在的,看到這個之后我立馬就是在…

游戲找不到d3dcompiler_43.dll怎么辦,教你5種可靠的修復方法

在電腦使用過程中,我們經常會遇到一些錯誤提示,其中之一就是“找不到d3dcompiler43.dll”。這個問題通常出現在游戲或者圖形處理軟件中,它會導致程序無法正常運行。為了解決這個問題,我經過多次嘗試和總結,找到了以下五…

idea2023的git從dev分支合并到主分支master

1.本地項目切換到主分支master 右鍵項目-git-Branches 依次點擊項目-Remote-Origin-master-CheckOut 現在你的idea中的這個項目就是遠程master分支的代碼了。 2.合并dev分支到master 右擊項目-git-Merge 選擇origin-dev 點擊Merge按鈕,此時只是合并到本地的maste…