分类:AI编程
连续对话背后:状态、上下文与记忆分工
用户先问:“帮我查订单 O-1001 为什么还没到,回答简单一点。”下一句只说:“那我明天还要等吗?”Agent 要接住追问,需要知道“那”指向哪张订单、物流查到什么,并继续遵守简短回答要求。素材将这类机制归为会话状态、上下文、长期记忆和知识库:会话状态保存执行进度,上下文承载本轮模型推理所需信息,长期记忆保留跨会话事实,知识库提供可检索资料。Agent Harness 则负责组织这些内容。
Harness 是 Agent 的运行底座,负责模型调用、工具执行、消息组织和状态管理,并不要求框架中存在同名类。素材以 AgentScope Python v2.0.10 示例展开,记忆模式参考官方 2.0.9 文档,以避免混用 1.x API。持久库可以存很长历史,但模型上下文只能放入本次请求允许的内容,因此“已经保存”不等于“这轮全部发送”。即便记忆和知识库都使用向量检索,两者的内容来源、更新方式和作用域也不同。订单实时状态要从业务工具重新查询,不能把昨天的物流结论直接当作今天的实时事实。
上下文组装与窗口预算
在同一 Agent、同一会话中,Harness 通常保留用户消息、Agent 回复和工具记录。第二轮到来时,再恢复状态并组织新的模型请求。素材中的示意结构包含 session_id、messages、available_tools 和 output_budget_tokens 等字段;工具结果也要传给模型,才会参与下一步推理。
预算是硬约束:本次输入 token + 计划输出 token ≤ 实际模型上下文窗口,同时还要满足服务独立的输入、输出限制。AgentScope v2.0.10 的 ChatModelBase.context_size 用于本地压缩预算,基类默认值为 32768,具体适配器可以设置不同默认值;该路径不会在每次请求前向服务查询窗口大小。若实际服务支持 128000 token,就按对应能力配置,配置成 256000 不会扩大真实窗口。
默认 ContextConfig.trigger_ratio 为 0.8。当估算的本次模型输入 token ≥ trigger_ratio × model.context_size 时触发处理。假设配置窗口为 100000,估算输入到 80000 就会触发。这里的计入项包括准备好的模型输入,例如系统提示词、摘要、消息以及工具 schema。该版本基类按文本 UTF-8 字节数除以 4 估算,非文本多模态 DataBlock 使用固定估值,因此 0.8 是提前处理策略,不是精确 tokenizer 测量。
摘要压缩与长期记忆
上下文过长时,摘要是一种有损整理。素材举例,多轮查订单记录可以压缩为:目标、已确认事实、未确认项、下一步和保留约束,例如保留订单号 O-1001 原值、用户要求简短。AgentScope 的 AgentState 包含 context 和 summary 等字段,压缩由 Agent 执行逻辑与 ContextConfig 共同完成。默认配置还包括 reserve_ratio=0.1 和摘要失败后允许截断;配置 offloader 时,可以保存被移出的原内容并留下路径提示。
长期记忆要解决跨会话复用。适合长期保存的是稳定偏好、项目约束和有来源的经验;时效性很强的数据需要有效期或重新核验。AgentScope 提供 Mem0Middleware,需要显式接入,支持 user_id、可选 agent_id、top_k 和 threshold,自动检索结果会加入 state.context。身份参数应来自服务端验证后的会话,不能直接信任用户请求里的自报身份。
素材还列出其他记忆模式:AgenticMemoryMiddleware 使用 MEMORY.md 索引和按主题组织的 Markdown,可通过 Read、Write、Edit 维护;ReMeMiddleware 使用文件工作区并提供 memory_search,回复后自动写回适用于所有模式。选择组件时,需要关注实际注入时机和可见性,而不只是“支持记忆”。
本地存储、多实例恢复与工程含义
Codex 的本地例子展示了多层文件分工:会话 rollout 使用 JSONL,SQLite 保存线程元数据等运行状态,Markdown 承载规则和长期记忆。官方 app-server 提供线程历史读取、恢复和压缩接口。本地记忆位于 ~/.codex/memories/,后台记忆生成与当前会话历史保存是两条流程。Codex 配置区分 model_context_window、model_auto_compact_token_limit 和 tool_output_token_limit,分别涉及窗口、自动压缩阈值和工具输出预算,不能据此推定它固定按 AgentScope 的 0.8 压缩。
多实例部署下,恢复会话也不是只传相同 session_id。素材指出,如果每次请求都重新创建 Agent,无法直接延续此前内存状态,需要恢复对应会话的 AgentState;单独设置相同 session_id 并不等于已经加载历史。
这组细节把 Agent 工程问题拉回应用层:连续对话不是把全部聊天记录塞给模型,而是区分本轮上下文、持久历史、实时查询和稳定偏好。窗口配置、摘要策略、记忆作用域和会话恢复机制,都需要和事实来源、有效期策略一起设计。
原创文章,作者:点点,如若转载,请注明出处:https://www.dian8dian.com/rang-ding-dan-zhu-shou-jie-zhu-xia-yi-ju-zhui-wen-agent