教你使用 Go 语言访问智谱 AI 大模型!

AI 大模型太火爆了!我在工作中经常使用它们,感觉已经离不开了!

最近测试了智谱 AI 大模型,实测下来感觉还挺不错的。

官方提供了体验包,注册并实名认证之后有 300 万 token,非常壕!

今天的股市太绿了,我让它给我写个文案,没想到还给股民按摩了哈哈!

你是一名文学家,请你为我创作文案,主题是 2024 年,A 股走势绿得可怕。要求:语言流畅通顺,观点独特,行文风骚。

2024年,A股走势绿意盎然,恍若春日里的翠竹,节节败退。那抹绿,如同一幅泼墨山水,挥毫之间,惊心动魄。
这一年,股市的绿意犹如江南的梅雨,绵延不绝,投资者们的心情也随着这绿意,起伏不定。有人调侃:“绿”成了心头大患,也有人戏言:“要想生活过得去,头上总得带点绿。”
然而,在这片绿海之中,智者看到了机遇,勇者捕捉到了逆袭的曙光。绿得可怕,恰似风雨前的乌云,预示着一场翻天覆地的变革即将来临。
风骚独步的投资者,把这片绿色视为一种挑战,一种磨砺。他们深知,在这片绿意盎然的A股市场,唯有独具慧眼,方能洞察先机,把握那稍纵即逝的盈利机会。
绿得可怕,是因为市场在洗牌,在重塑。那些站在风口浪尖的企业,或将涅槃重生,或将黯然离场。而作为投资者的我们,唯有紧跟时代步伐,拥抱变革,方能在这片绿色的股市中,破茧成蝶,翩翩起舞。
2024年,A股走势绿得可怕,但这绿色背后,却蕴藏着无尽的机遇与挑战。让我们以独特的视角,审视这片绿色的股市,携手共进,书写属于我们的辉煌篇章。

我平时使用 Go 语言,但我发现官方只给了 Python 和 Java 的接口!

这对于我们 Go 语言开发者来说,确实有点不方便。

翻遍了全球最大的男性交友平台——GitHub!Go 语言一个 SDK 都没有!难道要自己手写?

对我这种喜欢偷懒的人来说,是不可能自己写的。

我坏了十个键盘,每一个都是坏了 Ctrl C V 这三个键。

研究了下接口文档([智谱AI开放平台]),发现智谱 AI 的 v4 版本接口和 OpenAI 的接口长得挺像的!

那就用 go-openai 这个包试试水!

折腾下来,发现两个问题:

第一个问题是,智谱 AI 的接口认证要用 jwt 生成 token,这个在网上一搜,没人做过。

根据文档,我自己写了个函数,得到 Authorization 头部后,传给 go-openai 作为请求的 Header 头发出去!

import "github.com/golang-jwt/jwt/v5"

// apikey 为智谱提供的 API Key
func splitAPIKey(apikey string) (string, string) {
	parts := strings.Split(apikey, ".")
	if len(parts) != 2 {
		return "", ""
	}
	return parts[0], parts[1]
}

func getAuthorization(authToken string) string {
	id, secret := splitAPIKey(authToken)
	payload := jwt.MapClaims{
		"api_key":   id,
		"exp":       time.Now().Add(3 * time.Minute).UnixMilli(),
		"timestamp": time.Now().UnixMilli(),
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, payload)
	token.Header["sign_type"] = "SIGN"
	res, _ := token.SignedString([]byte(secret))
	return res
}

第二个问题是,你能通过认证,但调用失败!!!

我捣鼓了一下午,总算找到了罪魁祸首!

排查的方式是,将我的请求复制成 cURL 到终端,发现是能正常响应的!!!

而 go-openai 包在底层发送请求的时候,会自己加上以下头部:

	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Accept", "text/event-stream")
	req.Header.Set("Cache-Control", "no-cache")
	req.Header.Set("Connection", "keep-alive")

	resp, err := client.config.HTTPClient.Do(req) //nolint:bodyclose // body is closed in stream.Close()
	if err != nil {
		return new(streamReader[T]), err
	}

智谱 AI 服务器端,是不支持 Accept: text/event-stream 的!!!

感兴趣的同学可以自己测试下,只要带上 Accept 头就会报错,即便返回接口就是 text/event-stream,原因不明。

那该如何解决这个问题呢?我发现 go-openai 包里的 requestBuilder 是个 interface,但可惜没有暴露出来!

如果它暴露出来了,我可以套娃后替换它!不过请求头是在 requestBuilder 之后,所以这个方案只能放弃。

但它提供了自定义的 HTTPClient!

而 HTTPClient 最终会请求到 client.config.HTTPClient.Do(req) 方法!

所以用 RoundTrip(*Request) (*Response, error) 接口截获请求就完事了!

怎么搞呢?灰常简单:

type removeAcceptHeaderRoundTrip struct{}

func (s *removeAcceptHeaderRoundTrip) RoundTrip(req *http.Request) (resp *http.Response, err error) {
	req.Header.Del("Accept")
	resp, err = http.DefaultTransport.RoundTrip(req)
	return
}

然后初始化的时候,换成我们的 RoundTrip 就好了!

	cfg := openai.DefaultConfig(authorization)
	cfg.BaseURL = "https://open.bigmodel.cn/api/paas/v4"
	cfg.HTTPClient.Transport = &removeAcceptHeaderRoundTrip{} // 换成我们的 RoundTrip
	cli := openai.NewClientWithConfig(cfg)
	stream, err := cli.CreateChatCompletionStream(ctx, openai.ChatCompletionRequest{
		// Model: "glm-3-turbo",
		Model: "glm-4",
		Messages: []openai.ChatCompletionMessage{
			{Role: openai.ChatMessageRoleUser, Content: input},
		},
	})

是不是很惊艳!!!interface 大法好!抽象得当,有时候写代码真的就是几分钟的事情!!!

不得不说 Go 的标准库是真的舒服,简单翻一下代码,就知道怎么写了,1 分钟的事情干完下班!!!

现在这个就是活生生的例子……

假如没有暴露 RoundTrip 接口,那你什么都做不了,你只能硬质头皮自己写 SDK 写反射写各种恶心的黑科技……

总之,写代码抽象思维很重要,需要时刻注意代码的领域和边界!!!

夜已深,我把完整的代码贴上来吧,大家自行食用:

package main

import (
	"context"
	"errors"
	"fmt"
	"io"
	"net/http"
	"strings"
	"time"

	"github.com/golang-jwt/jwt/v5"
	"github.com/sashabaranov/go-openai"
)

func main() {
	input := `你是一名文学家,请你为我创作文案,主题是2024年,A股走势绿得可怕。要求:语言流畅通顺,观点独特,行文风骚。
`
	ctx := context.Background()
	authToken := "......"
	authorization := getAuthorization(authToken)
	cfg := openai.DefaultConfig(authorization)
	cfg.BaseURL = "https://open.bigmodel.cn/api/paas/v4"
	cfg.HTTPClient.Transport = &removeAcceptHeaderRoundTrip{} // 替换成我们自己的
	cli := openai.NewClientWithConfig(cfg)
	stream, err := cli.CreateChatCompletionStream(ctx, openai.ChatCompletionRequest{
		// Model: "glm-3-turbo",
		Model: "glm-4",
		Messages: []openai.ChatCompletionMessage{
			{Role: openai.ChatMessageRoleUser, Content: input},
		},
	})
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	defer stream.Close()

	fmt.Print(input)
	fmt.Println("")

	for {
		response, e := stream.Recv()
		if errors.Is(e, io.EOF) {
			break
		}
		if e != nil {
			break
		}
		content := response.Choices[0].Delta.Content
		fmt.Print(content)
	}

	fmt.Println("")

	return
}

func getAuthorization(authToken string) string {
	id, secret := splitAPIKey(authToken)
	payload := jwt.MapClaims{
		"api_key":   id,
		"exp":       time.Now().Add(3 * time.Minute).UnixMilli(),
		"timestamp": time.Now().UnixMilli(),
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, payload)
	token.Header["sign_type"] = "SIGN"
	res, _ := token.SignedString([]byte(secret))
	return res
}

func splitAPIKey(apikey string) (string, string) {
	parts := strings.Split(apikey, ".")
	if len(parts) != 2 {
		return "", ""
	}
	return parts[0], parts[1]
}

type removeAcceptHeaderRoundTrip struct{}

func (s *removeAcceptHeaderRoundTrip) RoundTrip(req *http.Request) (resp *http.Response, err error) {
	req.Header.Del("Accept")
	resp, err = http.DefaultTransport.RoundTrip(req)
	return
}

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值