Eino中的组件

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

相关阅读更多精彩内容

友情链接更多精彩内容