这道题其实问的是,你怎么让大模型听懂人话并且干好活,本质是意图对齐。我理解prompt设计不是写作文,而是做接口,得把任务边界、输出格式、上下文约束都交代清楚。
先说核心原则。我总结三个:清晰性、具体性、上下文完整性。清晰性就是告诉模型做什么和不做什么,比如输出格式用JSON模板框死,避免模型自由发挥。具体性就是别写“写得好一点”,要改成“用学术风格,包含三个论点,每个配一个数据支撑”。上下文完整性是说提供必要的背景,比如角色设定、用户画像。这三个原则其实对应的是模型最怕的三种情况:歧义、模糊、信息缺失。
再说技巧。最常用的两个是[[Few-shot]]和[[Chain-of-Thought]]。Few-shot适合格式固定的任务,比如抽取、分类、SQL生成,给两到五个输入输出示例,模型基本就能照做。Chain-of-Thought适合数学推理、复杂决策,加一句“Let's think step by step”或者显式拆解步骤。但落地时很少只用一种,比如做客服退款意图识别,我会先给几个例子做few-shot,再让模型按“用户诉求-订单状态-退款原因”的链条推理,这样准确率更高。
举个例子,客服退款场景。用户说“我买了件衣服,大小不合适,想退”,如果只给few-shot,模型可能直接输出“退货申请”,但忽略了订单是否已发货、是否在退款期内。所以我会在prompt里加CoT,让模型先判断订单状态,再检查退款政策,最后输出结果。同时输出格式用JSON,包含“action”和“reason”字段,这样下游系统可以直接解析。
这里有个坑:前提是模型能力要够。如果模型本身逻辑弱,CoT反而会放大错误。还有,few-shot的示例要覆盖边界情况,比如退款被拒的例子,否则模型会偏向常见情况。我上线前会特别关注这些。
另外,在[[RAG]]场景下,prompt设计要区分系统指令和用户指令。系统指令强调“基于参考资料回答”,用户指令才是具体问题。如果资料不足,要明确说“根据现有信息无法确定”,禁止编造。这个其实涉及到[[Faithfulness]]评估,怎么判断模型有没有忠实于资料,是一个值得深挖的点。
最后,工程上我会用动态组装,把系统指令、上下文、示例拆成模块,按场景拼接,避免硬编码在代码里。版本管理用Git,每次改动记录效果。同时建立prompt级的单元测试,输入变体看输出是否符合断言。
所以,我更倾向把prompt设计看成持续的调试过程,不是一锤子买卖。核心是理解模型能力和任务特点,动态调整。