LLM-04进阶13 min

Prompt Engineering:不是玄学,是有框架的

为什么别人写的 Prompt效果好,你的就石沉大海?本文拆解 Few-shot、CoT、System Prompt 等核心技巧的底层原理,配合可运行的 Python 示例,让你从"试"变成"设计"。

Few-shotCoTSystem Prompt模板

Prompt Engineering 不是玄学

很多人把 Prompt Engineering 当成"调参玄学"——不断试错,碰运气。这是一种误解。Prompt Engineering 的每一种技巧背后都有清晰的原理:模型根据输入的概率分布生成下一个 token,所有技巧本质上都是在引导这个概率分布朝着你想要的方向倾斜。

理解了这一点,你就不再是"碰运气",而是"做设计"。

Zero-shot:不给例子,直接问

Zero-shot 是最基础的方式:直接给模型一个任务描述,让它自己推理。这要求模型本身具备足够的知识。GPT-4、Claude 等大模型在通用场景的 Zero-shot 效果已经相当不错,但在垂直领域(尤其是跨境电商)往往不够精准。

zero_shot.py
import anthropic

client = anthropic.Anthropic()

def ask(prompt, model="claude-sonnet-4-20250514"):
    response = client.messages.create(
        model=model,
        max_tokens=512,
        messages=[{"role": "user", "content": prompt}]
    )
    return response.content[0].text

prompt = """
请将以下产品标题分类到对应类目:['运动户外', '家居用品', '3C数码']

产品标题:Sony WH-1000XM5 降噪无线耳机头戴式
类目:
"""
print("Zero-shot 回答:")
print(ask(prompt))

Few-shot:给示例,改变条件概率

为什么 Few-shot 有效

Few-shot 给模型提供了"示例",模型会从这些示例中学习输入和输出之间的映射关系。从概率角度看,这些示例改变了模型对"正确答案"的先验概率——当模型看到类似输入时,会更倾向于生成类似输出。

Few-shot 的关键不是数量,而是示例的质量和多样性。2-3 个代表性强的示例往往比 10 个低质量示例效果好得多。

few_shot.py
def build_few_shot_prompt(query, examples):
    parts = []
    for inp, out in examples:
        parts.append(f"输入:{inp}")
        parts.append(f"输出:{out}")
    parts.append(f"输入:{query}")
    parts.append("输出:")
    return "\n".join(parts)

examples = [
    ("Nike Air Max 270 跑步鞋男款黑色透气",
     "品牌=Nike; 款型=Air Max 270; 类型=跑步鞋; 性别=男; 颜色=黑色; 特性=透气"),
    ("Adidas Ultraboost 22 女子训练跑鞋米白",
     "品牌=Adidas; 款型=Ultraboost 22; 类型=训练跑鞋; 性别=女; 颜色=米白"),
]

query = "New Balance Fresh Foam 1080v12 跑步鞋男灰色轻便"
prompt = build_few_shot_prompt(query, examples)
print("Few-shot Prompt:")
print(prompt)

Few-shot vs One-shot:One-shot 只给 1 个示例,Few-shot 给 2-5 个。实验表明在大多数任务上,Few-shot 显著优于 One-shot,但数量超过 5 个后收益递减——模型上下文窗口有限,太多示例反而会稀释关键模式。

Chain-of-Thought(CoT):让模型一步步推理

标准 CoT

Chain-of-Thought 的核心是"让模型显式输出推理步骤"。不是直接问答案,而是引导模型先把推理过程说出来,再给出答案。这个技巧对数学题、逻辑推理、多步骤分析任务尤其有效。

原理:模型在生成 token 时是自回归的——每个新 token 取决于之前的 token。如果推理步骤在前,模型在生成最终答案时会受到前面推理的约束,错误率显著降低。

cot_prompt.py
def build_cot_prompt(question):
    return f"""问题:{question}

请分步骤思考,并在最后给出答案。

步骤:"""

question = "某商品原价120元,先涨价20%,再降价15%,最终价格是多少?"
prompt = build_cot_prompt(question)
print("CoT Prompt:")
print(prompt)
print("\n--- 模型回答 ---")
print("步骤1: 涨价20% -> 120 x 1.20 = 144元")
print("步骤2: 再降价15% -> 144 x 0.85 = 122.4元")
print("最终答案: 122.4元")

Self-Consistency:多数投票

Self-Consistency 是 CoT 的进阶技巧:对同一个问题用 CoT 生成多个不同推理路径(通过调整 temperature),然后取出现次数最多的答案。研究表明这比单一 CoT 路径准确率提升显著。

self_consistency.py
import numpy as np
from collections import Counter

def self_consistency(answers):
    normalized = [a.strip().rstrip(".。") for a in answers]
    counter = Counter(normalized)
    winner = counter.most_common(1)[0]
    print(f"答案分布: {counter.most_common()}")
    return winner[0][0]

answers = ["122.4元", "122.4元", "118.8元"]
winner = self_consistency(answers)
print(f"Self-Consistency 结果: {winner}")

CoT 不适合所有任务:CoT 适合需要推理的任务(数学、逻辑、分析),但对简单任务(如情感分类、摘要)反而增加 token 消耗且可能引入过度推理的错误。对于跨境电商的"产品标签提取"这类结构化任务,直接 Few-shot + 输出格式约束往往比 CoT 更高效。

System Prompt:角色和能力设定

System Prompt 定义模型的身份、专业能力、输出格式限制。User Prompt 是即时任务,System Prompt 是长期设定。一个好的 System Prompt 让模型在多轮对话中保持一致的专业角色。

system_prompt.py
SYSTEM_PROMPT = """你是一位专业的跨境电商产品经理助手。

你的专长:
- 分析亚马逊、Temu、SHEIN 等平台的产品标题和描述
- 提炼产品的核心卖点、目标人群、适用场景
- 识别标题中的关键属性(品牌、型号、颜色、尺码、材质)
- 提供多语言产品本地化建议(英语、西班牙语、德语、法语)

输出格式要求:
- 输出必须严格遵循用户指定的格式,不额外发挥
- 如果信息不足,明确说"信息不足,无法判断"
- 涉及价格、销量等数据时,标注"未提供"而不是编造

语言风格:专业、简洁、直接,关键结论放在最前面"""

user_prompt = "分析这个亚马逊产品标题的核心卖点:Sony WH-1000XM5 Wireless Noise Canceling Headphones"

def ask_with_system(user_prompt, system_prompt=SYSTEM_PROMPT):
    return f"[System: {system_prompt[:50]}...]\n[User: {user_prompt}]"

print(ask_with_system(user_prompt))

Prompt 模板:结构化设计

实际工程中,建议用模板管理 Prompt,而不是散落在代码里。模板让 Prompt 可复用、可版本化、可 A/B 测试。

prompt_template.py
from string import Template

PRODUCT_ANALYSIS_TEMPLATE = Template("""
【产品分析任务】

产品标题:${title}
平台:${platform}
目标市场:${market}

分析要求:
1. 提取关键属性:${attributes}
2. 识别核心卖点:${selling_points}
3. 判断目标人群:${target_audience}

开始分析:
""")

prompt = PRODUCT_ANALYSIS_TEMPLATE.substitute(
    title="Xiaomi Mi Smart Band 7 GPS 运动手环男黑色防水心率",
    platform="Amazon US",
    market="北美",
    attributes="品牌、型号、功能、颜色、适用性别",
    selling_points="3个最重要卖点",
    target_audience="2个细分人群",
)

print("模板生成的 Prompt:")
print(prompt)

实战:跨境电商多语言产品描述生成

综合使用 System Prompt + Few-shot + Output Format 约束,来构建一个高质量的产品描述生成 pipeline。

ecommerce_prompt_pipeline.py
SYSTEM = """你是一个跨境电商产品描述专家,擅长为电商平台生成符合当地用户习惯的产品标题和要点。

核心原则:
1. 标题控制在200字符以内,包含核心关键词在前
2. Bullet points 每条不超过250字符,格式:关键词 + 卖点描述
3. 避免夸大宣传,只描述产品实际具备的功能
4. 目标市场是 ${market},请使用当地用户的搜索词习惯

输出格式:
标题:[生成的标题]
要点:
- [要点1]
- [要点2]
- [要点3]"""

FEW_SHOT_EXAMPLES = [
    ("Xiaomi Mi Smart Band 7, GPS, Heart Rate Monitor, Sleep Tracker, 5ATM Waterproof, Black",
     "标题:Xiaomi Mi Smart Band 7 GPS Fitness Tracker - Heart Rate, Sleep & Waterproof Sports Band\n要点:\n- GPS Built-in: Track outdoor runs without your phone\n- 24/7 Heart Rate Monitoring: Real-time health insights\n- Advanced Sleep Tracking: Analyze sleep stages and quality")
]

def generate_product_copy(product_info, market="北美"):
    system = SYSTEM.replace("${market}", market)
    examples = "\n\n".join([f"产品:{p}\n描述:{d}" for p, d in FEW_SHOT_EXAMPLES])
    user = f"产品信息:{product_info}\n\n参考示例:\n{examples}"
    return {"system": system, "user": user}

product = "Amazfit GTS 4 Mini,1.75 AMOLED Screen, GPS, 5ATM Waterproof, Heart Rate, Sleep Tracker, 15-day Battery, Rose Black"
result = generate_product_copy(product, "北美")
print("=== System Prompt ===")
print(result["system"])

关键结论

· Few-shot 的本质是提供输入-输出映射的示例,改变模型对正确答案的条件概率
· CoT 适合推理任务:让模型显式输出推理步骤,减少"直觉跳跃"错误
· Self-Consistency用多次采样 + 多数投票提升推理准确率
· System Prompt 定义角色:是多轮对话中保持一致性的关键
· Prompt 模板化让工程实践可维护、可测试、可迭代
· 输出格式约束是最被低估的技巧:明确格式要求可以避免30% 的无效输出

Prompt Engineering 的上限:再好的 Prompt 也有上限——它改变不了模型本身的能力边界。当你的任务需要模型"学会"某个领域特定的行为模式(比如专业的跨境税务判断),微调(Fine-tuning)会比 Prompt Engineering 更稳定、更高效。