大模型应用:基于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.mzph.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 #…

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 文件/目录的所有者 一般文件的创建者,谁创建了该文件,就…

从程序被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…

每日一题---有效的括号问题

文章目录 前言1.题目以及分析2.参考代码 前言 前面我们学习了栈的相关操作,现在我们做一道题,进行巩固 Leetcode—有效的括号 1.题目以及分析 这道题就可以使用栈进行操作,因为把最左边的括号当成栈底,最右边的是栈顶&#xff0c…

【每日刷题】Day49

【每日刷题】Day49 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 110. 平衡二叉树 - 力扣(LeetCode) 2. 501. 二叉搜索树中的众数 - 力扣&…

基于YOLOv8的车牌检测与识别(CCPD2020数据集)

前言 本篇博客主要记录在autodl服务器中基于yolov8实现车牌检测与识别,以下记录实现全过程~ yolov8源码:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite 一、环境配置 …

27【Aseprite 作图】盆栽——拆解

1 橘子画法拆解 (1)浅色3 1 0;深色0 2 3 就可以构成一个橘子 (2)浅色 2 1;深色1 0 (小个橘子) (3)浅色 2 1 0;深色1 2 3 2 树根部分 (1)底部画一条横线 (2)上一行 左空2 右空1 【代表底部重心先在右】 (3)再上一行,左空1,右空1 (4)再上一行,左突出1,…