6.4 KiB
tags, create time
| tags | create time | ||||
|---|---|---|---|---|---|
|
2026-08-09 12:00 |
Eino DAG 工作流设计 — 测试题
概述
本测试覆盖 Eino DAG 核心概念(Node/Edge/Workflow)、状态传递机制、Choice 条件分支、ParallelStep 并行执行以及错误处理与重试策略。共 10 道题目(6 选择 + 3 填空 + 1 简答)。
一、选择题(6道,由浅入深)
难度阶梯: Q1-Q2 基础概念 → Q3-Q4 核心原理 → Q5-Q6 深入应用/边界场景
Q1(基础)— 考察定义层面
Eino 框架中,以下哪个节点类型不是原生支持的?
A. LLM Node — 调用大模型生成文本 B. Tool Node — 执行预注册的外部工具 C. Database Node — 直接执行 SQL 查询 D. Lambda Node — 自定义 Go 函数闭包
Q2(基础)→
DAG 的核心优势在于并行性——如果两个节点没有数据依赖,它们可以在不同 Goroutine 中同时运行。那么两个节点能否安全并发的判定条件是:
A. 它们的输入相同 B. 它们的上游节点相同 C. 它们没有重叠的 writes D. 它们的执行时间相近
Q3(进阶)— 核心原理
在 Eino 中 Choice 节点根据什么决定走向哪个下游节点?
A. 固定的路由规则表 B. 回调函数返回的目标节点 ID C. 节点的拓扑排序位置 D. 随机选择一个未饱和的下游
Q4(进阶)— 比较/辨析
关于 ParallelStep 的描述,以下哪个是错误的?
A. 可以对同一上游 fan-out 到多个下游 B. 需要一个 Merge 函数负责将子图结果聚合为最终输出 C. 三个子任务串行执行后合并结果以节省资源 D. 每个子任务可以处理输入的不同维度
Q5(深入)— 场景推理
一个 RAG 系统中,检索节点的输出可能为空(找不到相关文档)。用 Eino DAG 实现时,最合理的方案是:
A. 在检索节点后加一个 Checkpoint,如果为空就中断整个 DAG B. 使用 Choice 节点判断 hits 是否为空,为空时走 fallback 路径,不为空时走主路径 C. 配置重试策略无限重试直到有结果 D. 让 LLM 自己编造答案
Q6(深入)— 源码级/边界场景
关于 Eino DAG 的错误处理策略,"连续失败 N 次后跳过整条链路"对应的是哪种机制?
A. 节点级超时 B. 失败重试 C. 降级路径 D. 熔断器
二、填空题(3道)
F1 — 填空1
DAG 在编译期完成_____,确保图中无环。运行时按拓扑序执行所有没有未满足依赖的节点,已就绪节点可并发执行。如果实际项目中节点数超过_____个,建议拆分为嵌套子 DAG。
提示: 第一个空是编译期的关键动作;第二个空是原文中的经验上限值。
F2 — 填空2
State Schema 中节点的读集合(reads)和写集合(writes)决定了节点间能否安全并行——两个节点如果没有_____就一定能并发执行。如果都写同一个字段则必须串行。
提示: 原文面试常考点的原话。
F3 — 填空3
重试配置的参数包括 MaxRetries = _____、BackoffBase = 1s、BackoffMul = 2。这是一个标准的_____退避算法。
提示: 回忆重试代码示例中的数值和时间算法名称。
三、简答题(1道)
S1
面试官问:"如何用 DAG 实现一个多轮对话系统?"请给出你的架构设计,需要涵盖:
- State 如何携带上下文
- Intent 判断的节点设计
- 专业 Agent 的分发机制
- 质量保障闭环
答题框架提示:
- 单轮 vs 多轮的建模方式
- 关键节点类型及其职责
- 循环/反馈的设计(如 self-check)
- 复杂度控制
参考答案与解析
选择题答案
| 题号 | 正确答案 | 解析 |
|---|---|---|
| Q1 | C | Eino 原生的五种节点是:LLM Node、Tool Node、Prompt Node、State Node、Lambda Node。Database Node 不是原生类型——如果需要数据库操作,可以用 Tool Node 或 Lambda Node 封装 SQL 查询逻辑。 |
| Q2 | C | 原文面试常考点:两个节点如果没有重叠的 writes,就一定能并发执行。共享读取不冲突,只有写入冲突才需要序列化。 |
| Q3 | B | Choice 节点基于回调函数(路由函数)返回目标节点 ID,然后 map 中将字符串 key 映射到对应的下游节点。回调函数的签名是 func(state *eino.State) (string, error)。 |
| Q4 | C | ParallelStep 是并行执行而非串行——三个 Agent 同时启动各自处理 query 的一个维度。C 说"串行执行"完全违背了 ParallelStep 的设计目的。 |
| Q5 | B | Choice 判断 hits 是否为空是最合理的方案:RAG 检索为空时回退到备用路径(如默认回答或直接拒绝),这是原文中提到的降级模式。 |
| Q6 | D | 熔断器的定义是"连续失败 N 次后跳过整条链路"。这是为了防止上游服务不可用时持续浪费资源尝试调用。 |
填空题答案
| 题号 | 答案 | 解析 |
|---|---|---|
| F1 | 拓扑排序;15 |
DAG 编译期做拓扑排序确保无环。原文建议控制在 15 个节点以内,超出则拆分为嵌套子 DAG——因为复杂度随节点数呈组合增长。 |
| F2 | 重叠的 writes(或"共同的写入字段") |
读读不冲突,读写也不冲突(只要不是同一个字段),只有写写冲突才需要串行。这也是 Eino 状态机的核心并发安全原则。 |
| F3 | 3;指数 |
标准指数退避:第一次 1s,第二次 2s,第三次 4s。MaxRetries=3 表示最多重试 3 次。 |
简答题参考答案
S1:参考答案要点:
- 单轮建模:每轮对话作为一个独立的 DAG 实例,但 State 携带历史消息(messages 数组),保证上下文连贯。
- IntentNode:LLM Node 分析用户意图类型(问答/创作/闲聊),通过 Choice 分发给不同专业 Agent。
- 分发机制:Choice 根据 IntentNode 的输出路由到不同路径;ParallelStep 并行调用搜索 Agent、知识库加载 Agent 等。
- 质量保障:在 LLM 生成后加入质量评估节点做 self-check,如果不达标则重新触发检索节点(形成循环)。
- 复杂度控制:单轮 DAG 控制在 15 个节点内;复杂的多轮对话拆分为嵌套子 DAG,外层管理回合切换。
评分标准:答出任意 2 个要点即可得满分;完全正确需覆盖全部要点。