一文学会大模型开发Eino框架的模型调用方法
Eino框架如何使用chatModel调用模型
·
本文主要介绍在Eino框架中如何构造和模型的交互
包括但不限于介绍官方demo以及其他调用方式
什么是ChatModel
参考官方定义
总的来说就是通过流式or非流式的方式调用部署在某处的大模型以获取结果的组件
如何调用
数据结构定义
type BaseChatModel interface {
Generate(ctx context.Context, input []*schema.Message, opts ...Option) (*schema.Message, error)
Stream(ctx context.Context, input []*schema.Message, opts ...Option) (
*schema.StreamReader[*schema.Message], error)
}
type ToolCallingChatModel interface {
BaseChatModel
// WithTools returns a new ToolCallingChatModel instance with the specified tools bound.
// This method does not modify the current instance, making it safer for concurrent use.
WithTools(tools []*schema.ToolInfo) (ToolCallingChatModel, error)
}
实现了上述三个方法的就可以在任何地方被视为一个ChatModel组件,但是现在在最新的代码中官方建议实现ToolCallingChatModel,比如这样
以火山引擎上的模型为例
其余的一些模型平台的实现大家自行参考https://www.cloudwego.io/zh/docs/eino/ecosystem_integration/chat_model/,目前字节,阿里,百度,openai等平台的模型都可以传参快速调用了,如果上述平台没有覆盖就需要自己实现,后面会给大家demo
豆包的话不光可以通过API_KEY也可以通过EndPointID进行参考这里
直接调用
模型的参数建议写配置文件里,实际生产环境下这东西应该是支持独立于代码快速发布的,但是自己玩的话怎么来都行,截图如下
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/cloudwego/eino-ext/components/model/ark"
"github.com/cloudwego/eino/schema"
"github.com/joho/godotenv"
)
func Generate() {
// // 加载.env文件
err := godotenv.Load("./model.env")
if err != nil {
fmt.Println("Error loading.env file:", err)
return
}
//openAIBaseURL := os.Getenv("OPENAI_BASE_URL")
ctx := context.Background()
timeout := 30 * time.Second
// 初始化模型
model, err := ark.NewChatModel(ctx, &ark.ChatModelConfig{
APIKey: os.Getenv("OPENAI_API_KEY"),
Model: os.Getenv("OPENAI_MODEL_NAME"),
Timeout: &timeout,
})
if err != nil {
panic(err)
}
// 准备消息
messages := []*schema.Message{
schema.SystemMessage("你是一个助手"),
schema.UserMessage("你好"),
}
// 生成回复
response, err := model.Generate(ctx, messages)
if err != nil {
panic(err)
}
// 处理回复
println(response.Content)
// 获取 Token 使用情况
if usage := response.ResponseMeta.Usage; usage != nil {
println("提示 Tokens:", usage.PromptTokens)
println("生成 Tokens:", usage.CompletionTokens)
println("总 Tokens:", usage.TotalTokens)
}
}
非流式的调用结果如下
流式Demo
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/cloudwego/eino-ext/components/model/ark"
"github.com/cloudwego/eino/schema"
"github.com/joho/godotenv"
)
func Generate() {
// // 加载.env文件
err := godotenv.Load("./model.env")
if err != nil {
fmt.Println("Error loading.env file:", err)
return
}
//openAIBaseURL := os.Getenv("OPENAI_BASE_URL")
ctx := context.Background()
timeout := 30 * time.Second
// 初始化模型
model, err := ark.NewChatModel(ctx, &ark.ChatModelConfig{
APIKey: os.Getenv("OPENAI_API_KEY"),
Model: os.Getenv("OPENAI_MODEL_NAME"),
Timeout: &timeout,
})
if err != nil {
panic(err)
}
// 准备消息
messages := []*schema.Message{
schema.SystemMessage("你是一个助手"),
schema.UserMessage("你好"),
}
// 生成回复
// response, err := model.Generate(ctx, messages)
// if err != nil {
// panic(err)
// }
// // 处理回复
// println(response.Content)
// // 获取 Token 使用情况
// if usage := response.ResponseMeta.Usage; usage != nil {
// println("提示 Tokens:", usage.PromptTokens)
// println("生成 Tokens:", usage.CompletionTokens)
// println("总 Tokens:", usage.TotalTokens)
// }
st, _ := model.Stream(ctx, messages)
for {
msg, err := st.Recv()
if err != nil {
st.Close()
break
}
if msg.Content != "" {
fmt.Printf("流式调用当前包结果:%s\n", msg.Content)
}
}
}

对速度有要求的话是一定要流式的
放在图中调用
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/cloudwego/eino-ext/components/model/ark"
"github.com/cloudwego/eino/compose"
"github.com/cloudwego/eino/schema"
"github.com/joho/godotenv"
)
func modelGrapg() {
// // 加载.env文件
err := godotenv.Load("./model.env")
if err != nil {
fmt.Println("Error loading.env file:", err)
return
}
//openAIBaseURL := os.Getenv("OPENAI_BASE_URL")
ctx := context.Background()
timeout := 30 * time.Second
// 初始化模型
model, err := ark.NewChatModel(ctx, &ark.ChatModelConfig{
APIKey: os.Getenv("OPENAI_API_KEY"),
Model: os.Getenv("OPENAI_MODEL_NAME"),
Timeout: &timeout,
})
if err != nil {
panic(err)
}
g := compose.NewGraph[[]*schema.Message, *schema.Message]()
g.AddChatModelNode("model_node", model)
g.AddEdge(compose.START, "model_node")
g.AddEdge("model_node", compose.END)
modelRunnable, err := g.Compile(ctx)
if err != nil {
panic(err)
}
res, err := modelRunnable.Invoke(ctx, []*schema.Message{
schema.SystemMessage("你是一个助手"),
schema.UserMessage("你好"),
})
if err != nil {
panic(err)
}
fmt.Println(res.Content)
}
如何实现自定义的ChatModel
参考官方文档实现就好了,demo已经很详细了
https://www.cloudwego.io/zh/docs/eino/core_modules/components/chat_model_guide/#%E8%87%AA%E8%A1%8C%E5%AE%9E%E7%8E%B0%E5%8F%82%E8%80%83
更多推荐

所有评论(0)