Eino中有哪些组件?
// Component the name of different kinds of components
type Component string
const (
ComponentOfPrompt Component = "ChatTemplate"
ComponentOfChatModel Component = "ChatModel"
ComponentOfEmbedding Component = "Embedding"
ComponentOfIndexer Component = "Indexer"
ComponentOfRetriever Component = "Retriever"
ComponentOfLoader Component = "Loader"
ComponentOfTransformer Component = "DocumentTransformer"
ComponentOfTool Component = "Tool"
)
| 组件名 | 目录/包名 | 职责 |
|---|---|---|
| ChatModel | components/model | 对接 LLM,负责“生成回答”。 |
| ChatTemplate | components/prompt | 把变量塞进提示模板,生成最终 Prompt。 |
| Embedding | components/embedding | 把文本变成向量。 |
| Indexer | components/indexer | 把向量写进索引库(如 Redis、VikingDB)。 |
| Retriever | components/retriever | 根据 query 向量去索引库召回文档。 |
| DocumentLoader | components/loader | 从文件/URL/数据库加载原始文档。 |
| DocumentTransformer | components/transformer | 对文档做切块、过滤、格式转换等。 |
| Tool | components/tool | 封装外部 API 或函数,供 LLM 调用。 |
不同场景下这些组件如何协同工作,
| 场景示例 | 组件协作链路 |
|---|---|
| 对话机器人 | ChatTemplate → ChatModel |
| RAG 问答 | DocumentLoader → DocumentTransformer → Embedding → Indexer → Retriever → ChatTemplate → ChatModel |
| 工具调用 Agent | ChatModel(绑定 Tool)→ Tool → ChatModel |
可以通过chain , graph 或者工作流将这些组件串联起来, 来实现对应的业务编排, 如下图使用graph(有向无环图)来实现对话的场景,换成 RAG 只需在中间插入 Embedding、Indexer、Retriever 即可
g := compose.NewGraph[input, output]()
_ = g.AddChatTemplateNode("tpl", tpl)
_ = g.AddChatModelNode("model", model)
_ = g.AddEdge(compose.START, "tpl")
_ = g.AddEdge("tpl", "model")
_ = g.AddEdge("model", compose.END)
runnable, _ := g.Compile(ctx)

image.png
eino中不同组件之间的数据流动:

image.png
- 通过DocumentLoader从文件/URL/数据库加载原始文档, 并通过Transformer 对文档进行预处理, 然后通过Embedding 模型将文档转换为向量(需要依赖第三方向量模型,如豆包的Doubao-embedding-vision或Doubao-embedding)并存入向量数据库(redis等)
- 基于用户查询query, 由Embedding 模型对 query 向量化, 然后ChatModel基于 query 向量从 Redis Vector Database 召回最相关的文档, 召回流程参考如下:
| 阶段 | 组件 | 作用 |
|---|---|---|
| 1. 用户输入 | Lambda | 将用户原始 query 转换为字符串 |
| 2. 向量化 | Embedding | 使用模型(如 doubao-embedding-large)将 query 转为向量 |
| 3. 向量召回 | Retriever | 基于 query 向量从 Redis Vector Database 召回最相关的文档 |
| 4. 返回结果 | schema.Document | 返回 []*schema.Document 列表,包含召回的文本内容 |
-
ChatModel基于配置需要或者自行判断是否使用tool中的函数调用,如果需要,由eino框架执行工具调用 , 再把结果塞回 LLM 做最终回答。
image.png
工具调用代码示例:
// 1. 声明工具
weatherTool := tools.NewTool(
"get_weather",
"查询指定城市天气",
func(ctx context.Context, city string) (string, error) {
// 这里可调用真实天气 API
return "北京:晴 28℃", nil
},
)
// 2. 构建 Agent
ag, _ := agent.NewAgent(
chatModel,
agent.WithTools(weatherTool),
)
// 3. 运行
resp, _ := ag.Generate(ctx, []*schema.Message{
schema.UserMessage("北京今天天气如何?"),
})
fmt.Println(resp.Content) // → 北京今天晴,最高气温 28℃
| 角色 | 职责 | 代码示例 |
|---|---|---|
| Tool | 声明函数名、描述、参数结构,真正实现逻辑 | func GetWeather(location string) (string, error) |
| Agent | 负责循环:监听 LLM → 解析 tool_calls → 执行工具 → 回传结果 | agent.NewAgent(chatModel, tools...) |
