eino_1

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 组件是一个用于处理和格式化提示模板的组件。它的主要作用是将用户提供的变量值填充到预定义的消息模板中,生成用于与语言模型交互的标准消息格式。这个组件可用于以下场景:

  1. 构建结构化的系统提示
  2. 处理多轮对话的模板 (包括 history)
  3. 实现可复用的提示模式
    在与大模型交互前,我们通常需要告诉它“你是谁”、“你要做什么”。
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.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:绑定过程中的错误信息

eino官方文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容