Prompt 工程

返回大模型

通过设计高质量的输入提示,引导 LLM 输出符合预期的结果。是成本最低、迭代最快的模型能力优化手段。


基础技巧

角色设定

你是一位有 10 年经验的 Java 架构师,擅长分布式系统设计和性能优化。
请帮我审查以下代码:

结构化指令

任务:将以下 JSON 转换为 Markdown 表格
输入:{"name":"Alice","age":30,"role":"admin"}
要求:
1. 表头使用中文
2. 不要添加额外解释
输出格式:Markdown 表格

输出格式控制

请以 JSON 格式输出,结构如下:
{
  "summary": "...",
  "key_points": ["...", "..."],
  "confidence": 0.0~1.0
}

核心方法

Zero-shot / Few-shot

# Zero-shot:直接提问
将以下句子翻译成英文:今天天气很好

# Few-shot:给示例引导格式
将情感分类为正面/负面/中性:
文本:这个产品真的很棒!→ 正面
文本:服务态度太差了。→ 负面
文本:还行,没什么特别的。→ 中性
文本:快递速度超快,很满意!→

Chain-of-Thought(CoT)

请逐步分析:一个班级有 32 名学生,其中 3/4 参加了运动会,
参加运动会的学生中有 1/2 获得了奖项,请问获奖人数是多少?

思考过程:
第一步:...
第二步:...
答案:...

ReAct(推理 + 行动)

思考(Thought)→ 行动(Action)→ 观察(Observation)→ 循环

适用于 Agent 场景,模型交替推理和调用工具。

自洽性(Self-Consistency)

同一问题生成多个推理路径,投票选最终答案,提升复杂推理准确率。


System Prompt 设计

system = """
你是一个代码审查助手,专注于 Java 和 Spring Boot。
 
行为规范:
- 只回答代码相关问题
- 发现安全漏洞时必须标注 [安全风险]
- 回答使用中文,代码保持英文
- 不要重复问题,直接给出结论
 
输出格式:
1. 问题概述(1句话)
2. 具体问题列表(Markdown 列表)
3. 修改建议(带代码示例)
"""

进阶技巧

分解复杂任务

❌ 一步到位:帮我设计一个电商系统

✅ 分步引导:
   步骤1:列出核心业务模块
   步骤2:设计用户模块的数据库表
   步骤3:给出用户注册的 API 接口设计

约束负面行为

注意:
- 不要编造不确定的内容,如不确定请说"我不确定"
- 不要使用"当然"、"当然可以"等无意义开头
- 回答长度控制在 200 字以内

常见陷阱

问题原因解决
输出格式不稳定未明确格式要求给出示例或 JSON Schema
答案过长/啰嗦未限制长度明确字数或条数
忽略关键约束约束埋在段落中用列表或加粗突出约束
幻觉(编造内容)模型过度自信要求声明不确定或引用来源
中英混杂未指定语言在 System Prompt 中固定语言

工程实战

RAG Prompt 模板(LangChain)

from langchain_core.prompts import ChatPromptTemplate
 
rag_prompt = ChatPromptTemplate.from_messages([
    (
        "system",
        "你是严谨的文档助手。\n"
        "规则:\n"
        "1) 仅使用下方「上下文」中的信息作答;若不足以回答,请明确说「上下文未覆盖该问题」。\n"
        "2) 结论句末尾用角标引用,如 [1] [2],对应上下文中片段编号。\n"
        "3) 不要编造 URL、版本号或 API 字段名。",
    ),
    ("human", "问题:{question}\n\n上下文:\n{context}"),
])
 
def format_context(chunks: list[tuple[int, str]]) -> str:
    return "\n\n".join(f"[{i}] {text.strip()}" for i, text in chunks)

强制 JSON 输出(OpenAI)

import json
from openai import OpenAI
 
client = OpenAI()
schema_hint = json.dumps(
    {"answer": "string", "citations": [1, 2], "confidence": "high|medium|low"},
    ensure_ascii=False,
)
 
completion = client.chat.completions.create(
    model="gpt-4o-mini",
    temperature=0,
    response_format={"type": "json_object"},
    messages=[
        {"role": "system", "content": f"只输出合法 JSON,键限定为:{schema_hint}"},
        {"role": "user", "content": "根据上下文:[1] hello [2] world —— 总结一句"},
    ],
)
data = json.loads(completion.choices[0].message.content)

Pydantic 校验 + 失败重试

from pydantic import BaseModel, ValidationError
 
class Answer(BaseModel):
    summary: str
    citations: list[int]
 
def invoke_structured(user_text: str, context: str) -> Answer:
    def call(system: str) -> str:
        r = client.chat.completions.create(
            model="gpt-4o-mini", temperature=0,
            messages=[
                {"role": "system", "content": system},
                {"role": "user", "content": f"上下文:\n{context}\n\n问题:{user_text}\n"
                 "请输出 JSON:{{\"summary\": str, \"citations\": [int, ...]}}"},
            ],
        )
        return r.choices[0].message.content or ""
 
    system = "只输出一行合法 JSON,不要 markdown。"
    raw = call(system)
    try:
        return Answer.model_validate_json(raw)
    except ValidationError:
        fix = call(system + " 上一轮解析失败,请严格输出单行 JSON。")
        return Answer.model_validate_json(fix)

注入防护(网关侧)

import re
 
def rough_injection_guard(text: str, max_len: int = 8000) -> str:
    if len(text) > max_len:
        raise ValueError("input too long")
    if re.search(r"忽略.*(系统|指令|以上)", text, re.I):
        raise ValueError("possible prompt injection")
    return text

相关文档

  • LLM 基础 — 模型参数与采样策略
  • RAG — 外挂知识库替代 Prompt 塞入上下文
  • MCP — Agent 工具调用协议
  • 成本优化 — Token 压缩与缓存