一、ENIO 大模型交互组件
ChatModel
chatmodel组件是一个与大模型交互的组件,其是与大模型交互的核心组件,但我们使用的是其实现,其官方提供了很多实现例如:openai、gemini、qwen等等,本文先依据ark进行实现。
初始化一个go项目
go mod init awesome-eino
一个最简单的ChatDemo
main.go
go
package main
import (
"context"
"os"
"github.com/cloudwego/eino-ext/components/model/ark"
"github.com/cloudwego/eino/schema"
"github.com/joho/godotenv"
)
func main() {
err := godotenv.Load(".env")
if err != nil {
panic(err)
}
ctx := context.Background()
model, err := ark.NewChatModel(ctx, &ark.ChatModelConfig{
APIKey: os.Getenv("ARK_API_KEY"),
Model: os.Getenv("MODEL"),
})
input := []*schema.Message {
schema.SystemMessage("你是一个可爱的高中女生"),
schema.UserMessage("你好"),
}
response, err := model.Generate(ctx, input)
if err != nil {
panic(err)
}
print(response.Content)
}
.env
ARK_API_KEY="xxxxxxxx"
MODEL="doubao-seed-1-6-flash-250828"
EMBEDDER="doubao-embedding-text-240715"
这里运行起来之后就就会有回复啦
流式返回
go
package main
import (
"context"
"os"
"github.com/cloudwego/eino-ext/components/model/ark"
"github.com/cloudwego/eino/schema"
"github.com/joho/godotenv"
)
func main() {
err := godotenv.Load(".env")
if err != nil {
panic(err)
}
ctx := context.Background()
model, err := ark.NewChatModel(ctx, &ark.ChatModelConfig{
APIKey: os.Getenv("ARK_API_KEY"),
Model: os.Getenv("MODEL"),
})
input := []*schema.Message{
schema.SystemMessage("你是一个可爱的高中女生"),
schema.UserMessage("你好"),
}
/*
response, err := model.Generate(ctx, input)
if err != nil {
panic(err)
}
print(response.Content)
*/
reader, err := model.Stream(ctx, input)
if err != nil {
panic(err)
}
defer reader.Recv()
// 这种无限循环的循环结束方式是,所有信息打印完毕之后的报错导致的循环推出,这是不好的写法,这里由于demo先这样写了
for {
chunk, err := reader.Recv()
if err != nil {
panic(err)
}
print(chunk.Content)
}
}
ChatTemplate
ChatTemplate 是一个可以以更方便的形式进行自己的提示词传递和定制化大模型交互的组件,我们在使用大模型交互组件的时候,ChatTemplate可以帮助我们更好的实现大模型交互。
go
package main
import (
"context"
"os"
"github.com/cloudwego/eino-ext/components/model/ark"
"github.com/cloudwego/eino/components/prompt"
"github.com/cloudwego/eino/schema"
"github.com/joho/godotenv"
)
func main() {
err := godotenv.Load(".env")
if err != nil {
panic(err)
}
ctx := context.Background()
model, err := ark.NewChatModel(ctx, &ark.ChatModelConfig{
APIKey: os.Getenv("ARK_API_KEY"),
Model: os.Getenv("MODEL"),
})
// input := []*schema.Message{
// schema.SystemMessage("你是一个可爱的高中女生"),
// schema.UserMessage("你好"),
// }
// 这里是 ChatTemplate 的使用
template := prompt.FromMessages(schema.FString,
schema.SystemMessage("你是一个{role}"),
&schema.Message{
Role: schema.User,
Content: "请帮帮我,堂吉诃德先生:{task}",
},
)
params := map[string]any{
"role": "著名文学人物堂吉诃德",
"task": "写一首关于周末的押韵的诗句",
}
message, err := template.Format(ctx, params)
response, err := model.Generate(ctx, message)
if err != nil {
panic(err)
}
print(response.Content)
}