mirror of
https://github.com/OpenBMB/ChatDev.git
synced 2026-04-25 11:18:06 +00:00
207 lines
4.7 KiB
Markdown
Executable File
207 lines
4.7 KiB
Markdown
Executable File
# Passthrough 节点
|
||
|
||
Passthrough 节点是最简单的节点类型,它不执行任何操作,仅将接收到的消息传递给下游节点。默认情况下只传递**最后一条消息**。它主要用于图结构的"理线"优化和上下文控制。
|
||
|
||
## 配置项
|
||
|
||
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|
||
|------|------|------|--------|------|
|
||
| `only_last_message` | bool | 否 | `true` | 是否只传递最后一条消息。设为 `false` 时传递所有消息。 |
|
||
|
||
### 基本配置
|
||
|
||
```yaml
|
||
config: {} # 使用默认配置,只传递最后一条消息
|
||
```
|
||
|
||
### 传递所有消息
|
||
|
||
```yaml
|
||
config:
|
||
only_last_message: false # 传递所有接收到的消息
|
||
```
|
||
|
||
## 核心概念
|
||
|
||
### 透传行为
|
||
|
||
- 接收上游传入的所有消息
|
||
- **默认只传递最后一条消息**(`only_last_message: true`)
|
||
- 设置 `only_last_message: false` 时传递所有消息
|
||
- 不做任何内容处理或转换
|
||
|
||
### 图结构优化
|
||
|
||
Passthrough 节点的核心价值不在于数据处理,而在于**图结构的优化**("理线"):
|
||
- 使复杂的边连接更加清晰
|
||
- 集中管理出边配置(如 `keep_message`)
|
||
- 作为逻辑分界点,提高工作流可读性
|
||
|
||
## 关键用途
|
||
|
||
### 1. 作为起始节点保留初始上下文
|
||
|
||
将 Passthrough 作为工作流的入口节点,配合边的 `keep_message: true` 配置,可以确保用户的初始任务始终保留在上下文中,不会被后续节点的输出覆盖:
|
||
|
||
```yaml
|
||
nodes:
|
||
- id: Task Keeper
|
||
type: passthrough
|
||
config: {}
|
||
|
||
- id: Worker A
|
||
type: agent
|
||
config:
|
||
provider: openai
|
||
name: gpt-4o
|
||
|
||
- id: Worker B
|
||
type: agent
|
||
config:
|
||
provider: openai
|
||
name: gpt-4o
|
||
|
||
edges:
|
||
# 从入口分发任务,保留原始消息
|
||
- from: Task Keeper
|
||
to: Worker A
|
||
keep_message: true # 保留初始任务上下文
|
||
|
||
- from: Task Keeper
|
||
to: Worker B
|
||
keep_message: true
|
||
|
||
start: [Task Keeper]
|
||
```
|
||
|
||
**效果**:Worker A 和 Worker B 都能看到用户的原始输入,而不仅仅是上一个节点的输出。
|
||
|
||
### 2. 过滤循环中的冗余输出
|
||
|
||
在包含循环的工作流中,循环内的节点可能产生大量中间输出。如果将所有输出都传递给后续节点,会导致上下文膨胀。使用 Passthrough 节点可以**只传递循环的最终结果**:
|
||
|
||
```yaml
|
||
nodes:
|
||
- id: Iterative Improver
|
||
type: agent
|
||
config:
|
||
provider: openai
|
||
name: gpt-4o
|
||
role: 根据反馈不断改进输出
|
||
|
||
- id: Evaluator
|
||
type: agent
|
||
config:
|
||
provider: openai
|
||
name: gpt-4o
|
||
role: |
|
||
评估输出质量,回复 GOOD 或提供改进建议
|
||
|
||
- id: Result Filter
|
||
type: passthrough
|
||
config: {}
|
||
|
||
- id: Final Processor
|
||
type: agent
|
||
config:
|
||
provider: openai
|
||
name: gpt-4o
|
||
role: 对最终结果进行后处理
|
||
|
||
edges:
|
||
- from: Iterative Improver
|
||
to: Evaluator
|
||
|
||
# 循环:评估不通过时回到改进节点
|
||
- from: Evaluator
|
||
to: Iterative Improver
|
||
condition:
|
||
type: keyword
|
||
config:
|
||
none: [GOOD]
|
||
|
||
# 循环结束:通过 Passthrough 过滤,只传递最后一条
|
||
- from: Evaluator
|
||
to: Result Filter
|
||
condition:
|
||
type: keyword
|
||
config:
|
||
any: [GOOD]
|
||
|
||
- from: Result Filter
|
||
to: Final Processor
|
||
|
||
start: [Iterative Improver]
|
||
end: [Final Processor]
|
||
```
|
||
|
||
**效果**:无论循环迭代多少次,`Final Processor` 只会收到 `Evaluator` 的最后一条输出(表示质量通过的那条),而不是所有中间结果。
|
||
|
||
## 其他用途
|
||
|
||
- **占位符**:在设计阶段预留节点位置
|
||
- **条件分支**:配合条件边实现路由逻辑
|
||
- **调试观察点**:在流程中插入便于观察的节点
|
||
|
||
## 示例
|
||
|
||
### 基础用法
|
||
|
||
```yaml
|
||
nodes:
|
||
- id: Router
|
||
type: passthrough
|
||
config: {}
|
||
```
|
||
|
||
### 条件路由
|
||
|
||
```yaml
|
||
nodes:
|
||
- id: Classifier
|
||
type: agent
|
||
config:
|
||
provider: openai
|
||
name: gpt-4o
|
||
role: |
|
||
分类输入内容,回复 TECHNICAL 或 BUSINESS
|
||
|
||
- id: Router
|
||
type: passthrough
|
||
config: {}
|
||
|
||
- id: Tech Handler
|
||
type: agent
|
||
config:
|
||
provider: openai
|
||
name: gpt-4o
|
||
|
||
- id: Biz Handler
|
||
type: agent
|
||
config:
|
||
provider: openai
|
||
name: gpt-4o
|
||
|
||
edges:
|
||
- from: Classifier
|
||
to: Router
|
||
- from: Router
|
||
to: Tech Handler
|
||
condition:
|
||
type: keyword
|
||
config:
|
||
any: [TECHNICAL]
|
||
- from: Router
|
||
to: Biz Handler
|
||
condition:
|
||
type: keyword
|
||
config:
|
||
any: [BUSINESS]
|
||
```
|
||
|
||
## 最佳实践
|
||
|
||
- 使用有意义的节点 ID 描述其拓扑作用(如 `Task Keeper`、`Result Filter`)
|
||
- 作为入口节点时,出边配置 `keep_message: true` 保留上下文
|
||
- 在循环后使用,可以过滤掉冗余的中间输出
|