quickstart(PromptTemplate 组件 和ChatModel)
AI 的应用中,最基础的场景就是 prompt + chat model 的场景,这也是互联网上各类 AI 应用平台提供的最重要的功能。
也即我们常用到的:定义 System Prompt 来约束大模型的回答逻辑,比如 “你在扮演一个 XXX 角色” 等等,大模型扮演角色进行回答。
在Eino中可以 使用PromptTemplate 组件 和ChatModel 组件来构建一个角色扮演应用。
PromptTemplate 组件
eino-examples/blob/main/components/prompt/chat_prompt/chat_prompt.go 从官方给的例子来
func main() {
systemTpl := `你是情绪助手,你的任务是根据用户的输入,生成一段赞美的话,语句优美,韵律强。
用户姓名:{user_name}
用户年龄:{user_age}
用户性别:{user_gender}
用户喜好:{user_hobby}`
chatTpl := prompt.FromMessages(schema.FString,
schema.SystemMessage(systemTpl),
schema.MessagesPlaceholder("message_histories", true),
schema.UserMessage("{user_query}"),
)
msgList, err := chatTpl.Format(context.Background(), map[string]any{
"user_name": "张三",
"user_age": "18",
"user_gender": "男",
"user_hobby": "打篮球、打游戏",
"message_histories": []*schema.Message{ // => value of "messages_histories" will be rendered into chatTpl slot.
schema.UserMessage("我喜欢打羽毛球"),
schema.AssistantMessage("xxxxxxxx", nil),
},
"user_query": "请为我赋诗一首",
})
if err != nil {
logs.Errorf("Format failed, err=%v", err)
return
}
logs.Infof("Rendered Messages:")
for _, msg := range msgList {
logs.Infof("- %v", msg)
}
}
Prompt 组件是一个用于处理和格式化提示模板的组件。它的主要作用是将用户提供的变量值填充到预定义的消息模板中,生成用于与语言模型交互的标准消息格式。这个组件可用于以下场景:
- 构建结构化的系统提示
- 处理多轮对话的模板 (包括 history)
- 实现可复用的提示模式
在与大模型交互前,我们通常需要告诉它“你是谁”、“你要做什么”。
type ChatTemplate interface {
Format(ctx context.Context, vs map[string]any, opts ...Option) ([]*schema.Message, error)
}
Format 方法
- 功能:将变量值填充到消息模板中
- 参数:
- ctx:上下文对象,用于传递请求级别的信息,同时也用于传递 Callback Manager
- vs:变量值映射,用于填充模板中的占位符
- opts:可选参数,用于配置格式化行为
- 返回值:
-
[]*schema.Message:格式化后的消息列表 - error:格式化过程中的错误信息
-
ChatTemplate 一般用于 ChatModel 之前做上下文准备的。
一般有如下创建方法
创建方法
-
prompt.FromMessages()- 用于把多个 message 变成一个 chat template。
-
schema.Message{}- schema.Message 是实现了 Format 接口的结构体,因此可直接构建
schema.Message{}作为 template
- schema.Message 是实现了 Format 接口的结构体,因此可直接构建
-
schema.SystemMessage()- 此方法是构建 role 为 “system” 的 message 快捷方法
-
schema.AssistantMessage()- 此方法是构建 role 为 “assistant” 的 message 快捷方法
-
schema.UserMessage()- 此方法是构建 role 为 “user” 的 message 快捷方法
-
schema.ToolMessage()- 此方法是构建 role 为 “tool” 的 message 快捷方法
-
schema.MessagesPlaceholder()- 可用于把一个
[]*schema.Message插入到 message 列表中,常用于插入历史对话
- 可用于把一个
Prompt 组件内置支持三种模板化方式:
-
FString格式(schema.FString)
使用{variable}语法进行变量替换
简单直观,适合基础文本替换场景
示例:"你是一个{role},请帮我{task}。"
-
GoTemplate格式(schema.GoTemplate)
使用 Go 标准库的 text/template 语法
支持条件判断、循环等复杂逻辑
示例:"{{if .expert}}作为专家{{end}}请{{.action}}"
-
Jinja2格式(schema.Jinja2)
使用 Jinja2 模板语法
示例:"{% if level == 'expert' %}以专家的角度{% endif %}分析{{topic}}"
ChatModel 组件
在构建完输入模版后,接下来就是输入模型。Model 组件是一个用于与大语言模型交互的组件。它的主要作用是将用户的输入消息发送给语言模型,并获取模型的响应。
eino/components/model/interface.go
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)
Generate 方法
- 功能:生成完整的模型响应
- 参数:
- ctx:上下文对象,用于传递请求级别的信息,同时也用于传递 Callback Manager
- input:输入消息列表
- opts:可选参数,用于配置模型行为
- 返回值:
-
*schema.Message:模型生成的响应消息 - error:生成过程中的错误信息
-
Stream 方法
- 功能:以流式方式生成模型响应
- 参数:与 Generate 方法相同
- 返回值:
-
*schema.StreamReader[*schema.Message]:模型响应的流式读取器 - error:生成过程中的错误信息
-
WithTools 方法
- 功能:为模型绑定可用的工具
- 参数:
- tools:工具信息列表
- 返回值:
- ToolCallingChatModel: 绑定了 tools 后的 chatmodel
- error:绑定过程中的错误信息