TwKit
正在载入
TwKit

Claude 每次都像失忆?官方拆台:不是它记性差,是你根本没把上文发回去 官方来源:Anthropic Academy《Building with the… · @swordBluesy · TwKit

@swordBluesy

Claude 每次都像失忆?官方拆台:不是它记性差,是你根本没把上文发回去 官方来源:Anthropic Academy《Building with the Claude API》第 2 课。课页未标注发布日期,故此处不写日期。原文标题直译:《多轮对话》。先把反常识结论放前面:Claude 不是记性差,它根本不记——每一次请求对它来说都是一个全新的陌生人,你以为的“对话”,其实是你自己一遍遍把旧账重新寄过去;一旦你少寄了一轮,它就真的什么都不知道了,答非所问不是模型翻车,是你没把上下文交到它手上。 说清词: - 无状态(stateless):服务器不保存任何对话记录,每次请求独立存在,没有会话编号、没有后台记忆。 - 消息列表(messages):你自己在代码里维护的对话清单,每轮新消息都追加进去,每次请求都整份发出。 - 用户消息(user message):人说的话,在列表里身份标为 user。 - 助手消息(assistant message):Claude 回复的话,在列表里身份标为 assistant,必须原样存回列表。 - 对话历史(conversation history):从第一句到最新一句的完整往来记录,是 Claude 理解“你刚才说的是什么”的唯一依据。 - 辅助函数(helper functions):把“追加用户消息、追加助手消息、发请求取回复”包起来的三个小工具,写一次、多轮复用。 一个真实的例子:课内就是拿量子计算开刀。第一轮问“什么是量子计算”,Claude 答得好好的;第二轮你只丢一句“再写一句话”过去,Claude 直接写了一句毫不相干的话——它不是在敷衍你,它是真的不知道你要续写什么。同一段对话,只要第二轮把第一轮的问答原样带上,Claude 马上就懂了:你要的是在量子计算定义后面再续一句。同一句跟进,带历史就是续写,不带历史就是乱写,差别只在你有没有把上文交出去。眼熟的进化路线也正是这条:从第 1 课的单次请求,到本课的多轮对话,再到本课程第 3 模块工具调用的多轮循环——工具结果也要以同样的办法塞回消息列表,否则工具一调,对话照样断线。 反方适用条件清单——以下情况,不必每次都带完整历史,先说清楚,免得把本课读成教条: - 单次独立任务:翻译一句、分类一条、改写一段,前后轮互不相干,带历史只是白花 token(词元)。 - 历史已经长到成本与延迟压不住:这时要截断、摘要或只留关键轮,但那是成本取舍,不是“可以不带历史”的借口,截掉哪轮、为什么截,必须是你主动的决定。 - 你要的就是无状态的好处:并行跑多路、失败重试、同一问题开多个分支——没有后台记忆,反而让每一路都干净独立。 - 除此之外,只要用户会说“接着说”“再写一句”“换一个说法”,完整历史就是必选项,没有第二种做法。 一句定性金句:记忆不是 Claude 给你的,是你一行行亲手递过去的。 一、翻车清单 - 只发最新一句:跟进句一发过去,Claude 答的和上文毫无关系,用户以为模型疯了,其实是历史根本没到它手上。 - 只追加用户消息、漏了助手回复:列表里只有人问、没有它答,上下文从中间断链,Claude 读到的是一串没人回答过的问题。 - 角色顺序错乱:user(用户)与 assistant(助手)身份贴错、顺序颠倒,Claude 读到的对话就不是当初那场对话。 - 以为有会话编号:到处找 session(会话)参数、等服务器帮你记——这个参数不存在,找一百年也找不到。 - 历史越攒越长、不做任何处理:轮数一多,token(词元)账单与延迟一起爆炸,最后不是对话断了,是成本先断了。 二、替代方案+理由 课内给的替代方案不是什么新架构,就是三个辅助函数:一个负责把用户新问题追加进列表,一个负责把 Claude 的回复以助手身份存回列表,一个负责拿着完整列表发请求、取回复。理由有三:第一,追加与发送的规矩只写一次,之后每轮照抄,不会这轮记得带历史、下轮又忘了;第二,出错只会出在一个地方,丢轮、错角色、顺序乱,查三个函数就够了,不用满代码找;第三,这套东西后面全程复用——工具调用要把工具结果塞回列表,RAG(检索增强生成)要把检索到的资料塞进上下文,用的都是同一条“列表+整份发送”的路。先把这三个函数写稳,后面所有多轮能力都是在它上面加东西。 三、目标形态 一个能连续多轮、每轮都带着完整上文的对话循环:用户说第一句,列表记一句;Claude 答一句,列表记一句;用户说“再写一句”“换个说法”“接着讲”,Claude 永远接得上,因为它每次收到的都是从头到尾的完整对话。跟进句不再靠运气,长对话不再前言不搭后语,开发者也不用再为“它怎么又忘了”背锅——历史在谁手上,责任就在谁手上,而历史从此一直在你手上。 四、迁移步骤 1. 建一个空的消息列表,当作这场对话唯一的账本。 2. 每轮先把用户的新问题以 user(用户)身份追加进列表。 3. 拿着整份列表发一次请求,不要只发最新一句。 4. 把 Claude 的回复以 assistant(助手)身份原样追加回列表。 5. 下一轮重复第 2 到第 4 步,列表只增不减、顺序不乱。 6. 照课内例子验收两轮:先问量子计算,再说“再写一句话”,确认第二句是续写定义而不是随机一句——续上了,这套循环就算跑通了。 五、团队共建分工 - 一个人定消息列表的归属与追加规则:列表存在哪、谁负责追加、谁负责截断,规则写进团队共识,不许各人各写一套。 - 一个人写三个辅助函数与单测:追加、存回、发送各写一个函数,单测专门验顺序、验角色、验丢轮即报错。 - 一个人定长对话的成本与截断策略:历史多长开始摘要、摘要留什么丢什么、token(词元)预算报表怎么做,让长对话不断线也不爆账单。 六、官方工具包 - 本课三个辅助函数:追加用户消息、追加助手消息、发请求取回复,课内点名“在之后的工作中会反复用到”。 - 第 1 课的核心函数 client.messages.create():本课流程复用它,只是 messages(消息)参数从单条变成整份历史。 - Python SDK(Anthropic SDK):课内示例所用的开发包,消息列表与请求都由它承载。 - 课页四张示意图:对话窗口、无状态原理、消息入列、整份历史发送,照着图走一遍,流程就立住了。 结尾收束:原则比架构重要——无状态不是缺陷,是契约:你给什么,Claude 就只知道什么;你不给,它就不知道,而且它永远不会告诉你它不知道。可重复的动作规则只有一条,每轮三步,少一步都不行:追加用户句、发完整历史、存回助手句。把这三步写成函数、写成习惯,多轮对话就从玄学变成了手艺。 S1哥观点:别再骂模型失忆了,先查你自己的代码有没有把上文发回去——十个“Claude 记不住”里,九个是开发者自己把历史弄丢了,剩下一个是历史太长没做截断,照样是开发者的账。这就跟给一个失忆的专家写信一样:你不附上前几封信,他凭什么知道你在说什么事?骂模型之前,先打开你的消息列表看看:上一轮的助手回复,到底在不在里面?你第一次做多轮对话时,是在哪一步丢了历史? 收藏用清单(照着做): 1. 建一个空的消息列表,当作这场对话唯一的账本。 2. 每轮三步:追加用户句、发整份历史、助手回复原样存回。 3. 照课内例子验收两轮:先问量子计算,再说“再写一句话”,确认第二句是续写定义而不是随机一句。 4. 历史太长先定截断策略:多长开始摘要、截掉哪轮,必须是你主动的决定,别等账单爆了才处理。 转给还在骂模型失忆的朋友,这篇能帮他省下一周调试时间。 #Claude中文教程

曝光 264 · 评论 7 · 点赞 3 · 书签 1

查看原帖