Eino学习笔记-1-ChatModel

date
Apr 11, 2025
slug
Eino-learning-notes-1-ChatModel
status
Published
tags
Eino
LLM
summary
Eino学习笔记,持续更新,也可能不更新。
type
Post
ChatModel 是 Eino 框架中对对话大模型的抽象,它提供了统一的接口来与不同的大模型服务(如 OpenAI、Ollama 等)进行交互。
这个组件在以下场景中发挥重要作用:
  • 自然语言对话
  • 文本生成和补全
  • 工具调用的参数生成
  • 多模态交互(文本、图片、音频等)

组件定义

接口定义

代码位置:eino/components/model/interface.go
Generate方法
  • 功能:生成完整的模型响应
  • 参数:
    • ctx:上下文对象,用于传递请求级别的信息,同时也用于传递Callback Manager
    • input:输入消息列表
    • opts:可选参数,用于配置模型行为
  • 返回值:
    • *schema.Message:模型生成的响应消息
    • error:生成过程中的错误信息
Stream方法
  • 功能:以流式方式生成模型响应
  • 参数:与Generate方法相同
  • 返回值:
    • *schema.StreamReader[*schema.Message]:模型响应的流式读取器
    • error:生成过程中的错误信息
BindTools方法
  • 功能:为模型绑定可用的工具
  • 参数:
    • tools:工具信息列表
  • 返回值:
    • error:绑定过程中的错误信息
 
核心定位 该接口是对话模型的核心抽象层,支持两种调用模式:
  • Generate :同步生成完整响应(适合常规对话场景)
  • Stream :流式响应处理(适合长文本生成/实时交互)
架构特性
关键设计点 : - 多模型支持 :通过接口抽象实现不同AI引擎(OpenAI/MAAS)的兼容 - 上下文感知 :使用 context.Context 支持超时控制、链路追踪等 - 可扩展参数 : ...Option 可变参数为不同实现提供配置扩展能力 - 工具热绑定 : BindTools 实现运行时功能增强(推测支持Function Calling等特性) 工程实践 : 通过 //go:generate 指令自动生成 ChatModelMock模拟实现,说明: - 接口优先设计原则 - 完善的单元测试支持 - 依赖注入能力(方便不同环境下的测试) 注意事项 : - 并发安全 :注释明确提示 BindToolsGenerate 存在非原子性操作,暗示需要同步控制 - 消息协议 :依赖<schema.Message>定义的消息格式(需结合具体协议分析) - 流式生命周期 : StreamReader 需要配合Close操作确保资源释放

Message结构体

代码位置:eino/schema/message.go
Message结构体是模型交互的基本结构,支持:
  • 多种角色:system(系统)、user(用户)、assistant(ai)、tool(工具)
  • 多模态内容:文本、图片、音频、视频、文件
  • 工具调用:支持模型调用外部工具和函数
  • 元信息:包含响应原因、token使用统计等

公共Option

Model组件提供了一组公共Option用于配置模型行为:
代码位置:eino/components/model/option.go
可以通过以下方式设置Option:

使用方式

单独使用

在编排中使用

Option和Callback使用

Option使用示例

Callback使用示例

已有实现

  1. OpenAI ChatModel: 使用 OpenAI 的 GPT 系列模型 ChatModel - OpenAI
  1. Ollama ChatModel: 使用 Ollama 本地模型 ChatModel - Ollama
  1. ARK ChatModel: 使用 ARK 平台的模型服务 ChatModel - ARK

自行实现参考

实现自定义的 ChatModel 组件时,需要注意以下几点:
  1. 注意要实现公共的 option
  1. 注意实现 callback 机制
  1. 在流式输出时记得完成输出后要 close writer

Option机制

自定义 ChatModel 如果需要公共 Option 以外的 Option,可以利用组件抽象的工具函数实现自定义的 Option,例如:

Callback处理

ChatModel 实现需要在适当的时机触发回调,以下结构由 ChatModel 组件定义:

完整实现示例

参考资料


© Shemol 2022 - 2025