☰
goose 中如何用 Edit in Place 与 Fork Session 修正走偏的对话方向?
2026/10/25 8:35:08 网站建设 项目流程

goose 中如何用 Edit in Place 与 Fork Session 修正走偏的对话方向?

【免费下载链接】goosean open source, extensible AI agent that goes beyond code suggestions - install, execute, edit, and test with any LLM项目地址: https://gitcode.com/GitHub_Trending/goose3/goose

在 goose 中持续迭代一个任务时,对话经常会在某条消息上走偏:要么你发出的 prompt 不清楚、缺少关键信息,要么 goose 误解了意图往错误方向执行,之后的多轮消息和工具调用都建立在这个错误起点上。继续发消息纠正往往收效有限,因为错误起点仍然留在上下文里。goose 提供了两种会话内操作来解决这个问题:Edit in Place直接改写历史、从编辑点重新开始;Fork Session则在保留原会话的前提下,基于编辑后的消息开一条新分支去探索。两者都适用于 goose Desktop 和 goose CLI,且会话存储在同一个数据库中,Desktop 创建的会话可以在 CLI 中恢复,反之亦然。

先判断:走偏的会话该覆盖还是保留

两种操作的后果完全不同,选错会导致上下文丢失,动手前先按文档给出的适用条件做判断:

操作对原会话的影响适合的场景
Edit in Place当前会话中编辑点之后的所有消息和响应上下文被删除,会话从该点继续确认后面的内容不再需要,想从某一点彻底重开(例如修正最后一条消息里的一个路径)
Fork Session原会话保持不变,新建一个包含"编辑点及之前历史"的新会话已有不错的进展但想换一种做法,希望保留原会话作为参照(例如对比两种不同 prompt 的效果)

文档用一个消息流示例说明 Edit in Place 的截断效果:一段有五轮消息的对话,编辑第 3 条消息后,第 4、5 条的消息与响应上下文全部被删除,会话从第 3 条继续。

文档还给出两条选择建议,可以直接对照自己的情况:

  • Preserving Progress:当你已经取得良好进展但想尝试不同方向时,用 Fork Session。这样如果新方向行不通,随时可以回到原会话。
  • When to Edit vs. Interrupt:当对话已经走偏时,编辑早期消息比用新消息或中断来纠偏更有效——编辑消息是重写历史,而中断只影响当前消息之后的对话。

在 goose Desktop 中操作

两条路径的第一步相同:把鼠标悬停在会话中任何一条历史消息上,点击出现的Edit按钮,在行内编辑器中修改内容,再决定保存方式。

Edit in Place:覆盖当前会话

  1. 悬停在要修改的历史消息上
  2. 点击Edit按钮
  3. 在行内编辑器中修改内容
  4. 点击Edit in Place保存修改并重新向 goose 提问

保存后,goose 会删除该消息之后的全部会话历史,并基于编辑后的上下文从该点继续响应。

需要注意文档中的明确警告:Edit in Place 会把编辑点之后的会话历史永久从会话中删除,同时移出 goose 的上下文。只有在你不需要 goose 记住编辑点之后的内容时才选这个方式。

Fork Session:保留原会话开新分支

  1. 悬停在要修改的历史消息上
  2. 点击Edit按钮
  3. 在行内编辑器中修改内容
  4. 点击Fork Session保存修改并开启新会话;也可以使用快捷键Cmd+Enter(macOS)或Ctrl+Enter(Windows/Linux)

goose 会创建一个新会话,其中包含直到并包括你编辑后的那条消息的对话历史。新会话的显示名带 "(edited)" 后缀,原会话保持原样。

这里容易和另一个功能混淆,文档专门做了区分:

  • Fork Session(消息上的 Edit 按钮):创建只包含"某个编辑点及之前"历史的新会话,用于从对话的某个特定位置探索不同做法。
  • Duplicate Session(会话列表中的 Copy 按钮):完整复制整个会话,用于保存一个可用的会话或复用其配置。

在 goose CLI 中操作

CLI 通过goose session的--edit和--fork参数实现同样两个操作。--edit打开的是把整段会话序列化为 YAML 的编辑器(优先使用$VISUAL,其次$EDITOR,都没有时用vi);--edit必须与--resume一起使用,可以与--fork组合。

先找到目标会话的 ID。会话 ID 格式为YYYYMMDD_<COUNT>,可用goose session list查看(也可用--name按名称定位会话)。

CLI 版 Edit in Place

goose session --resume <session-id> --edit

<session-id>替换为要编辑的会话 ID,例如20251108_2。文档给出的完整写法是:

goose session --resume --session-id 20251108_2 --edit

编辑器中 YAML 的编辑方式与 UI 版语义略有差别,需要留意:

  • 编辑并保存后,goose 从编辑后的会话继续;
  • YAML 中你保留的其后的消息会留在会话和 goose 的上下文中;
  • 想让 goose"忘记"后面的消息,就从 YAML 中删除对应消息。

也就是说,CLI 下"截断到哪里"由你删除哪些 YAML 内容决定,而不是自动删除编辑点之后的所有消息。

CLI 版 Fork Session

--edit与--fork组合使用,从编辑结果创建新会话:

goose session --resume <session-id> --fork --edit

也可以附加--history在恢复时显示此前的消息(文档示例):

goose session --resume --session-id 20251108_2 --fork --edit --history

保存编辑后,goose 创建包含编辑后对话的新会话并从中恢复,原会话保持不变。

另外,只使用--fork而不加--edit,则是不经过编辑的整会话复制(相当于 UI 的 Duplicate):

# Fork 最近的会话 goose session --resume --fork # 按名称 fork 指定会话 goose session --resume --fork --name my-project

验证操作是否生效

文档给出了两种操作生效后可观察的结果,可据此核对:

Edit in Place:编辑点之后的历史不再出现在会话中,goose 从编辑后的消息处按新上下文响应(UI 版会直接删除后续历史;CLI 版以你在 YAML 中留下的消息为准)。

Fork Session:会话列表中出现一个新会话。UI 中新会话名为原会话名加 "(edited)" 后缀,原会话内容不变;CLI 中可以用goose session list确认新会话已创建。文档中一个goose session list -l 1的示例输出(文档示例,实际会话名与 ID 因人而异):

Available sessions: 20260213_9 - react-migration - 2026-02-13 16:20:37 UTC

其中20260213_9就是可用于--session-id的会话 ID。

限制与边界

  • 删除不可逆:UI 版 Edit in Place 对编辑点之后历史的删除是永久性的,且移出 goose 上下文,操作前确认后面的内容确实不需要。
  • CLI 编辑的截断语义不同:CLI 下--edit不会自动删除编辑点之后的消息,留在 YAML 里的消息会保留在会话和上下文中,需要手动从 YAML 删除。
  • Fork 与 Duplicate 的边界:Fork Session 只带"编辑点及之前"的历史;需要完整复制(含元数据、provider 与模型配置、扩展配置、recipe 信息)时用 Duplicate Session /--fork(无--edit)。
  • 迭代式纠偏:文档建议的日常工作方式是先用基础 prompt 起步,再根据 goose 的响应边编辑边细化,而不是一开始就追求一条完美 prompt;结合 Fork Session 可以同时保留验证过的方向。

完整操作细节见 In-Session Actions 文档,--edit与--fork参数定义见 goose CLI 命令文档,会话的恢复与复制操作见 Session Management 文档。

【免费下载链接】goosean open source, extensible AI agent that goes beyond code suggestions - install, execute, edit, and test with any LLM项目地址: https://gitcode.com/GitHub_Trending/goose3/goose

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询