大模型应用:基于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.rhkb.cn/news/332421.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MDK安装

MDK安装 1 MDK的差异2 切换MDK3 安装芯片支持包注意点 1 MDK的差异 不同版本MDK有略微的差别,比如:MDK536.EXE,支持版本5的交叉编译链。如下图所示: 而MDK539.EXE不支持版本5的交叉编译链,所以工作的时候&#xff0c…

方正畅享全媒体新闻采编系统 binary.do SQL注入漏洞复现

0x01 产品简介 方正畅享全媒体新闻生产系统是以内容资产为核心的智能化融合媒体业务平台,融合了报、网、端、微、自媒体分发平台等全渠道内容。该平台由协调指挥调度、数据资源聚合、融合生产、全渠道发布、智能传播分析、融合考核等多个平台组成,贯穿新闻生产策、采、编、发…

Docker提示某网络不存在如何解决,添加完网络之后如何删除?

Docker提示某网络不存在如何解决? 创建 Docker 网络 假设现在需要创建一个名为my-mysql-network的网络 docker network create my-mysql-network运行容器 创建网络之后,再运行 mysqld_exporter 容器。完整命令如下: docker run -d -p 9104…

压缩能力登顶 小丸工具箱 V1.0 绿色便携版

平常录制视频或下载保存的视频时长往往都很长,很多时候都想要裁剪、 截取出一些“精华片段”保留下来,而不必保存一整个大型视频那么浪费硬盘空间… 但如今手机或电脑上大多数的视频剪辑软件,切割视频一般都要等待很长时间导出或转换&#…

RK3568笔记二十五:RetinaFace人脸检测训练部署

若该文为原创文章,转载请注明原文出处。 一、介绍 Retinaface是来自insightFace的又一力作,基于one-stage的人脸检测网络。RetinaFace是在RetinaNet基础上引申出来的人脸检测框架,所以大致结构和RetinaNet非常像。 官方提供两种主干特征提取网…

struct.unpack_from()学习笔记

struct.unpack_from(fmt,b_data,offset) 按照指定的格式fmt,从偏移位置offset,对b_data开始解包,返回数据格式是一个元组(v1,v2…) fmt可以有: _struct.py: The remaining chars indicate types of args and must match exactly;…

1738. 找出第 K 大的异或坐标值

题目&#xff1a; 给你一个二维矩阵 matrix 和一个整数 k &#xff0c;矩阵大小为 m x n 由非负整数组成。 矩阵中坐标 (a, b) 的 值 可由对所有满足 0 < i < a < m 且 0 < j < b < n 的元素 matrix[i][j]&#xff08;下标从 0 开始计数&#xff09;执行异…

Springboot整合Minio对象存储超级详细讲解以及配置搭建

windows环境下搭建minio步骤 1.从minio官网进行查看详细信息 地址&#xff1a;https://min.io/里面有详细的配置信息搭建成功之后如下如所示&#xff1a;用户名密码默认情况下为 username&#xff1a;minioadmin password&#xff1a;minioadmin2.搭建成功之后的访问 地址&…

Jenkins + github 自动化部署配置

1 Jenkins安装 AWS EC2安装Jenkins&#xff1a;AWS EC2 JDK11 Jenkins-CSDN博客 AWS EC2上Docker安装Jenkins&#xff1a;https://blog.csdn.net/hhujjj2005/article/details/139078402 2 登录jenkins http://192.168.1.128:8080/ $ docker exec -it d1851d9e3386 /bin/ba…

避免锁表:为Update语句中的Where条件添加索引字段

最近在灰度环境中遇到一个问题&#xff1a;某项业务在创建数据时耗时异常长&#xff0c;但同样的代码在预发环境中并未出现此问题。起初我们以为是调用第三方接口导致的性能问题&#xff0c;但通过日志分析发现第三方接口的响应时间正常。最终&#xff0c;我们发现工单表的数据…

VSCODE gcc运行多个.c文件

一、简介 很多时候&#xff0c;开发者需要使用VSCODE进行C语言算法验证。而VSCODE的gcc编译&#xff0c;默认是只编译本文件的内容&#xff0c;其他.c文件是不参与编译的。这就给开发者带来很大的困扰&#xff0c;因为开发者不可能把所有的算法都写在一个.c文件&#xff0c;特别…

visual studio 2022 ssh 主机密钥算法失败问题解决

 Solution - aengusjiang 问题&#xff1a; I follow the document, then check sshd_config, uncomment“HostKey /etc/ssh/ssh_host_ecdsa_key” maybe need add the key algorithms: #HostKeyAlgorithms ssh-ed25519[Redacted][Redacted]rsa-sha2-256,rsa-sha2-512 Ho…

透视App投放效果,Xinstall助力精准分析,让每一分投入都物超所值!

在移动互联网时代&#xff0c;App的推广与投放成为了每一个开发者和广告主必须面对的问题。然而&#xff0c;如何精准地掌握投放效果&#xff0c;让每一分投入都物超所值&#xff0c;却是一个令人头疼的难题。今天&#xff0c;我们就来谈谈如何通过Xinstall这个专业的App全渠道…

Shell字符串变量

目标 能够使用字符串的3种方式 掌握Shell字符串拼接 掌握shell字符串截取的常用格式 能够定义Shell索引数组和关联数组 能够使用内置命令alias,echo,read,exit,declare操作 掌握Shell的运算符操作 Shell字符串变量 介绍 字符串&#xff08;String&#xff09;就是一系…

让大模型变得更聪明三个方向

让大模型变得更聪明三个方向 随着人工智能技术的飞速发展&#xff0c;大模型在多个领域展现出了前所未有的能力&#xff0c;但它们仍然面临着理解力、泛化能力和适应性等方面的挑战。那么&#xff0c;如何让大模型变得更聪明呢&#xff1f; 方向一&#xff1a;算法创新 1.1算…

Git--本地仓库

文章目录 工作区和暂存区工作区&#xff08;Working Directory&#xff09;版本库&#xff08;Repository&#xff09; 初始化git仓库添加文件到版本库步骤 查看修改内容查看工作区和暂存区状态已add文件已修改/新增 的未add文件git跟踪修改原理 查看提交历史版本回退撤销修改撤…

《python编程从入门到实践》day39加更

# 昨日知识点回顾 添加主题、条目 # 今日知识点学习 19.1.3 编辑条目 1.URL模式edit——entry # learning_logs/urls.py ---snip---# 用于编辑条目的页面path(edit_entry/<int:entry_id>/, views.edit_entry, nameedit_entry), ] 2.视图函数edit_entry() # views.py fr…

Docker搭建mysql性能测试环境

OpenEuler使用Docker搭建mysql性能测试环境 一、安装Docker二、docker安装mysql三、测试mysql连接 一、安装Docker 建立源文件vim /etc/yum.repos.d/docker-ce.repo增加内容[docker-ce-stable] nameDocker CE Stable - $basearch baseurlhttps://repo.huaweicloud.com/docker…

SVM原问题与对偶问题

目的&#xff1a;求出我们的f(X)&#xff0c;它代表着我们X映射到多维的情况&#xff0c;能够帮我们在多维中招到超平面进行分类。 1.优化问题&#xff1a; 1.1推荐好书&#xff1a; 1.2 优化理论中的原问题&#xff1a; 原问题和限制条件如下&#xff1a; 这是一个泛化性…

Linux基础(八):计算机基础概论

本篇博客简单介绍计算机的基础知识&#xff0c;为后续学习做个铺垫。 目录 一、计算机的基本组成 1.1 计算机组成五大部件 1.1.1 运算器&#xff08;Arithmetic Logic Unit&#xff0c;ALU&#xff09; 1.1.2控制器 &#xff08;Control Unit&#xff0c;CU&#xff09; …