一文学会大模型开发Eino框架的模型调用方法
本文主要介绍在Eino框架中如何构造和模型的交互
包括但不限于介绍官方demo以及其他调用方式
文章目录
- 什么是ChatModel
- 如何调用
- 数据结构定义
- 直接调用
- 流式Demo
- 放在图中调用
- 如何实现自定义的ChatModel
什么是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 mainimport ("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 mainimport ("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 mainimport ("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