提示词工程(Prompt Engineering)是 在不微调模型参数的情况下,通过设计输入提示(Prompt)来控制大模型输出行为的一种工程方法。它的核心目标是:让大模型稳定、可控、可评估地完成任务。
一、什么是提示词工程
最简单理解:
Prompt Engineering = 如何写Prompt + 如何用代码管理Prompt
它解决的是一个问题:
大模型本质是概率预测,你需要让它尽量按你的意图输出。
例如:
普通提问:
总结这段话
效果不稳定。
优化后的 Prompt:
你是一个技术文档助手。
请用三条 bullet point 总结下面内容。
每条不超过20字。
内容:
{content}
输出就稳定很多。
二、Prompt 设计原则
常见的设计方法:
1 角色设定(Role Prompting)
给模型一个身份。
例如:
你是一名资深前端架构师
示例:
const prompt = `
你是一名资深前端架构师
请解释 React diff 算法
`
好处:
- 输出更专业
- 风格更稳定
2 任务拆解(Task Decomposition)
复杂任务拆成多个步骤。
例如:
1. 提取关键词
2. 总结内容
3. 给出建议
示例:
const prompt = `
请按照以下步骤完成任务:
1. 提取文本关键词
2. 总结文本
3. 给出改进建议
文本:
${text}
`
3 Few-shot 示例
给模型示例。
输入:苹果是一种水果
输出:水果
输入:老虎是一种动物
输出:动物
输入:香蕉是一种水果
输出:
TS 实现:
const prompt = `
请提取类别
输入:苹果是一种水果
输出:水果
输入:老虎是一种动物
输出:动物
输入:香蕉是一种水果
输出:
`
4 约束输出格式
例如:
必须输出 JSON
示例:
返回 JSON 格式:
{
"score": number,
"reason": string
}
TS:
const prompt = `
判断图片和文本是否匹配
返回JSON:
{
"score": number,
"reason": string
}
文本:
${text}
`
三、Prompt 模板化(工程实践)
在真实项目中,Prompt 不能写死在代码里。
通常做成 模板系统。比如一些内置的 Skills 或者 Tools 。
示例:Prompt Template
class PromptTemplate {
constructor(
private template: string
) {}
format(data: Record<string, string>) {
let result = this.template
for (const key in data) {
result = result.replace(
`{${key}}`,
data[key]
)
}
return result
}
}
使用:
const template = new PromptTemplate(`
你是一个视频审核专家
判断视频是否符合要求:
要求:
{requirement}
视频描述:
{description}
返回 JSON:
{
"pass": boolean,
"reason": string
}
`)
调用:
const prompt = template.format({
requirement: "必须包含动物",
description: "视频是一只狗在跑"
})
多模板形成的 Prompt Chain
复杂任务需要多个 Prompt。
例如:
视频生成流程:
用户需求
↓
脚本生成
↓
分镜生成
↓
视频生成
↓
视频评估
TS 示例:
async function generateScript(topic: string) {
return llm(`
生成一个视频脚本
主题:${topic}
`)
}
async function generateStoryboard(script: string) {
return llm(`
根据脚本生成分镜
${script}
`)
}
async function generateVideo(storyboard: string) {
return videoModel(storyboard)
}
async function workflow(topic: string) {
const script = await generateScript(topic)
const storyboard = await generateStoryboard(script)
const video = await generateVideo(storyboard)
return video
}
这就是 Prompt Chain。在 LangChain / LangGraph 中会更常见。
四、结构化输出
工程中 必须结构化输出。否则你没法处理。
例如:
坏例子:
这个图片挺符合要求的
好例子:
{
"match": true,
"score": 0.87,
"reason": "图片包含猫"
}
TS 实现:
async function evaluateImage(
text: string,
imageDesc: string
) {
const prompt = `
判断图片和文本是否匹配
文本:
${text}
图片描述:
${imageDesc}
返回JSON:
{
"match": boolean,
"score": number,
"reason": string
}
`
const res = await llm(prompt)
return JSON.parse(res)
}
五、常见应用
1 AI 客服
用户问题
↓
Prompt
↓
大模型回答
2 内容审核
视频生成
↓
内容校验
↓
语义分析
↓
质量评估
Prompt 示例:
判断视频是否符合以下要求:
1 包含动物
2 场景是森林
3 时长不超过10秒
3 图文匹配
image-text matching 的 Prompt:
判断图片是否符合文本描述
返回:
score
4 自动生成内容
例如:
文章
视频脚本
代码