把 system、历史、RAG、工具结果、记忆和业务状态装进有限上下文窗口,并记录哪些材料被保留、压缩、降级或丢弃
| 层 | 它做什么 | 常见错误 | 应该留下的证据 |
|---|---|---|---|
| 候选材料收集 | 收集 system、developer、user、history、RAG、tool、memory、产品状态 | 把所有材料不分来源地塞进 prompt | segment_id、source、owner、created_at |
| 可信度分层 | 区分高优先级指令、用户请求、外部证据和低信任内容 | 把网页 / 文档里的伪指令当成系统指令 | trust_level、authority、content_type |
| 窗口预算 | 为输入、输出、RAG、历史、工具结果和安全规则预留 token | 输入吃满窗口,导致输出空间或关键证据被挤掉 | token_budget、reserved_output_tokens |
| 排序与压缩 | 决定哪些材料靠前、靠近问题、摘要化或结构化 | 只按时间或检索分数排序,忽略任务需要 | rank_reason、compression_policy |
| 截断与降级 | 超预算时决定丢什么、压什么、降级什么 | 静默截掉 system prompt、引用或工具结果尾部 | dropped_segments、truncation_reason |
| 序列化 | 按模型 chat template 渲染成最终文本和 token ids | 装配逻辑和模板版本不一致,回放不可复现 | template_version、rendered_prompt_hash |
| 材料 | 来源 | 主要作用 | 预算与风险 |
|---|---|---|---|
| system / policy | 平台、产品、安全策略 | 定义角色、边界、禁止项和输出约束 | 必须保留完整边界;被截断会导致行为漂移 |
| developer / task prompt | 功能模块、场景模板 | 把通用能力约束到当前任务 | 容易和 system 或用户意图冲突,需要版本化 |
| user input | 当前用户请求、附件、表单状态 | 当前任务的直接目标 | 包含提示注入、敏感信息和伪角色标记 |
| conversation history | 会话存储、最近轮次 | 保持连续性、指代消解和偏好延续 | 旧错误会污染当前请求,长会话容易吃掉窗口 |
| memory / summary | 长期记忆、工作摘要、状态检查点 | 跨轮、跨会话保留任务状态 | 摘要可能过期、偏置或不可解释 |
| RAG evidence | 搜索、向量库、数据库、文件解析 | 提供专有、最新、可引用事实 | Top-K 过大导致噪声,Top-K 过小漏证据 |
| tool result | API、代码执行、工作流节点 | 提供真实系统状态和执行反馈 | 结果可能很长、出错、被外部内容间接注入 |
| product state | 页面对象、权限、租户、业务流程 | 说明用户正在操作什么、能做什么 | 状态不完整会让模型做出越权或不合时宜的建议 |
| 预算桶 | 典型内容 | 分配原则 | 超预算时先做什么 |
|---|---|---|---|
| reserved output | 最终回答、JSON、引用、工具参数 | 按任务输出形态预留,不和输入抢窗口 | 缩短输出要求或改成分段生成 |
| control budget | system、policy、schema、tool rules | 稳定保留,尽量短而不可歧义 | 压缩低价值描述,不删除边界规则 |
| query budget | 当前用户请求、当前对象、附件摘要 | 当前任务最靠近模型生成位置 | 提取任务目标和约束,附件走摘要 / 引用 |
| history budget | 最近对话、任务状态、用户偏好 | 最近轮次 + 状态摘要,而不是全量历史 | 保留关键决策,丢弃寒暄和已完成中间过程 |
| RAG budget | 证据 chunk、引用、表格片段、代码片段 | 按问题、权限、去重和证据覆盖分配 | 重排、合并相似 chunk、保留引用 id |
| tool budget | 工具结果、错误、执行日志、审批状态 | 保留状态、关键字段和错误类型,避免长日志直塞 | 结构化摘要,长结果只放相关片段 |
| safety budget | 风险标签、权限快照、审核要求 | 高风险任务必须显式保留 | 降级能力,而不是删除安全上下文 |
| 排序原则 | 怎么做 | 为什么重要 |
|---|---|---|
| 高优先级指令前置 | system / policy / developer 指令稳定放在模板规定位置 | 让角色协议承载权威边界,降低被用户内容覆盖的概率 |
| 当前问题靠近生成点 | 把最新 user query 和必要约束放在 assistant 生成前附近 | 减少长上下文中任务目标被稀释或遗忘 |
| 证据靠近被问到的点 | 按 query intent 重排 RAG chunk,并把引用 id 留在片段旁边 | 缓解 lost in the middle 和引用错位 |
| 历史先摘要再补近邻 | 长期历史压成状态摘要,最近几轮保留原文 | 同时保留连续性和近期语气、指代、未完成动作 |
| 工具结果结构化 | 把 tool result 转成字段、状态、证据 id、错误类型 | 避免模型把长日志、HTML、网页文本当成新指令 |
| 冲突证据显式标记 | 把来源、时间、权限、置信度和冲突点写清楚 | 不要让模型在互相矛盾的材料里凭语气猜真伪 |
| 策略 | 适用场景 | 优点 | 风险 |
|---|---|---|---|
| tail truncation | 普通长文输入、日志尾部不重要 | 实现简单,保留开头背景 | 可能切掉最新指令、结论、错误码和引用 |
| head truncation | 多轮聊天只需要近期上下文 | 保留最近状态和用户最新意图 | 可能丢失早期约束、身份、任务目标 |
| middle-aware truncation | 长文档、长会话、代码文件 | 保留开头定义、尾部结论和相关中段 | 需要相关性判断,不能盲切 |
| role-aware truncation | chat template、多角色消息 | 避免切破 role boundary 和 tool call JSON | 实现需要理解消息结构,不适合纯字符串截断 |
| evidence-aware truncation | RAG 问答、引用回答、合规场景 | 优先保留能支撑答案的证据和出处 | 如果检索排序错,可能保留错误证据 |
| summary compression | 长历史、长工具结果、长任务状态 | 用少量 token 保留状态 | 摘要会丢细节,且需要记录摘要版本和来源 |
| graceful degradation | 超长输入、低预算模型、移动端延迟要求 | 明确告诉系统或用户“只处理部分材料” | 如果不显式暴露,会制造假完整感 |
不要在最终字符串上做无感截断。正确做法是先把上下文拆成结构化 segment,再按 role、source、token、priority、trust、evidence_id 和 dependency 做选择;最终被丢弃的材料也要能在 Trace 里查到。
| 对象 | 装配方式 | 必须保留 | 不要这样做 |
|---|---|---|---|
| RAG chunk | 按问题重排、去重、压缩、带引用 id 放入证据区 | doc_id、chunk_id、score、权限快照、时间 | 把整篇文档拼进 prompt,或者只保留正文不留出处 |
| 搜索结果 | 标题、摘要、URL、时间、可信度分开呈现 | source、retrieved_at、query rewrite | 把搜索摘要当成已验证事实 |
| 数据库结果 | 结构化表格、字段说明、过滤条件一起传入 | sql / filter、row count、权限过滤条件 | 只给结果不给查询条件,无法审计 |
| 工具返回 | 状态、关键字段、错误码、调用 id、证据 id | tool_call_id、args_hash、status、error_type | 把原始 HTML / 日志 / 异常栈全量塞入 |
| 代码执行 | 命令、退出码、关键输出、失败原因 | command_id、cwd、exit_code、stdout 摘要 | 只给模型“执行失败”,不给可恢复线索 |
| 人工审批 | 审批状态、审批人角色、范围、过期时间 | approval_id、scope、expires_at | 把人工确认写成普通自然语言,后续无法判断权限 |
| 字段 | 记录什么 | 用来排查什么 |
|---|---|---|
| context_version | 上下文装配器版本、策略版本、排序规则版本 | 同一请求为什么换版本后行为变化 |
| template_version | chat template、role mapping、stop rule | 模板变动、工具调用格式漂移、停止符冲突 |
| rendered_prompt_hash | 最终渲染 prompt 的哈希或脱敏快照 | 评测回放、事故复现、发布对比 |
| token_budget | 窗口大小、输入预算、输出预留、各桶分配 | 慢、贵、截断和输出不完整 |
| segments | 每段来源、角色、token、优先级、可信度、证据 id | 模型到底看到了什么、哪些材料影响回答 |
| dropped_segments | 被丢弃或压缩的段落、原因、原 token 数 | 关键证据或系统指令是否被截断 |
| truncation_reason | 超预算、低优先级、重复、权限不足、过期 | 区分正常降级和系统错误 |
| retrieval_snapshot | query rewrite、top-k、rerank、ACL、doc version | RAG 命中、权限过滤、引用错误 |
| tool_context_snapshot | 工具定义、调用 id、结果摘要、审批状态 | 工具越权、结果污染、Agent 循环 |
| 装配节点 | 必须记录的字段 | 用来判断什么 |
|---|---|---|
| 材料候选 | segment_id、source_type、source_version、authority_level、permission_snapshot | 这段材料来自哪里,用户是否有权看,它能否充当指令? |
| 预算分配 | bucket_name、allocated_tokens、used_tokens、reserved_output_tokens、overflow_policy | system、当前问题、历史、RAG、工具结果分别占了多少窗口? |
| 排序与靠近 | rank_score、position_index、recency、task_relevance、evidence_priority | 关键证据是否离生成位置太远,当前任务是否被历史淹没? |
| 压缩与截断 | compression_method、dropped_segments、drop_reason、summary_id、loss_risk | 丢弃的是重复噪音、低权重历史,还是关键约束和引用证据? |
| 最终快照 | context_pack_id、rendered_prompt_hash、token_count、template_version、trace_id | 一次坏例能否精确回放到当时模型真正看到的上下文? |
| 问题 | 先看什么 | 常见修复动作 |
|---|---|---|
| 模型是否看到了正确 system / policy? | rendered prompt、template version、control budget | 固定控制区预算,减少冗长系统说明 |
| 当前用户问题是否靠近生成位置? | segment order、final user message、history summary | 重排历史,把当前任务目标前置或靠近 assistant header |
| 关键证据有没有进入窗口? | RAG top-k、dropped_segments、chunk ids | 重排、去重、压缩 chunk,调低无关历史预算 |
| 引用为什么错位? | evidence_id、chunk boundary、answer citation map | 证据片段和引用 id 绑定,避免正文和出处分离 |
| 工具结果有没有被当成指令? | tool role、trust_level、serialization | 用低信任工具结果区和结构化字段隔离 |
| 长会话为什么越聊越偏? | history budget、memory summary、过期状态 | 摘要状态、清理旧目标、标记已完成任务 |
| 为什么同一问题单轮好、多轮差? | 历史排序、截断策略、role boundary | 多轮用状态摘要 + 最近轮次,不盲目全量拼接 |
| 为什么首 token 很慢? | 输入 token、prefill、RAG budget、cache hit | 瘦身上下文、缓存控制区、缩短证据和工具结果 |
| 为什么回答半截停止? | reserved output、max tokens、stop rule | 预留输出、拆分任务、修正 stop sequence |
| 为什么坏例无法复现? | context_version、rendered_prompt_hash、dropped_segments | 把上下文装配纳入 Artifact / Release / Eval 证据链 |
| 相邻页 | 它回答什么 | 本页补什么 |
|---|---|---|
| 一次请求的一生 | 请求从输入到推理、返回、Trace 的时间顺序 | 细化“上下文组装”这一步如何预算、排序、截断和留证据 |
| Prompt / 上下文工程 | 怎样设计 System Prompt、历史、记忆和上下文 | 把设计落到结构化 segment、预算桶和装配策略 |
| Chat Template | messages 怎样按角色协议序列化成 token | 决定哪些 message / segment 被送去模板,以及被截掉什么 |
| 长上下文 / 记忆 | 长会话和长期记忆如何保持连续性 | 提供历史、摘要、记忆和当前请求的预算取舍规则 |
| 长上下文失效机制 | 为什么证据进了窗口仍会漏看或偏看 | 通过排序、近邻放置、证据去重和截断记录减少失效 |
| RAG / 知识检索 | 知识怎样检索、重排、引用和评测 | 回答检索结果怎样进入最终上下文窗口 |
| 成本 / 性能工程 | token、延迟、缓存和模型成本怎样优化 | 把窗口预算变成 TTFT、Prefill 和单位成本治理动作 |
| 审计证据链 | AI 请求怎样可复现、可归因、可追责 | 把 context_version、rendered_prompt_hash 和 dropped_segments 纳入证据 |