Skip to main content

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 为真)时,禁用编辑和重新生成。
  • 【交互影响】Build a branch switcher:切换分支不仅改变目标消息,其后的所有后续消息都会更新,以反映所选分支的完整对话线。
  • 【额外优化】
    • 乐观更新:编辑消息时可使用 optimisticValues 实现乐观更新,让界面立刻响应,提升体验。
    • 键盘导航:可以为高级用户添加 Alt + ←/→ 快捷键来切换分支。
    • 取消恢复:用户取消编辑时,务必将文本域内容重置为原始消息。

总结自检

  • 性能相关:文档提示需要在深层分支树下测试性能,并确保数据处理的流畅性。
  • 安全相关:无直接安全内容。
  • 技术细节:已涵盖通过 fetchStateHistory 启用功能、使用 getMessagesMetadata 获取叉点、编辑/重新生成的 stream.submit 调用方式,以及分支切换器的条件渲染逻辑。