011-4-BranchingChat
“切换分支不仅影响目标消息,其后的所有后续消息都会更新,以反映所选分支的完整对话线。”
每一条从根节点("What is React?")到末端叶子节点(如 "JSX is a syntax extension...")的路径,都构成一条完整、独立的链路。每条链路代表一次完整且独立的对话历史。
当你通过分支切换器(Branch Switcher)更改一个中间节点的版本时,你实际上选择了经过该节点的另一条完整链路。因此,该节点之后的所有消息都会更新,以匹配新选择分支的上下文。
心智模型
分支聊天 / Branching chat 将对话视为一棵版本树而非线性列表。其核心运作机制如下:
- 核心操作:任何对历史消息的编辑或重新生成,都会在对话树中创建一个分叉(fork),形成一个新的独立分支。
- 分支导航:用户可以通过
stream.setBranch()在不同分支间无缝切换,所有分支数据通过fetchStateHistory: true预加载,因此切换是即时且不丢失数据的。 - 后端支撑:LangGraph 将每个状态转换保存为检查点(checkpoint)。编辑或重新生成时,前端将消息和指定的
checkpoint提交给后端,后端便从该点分叉出新的对话路径。
关键实践提示
- 【关键配置】Set up useStream with history:必须为
useStream开启fetchStateHistory: true,否则getMessagesMetadata无法返回分支信息。 - 【元数据驱动】Understand message metadata:通过
getMessagesMetadata(msg)获取的parent_checkpoint是所有分支操作的叉点(fork point),编辑和重新生成都依赖它。 - 【编辑与重新生成】Edit a message / Regenerate a response:两者原理相同,都是向
parent_checkpoint提交新内容(编辑)或提交空内容(重新生成),从而创建新分支。 - 【UI 细节】
- 按需显示:仅在分支数大于1时,才显示分支切换器(如
1/1的指示器无意义)。 - 悬停交互:将编辑、重新生成按钮和分支导航放在悬停时才显示,以保持界面整洁。
- 禁用时机:Agent 正在流式输出(
stream.isLoading为真)时,禁用编辑和重新生成。
- 按需显示:仅在分支数大于1时,才显示分支切换器(如
- 【交互影响】Build a branch switcher:切换分支不仅改变目标消息,其后的所有后续消息都会更新,以反映所选分支的完整对话线。
- 【额外优化】
- 乐观更新:编辑消息时可使用
optimisticValues实现乐观更新,让界面立刻响应,提升体验。 - 键盘导航:可以为高级用户添加
Alt + ←/→快捷键来切换分支。 - 取消恢复:用户取消编辑时,务必将文本域内容重置为原始消息。
- 乐观更新:编辑消息时可使用
总结自检
- 性能相关:文档提示需要在深层分支树下测试性能,并确保数据处理的流畅性。
- 安全相关:无直接安全内容。
- 技术细节:已涵盖通过
fetchStateHistory启用功能、使用getMessagesMetadata获取叉点、编辑/重新生成的stream.submit调用方式,以及分支切换器的条 件渲染逻辑。