雨天小六

读懂 Codex(4.10):Model、Personality 与模型切换提示

· 更新于 2026-08-02 · 专栏:读懂 Codex

#Codex#Agent Runtime#Prompt#上下文工程#软件架构

模型切换涉及三个值:当前 ModelInfo、Session 持有的 Base Instructions、History 中模型可见的切换说明。ModelInstructionsState 只在模型身份真正变化且存在切换指令时发消息;PersonalityState 则判断人格是否已经烘焙进基础指令,避免重复注入。

Model section 只保存模型标识

ModelInstructionsState.snapshot() 返回当前模型 slug。它还接收 previous model 和本次切换指令,用于没有已知 baseline 的恢复边界判断:若前后模型不同且说明非空,生成 Developer 片段;模型未变则不发。

模型身份变化触发 ModelInstructionsState 差异消息
图 4.10-1:Snapshot 只比较稳定 slug,切换说明是渲染材料。已知 baseline 相同时,即使调用方再次提供说明也不会重复注入。
def render_model_diff(current, previous):
    changed = (
        previous.value != current.model
        if previous.is_known
        else current.previous_model not in (None, current.model)
    )
    return ModelSwitchFragment(current.instructions) if changed and current.instructions else None

Personality 有“烘焙”和“附加”两条路径

模型模板若包含 Personality 占位,初始人格已经进入 Base Instructions;personality_is_baked 为真时不再创建重复片段。无法烘焙的模型或运行中人格变化,才由 PersonalityState 生成独立 Developer 更新。

Personality 在基础指令烘焙和历史增量注入之间选择
图 4.10-2:初始模板能容纳人格时走顶层通道;运行中变化或模板不支持时走 World State 通道。两条线最终都影响模型行为,但持久化边界不同。
def resolve_personality_delivery(model, personality, previous):
    baked = model.supports_personality_template
    base = model.instructions_for(personality)
    fragment = None
    if not baked and personality_changed(previous, model.slug, personality):
        fragment = model.personality_instructions(personality)
    return base, fragment

Personality Snapshot 同时包含 model 和 personality,因为换模型后即使人格枚举相同,渲染方式也可能不同。只比较 personality 会漏掉这种转换。

前后顺序

初始上下文发现模型切换片段时把它放到 Developer bundle 首部,使后续项目规则和模式说明在新模型合同之下解释。后续变化按 World State 分区稳定顺序记录。

错误实现包括:切换模型时无条件替换 Session Base Instructions、把同一人格同时写入顶层和 History、只比较人格不比较模型。对应测试要覆盖无变化去重、模型变更、人格变更和 baked 分支。

源码与测试锚点

  • codex-rs/core/src/context/world_state/model.rs
  • codex-rs/core/src/context/world_state/personality.rs
  • codex-rs/protocol/src/openai_models.rs::get_model_instructions
  • codex-rs/core/src/context/world_state/model_tests.rspersonality_tests.rs

评论


← 返回文章列表