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
模拟实现,说明:
- 接口优先设计原则
- 完善的单元测试支持
- 依赖注入能力(方便不同环境下的测试)
注意事项 :
- 并发安全 :注释明确提示 BindTools
与 Generate
存在非原子性操作,暗示需要同步控制
- 消息协议 :依赖<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使用示例
已有实现
- OpenAI ChatModel: 使用 OpenAI 的 GPT 系列模型 ChatModel - OpenAI
- Ollama ChatModel: 使用 Ollama 本地模型 ChatModel - Ollama
- ARK ChatModel: 使用 ARK 平台的模型服务 ChatModel - ARK
自行实现参考
实现自定义的 ChatModel 组件时,需要注意以下几点:
- 注意要实现公共的 option
- 注意实现 callback 机制
- 在流式输出时记得完成输出后要 close writer
Option机制
自定义 ChatModel 如果需要公共 Option 以外的 Option,可以利用组件抽象的工具函数实现自定义的 Option,例如:
Callback处理
ChatModel 实现需要在适当的时机触发回调,以下结构由 ChatModel 组件定义: