vault backup: 2026-08-09 19:06:40

This commit is contained in:
2026-08-09 19:06:40 +08:00
parent e2975eb86b
commit 9d664545c9
46 changed files with 7287 additions and 0 deletions
@@ -0,0 +1,147 @@
---
tags: [test/review, ai, agent-design, eino-dag]
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 实现一个多轮对话系统?"请给出你的架构设计,需要涵盖:
1. State 如何携带上下文
2. Intent 判断的节点设计
3. 专业 Agent 的分发机制
4. 质量保障闭环
> **答题框架提示**:
> 1. 单轮 vs 多轮的建模方式
> 2. 关键节点类型及其职责
> 3. 循环/反馈的设计(如 self-check)
> 4. 复杂度控制
---
## 参考答案与解析
### 选择题答案
| 题号 | 正确答案 | 解析 |
|------|---------|------|
| 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:**参考答案要点**:
1. **单轮建模**:每轮对话作为一个独立的 DAG 实例,但 State 携带历史消息(messages 数组),保证上下文连贯。
2. **IntentNode**:LLM Node 分析用户意图类型(问答/创作/闲聊),通过 Choice 分发给不同专业 Agent。
3. **分发机制**:Choice 根据 IntentNode 的输出路由到不同路径;ParallelStep 并行调用搜索 Agent、知识库加载 Agent 等。
4. **质量保障**:在 LLM 生成后加入质量评估节点做 self-check,如果不达标则重新触发检索节点(形成循环)。
5. **复杂度控制**:单轮 DAG 控制在 15 个节点内;复杂的多轮对话拆分为嵌套子 DAG,外层管理回合切换。
**评分标准**:答出任意 2 个要点即可得满分;完全正确需覆盖全部要点。
## 关联笔记
- [[多智能体协作模式]]
- [[上下文工程与记忆管理]]