今天我们初次体验大名鼎鼎的人工智能开源框架 langchain 的Go语言版 langchaingo。本文将初步介绍基于智谱的AI开放平台,通过 GLM-4 模型运行本地 langchaingo 项目。
GLM-4模型介绍
GLM-4(General Language Modeling-4)模型是一个先进的自然语言处理模型,它属于GLM系列模型,这个系列模型是由清华大学知识工程实验室(KEG)提出的。GLM模型结合了BERT和GPT的优势,旨在处理多种语言任务,包括但不限于文本分类、序列标注、自然语言推理、机器翻译、文本生成等。
此外,GLM-4模型在注册账号后,会赠送 500w token用于测试使用。实名认证成功后,
会再赠送500w token用于测试。
langchaingo 介绍
根据官方介绍,LangchainGo 是 LangChain 的 Go 语言的版本。目前社区非常活跃,这篇文章将会介绍在本地通过 Go 语言环境进行 langchaingo 项目的使用介绍。
go get github.com/tmc/langchaingo
导入 langchaingo package到本地后,还需要通过注册智谱AI开放平台,获取API-KEY。
该步骤较为简单,只需要访问复制即可。
package main
import (
"context"
"fmt"
"github.com/tmc/langchaingo/llms"
"github.com/tmc/langchaingo/llms/openai"
"log"
)
func main() {
// 配置 glm-4 模型基础必要信息
llm, err := openai.New(
openai.WithModel("glm-4"),
openai.WithBaseURL("https://open.bigmodel.cn/api/paas/v4/"),
openai.WithToken("*****************************************"),
)
if err != nil {
panic(err)
}
ctx := context.Background()
// 构建聊天消息内容
// 该部分代码用于创建并填充一个包含系统消息和人类消息的content切片。
// content切片将包含关于项羽和刘邦的介绍请求
var content []llms.MessageContent
// 增加 system 消息
content = append(content, llms.TextParts(llms.ChatMessageTypeSystem, "You are a chatbot."))
// 增加 human 消息
content = append(content, llms.TextParts(llms.ChatMessageTypeHuman, "帮我介绍一下项羽和刘邦."))
// 调用模型生成回复
if _, err = llm.GenerateContent(ctx, content,
// 设置最大生成长度
llms.WithMaxTokens(2048),
// 设置 temperature
llms.WithTemperature(0.9),
// 设置流式输出
llms.WithStreamingFunc(func(ctx context.Context, chunk []byte) error {
fmt.Print(string(chunk))
return nil
})); err != nil {
log.Fatal(err)
}
}
上面的代码部分,主要分为3个部分:
配置 LLM。即配置模型的基本必要信息,如模型名称、模型的base-url以及模型的密钥部分。这块的基础信息都可以从智谱AI开放平台以及“接口文档-langchain sdk使用” 中直接获取。
构建基本聊天内容。其中 llms.ChatMessageTypeSystem 可以理解为 langchain 框架中的 system 角色,即用于传递系统级别的指示或设置对话的背景。这种消息通常由系统或开发者设定,用来影响对话的整体方向或提供背景信息。例如,你可以使用 system 消息来设定AI助手的角色、提供对话的背景信息或指定特定的行为规范;llms.ChatMessageTypeHuman 则对应代表 human 角色,即代表由用户或对话中的人类参与者发送的消息。这些消息是对话的主要输入,AI助手基于这些输入生成响应。
发送请求并构建返回内容。通过调用 llm 的 GenerateContent 方法,同时通过 llm 的 WithStreamingFunc 方法流式输出(即 stream=True);当然同样也可以通过 GenerateContent 方法直接返回 *llms.ContentResponse,并进行取值输出,如下所示:
response, err := llm.GenerateContent(ctx, content,
// 设置最大生成长度
llms.WithMaxTokens(2048),
// 设置 temperature
llms.WithTemperature(0.9),
)
if err != nil {
log.Fatal(err)
}
fmt.Println(response.Choices[0].Content)
初步总结
langchaingo 项目目前距离 langchain 项目覆盖的功能还有段距离,但是社区的活跃度一直都比较稳定,此外最近测试,像 ollama 部署的 qwen1.5 模型,通过 langchaingo 测试整体效果也不错,可以持续关注。
后续除了继续深入 langchaingo 之外,也会不定期更新 ollama 的使用指南和 go 语言的其他场景~
参考内容
langchaingo: https://github.com/tmc/langchaingo
智谱AI开放平台: https://maas.aminer.cn/