你是否曾遇到过这样的情况:精心撰写了一条自认为清晰的 Prompt,换了一个模型运行后,结果却截然不同?

上个月,有人恰好踩了这个坑。他为团队编写了一段用于自动审核 PR 的 Prompt,在 GPT 上生成的 review 意见专业且精准,但切换到另一个模型后——它竟然开始分析代码的“美学价值”了。
同一份 Prompt,措辞未改一字,输出质量却天差地别。
这一经历促使我们进行了一次系统化测试:将同一份 Prompt 分别提交给六个主流模型,观察差异究竟有多大,并探索如何编写 Prompt 才能最大程度缩小这种差异。
一、测试设计
我们准备了三个不同类型的 Prompt,每个均运行于六个模型之上。这六个模型分别为:GPT-4o、Claude Sonnet 4、DeepSeek V3、Gemini 2.5 Pro、Grok 4.3、Qwen3。
三个 Prompt 覆盖了三种典型应用场景:
Prompt A:代码审查
请审查以下Python函数,指出潜在的Bug、性能问题和代码规范问题,按严重程度排序,每个问题给出具体的修改建议。
Prompt B:技术文档生成
根据以下API接口代码,生成一份Markdown格式的接口文档,包含接口描述、请求参数、响应示例、错误码说明。
Prompt C:需求分析
根据以下产品需求描述,输出一份结构化的需求分析,包含核心功能点、技术可行性评估、潜在风险和工期估算。
每个 Prompt 后方均附上对应的实际输入材料(一段代码、一个接口类、一段需求描述),确保唯一变量仅为模型本身,其他条件完全一致。
所有测试均在同一平台上完成,便于快速切换模型并保持输入的一致性。
二、测试结果:同一份 Prompt 的六种“解读”
Prompt A(代码审查)的表现差异
输入是一段约 80 行的 Python 数据处理函数,其中埋入了 3 个真实 Bug 和 2 个性能隐患。
| 模型 | 找到的Bug数 | 误报数 | 建议质量 | 输出格式 |
|---|---|---|---|---|
| GPT-4o | 3/3 | 0 | 高,修改建议可直接应用 | 严格按严重程度排序 |
| Claude Sonnet 4 | 3/3 | 1 | 高,解释最详细 | 按类别分组,有代码示例 |
| DeepSeek V3 | 3/3 | 0 | 中,建议偏简略 | 有序列表,但缺严重程度标签 |
| Gemini 2.5 Pro | 2/3 | 2 | 中,有些建议过于泛泛 | 格式工整但信息密度低 |
| Grok 4.3 | 3/3 | 1 | 中,部分建议口语化 | 风格随意,格式不统一 |
| Qwen3 | 2/3 | 0 | 中,缺少修改代码示例 | 格式规范 |
关键差异体现在三个方面:
GPT-4o 是唯一严格遵守“按严重程度排序”指令的模型。 其他模型有的按类别分组(Claude),有的按发现顺序罗列(DeepSeek),还有的格式随机(Grok)。同样一条“按严重程度排序”的要求,六个模型中仅有一个完全执行。
Claude 输出内容最多、解释最详细,但同时也多报了一条误报。 它将一个正常的设计选择标记为“潜在问题”。这与 Claude 偏“谨慎”的倾向有关——宁可多报,也不遗漏。
Gemini 遗漏了一个 Bug,却额外给出了两个假阳性。 它对该段代码的理解深度不足,但输出格式工整——仅看格式可能会觉得它很可靠。
Prompt B(技术文档生成)的表现差异
输入是一个包含 5 个接口的 FastAPI 控制器类。
| 模型 | 覆盖接口数 | 参数描述准确性 | 响应示例 | 错误码覆盖 |
|---|---|---|---|---|
| GPT-4o | 5/5 | 高 | 完整且格式规范 | 覆盖主要错误码 |
| Claude Sonnet 4 | 5/5 | 高 | 完整,增加了调用示例 | 覆盖全面,含自定义错误码 |
| DeepSeek V3 | 5/5 | 高 | 完整 | 覆盖基本错误码 |
| Gemini 2.5 Pro | 5/5 | 中,有2处参数类型描述不准确 | 格式好但示例数据偏简单 | 只覆盖了400和500 |
| Grok 4.3 | 4/5 | 中,遗漏了1个可选参数 | 风格随意 | 只覆盖了500 |
| Qwen3 | 5/5 | 高 | 格式规范但示例偏短 | 覆盖基本错误码 |
本轮测试中,Prompt 的核心要求是“生成 Markdown 格式的接口文档”。结果六个模型对“接口文档应包含什么”的理解差异明显:
Claude 是唯一主动增加“调用示例”(cURL 命令)的模型。 Prompt 并未要求此项,但 Claude 认为一份优质的接口文档应包含调用示例。这种“主动补全”有时是加分项,有时则可能被视作“超出指令范围”。
Grok 遗漏了一个接口。 控制器中有一个接口的路由装饰器写法与其他四个不同(使用了 APIRouter 而非直接 @app.get),Grok 未能识别出来,暴露了它在代码解析上的盲区。
Gemini 的参数类型描述出现两处错误。 一个 Optional[str] 被描述为 str(忽略了可选性),另一个 List[int] 被描述为 array(语义虽接近,但在 Python 技术文档中应使用类型标注)。
Prompt C(需求分析)的表现差异
输入是一段约 300 字的产品需求描述,内容涉及在线协作文档的功能。
| 模型 | 功能点拆解数量 | 技术可行性评估 | 风险识别 | 工期估算 |
|---|---|---|---|---|
| GPT-4o | 8个,分级清晰 | 有,但偏保守 | 识别了3个风险 | 有,分阶段 |
| Claude Sonnet 4 | 10个,最细致 | 有,分析合理 | 识别了4个风险 | 有,但偏乐观 |
| DeepSeek V3 | 7个,偏粗 | 简略 | 识别了2个风险 | 笼统 |
| Gemini 2.5 Pro | 9个,分了优先级 | 有,偏泛 | 识别了3个风险 | 有,但缺乏依据 |
| Grok 4.3 | 6个,有遗漏 | 基本没有 | 识别了2个风险 | 没有给出 |
| Qwen3 | 8个,结构清晰 | 有,偏简略 | 识别了3个风险 | 有,格式规范 |
本轮差异最大的是 Grok。它对“需求分析”任务的理解出现偏差——输出更接近“需求摘要”而非“需求分析”。功能点拆解粗略,未进行技术可行性评估,工期估算直接被跳过。这表明该 Prompt 对 Grok 的约束力不足,未能严格遵循要求的四个输出维度。
Claude 拆解出的功能点最多(10个),但工期估算偏于乐观。 它将一个涉及实时协作的功能估算为“2周”,按行业经验至少需要 4 周。Claude 的“乐观倾向”在涉及数字估算的任务中经常出现。
三、为什么同一份 Prompt 在不同模型上差异这么大
完成三项测试后,差异原因可归纳为三个层面。
3.1 指令遵循精度不同
Prompt 中“按严重程度排序”是一个明确的指令。六个模型中仅有一个完全遵守。并非模型“不理解”该要求,而是它们对指令“刚性程度”的理解有所差异。
GPT 对指令的遵循最为严格——你要求排序,它便排序,不会自行更换组织方式。Claude 更倾向于“优化”你的指令——若它认为按类别分组更佳,便会自行调整。DeepSeek 和 Qwen 会执行指令但不彻底——给出了排序却未标注严重程度标签。Grok 对格式类指令的遵循最弱。
3.2 对模糊表述的填充策略不同
“指出潜在的 Bug”——什么是“潜在”?到何种程度才算“潜在”?不同模型的阈值不同。Claude 的阈值最低,因此误报最多但也最全面;GPT 的阈值最合理,精准度最高;Gemini 的阈值偏低且判断力不足,导致误报与漏报并存。
3.3 输出风格偏好不同
即使对任务理解完全相同,不同模型也拥有各自的“表达习惯”。Claude 偏好详尽的长输出,DeepSeek 倾向精炼的短输出,Grok 的输出格式随机性最大。这些风格差异会影响信息密度与阅读体验,但通常在 Prompt 中难以约束。
四、Prompt 调优指南:如何写出“跨模型稳定”的 Prompt
基于以上测试,我们总结了五条实操建议。核心目标是:让你的 Prompt 在不同模型上都能稳定产出高质量结果,而非仅在某一个模型上表现出色。
建议一:用结构化输出要求替代模糊描述
反面示例:请分析这段代码的问题。
正面示例:
请审查以下代码,按以下格式输出:
- 【严重】Bug描述 → 修改建议(附代码)
- 【中等】性能问题 → 优化方案
- 【轻微】规范问题 → 改进建议
每个问题必须包含:问题位置(行号)、问题描述、修改后的代码片段。
模糊的 Prompt 给了模型过多自由发挥的空间,不同模型的“默认发挥”差异巨大。结构化要求越明确,模型偏离预期的概率越低。
建议二:明确约束输出数量和格式
反面示例:列出主要功能点。
正面示例:
列出5-8个核心功能点,每个功能点用以下格式:
- 功能名称 | 优先级(P0/P1/P2) | 预估工期 | 一句话描述
测试中 Grok 仅拆出 6 个功能点且未给出工期估算,正是因为 Prompt 未明确输出格式。若在 Prompt 中写死格式模板,即使是“不太听话”的模型也会尽量向模板靠拢。
建议三:设置角色和能力边界
在 Prompt 开头加入一句角色设定,能显著提升模型输出质量的稳定性。
你是一位有10年经验的后端工程师,正在做代码审查。你关注的重点是:正确性 > 性能 > 可维护性 > 代码风格。不需要评价代码的“美感”或“优雅程度”。
“不需要评价代码的美感”这条约束并非废话——测试中 Grok 确实在没有这句约束时跑去评价代码“写得不够 Pythonic”了。明确告诉模型“不要做什么”,与告诉它“要做什么”同等重要。
建议四:给出输出示例(Few-shot)
若你对输出格式有严格要求,最有效的方法不是描述格式,而是直接提供一个示例。
以下是期望的输出格式示例:
问题1 [严重] 第23行
- 描述:未处理None值,可能导致TypeError
- 修改:
if data is not None and len(data) > 0:请按照此格式审查以下代码。
Few-shot 示例对所有模型均有效,但效果提升幅度不同。对 GPT 和 Claude 提升约 10-15%,对 DeepSeek 和 Qwen 提升约 20-25%,对 Grok 提升最大——约 30%。指令遵循能力越弱的模型,示例的约束效果越明显。
建议五:对数字估算类任务加校准约束
模型天生不擅长给出准确的数字(工期、成本、性能指标),且不同模型的“乐观/悲观倾向”差异显著。
一个实用的做法是在 Prompt 中加入校准语句:
工期估算请基于以下假设:1个中级工程师,每天有效编码时间5小时。如果不确定,请给出范围而非单一数字(如“2-3周”而非“2周”)。
这句约束能将 Claude 的乐观偏差拉回不少,也能让 DeepSeek 的笼统估算变得更具参考价值。
五、一个高阶技巧:先跑再调,用对比驱动优化
以上五条是通用建议。但若你想针对某个具体场景将 Prompt 调至最优,最有效的方法不是凭经验猜测,而是实测。
具体做法:写好初版 Prompt 后,同时提交给 2-3 个你常用的模型运行一遍,对比输出差异。若三个模型的输出均符合预期,说明 Prompt 写得足够好;若某个模型出现偏差,分析偏差所在,然后在 Prompt 中补充约束加以修正。
在此过程中,使用多模型聚合平台可节省大量时间。直接在同一平台上切换模型,几秒钟即可看到不同模型的输出对比,偏差一目了然。这比在多个网页间来回切换高效得多。
调优 Prompt 本质上与调代码无异:写 → 跑 → 看差异 → 改 → 再跑。差别仅在于调试工具不同。
六、写在最后
这次测试带来的最大感触是:Prompt 不是写给人看的说明书,而是写给机器的指令集。 你觉得“已经说得很清楚了”的地方,模型可能有五六种理解方式。
五条调优建议的核心逻辑实际只有一句话:减少歧义,压缩模型的自由发挥空间。 输出格式越明确,模型偏离的概率越低;约束条件越多,不同模型之间的输出一致性越高。
当然,这也引出一个取舍问题:约束过多,模型的创造力就会被压制;约束过少,输出稳定性便无法保障。具体如何平衡,取决于你的应用场景——代码审查和需求分析需要稳定性,创意写作则需要自由度。
没有万能的 Prompt,只有适合当前任务和当前模型的 Prompt。多跑几次、多对比几次,比在网上搜索“最强 Prompt 模板”有用得多。
