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

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…