实现一个基本的LLM应用
ChatModel 是 Eino 框架中对对话大模型的抽象,它提供了统一的接口来与不同的大模型服务(如 OpenAI、Ollama 等)进行交互。
ChatModel interface定义如下所示:
type ChatModel 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) BindTools(tools []*schema.ToolInfo) error }
ChatModel组件方法
- Generate方法
- 功能:生成完整的模型响应
- 参数:
- ctx:上下文对象,用于传递请求级别的信息,同时也用于传递 Callback Manager
- input:输入消息列表
- opts:可选参数,用于配置模型行为
- 返回值:
*schema.Message
:模型生成的响应消息- error:生成过程中的错误信息
- Stream方法
- 功能:以流式方式生成模型响应
- 参数:与 Generate 方法相同
- 返回值:
*schema.StreamReader[*schema.Message]
:模型响应的流式读取器- error:生成过程中的错误信息
- BindTools方法
- 功能:为模型绑定可用的工具
- 参数:
- tools:工具信息列表
- 返回值:
- error:绑定过程中的错误信息
schema.Message结构体
Message结构体如下所示,其中:
- Role字段有4种类型,分别为assistant、user、system、tool;
- Content字段支持多模态内容,文本、图片、音频等;
- ResponseMeta字段包含响应原因以及token使用统计;
type Message struct { // Role 表示消息的角色(system/user/assistant/tool) Role RoleType // Content 是消息的文本内容 Content string // MultiContent 是多模态内容,支持文本、图片、音频等 MultiContent []ChatMessagePart // Name 是消息的发送者名称 Name string // ToolCalls 是 assistant 消息中的工具调用信息 ToolCalls []ToolCall // ToolCallID 是 tool 消息的工具调用 ID ToolCallID string // ResponseMeta 包含响应的元信息 ResponseMeta *ResponseMeta // Extra 用于存储额外信息 Extra map[string]any }
model.Option结构体
可以通过以下方式设置Option:
// Option is the call option for ChatModel component. type Option struct { apply func(opts *Options) implSpecificOptFn any }
Option具体使用方式如下所示:
response, err := chatModel.Generate(ctx, messages, model.WithMaxTokens(4096), model.WithTemperature(1.0), )
实现一个基础的LLM应用
eino的当前版本还不具备对deepseek的推理部分的独立展示,即返回的Message字段中只有Content字段,还没有更新独立的推理部分的reasoning_content字段。
package main import ( "context" "fmt" "github.com/cloudwego/eino/components/model" "github.com/cloudwego/eino/schema" "github.com/cloudwego/eino-ext/components/model/openai" "log" ) func main() { ctx := context.Background() chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{ Model: "ep-20250219155847-*****", APIKey: "***************************", BaseURL: "https://************************", }) if err != nil { log.Fatal(err) return } // 准备输入消息 messages := []*schema.Message{ { Role: schema.System, Content: "你是一个专业的个人助理。", }, { Role: schema.User, Content: "你好!", }, } response, err := chatModel.Generate(ctx, messages, model.WithMaxTokens(4096), model.WithTemperature(1.0), ) fmt.Print(response.Content) }
模板功能
Eino同样提供了类似langchain的对话模板渲染功能,支持以下三种模板格式:
- FString:Python 风格的简单字符串格式化(例如:“你好,{name}!")
- Jinja2:支持丰富表达式的 Jinja2 风格模板(例如:“你好,{{name}}!")
- GoTemplate:Go 语言内置的 text/template 格式(例如:“你好,{{.name}}!")
以下部分是官方文档中的代码,以FString格式+消息占位符实现
// eino-examples/quickstart/chat/template.go import ( "context" "github.com/cloudwego/eino/components/prompt" "github.com/cloudwego/eino/schema" ) // 创建模板,使用 FString 格式 template := prompt.FromMessages(schema.FString, // 系统消息模板 schema.SystemMessage("你是一个{role}。你需要用{style}的语气回答问题。你的目标是帮助程序员保持积极乐观的心态,提供技术建议的同时也要关注他们的心理健康。"), // 插入需要的对话历史(新对话的话这里不填) schema.MessagesPlaceholder("chat_history", true), // 用户消息模板 schema.UserMessage("问题: {question}"), ) // 使用模板生成消息 messages, err := template.Format(context.Background(), map[string]any{ "role": "程序员鼓励师", "style": "积极、温暖且专业", "question": "我的代码一直报错,感觉好沮丧,该怎么办?", // 对话历史(这个例子里模拟两轮对话历史) "chat_history": []*schema.Message{ schema.UserMessage("你好"), schema.AssistantMessage("嘿!我是你的程序员鼓励师!记住,每个优秀的程序员都是从 Debug 中成长起来的。有什么我可以帮你的吗?", nil), schema.UserMessage("我觉得自己写的代码太烂了"), schema.AssistantMessage("每个程序员都经历过这个阶段!重要的是你在不断学习和进步。让我们一起看看代码,我相信通过重构和优化,它会变得更好。记住,Rome wasn't built in a day,代码质量是通过持续改进来提升的。", nil), }, })
总结
本文介绍了如何使用Eino框架实现一个基本的LLM(大语言模型)应用。Eino中的 ChatModel
接口提供了与不同大模型服务(如OpenAI、Ollama等)交互的统一方式,支持生成完整响应、流式响应和绑定工具等功能。通过 Generate
方法可以生成完整的模型响应, Stream
方法则以流式方式返回结果,而 BindTools
方法用于为模型绑定工具。
同时,介绍了 Option
模式配置可以配置模型的对应参数,模板功能可以实现基于前端、用户自定义的角色以及Prompt。
目前只介绍了 ChatModel
其中的 Generate
方法,后面继续学习(*∩_∩*)