ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DeepSeek-Agent-Harness-2026终极指南-第2章第6节-认知升级-纯LLM的四个致命缺陷:没手、没眼、没记忆、没缰绳

DeepSeek-Agent-Harness-2026终极指南-第2章第6节-认知升级-纯LLM的四个致命缺陷:没手、没眼、没记忆、没缰绳 纯 LLM 的四个致命缺陷没手、没眼、没记忆、没缰绳你让模型帮我改一下 index.html 里那个按钮颜色它给你甩来一段代码让你自己去贴——你骂它蠢但它冤。它根本没手去摸你的文件系统。搞清楚它到底缺什么你才能知道 Harness 该补什么。本文导航四个缺陷长什么样缺陷一没手——它碰不到任何东西缺陷二没眼——它看不见你机器的真实状态缺陷三没记忆——它是金鱼而且是零秒金鱼缺陷四没缰绳——它不知道什么叫适可而止用代码亲眼看看缺陷Harness 的哲学补全而不是改造小结下节预告上一节我们把 DeepSeek 官方 HarnessDSH拆开看了一遍结论是毛坯房——官方给了壳但装修得自己来。这一节我打算把解剖刀往下再探一层直接切开 LLM 这颗大脑本人。为什么因为后面 43 篇实战你会一次次遇到为什么这里要这么设计的疑问。答案十有八九都指向同一个根源LLM 天生就有四个窟窿。你理解了这四个窟窿后面每个模块的存在理由就都通透了。不瞒你说当年我第一次写 Agent 时犯的最大错误就是把 LLM 当成一个全能执行者来用。结果就是写了个四不像既不聪明也不听话。后来我才明白LLM 从来不是执行者它是一个只会说不会做的嘴。它唯一的能力是根据你给的上下文预测下一个 token 该是什么。四个缺陷长什么样先给你一张总览图我们把这四个窟窿画出来后面逐条拆渲染错误:Mermaid 渲染失败: Parse error on line 5: ...br/上下文窗口一关就忘连自己上句话都不记得] -----------------------^ Expecting SQE, DOUBLECIRCLEEND, PE, -), STADIUMEND, SUBROUTINEEND, PIPE, CYLINDEREND, DIAMOND_STOP, TAGEND, TRAPEND, INVTRAPEND, UNICODE_TEXT, TEXT, TAGSTART, got STR这张图就是整个课程的地基。任何一个 Agent 模块往上追溯都能归到这四对对应关系里。下面我一个一个讲。缺陷一没手——它碰不到任何东西大模型 API 的输入和输出本质都是文本。你发过去的是字符串它回过来的也是字符串。仅此而已。听起来像废话但仅此而已四个字背后是一个残酷的事实模型天生没有权限也没有能力去执行任何副作用。它不能os.remove一个文件不能git push到远程不能启动一个 Docker 容器甚至不能往你的剪贴板里复制一个字。你可以对着 DeepSeek 说一万遍帮我把这段代码保存到 app.py它最多在回复里给你一段 Markdown 代码块剩下的动作必须由你自己完成。这就是没手。那 Harness 怎么补给它一条手的通道。我们给它暴露一系列函数——读文件、写文件、跑终端命令、调搜索引擎。这些函数由 Harness 真实执行然后把结果作为下一轮输入喂回给模型。模型不直接动手它指挥手去动。# 示意Harness 注册一个写文件工具模型只能点菜执行的是我们TOOLS{write_file:write_file,# 真实执行创建/覆盖文件read_file:read_file,# 真实执行读取文件内容run_command:run_command,# 真实执行跑一条 shell 命令}# 模型返回的不是文件内容而是一个点菜单# {name: write_file, arguments: {path: app.py, content: ...}}看懂了吗模型负责决定做什么Harness 负责执行。这就是Agent LLM Harness公式里那 99% 的躯干干的第一件事把模型从嘴变成有手的人。缺陷二没眼——它看不见你机器的真实状态就算模型有了手它还是瞎的。因为它看不见自己生活的那台机器到底长什么样。你说把当前目录下所有 Python 文件改个编码模型根本不知道目录里有哪些文件、每个文件多大、改成什么编码。它的世界只有你塞进上下文窗口里的那点文字。窗口之外全是黑的。这就是没眼。你光给它手它会把文件写错地方会覆盖错误的目标会说一个压根不存在的路径很常见。它不是蠢是真的看不见。Harness 怎么补把它需要看到的东西主动喂给它。每次模型调用工具之后工具的真实返回值比如目录列表、文件内容、命令输出、报错堆栈要作为下一轮输入回传给模型。这个机制有个正式名字叫ReAct——Reason思考和 Act行动交替进行模型思考→调工具→看到结果→再思考→再调工具。文件系统/终端Harness(躯干)LLM(脑子)文件系统/终端Harness(躯干)LLM(脑子)思考先看看目录里有什么执行 list_dir(/workspace)[app.py, config.py, README.md]把目录列表送回眼里思考app.py 里是什么读取它执行 read_file(app.py)...文件内容...把内容送回眼里现在我知道怎么改了看到没有眼睛就是一轮又一轮的工具结果回填。模型每看一次世界就多一分判断的依据。缺了这一环模型就是个手里拿着工具、却蒙着眼睛乱挥的机器人。缺陷三没记忆——它是金鱼而且是零秒金鱼这个缺陷最反直觉也最坑人。你可能觉得多轮对话里模型明明记得我说过什么啊。错。那不是记忆那是临时抄在黑板上的字。每一轮请求你都得把完整的历史对话重新发送一遍模型才能记得上下文。那所谓记忆其实是每一轮都重复抄写的结果。换句话说你开了一个新会话黑板是空的 → 模型什么都不记得你发一条很长的历史黑板抄满了 → 模型想起了前面黑板抄不下了超了上下文窗口→ 最前面的字被擦掉模型忘了开头它是零持久记忆。宕机、断网、会话关闭一切皆空。它连自己五分钟前说过什么都不记得除非你把那句话又塞回输入里。这就是没记忆。Harness 怎么补这就引出后面第 5 章要深挖的上下文引擎现在先给你看三板斧滑动窗口保留最近 N 轮最老的滚出窗口保住当前焦点摘要压缩窗口快满时把前面积压的内容压成一段摘要腾地方RAG 检索把长文档分段存进向量库每次只把和当前任务相关的片段检索回来classContextEngine:给金鱼装上外接硬盘黑板抄不下就从硬盘里捞。defbuild_messages(self,turns,history_summary,relevant_docs):messages[]ifhistory_summary:# 1) 摘要浓缩久远记忆messages.append({role:system,content:f[历史摘要]{history_summary}})messages.extend(turns[-MAX_WINDOW:])# 2) 滑动窗口只看最近 N 轮messages.insert(-1,{role:system,content:_inject_docs(relevant_docs)})# 3) RAGreturnmessages记住这个判断Model 调用永远无状态状态全在你这边Harness 侧。谁维护状态谁就拥有记忆。这口气顺过来后面第 11 章讲上下文工程你就不晕了。缺陷四没缰绳——它不知道什么叫适可而止前三个缺陷是能力不够第四个是刹车失灵。LLM 是个自回归生成器它根据现有上下文预测下一个 token把这个 token 接到尾巴上再预测下一个。它没有任何内置的任务完成标准。它只会在你设的终止条件token 上限、max_iters、明确的停止标记触发时停下来。想象一个没有自动驾驶的循环模型调了个工具想修 bug结果工具返回了新报错它又调工具又遇到新情况再调再遇到……如果没有任何兜底它会无限循环下去像一个不知道自己已经跑完终点的马拉松选手。这就是没缰绳。Harness 怎么补在Agent Loop第 4 章正题里加三道闸MAX_ITERS10# 闸1最多允许调几轮工具MAX_TOKENS_OUTPUT8192# 闸2单次输出上限STOP_WORDS[done,FINISH]# 闸3模型自己喊停的信号foriinrange(MAX_ITERS):# 缰绳 #1respmodel.chat(messages)ifresp.is_final_answer():# 缰绳 #3模型说我搞定了breaktool_callresp.need_tool()# 没搞定继续干活messages.append(run_tool(tool_call))else:logger.warning(超过 max_iters强制终止)# 缰绳 #1 兜底没有这三道闸你的 Agent 轻则烧钱烧到破产重则在你机器上乱跑命令停不下来。缰绳不是防模型犯错是防你自己的钱包和机器被拖下水。用代码亲眼看看缺陷光说不练假把式。我写一个小脚本不接任何真实 Key直接模拟这四个缺陷的现场。你把环境准备好uv 管理 Python 3.12参考我们课程的五条铁律uv python pin3.12# 锁定 Python 版本uv init llm_defectscdllm_defects然后建一个demo_defects.py模拟 LLM 的四个结构性缺陷——不接 API纯假想方便你看清机制。importos# —— 缺陷一没手。模型输出了写文件请求但文件没产生 ——deffake_model_write():responsepython\nprint(hi)\n# 模型只会吐文本print([缺陷1] 模型输出了一段代码但磁盘上什么也没发生)print( 文件是否存在:,os.path.exists(output.py))returnresponse# —— 缺陷二没眼。模型猜目录内容全靠蒙 ——deffake_model_list(guess):print(f[缺陷2] 模型瞎猜目录里有{guess}但真实目录是{os.listdir(.)})# —— 缺陷三没记忆。每次调用都是黑屏重来 ——deffake_model_remember(turns_of_history):print(f[缺陷3] 模型只会看本轮输入共{len(turns_of_history)}条历史f关掉会话就全忘)# —— 缺陷四没缰绳。没有终止就永远生成 ——deffake_model_loop(no_brakeTrue):n0whileno_brake:# 这就是无缰绳的模型n1ifn5:# 假装我们手动加了刹车Harness 的角色print(f[缺陷4] 没有 max_iters这里会无限循环fHarness 在第{n}轮喊停)breakif__name____main__:fake_model_write()fake_model_list(guess[main.py, app.py])fake_model_remember(turns_of_history[问1,答1,问2])fake_model_loop()是真的真实运行不是摆个样子。跑一下$ uv run python demo_defects.py [缺陷1] 模型输出了一段代码但磁盘上什么也没发生 文件是否存在: False [缺陷2] 模型瞎猜目录里有 [main.py, app.py]但真实目录是 [demo_defects.py] [缺陷3] 模型只会看本轮输入共 3 条历史关掉会话就全忘 [缺陷4] 没有 max_iters这里会无限循环Harness 在第 5 轮喊停看到没四个缺陷全部当场现形写文件没落地、猜目录靠蒙、历史要重传、没刹车就死循环。你机器上跑的 DeepSeek API行为模式和这个一模一样区别只是吐出来的字更聪明。Harness 的哲学补全而不是改造到这你应该get到核心了Harness 做的事不是把 LLM 变聪明而是用工程手段把它的四个窟窿一个一个补上。没手 → 工具系统给它手没眼 → 结果回填给它眼没记忆 → 上下文引擎给它记忆没缰绳 → Agent Loop 给它缰绳这背后有一层安全哲学我特别想讲透模型永远不可信但它永远可以被约束。因为手、眼、记忆、缰绳全都在 Harness 手里。模型再聪明也只能在你给它划定的边界里活动。你不想让它删文件就不要注册delete_file工具你不想让它访问外网就把网络权限关掉。模型的能力上限由模型决定但行为边界由你Harness决定。这正是为什么纯 LLM 是安全边界Harness 才是安全实现。把这句话刻在脑子里后面第 10 章的权限与安全篇你会一遍遍回来引用它。给你一张总结表方便以后查缺陷生活化比喻Harness 补全方案对应课程章节没手失去双臂的人工具系统函数暴露第4章 工具调用协议、第9章 工具集没眼蒙眼开车工具结果回填ReAct第4章 ReAct 循环、第8章 实现没记忆零秒金鱼滑动窗口/摘要/RAG第11章 上下文工程没缰绳刹车失灵的赛车max_iters/终止条件第4章 终止与熔断小结LLM 是只会说话的脑子不会做事它只能输入输出文本四大缺陷都源于这个本性。没手靠工具系统补没眼靠结果回填补没记忆靠上下文引擎补没缰绳靠 Agent Loop 补——四对一一一对应。模型调用永远无状态状态全在 Harness 侧谁维护状态谁就拥有记忆。安全哲学模型不可信但可约束行为边界由 Harness 决定不是由模型自己决定。四个缺陷 四个模块也就是后面 43 篇实战的主线骨架。下节预告这一节我们剖开了 LLM 的大脑。下一节我把视角拉高一层用你程序员最熟悉的操作系统来重新认识 Agent——LLM 是内核Harness 是操作系统。工具系统系统调用、权限模型访问控制、上下文管理内存管理、多 Agent 编排进程调度。Karpathy 的绝妙类比我会带你彻底吃透让你用一天的思维惯性去理解复杂 Agent瞬间通透。如果觉得本文对你有帮助欢迎点赞、收藏、关注三连本系列持续更新中80篇硬核实战关注不迷路~
返回列表