最近 OpenClaw 很火,有种 agent 飞入寻常百姓家的感觉。对于 AI 的使用,我也不是茫然无知的状态了。做一个总结,也方便自己确定后续学习方向。个人感受,LLM 最大能力就是推理。普通人也接触不到基础建设,例如,训练模型,这种提升 AI 推理能力的工作。我们的工作重点还应该是如何利用大模型的推理能力。但是这种推理能力不是万能的,严重依赖于模型知道的信息。这些特点决定了我们努力的方向。强烈推荐阅读 Tracing the thoughts of a large language model,看完之后能更好了解大模型推理能力,虽然对开发用处不大。
这是我的学习笔记,一点胡思乱想。随着学习的深入,回顾时一定能看到很多讹误。但是总要开始不是吗,错了就去纠正, Act, don't explain,也是我学到的第一课。
LLM 能力
LLM 的推理能力,是数据训练出来的。哪怕做大模型的人,也不清楚究竟是为什么。推理能力如何出现并不重要,重要的是什么会影响他的推理能力。前面提到的文章指出,模型推理涉及两个方面,一个是已知结果,另一个是关联推理。模型会同时运用两种能力,达到预期结果。举例说明,缸比盆深,盆比碗深,碗比碟子深,这是相声里的一个包袱。如果你直接问大模型,缸和碟子哪个深。大模型中有缸比碟子深的数据,可以直接给出答案。如果要求推理,大模型会并行执行两个步骤,一个是直接查找数据中缸比碟子深,另一个是查找关联数据,缸比盆深,盆比碗深,碗比碟子深。接下来通过语义整合,回答缸比盆深,盆比碗深,碗比碟子深,所以缸比碟子深。
所以,模型的推理能力是由数据决定的。如果给出错误的信息,就可能导致错误的结果。这也可以反推到人类身上吧,为什么那么多认知奇奇怪怪的人,可能他们获取的信息就是错误,吵架不要只是讲理,事实说话更有用。
值得注意的是,当模型能直接拿到结果时,通常不会推理,更倾向于将结果直接返回。我们可以通过提示,给出推理过程,来引导模型强制执行推理过程。还有一点也很重要,事关幻觉。模型在遇到不知道的问题时,默认会给出否定答案,也就是我不知道。针对有数据,但数据不全的问题。模型还是会执行上述的两个步骤,也就是找已知结果,进行关联推理。由于数据不全,模型会尝试从语义上补全,这时就会伪造推理链,产生幻觉。
使用 AI 的重点
了解模型的推理能力,就能针对性优化相关痛点。训练数据层面,大多数人接触不到,那么重心就是调用层面了。我们只能在相信模型推理能力前提下,进行优化。模型的上下文有限制,那么就尽量传递有用信息。从这个角度去思考当今的各种概念,所有的工作都是 tradeoff。
为什么会有系统提示词,因为上下文有限制,消息多了必须舍弃一部分。系统提示词,关系到整个对话过程的结果,一定不能删除,所以单独给了一个固定字段。
Rules 也涉及生成质量,不能舍弃。在一个项目中,有通用的规范,同一个开发团队共享一套规范。把相关规范提取出来,就跟项目工程化一样。这部分拆分出来,做持久化也是自然的事情
上述两种,处理的都是已知结果部份,告诉模型我要什么。唯一不同的是 tools。Tools 不是用来告诉模型怎么做的,而是告诉模型可以用什么手段逼近结果,也即是关联推理过程,这一点让 tools 变得更重要。影响推理的主要是数据,tools 可以直接控制返回什么数据,所以可信的 tools 至关重要。
如何编写
GitHub 有个开源仓库 system-prompts-and-models-of-ai-tools,里面有很多主流 AI 工具的 prompt。为什么不说 rules 呢?我觉得两者没什么大区别,无论我们调什么模型,都是 LLM,中文叫大语言模型。重点语言,也就是对话。无论包装多少种概念,始终是以 prompt 为基础的。
这些内容都要被塞进上下文,简介才是王道。模型是经过训练的,它本身就知道很多数据,相关模块会在推理过程中被索引到。相比于简历式写法,“熟悉Vue、React...“。一句简单的,“你是世界级的前端领域专家”,要更合适。相信模型的数据,相信他的推理能力。记住模型能拿到数据时,倾向于直接使用数据。这也就是说,我们指定了相关技术时,模型会倾向于使用特定技术。假设我们只给了你是相关领域专家,在推导这一结果时,会激活自身数据中相关链路,这远比我们自己写的要全面。
接着看 Cursor 的提示词:
You are an AI coding assistant, powered by GPT-4.1. You operate in Cursor.
You are pair programming with a USER to solve their coding task. Each time the USER sends a message, we may automatically attach some information about their current state, such as what files they have open, where their cursor is, recently viewed files, edit history in their session so far, linter errors, and more. This information may or may not be relevant to the coding task, it is up for you to decide.
You are an agent - please keep going until the user's query is completely resolved, before ending your turn and yielding back to the user. Only terminate your turn when you are sure that the problem is solved. Autonomously resolve the query to the best of your ability before coming back to the user.
Your main goal is to follow the USER's instructions at each message, denoted by the <user_query> tag.
Tool results and user messages may include <system_reminder> tags. These <system_reminder> tags contain useful information and reminders. Please heed them, but don't mention them in your response to the user.
这里有几个重点,首先给出了自身定位。这个定位需要收缩到恰到好处,运用你的语言能力,给出精准定位,而不是详细描述每个细节。再就是,提示词中写了用户的输入可能有用也可没用,这是为了限制不产生幻觉。上面说过,模型会在得到结果的路径上,通过语义缝合推理路径。Assistant 主要就是为了帮助用户,用户输入信息权重很高。用户输入内容错误,模型在推理链路上加入用户信息,就会胡说八道。Cursor 后面的提示词中,也强调过如果自己能查询到的数据,就不去问用户,这也就为了保证推理链路不出错,模型自身数据被认为是可信的。我们使用 AI 过程也要注意这一点。
上下文管理
无论 prompt、rules 还是 skills,最终都要注入上下文。如果不做管理,轻轻松松就会超出窗口要求。Cursor rules 最佳实践中,建议 rules 不超过 500 行,尽量拆分。还有 apply 设置,都是希望实现动态注入,管理上下文窗口,只在应该使用时,传入相关内容。
从这个角度看 tools 和 MCP,相当于托管出去一部分操作以减轻上下文压力。比如 searh 工具,或者 RAG,上下文窗口够用,且不在乎 token 费用,完全可以把整本书所有数据,所有的对话内容,一股脑儿抛给模型。
Skill 就是上述的结合体,一整套设定集,需要用的时候再加载。
还有就是 subagents,简单 tools 不能满足过滤需求,再起一个 agent 总结处理后,给出精简版结果。
总结
我希望学习的过程,应该是先实现一个简单的 agent。这就包括 prompt、tools 实现。实现 tools 的时候,去看看开源社区有什么好的 skills。接着,看看怎么使用 subagents,实现分工和上下文隔离。