【无标题】

从"能用"到"好用":System Prompt、Few-shot与调参实战指南

让AI产出精准代码和方案的工程化方法论

核心主题 关键内容
AI框架 LangChain / Dify / Coze 等

一、为什么你的Prompt总是不稳定?

很多开发者都有这样的体验:明明用的是同一个模型,有时输出惊艳,有时却答非所问。问题往往不在模型本身,而在于提示词(Prompt)的设计缺乏结构性和明确性。

大模型本质上是一个概率模型,Prompt的歧义性会直接转化为输出的不确定性 。要让AI从"能用"变成"好用",核心思路只有一个:减少歧义,引导模型收敛到你期望的输出

二、System Prompt:设定AI的"人设"与"规则"

System Prompt是所有Prompt里最重要的一层,它相当于给模型设定了"操作系统"------定义角色、行为规则和输出边界。

2.1 四大核心要素

设计System Prompt需要包含以下内容:

要素 说明 示例
角色定义 具体身份,避免"助手"等模糊词 "你是一位拥有10年经验的Java架构师"
行为规则 该做什么、不该做什么 "拒绝回答非技术问题"
输出格式 强制结构化 "必须返回JSON格式"
特殊指令 边界约束 "不确定时明确说明,不要编造"

2.2 实战模板

markdown 复制代码
你是一位{角色}。
你的目标是:{任务描述}。
回答时请遵守:
1. {规则1}:如"使用Spring Boot示例"
2. {规则2}:如"输出简洁,每部分不超过3条"
3. {规则3}:如"如果不确定,明确说明"

一个典型的例子:

复制代码
你是一位资深Java后端工程师。
职责:帮用户审查代码性能和安全性。
输出格式:
- 问题列表(按严重程度排序)
- 修复建议(附带代码示例)
约束:
- 不要给出未经证实的优化建议
- 如果不确定根因,明确说明

三、Few-shot:给模型"抄作业"的机会

有时即使说清楚了需求,模型还是会理解错。这时最有效的方法就是:给模型看几个示例------这就是Few-shot Prompting。

3.1 为什么有效?

大模型本质上是"模式识别器",2-3个高质量示例比10行规则说明更有效。研究发现,Few-shot策略在代码生成任务中,CodeBLEU分数相比零样本可提升40%以上。

3.2 在LangChain中实现Few-shot

LangChain提供了专门的FewShotChatMessagePromptTemplate来构建少样本提示:

python 复制代码
from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate

# 定义示例样本
examples = [
    {"input": "查询用户订单状态", 
     "output": "SELECT * FROM orders WHERE user_id = ? AND status = 'active'"},
    {"input": "统计本月销售额", 
     "output": "SELECT SUM(amount) FROM orders WHERE month(created_at) = month(now())"},
]

# 定义示例模板
example_prompt = ChatPromptTemplate.from_messages([
    ("human", "输入:{input}"),
    ("ai", "输出:{output}"),
])

# 创建Few-Shot提示模板
few_shot_prompt = FewShotChatMessagePromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    input_variables=["input"],
)

# 组合最终提示词
final_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个SQL生成助手,根据自然语言描述生成MySQL查询语句。"),
    few_shot_prompt,
    ("human", "输入:{input}"),
])

3.3 示例选择原则

原则 说明
覆盖典型场景 2-5个示例足以覆盖主要模式
包含边界情况 帮助模型处理极端输入
格式完全一致 输入输出键名、层级保持统一
宁少勿滥 过多示例引入噪声,反而导致混淆

⚠️ 注意 :对于较大的代码专用模型,Few-shot有时反而会降低性能,零样本(Zero-shot)可能效果更好------这与传统认知相反,需要根据具体模型做实验验证。

四、调参与其他进阶技巧

4.1 Temperature参数调优

Temperature控制输出的随机性,不同场景有不同推荐值:

场景 推荐Temperature 原因
代码生成 0.2 - 0.4 需要高确定性
知识问答 0.3 - 0.5 平衡准确与自然
创意写作 0.7 - 0.9 需要多样性
逻辑推理 0.1 - 0.3 减少随机性

4.2 Chain-of-Thought(思维链)

对于复杂推理任务,引导模型"一步步思考"可显著提升准确率:

复制代码
请一步步思考并计算:
1. 先分析需求文档中的核心功能点
2. 再设计数据库表结构
3. 然后编写核心接口代码
4. 最后给出测试用例

4.3 结构化输出(JSON Mode)

许多模型支持强制输出JSON,极大简化后端解析逻辑:

python 复制代码
response = await client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": prompt}],
    response_format={"type": "json_object"}  # 开启JSON Mode
)

五、在Dify/Coze等平台中的应用

5.1 Dify中的Few-shot最佳实践

在Dify工作流中,Few-shot示例应置于触发节点与提示模板之间,作为上下文引导:

json 复制代码
{
  "prompt": "请将用户问题分类为商品咨询或售后请求。\n\n示例:\n- '怎么退货?' -> 售后请求\n- '这款手机有货吗?' -> 商品咨询\n\n问题:{{user_input}}"
}

5.2 动态示例选择

当示例库较大时,可通过语义相似度动态筛选最相关的Few-shot示例,避免超出上下文窗口:

python 复制代码
# 使用向量数据库(如FAISS)快速检索高相似度样本
# 优先保留与当前查询最匹配的2-3个示例

六、效果对比与总结

指标 基础Prompt 结构化Prompt 提升
输出准确率 45% 92% ⬆️104%
格式一致性 不稳定 稳定 ⬆️显著
人工复核率 80% 15% ⬇️81%

核心要点总结

  1. System Prompt定义"人设":角色具体、规则清晰、格式明确
  2. Few-shot提供"范例":2-5个高质量示例,覆盖典型场景
  3. 调参控制"自由度":代码生成用低温,创意任务用高温
  4. 框架选择看场景:LangChain适合复杂编排,Dify/Coze适合可视化工作流

Prompt Engineering的本质不是让模型变强,而是让模型更准确地理解你的意图。掌握这三个核心技能,你已经能解决大多数Prompt问题。