资讯动态

Goose 会话自动命名机制解析:读懂 session_name.md 提示词及其在代码中的完整落地

发布时间:2026/9/10 21:35:00 来源:尧图企业网站定制
Goose 会话自动命名机制解析读懂 session_name.md 提示词及其在代码中的完整落地【免费下载链接】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 这类 AI Agent 中每一次交互会话都会在侧边栏或会话列表里留下一个名字——如果每个名字都是新建会话用户将很难回溯一次特定的调试、迁移或重构过程。Goose 在 crates/goose/src/prompts/session_name.md 中内置了一段用于会话自动命名的提示词并配套实现了一套从抽取历史消息 → 交给 LLM 取名 → 后处理清洗 → 持久化回写的完整流水线。本文以该提示词为骨架结合 Goose 仓库中的渲染、调度与测试代码讲解它是如何约束模型围绕事务本质而非机械动作来生成 ≤4 个词的短标题的并说明其触发条件、用户自定义覆盖方式以及你在此基础上二次调优时应掌握的边界。一、提示词全文与逐条解读session_name.md全文非常简短但信息密度极高。其全部内容如下Generate a short title (four words or less) for this conversation.Title what the work is ABOUT, not the mechanical activity. Many conversations share the same workflow steps (creating a PR, setting up a worktree, drafting an email, summarizing a document); a good title carries the distinguishing subject instead — a ticket or issue ID, feature name, customer or company, person, document, event, or project.Rules:If a ticket or issue identifier (like ABC-123) appears in the messages, include it in the title. Use identifiers found only in hints when the messages make their relevance clear.Prefer names of companies, projects, or documents over generic activity words.Prefer a company or project name over a persons name when both are present.If there is genuinely no distinguishing subject, a plain activity title is fine — never invent specifics that are not present.Reply with only the title, nothing else. Do not show your reasoning.Examples:how do I reverse a list in python? → Python list reversalset up a git worktree for BOT-1565 session auto titles → BOT-1565 session auto-titlesopen the payments repo and create a PR for the refund timeout fix → Refund timeout fixhelp me draft a follow-up email about the renewal (hints mention Acme) → Acme renewal follow-upsummarize this spreadsheet (attached Q3 pipeline.xlsx) → Q3 pipeline summarywhats the weather in Tokyo? → Tokyo weather1.1 顶层目标四词以内的短标题第一句即定义了输出约束four words or less≤4 个英文单词。这一约束贯穿整个流水线后端的简单兜底生成逻辑一次只取 4 个词见下文 3.3 节最终结果还会被再次截断清洗确保会话名在 UI 列表中的可读性。1.2 核心命题命名对象而非动作提示词最关键的设计点在于区分一对概念mechanical activity机械动作创建 PR、搭建 worktree、起草邮件、总结文档——无数会话共享同一套工作流步骤用它们命名毫无区分度subject事务本质/主题ticket/issue ID、feature 名、客户或公司、人名、文档、事件或项目——它们是区分一次会话的关键载荷。因此open the payments repo and create a PR for the refund timeout fix应命名为Refund timeout fix事务退款超时缺陷修复而不是Create a PR动作建 PR。这对应代码中消息头部的---BEGIN USER MESSAGES---包裹的真实用户输入模型需要从中提炼出 subject。1.3 四条硬性规则优先嵌入标识符若消息中出现类似ABC-123的 ticket/issue 编号必须写入标题仅存在于 hints如工作目录上下文中的标识符只有在其与消息主题明确相关时才可使用——提示词限制了模型不得过度联想。命名实体优先于动作词公司、项目、文档名优于generic activity words。公司/项目优先于人名当两者同时出现时以公司或项目命名对应示例 Acme renewal follow-up。宁可用朴素动作标题也不虚构当确实不存在可区分主题时允许退化为普通动作标题——但严禁捏造不存在的细节。这一条是防幻觉的关键护栏。1.4 输出约束Reply with only the title, nothing else. Do not show your reasoning. 与提示词刻意不给推理空间并且代码层还会做二次兜底剥离think/reasoning等 XML 标签、只取引用/末行即便模型违规输出思考过程也能被纠正为纯标题。二、提示词在 Goose 中的注册与定位session_name.md不是游离的文本它是 Goose 提示词模板体系中的一员。在 prompt_template.rs 的TEMPLATE_REGISTRY中它被登记为( session_name.md, System prompt for generating short session names from conversation history, ),与之并列的是system.md主系统提示词、compaction.md上下文压缩摘要等核心提示词。这意味着session_name.md是一个独立于系统提示词的一次性任务提示——命名会话时不加载整套人格化系统提示词只加载这一小段指令让模型以最小成本输出标题。模板内容在编译期通过include_dir!($CARGO_MANIFEST_DIR/src/prompts)打进二进制即crates/goose/src/prompts/目录运行时再经 render_template 渲染。官方文档 documentation/docs/guides/context-engineering/prompt-templates.md 也将其列为用于从对话历史生成短会话名的 Desktop 与 CLI 共用模板。三、从消息到标题generate_session_name运行时全链路提示词是被 session_naming.rs 中的generate_session_name函数消费的。该函数的完整处理流程如下。3.1 输入准备仅取最近至多 3 条可见用户消息函数开头定义了触发规模常量pub static MSG_COUNT_FOR_SESSION_NAME_GENERATION: usize 3;get_initial_user_messagessession_naming.rs会从会话中筛出角色为User且is_user_visible()的消息按顺序只取前 3 条并把每条消息的文本内容拼接成上下文。也就是说命名依据不是整个对话而是最初几条用户诉求——会话刚起步时即可命名后续无需反复重命名。可见性过滤is_user_visible确保了用于取名的只是对用户可见的输入而非系统内部注入的消息。3.2 请求组装系统提示 工作目录 hints 消息标记代码在组装请求时注入了三类信息session_naming.rs系统提示渲染session_name.md模板本身该模板无变量传入空上下文Hints 区若存在工作目录取目录的file_name拼成working folder: 目录名放入---BEGIN HINTS (optional signals like the working folder; use them only when they match the subject of the messages)--- working folder: xxx ---END HINTS---这解释了提示词规则中Use identifiers found only in hints的来源——hints 是可选的弱信号提示词要求模型仅在 hints 与消息主题吻合时才采纳其中的信息消息标记区真实用户消息被 cli_common.rs 中定义的定界符包裹并追加后缀指令pub(crate) const SESSION_NAME_BEGIN_MARKER: str ---BEGIN USER MESSAGES---; pub(crate) const SESSION_NAME_END_MARKER: str ---END USER MESSAGES---; pub(crate) const SESSION_NAME_SUFFIX: str Generate a short title for the above messages.;最终发给模型的是系统提示(session_name.md) 可选Hints ---BEGIN USER MESSAGES--- 消息内容 ---END USER MESSAGES--- Generate a short title for the above messages.。标记符既能让模型清楚区分待命名的消息边界也服务于下面的无模型兜底路径。3.3 两条生成路径完整 LLM 推理 vs 纯客户端兜底根据 provider 能力代码分了两种执行路径session_naming.rsprovider.manages_own_context()为 false默认路径走model_config::complete_one_shot将系统提示 用户消息作为一次完整推理请求发给模型按session_name.md的指令生成标题。这是提示词真正生效的路径。provider.manages_own_context()为 true自带上下文管理/离线裁剪能力的 provider为避免额外一轮完整推理直接调用 generate_simple_session_description在本地从消息中定位---BEGIN USER MESSAGES---与---END USER MESSAGES---之间的文本剔除首尾定界符后机械截取前 4 个词作为标题空则回退为 Simple task。该路径不做语义理解是纯零成本的兜底因此在 4 词硬约束上与提示词保持一致。3.4 后处理清洗、提取与截断模型原始输出不能直接当作会话名session_naming.rs 的 L145-L156 及配套测试函数strip_xml_tags用两轮正则剔除think.../think之类的 XML 标签块及孤立标签——防止思考型模型把推理过程混进标题extract_short_title若清洗后文本 ≤8 词直接返回否则先在文本中寻找成对引号//括起来的、词数在 2~8 之间的疑似标题取最后一个命中者没有命中则退回取最后一行非空内容。这样即便模型输出了大段解释最终也能捞出真正的标题safe_truncate(..., 100)最终统一截断到 100 字符上限。上述每步都有对应单元测试例如test_strip_xml_tags覆盖了多行think、带属性的标签、自闭合br/、孤立闭合标签等边界session_naming.rstest_extract_short_title则验证了引号提取取最后一个、末行回退等规则同文件 L190-L242。可见提示词中Reply with only the title是一条软约束真正的只输出标题由代码后处理来兜底保证。四、什么时候触发命名从 Agent 消息投递到会话名回写提示词与生成函数只解决怎么取名而何时取名、取名后怎么办由调度层控制。4.1 触发入口与禁用开关在 agent.rs每当新用户消息被加入会话后若配置项disable_session_naming未开启Goose 会tokio::spawn一个异步任务调用session_manager.maybe_update_name(...)成功后把生成的SessionNameUpdate通过session_name_update_tx通道广播给 UIDesktop/CLI 据此即时刷新会话标题。disable_session_naming可通过配置读取见 server_factory.rs 中get_goose_disable_session_naming()需要完全关闭自动命名时可置位。4.2maybe_update_name的准入判断maybe_update_name 在真正调用生成函数前有一组前置守卫条件行为session.user_set_name true用户手动改过名跳过尊重用户自定义session_type Scheduled定时任务会话跳过会话关联 recipe 且有非空标题直接用recipe.title作为名字不再调用 LLM可命名用户消息数 触发阈值跳过其中命名触发阈值逻辑为let should_generate_name if provider.manages_own_context() { user_message_count 1 } else { user_message_count MSG_COUNT_FOR_SESSION_NAME_GENERATION // 即 3 };即默认 provider 在前3 条用户消息期间每新增一条且仍未过阈值时都会尝试取名而自带上下文管理的 provider 只在恰好 1 条用户消息时触发一次。这保证了命名尽量发生在会话早期、依据信息量足够且成本可控。4.3 命名结果回写生成成功后调用system_generated_name_updatesession_manager.rs把新名字以system_generated_name的方式写入会话存储区别于用户手动设置的user_set_name名字并返回包含session_id / name / updated_at / user_set_name的更新结构体供上层 UI 刷新。测试方面session_manager.rs 中有一组maybe_update_name的命名测试含状态化命名测试 provider覆盖了用户自定义名优先、recipe 标题优先、阈值内/外触发等行为。五、把提示词变成自己的模板自定义机制session_name.md虽以内置模板发布但 Goose 的模板系统允许用户用同名文件覆盖内置模板。根据 prompt_template.rs 的render_template逻辑渲染时的查找顺序是先检查用户目录Paths::config_dir().join(prompts)下是否存在session_name.md存在则读取该自定义文件渲染is_customized true否则回退到编译期内置模板。配套的template_source、get_template、list_templates、save_template、reset_template提供了模板内容查看、保存覆盖与一键还原的能力同文件 L142-L212。也就是说如果你想调整命名风格——例如要求中文短标题、强制优先使用技术栈名词、把 4 词放宽为 6 词——只需在配置目录的prompts/下放置一份修改版session_name.md无需改动仓库代码。注意模板渲染使用 minijinja 引擎自定义文件中可以像内置模板一样不依赖任何变量session_name.md渲染时传入的是空上下文但若改动涉及如何从对话/工具历史取 subject仍需注意与 session_naming.rs 中 3.3/3.4 节的客户端兜底与后处理逻辑保持兼容——例如无模型兜底路径仍会机械截取 4 词、后处理仍会把输出收缩到 100 字符以内并剥离 XML 标签与冗长解释这些是提示词无法覆盖的硬边界。六、提示词工程角度的设计启示把session_name.md与上述实现放在一起能提炼出几条可复用的提示词工程经验用反例 正例锚定抽象概念。Title what the work is ABOUT, not the mechanical activity这类指令很抽象但紧跟的示例对如 create a PR for the refund timeout fix → Refund timeout fix把object vs action落到可模仿的具体输出上这是提升指令可执行性的关键手法。用优先级规则压缩决策空间。标识符 公司/项目/文档 人名 朴素动作的本质是把命名变成一个可判定的排序问题显著降低模型自由发挥度。幻觉护栏写进提示词。never invent specifics that are not present与 hints 区use them only when they match the subject两条共同约束模型不得把工作目录等弱信号脑补成确定事实。提示词软约束 代码硬兜底。模型理论上应只输出标题但工程上仍用定界符解析、XML 剥离、引号提取与长度截断四道保险保证产物纯净避免把可靠性押注在模型纪律性上。轻量任务最小化成本。命名任务不走完整系统提示词、只取前 3 条消息、默认只在前 3 条用户消息窗口内触发让这一高频轻任务的开销可控。七、小结Goose 的会话自动命名是一套提示词设计 模板体系 运行时流水线三层咬合的机制session_name.md以 4 词上限、命名对象而非动作、四优先规则与防幻觉护栏定义了什么是好标题session_naming.rs 把这段提示词转化为可重复执行的抽取、推理、清洗流程session_manager.rs 与 agent.rs 则决定在什么时机、什么条件下触发并回写名称同时尊重用户手动命名、recipe 标题与 scheduled 会话等特例。若你要为其他 Agent 产品实现类似的自动命名会话功能或希望微调 Goose 的命名行为本文展示的提示词全文、渲染链与后处理代码就是一份可直接对照的参考实现。相关源码入口提示词模板 · 模板注册与渲染 · 命名生成与后处理 · 触发与回写 · 请求组装兜底【免费下载链接】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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价