对话循环:人机交互的基本模式
分析最简单的 Agent 形式——对话机器人——控制权如何在用户和助手之间交替
02 - 对话循环
从模型开始
一个模型,无论其内部是 Transformer 还是其他架构,对外呈现的基本契约是简单的:输入一段文本序列,输出一段文本序列。
输入序列 → [模型] → 输出序列
单次推理的生命周期到此结束。模型不会记住上一次你问了什么,也不会主动追问澄清。每一次调用都是独立的、无状态的。
对话机器人
要让模型具备对话能力,我们需要在模型之外构建一个薄层:将之前的对话历史,连同新的用户输入,打包成一个完整的上下文,再送入模型。
用户输入: "今天天气怎么样?"
打包后的上下文:
用户: 你好
Assistant: 你好!有什么可以帮助你的吗?
用户: 今天天气怎么样?
模型输出: "我无法获取实时天气信息,建议您查看天气预报应用。"
这个打包动作在每次用户输入后执行。模型生成的回复被追加到对话历史中,等待下一轮输入。由此,一个循环形成了:
User 输入 → 打包上下文 → 模型生成 → Assistant 回复 → 等待 User 输入
↑ |
└────────────────────────────────────────────────────────┘
这就是对话循环(Dialogue Loop)。它不是在模型内部实现的,而是模型之上的编排层。
控制权的流转
对话循环的核心特征是控制权的交替:
| 阶段 | 控制权归属 | 行为 | |------|------------|------| | 等待输入 | User | 决定说什么、何时发送 | | 生成回复 | Assistant | 基于上下文决定如何回应 | | 回复结束 | User | 接收结果,决定下一轮输入 |
这种交替构成了人机交互的基本节拍。User 在边界外拥有完全的控制力——决定何时启动一轮对话,何时结束整个会话。Assistant 在边界内拥有临时的控制权——一旦接手,它就独立完成生成,直到返回结果。
Turn:一个完整的请求-响应周期
我们将单次控制权移交的周期称为 Turn。一个 Turn 包含:
- 触发:User 发送消息,控制权转移给 Assistant
- 处理:Assistant 接收上下文,生成回复
- 返回:Assistant 输出结果,控制权交还 User
Turn 1 Turn 2 Turn 3
│ │ │
▼ ▼ ▼
User ──→ Assistant ──→ User ──→ Assistant ──→ User ...
在这个模型中,Turn 是原子性的。Assistant 不能在生成过程中暂停询问,User 也不能在 Assistant 处理时介入。这种简单的边界带来了可预测性:每轮 Turn 结束时,系统处于一个稳定状态——控制权在 User 手中,对话历史被更新,资源可以被安全地检查或持久化。
检查点
每轮 Turn 结束都是一个自然的检查点。此时:
- 对话历史处于一致状态
- 控制权明确归属于 User
- 中间产物可以被审查
- 资源可以被同步或持久化
这个性质使 Turn 成为 Agent 系统中最基础的质量控制边界。后续章节将讨论的 Hooks、状态总线、质量门等机制,很大程度上都是围绕 Turn 边界展开的。