LLM 原理是根据前面的 token 预测后面的 token,Prompt 是最早输入的 token。
LLM 有一些配置也能影响模型输出。
参数
温度 Temperature
温度是 softmax 函数中的除数,一般取值从 0 ~ 1(2)。
<math xmlns="http://www.w3.org/1998/Math/MathML"> P ( x i ) = e z i / T ∑ j e z j / T P(x_i) = \frac{e^{z_i / T}}{\sum_{j} e^{z_j / T}} </math>P(xi)=∑jezj/Tezi/T
温度越低,生成的结果越确定,温度越高,生成的结果越随机。
在代码、数学、事实问题方面取低值;文学创作、营销方面取高值。
Top-K & Top-P
LLM 预测的下一堆 token 中,是一群概率加起来为 1 的 token,Top-K 表示挑选前 K 个概率最大的 token,Top-P 表示挑选累计概率超过 P 的前 n 个 token。
比如 token 对应的概率队列是 [0.4,0.3,0.2,0.1],Top-K 为 2 表示取 [0.4,0.3],Top-P 为 0.3 取 [0.4]。
Top-P 也叫核采样,一般只用这个,如果两个都配置了则取两者结果的交集。
输出长度
输出长度表示回复 token 的长短,缩小输出长度不会让输出更简洁,只会截断输出。
以上是常见的参数配置,影响输出的还包含语气、措辞、上下文等,这些可以在 Prompt 提示词中指定。
提示词技巧
样本
在 cursor 的实践中,提供样本比如说一堆指令效果更好。比如提供标准的 Service 代码规范如何。
样本数量 3 ~ 5 个最佳,目的是给 LLM 示例让他模仿,样本要乱序,比如判断情绪的 Prompt 中,正面情绪和负面情绪的案例要打乱随机,否则模型可能按照前三个是正面情绪、后两个是负面情绪的规律给答案。
复杂场景要提供边界案例,告诉 LLM 应该如何处理。
提示词结构
一个良好的 Prompt 应包含系统提示词(System Prompting)、角色提示词(Role Prompting)和上下文提示词(Contextual Prompting)。
系统提示词提供整体的规则、输出规范,比如以 josn 格式输出,使用格式规范可以有效抑制 LLM 的幻觉问题,这样 LLM 只用关注 json 内的值,而不会过于随机的产出内容。
角色提示词给 LLM 设置人设,可以控制输出风格、语气和相关联的知识,比如设置导游角色,输出里就会有导游特有的额外信息。
上下文提示词提供背景信息,避免输出的内容过于空泛,使回答更精确。
提示词内容本身,要是清晰的指令,不要给模棱两可的话术。
推理技巧
后退一步提示(Step-back Prompting)
后退一步指的是在回答所需的问题前,先用一个提示词把上下文调整到合适的状态,这样获得的回答更具体和实用。
比如在 cursor 实践中有非常多的代码规范文档,如果直接发起命令 " 请根据规范生成....",生成的代码可能是没有遵循规范的,解决方案就是先把所需的规范加载到对话的上下文中,比如在生成代码前,先说 " 查找项目中 Dao 和 Service 的规范有哪些",再执行生成代码的命令。
思维链(Chain of Thought, CoT)
在数学、逻辑推理中,如果让 LLM 给出答案,大概率是猜的,为此需要加一些中间步骤,帮助 LLM 更好的推理。
这个原理是 LLM 的本质上预测下一个 token,如果在样本中给出完整的推理路径,就会让 LLM 在模仿过程中也改动内部向量,遵循特定的路径可以让结果更加准确。
在这些 Prompt 中,要把温度参数调低。
自我一致性(Self-consistency)
即使用同样的 Prompt 和模型多次运行,根据运行结果投票选择相同答案最多的那种。
这个技巧由于太费 token 使用的比较少。
思维树(Tree of Thoughts, ToT)
思维链是一条路径,思维树就是多条路径。
逻辑推理对模型来说是最困难的,这和模型本身的能力关系更大,使用这种技巧只能有限的增加推理能力。
推理 + 行动(Reason & Act)
为 LLM 加上各种外挂,比如 MCP、RAG、Agent 等,让模型自行思考和决策,由主模型和子模型和工具共同完成任务。
比如在 cursor 中加入高德地图的 MCP 提供路线规划能力、加入搜索工具提供外网搜索能力等等。
自动化提示工程(APE)
让 AI 生成一个提示词工程的提示词,在对话中口语化提供所需的上下文、目标等,即可让 AI 按照规范生成特定的提示词。
其他补充
- 提供示例,这是最直接有效的办法。
- 简洁设计,如果人类看不懂,那 LLM 也不会理解。
- 具体输出,明确指定输出的格式、风格。
- 指令由于约束,即多告诉 LLM 需要 xxxx,少说不要 xxxx。
- 使用变量,如 {city} 。
- 示例打乱顺序。
- 文档化,Prompt 是一个不停迭代的过程,建立个文档库像 git 一样记录变动的原因。