这道题问Prompt Engineering的方法和技术,我觉得本质其实是在问:你怎么跟大模型有效沟通?是手写指令,还是让模型自己学会怎么理解你?这两个思路差别很大,而且落地时往往要混着用。
先说手动设计。最典型的像 [[Few-shot]],给几个例子让模型照着来;还有 [[Chain-of-Thought]],就是让模型把推理步骤写出来,解决复杂推理问题;再有就是设定角色、拆指令。这些方法好处是零成本,拿来就能用,效果立竿见影。但问题也明显:完全依赖人的经验,换一个任务或者换一个模型,你可能要重新调模板,迁移性很差。比如在客服退款场景里,你写一套Prompt让模型判断退款原因,换到满减政策咨询,模板基本得重写。所以手动设计更适合快速验证或者任务固定、量不大的情况。
再说自动化优化。这里分两类:连续优化和离散优化。连续优化代表是 Prompt Tuning,不碰模型本身,只在输入层加一串可学习的向量,模型参数冻结,只优化这串向量。效果通常很好,因为向量空间比词表大得多,优化直接。但前提是你得有模型权重,能反向传播。离散优化像 AutoPrompt 和 APE,是在词表里搜最优的文本模板,搜出来是人类可读的句子,可以直接用在任何模型或者API上。但离散搜索效率低,因为要在几千个词里穷举或梯度近似,容易掉进局部最优。
对比一下:连续方法效果更好、训练快,但推理时得加载额外[[嵌入]],而且可解释性差,你根本不知道那串向量在干什么;离散方法搜索慢,但推理零开销,模板可读可迁移。所以场景很明确:你有模型权重、任务固定、高频调用,用Prompt Tuning;你只有API、或者需要跨模型迁移、或者要让业务方审核Prompt,那就用离散搜索。
实际落地我很少只用一种。比如做企业SOP合规文档的问答系统,我会先用手动CoT搭一个基线,再跑一次APE搜索,看能不能找到更好的离散模板,然后固定下来用。如果后面要大规模部署,我可能会把CoT模板转成软提示,用Prompt Tuning微调几轮,效果还能再涨几个点。这里有个坑:连续提示虽然效果好,但换模型版本或者换底层LLM,那串向量可能就废了,得重新训。所以上线前我会特别关注模型的版本锁定,如果未来有升级计划,离散模板更稳妥。
还有一个点值得注意:连续提示的迁移性问题其实比想象中更严重。我试过把同一个软提示从Llama 2 7B搬到13B,效果直接掉一半,因为模型内部的表征分布变了。这背后涉及到底层表征对齐的问题,现在有些工作在做跨模型迁移的连续提示,但还不成熟。
所以我的整体判断是:没有银弹。手动设计是起点,自动化优化是进阶,两者互补。我更倾向先用手动搭框架、再用自动化搜索做精调,最后根据部署约束决定用连续还是离散。