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