认清现实吧LLM就是个“超级赌场”而我们需要的是一套“紧箍咒” 摘要LLM本质上是一个无状态的条件概率文本生成器它没有记忆、没有意识、不会创新且天生存在弱指令遵守和幻觉两大致命弱点。不加约束地使用LLM就像让一个天才但散漫的实习生独立负责生产任务注定会出问题。本文提出Harness约束框架“的概念——通过记忆系统、系统调用门、校验Agent、知识图谱和Batch Agent等工程手段给LLM装上规则引擎”让它从不可靠的赌场变成可信赖的生产力工具。核心观点别神化AI要工程化AI。 SEO关键词LLM本质、条件概率文本生成器、LLM幻觉、弱指令遵守、Harness约束框架、Agent工程化、LLM无状态、知识图谱、AI系统设计、LLM生产部署之前我的系列文章一直在聊“流马怎么设计”、“用了什么技术”、“能带来什么收益”。但今天我想退一步聊聊一个更根本的问题LLM到底是什么它擅长什么不擅长什么为什么我们需要一套“Harness”来约束它这些问题的答案决定了我们到底应该把AI当成“神”来崇拜还是当成“工具”来调教。一、LLM的本质一个没有状态的“条件概率文本生成器”如果你用过LLM的API你会发现一个“反直觉”的事实LLM本身没有任何记忆。它不知道上一轮对话说了什么不知道你是谁甚至不知道自己在哪。每一次你调用它你发给它的消息长这样系统提示词Agent.md、Skills、Rules、Specs、Powers... 对话历史如果有的话 当前用户的输入LLM拿到这一大坨文本开始工作。它的工作原理非常“简单粗暴”根据你给的输入条件计算下一个词的概率分布。从这个概率分布中选出第一个词。把选出的第一个词拼到输入后面重新计算第二个词的概率分布。再选第二个词。递归执行直到生成完整的回答。这就是全部。没有思考没有意识没有状态。你可能会问“那它怎么记住对话上下文”答案是它不记是你每次都把历史对话重新塞给它。LLM本身是无状态的——每次请求都是一次全新的计算它的“记忆”完全依赖于你每次喂进去的上下文。这也解释了为什么你可以随时切换模型从GPT-4换到Claude或者换到Qwen只要上下文一致任务可以无缝继续。因为LLM只是一个“接收文本、返回文本”的函数它的内部状态不影响外部任务的一致性。状态由外部系统就是我们一直在做的Harness维护LLM只负责“给定输入生成输出”。至于温度Temperature、Top-K、Top-P这些参数它们属于后处理工程不影响LLM的本质。温度高LLM选词的随机性大输出看起来更“有创意”温度低LLM更倾向于选概率最高的词输出更“保守”。但无论怎么调它都是在已有的概率分布上做文章。它不会“顿悟”不会“灵光一闪”不会创造出训练数据中从未出现过的真正新概念。二、LLM的致命弱点弱指令遵守 幻觉因为LLM的本质是“条件概率”所以它有两个无法根治的毛病。第一个毛病弱指令遵守。你告诉它“必须用JSON格式输出”它答应了。但输出的时候可能多打了一个逗号少加了一个引号。为什么因为它在生成每个词的时候只是在考虑“下一个词是什么概率最高”而不是“我有没有严格遵守某个规则”。你把一堆规则写在System Prompt里——它都会“看”但会不会遵守看运气。看概率。看它训练数据里类似的规则被遵守的频率。这就是“弱指令遵守”它能理解你的指令但它无法保证每次都不犯低级错误。因为它不是一个“函数”不会“编译”——它只是一个“文本生成器”。第二个毛病幻觉。这也是条件概率的必然结果。当LLM遇到一个它“不太确定”的问题时它不会说“我不知道”。它会基于训练数据中见过的类似模式“编”一个听起来合理的答案。这个答案可能格式完全正确、语气非常自信但内容完全错误。幻觉不是bug是feature。LLM的设计目标就是“生成”不是“验证”。验证需要外部世界的信息——一个它没有的“现实锚点”。三、既然创新不行守成也不行那LLM不是“鸡肋”了吗读到这你可能觉得创新任务不适合LLM因为它只会根据先验出结果。非创新任务也不适合因为它总会犯错。那LLM不就是个鸡肋吗对如果不加任何约束它就是鸡肋。写个周报还行写生产代码你敢直接部署它生成的代码不经人工审查吗我猜你不敢。但这不是LLM的错这是我们用法的错。我们把一个天生“无状态、弱约束、会幻觉”的文本生成器当成一个“全知全能的智能体”来用。出了问题我们骂它“不靠谱”但其实是我们自己没给它搭好台子。这就是Harness存在的意义。Harness不是给LLM锦上添花而是给LLM雪中送炭。四、Harness怎么做给“赌场”装上“规则引擎”LLM是一个“超级赌场”——它每次生成一个词都是在赌概率。而Harness就是给这个赌场装上规则引擎、审计系统和质量门禁。在我的流马Gliding Horse里Harness是这样调教LLM的1. 用记忆系统弥补LLM的“无状态”LLM自己没记忆但流马有四层记忆L0-L3。对话历史不用全塞进上下文而是存摘要和IRI。LLM需要细节时沿着IRI去图数据库里查。状态由Harness维护LLM只是一个“查询引擎”。2. 用系统调用门弥补LLM的“弱指令遵守”你写Prompt说“不要删文件”LLM可能还是会删。但流马在代码层拦截PA想写文件白名单里没有直接拒绝。DA想调用危险APIEd25519签名对不上直接拒绝。软约束在Prompt里硬约束在代码里。Harness替LLM兜底。3. 用CA检查Agent和阶段门禁弥补LLM的“幻觉”LLM生成了一份PRD说“功能模块已完整”。CA Agent会自动检查真的完整吗缺少参与者定义打回重做。这个检查不是LLM的“自我反省”而是独立于LLM之外的校验Agent在把关。4. 用知识图谱弥补LLM的“没有现实锚点”LLM说“上次我们讨论过JWT密钥长度是256位”。真的吗流马自动查知识图谱里的历史决策节点验证事实。如果LLM在胡编知识图谱会“打脸”。5. 用Batch Agent让系统“自我优化”技能图谱用久了会乱知识碎片会散失败模式会堆积。流马的后台整理Agent自动做技能合并、实体解析、失败模式挖掘。**系统越用越聪明不是因为LLM变强了而是因为Harness在持续优化。系统越用越聪明不是因为LLM变强了而是因为Harness在持续优化。下面是流马Gliding Horse中Harness的整体系统架构图直观展示各组件如何协同工作存储层Harness 规则引擎层LLM 层用户层状态管理事实验证安全拦截质量校验定期整理用户请求查询/生成返回结果用户界面 / API大语言模型(条件概率文本生成器)记忆系统 L0-L3维护状态与摘要系统调用门白名单 / Ed25519 签名CA 检查 Agent独立校验与门禁知识图谱事实锚点与验证Batch Agent后台自我优化图数据库文件系统架构说明用户请求先进入Harness层由Harness统一调度LLM、管理记忆、执行安全检查、验证事实并定期自我优化。LLM仅作为查询引擎被调用不直接接触存储或执行危险操作。**五、总结别把LLM当神把它当“天才实习生”LLM是一个天才但散漫的实习生。它学富五车训练数据量大反应极快推理速度快但不记事儿无状态不守规矩弱指令遵守爱胡扯幻觉没有创新基于先验不懂验证只会生成如果你直接让它独立负责生产任务它一定会闯祸。但如果你给它配上一套完善的工程体系——记忆系统帮它记事儿校验系统帮它把关门禁系统帮它守住底线知识系统帮它验证事实——它就能从一个“散漫的天才”变成“可信赖的生产力”。这就是Harness的价值不是让LLM变得更强而是让LLM变得靠谱。流马不是在做“更强的AI”而是在做“让AI可以放心用”的工程基座。六、最后说句心里话AI圈现在有两个极端一派把LLM当成“通向AGI的神谕”一派把LLM当成“只会写周报的玩具”。我的立场在中间LLM是伟大的发明但它只是一个“零件”。它需要操作系统、需要文件系统、需要权限管理、需要质量保障——就像CPU很强大但没有主板、内存、操作系统它就是个发热的硅片。LLM是天才Harness是纪律。天才需要纪律才能创造价值。我这套系统叫Gliding Horse流马所有代码都在 GitHub 上https://github.com/doiito/gliding_horse*系列第15篇了。写了这么多其实核心思想只有一个别神化AI工程化AI。如果你也在做Agent系统希望这个系列能让你少踩一些坑。七、实战用Harness约束LLM的Python示例前面我们聊了Harness的理念——给LLM装上规则引擎。下面用一个完整的Python示例展示如何通过一个简单的Harness类来包装LLM调用实现记忆缓存、输出格式校验和内容安全检查。7.1 核心Harness类importjsonimportreimporthashlibfromtypingimportAny,Callable,OptionalclassHarness: Harness 类给 LLM 调用套上紧箍咒 对应文章中的 Harness 理念 - 记忆缓存 → 避免重复调用节省成本 - 格式校验 → 确保 LLM 输出符合预期结构 - 安全检查 → 过滤敏感/违规内容 def__init__(self,llm_func:Callable[[str],str]):# llm_func实际的 LLM 调用函数如 OpenAI API 封装self.llm_funcllm_func# 记忆缓存存储已处理过的 prompt 及其结果self._cache:dict[str,str]{}# 关键词黑名单内容安全检查用self._blocklist:set[str]set()# ---------- 记忆缓存 ----------def_cache_key(self,prompt:str)-str:生成缓存键对应文章缓存机制returnhashlib.sha256(prompt.encode()).hexdigest()def_check_cache(self,prompt:str)-Optional[str]:命中缓存直接返回对应文章减少重复调用 keyself._cache_key(prompt)returnself._cache.get(key)def_update_cache(self,prompt:str,response:str):更新缓存keyself._cache_key(prompt)self._cache[key]response# ---------- 格式校验 ----------def_validate_json(self,text:str)-dict: 校验 LLM 输出是否为合法 JSON 对应文章输出格式约束——LLM 可能输出非结构化文本 try:returnjson.loads(text)exceptjson.JSONDecodeErrorase:raiseValueError(f输出格式校验失败不是合法 JSON{e})# ---------- 安全检查 ----------defadd_blocklist(self,keywords:list[str]):添加关键词黑名单对应文章内容安全过滤 self._blocklist.update(k.lower()forkinkeywords)def_safety_check(self,text:str)-bool: 检查输出是否包含黑名单关键词 对应文章安全护栏——防止 LLM 生成违规内容 lower_texttext.lower()forkeywordinself._blocklist:ifkeywordinlower_text:returnFalse# 未通过安全检查returnTrue# ---------- 主调用入口 ----------definvoke(self,prompt:str,require_json:boolFalse)-Any: 带 Harness 约束的 LLM 调用 参数 prompt: 输入提示词 require_json: 是否要求输出为 JSON 格式 返回 校验通过后的 LLM 输出 对应文章Harness 工作流 1. 查缓存 → 2. 调用 LLM → 3. 格式校验 → 4. 安全检查 → 5. 更新缓存 # 步骤1查缓存cachedself._check_cache(prompt)ifcachedisnotNone:print([Harness] 命中缓存跳过 LLM 调用)returncached# 步骤2调用 LLMprint([Harness] 调用 LLM...)raw_responseself.llm_func(prompt)# 步骤3格式校验ifrequire_json:raw_responseself._validate_json(raw_response)# 步骤4安全检查response_strjson.dumps(raw_response,ensure_asciiFalse)ifisinstance(raw_response,dict)elsestr(raw_response)ifnotself._safety_check(response_str):raiseRuntimeError(内容安全检查未通过输出包含敏感关键词)# 步骤5更新缓存self._update_cache(prompt,response_str)returnraw_response7.2 使用示例# 模拟一个 LLM 调用函数实际使用时替换为 OpenAI / 本地模型 APIdefmock_llm(prompt:str)-str:模拟 LLM 返回 JSON 格式的天气信息returnjson.dumps({city:北京,temperature:22,condition:晴,advice:适合户外活动})# 创建 Harness 实例harnessHarness(llm_funcmock_llm)# 添加安全关键词过滤harness.add_blocklist([暴力,色情,赌博])# 调用 LLM要求 JSON 输出try:resultharness.invoke(prompt北京今天天气怎么样,require_jsonTrue)print(f✅ 校验通过结果{result})# 输出{city: 北京, temperature: 22, condition: 晴, advice: 适合户外活动}# 第二次调用相同 prompt → 命中缓存result2harness.invoke(prompt北京今天天气怎么样,require_jsonTrue)print(f✅ 缓存命中结果{result2})exceptValueErrorase:print(f❌ 格式校验失败{e})exceptRuntimeErrorase:print(f❌ 安全检查失败{e})7.3 扩展思路这个Harness类只是一个起点你可以根据实际需求扩展功能对应文章理念实现方式重试机制容错性校验失败时自动重试 LLM最多 N 次Token 预算控制成本约束在调用前预估 token超限则截断 prompt输出长度限制质量保障校验响应字符数超限则截断或重试多轮对话记忆状态管理用列表维护对话历史每次调用自动拼接上下文结构化输出 Schema格式约束用 Pydantic 定义输出模型校验时自动转换核心思想LLM 是天才实习生Harness 是纪律。没有纪律的天才只会制造混乱有了纪律的天才才能创造价值。