我从Java后端转大模型应用开发,踩坑最多的不是LangChain、不是RAG,而是提示词

同一个需求——"帮我写产品推广文案",3种写法的输出质量差10倍。不是模型不行,是提示词写得烂。

这篇文章用真实踩坑案例+可复制代码,讲透提示工程的4个核心技巧。读完直接能用在你的项目里。


目录


需求很简单:给一款智能手表写推广短文案

写法1:随便问问(效果1分)

帮我写个智能手表的推广文案

AI输出:

智能手表是现代生活中不可或缺的科技伴侣。它不仅可以追踪您的健康数据,还能让您随时保持联系。无论是运动监测、心率追踪还是消息提醒,智能手表都能为您提供全方位的便捷体验。快来选购属于您的智能手表吧!

问题: 模板化废话、没有产品亮点、没有目标人群、看完毫无购买欲望。

写法2:加了点要求(效果4分)

帮我写一条智能手表推广文案,产品叫"星环Watch Pro",主打运动健康监测,面向25-35岁上班族,控制在200字以内

AI输出:

星环Watch Pro——你的职场运动搭子。精准心率+睡眠监测,让你在996的间隙也能守护健康。7天续航不充电,午休跑步不摘表。25-35岁的你,值得一块懂你的智能手表。

好了一点——有产品名、有人群、有字数限制。但还是不够精准,风格偏泛化。

写法3:角色+约束+示例(效果10分)

角色:请你扮演资深电商文案策划,5年3C数码推广经验,擅长用短句+数字冲击力打动消费者

任务:为"星环Watch Pro"智能手表写一条朋友圈推广文案

背景:产品主打运动健康监测,目标用户是25-35岁上班族,常加班少运动,关注健康但没时间锻炼

约束:
1. 100字以内
2. 至少包含1个数据点(心率/续航/步数)
3. 用短句,每句不超过15字
4. 禁止使用"不可或缺""全方位""智能伴侣"等模板化词汇
5. 结尾用行动号召句式(如"点击了解→")

示例参考:
"78%上班族心率异常。星环Watch Pro,实时监测+7天续航。你的健康,别再拖延。点击了解→"

AI输出:

久坐8小时,心率悄悄超标。星环Watch Pro实时预警,7天续航不间断监测。你的健康数据,一抬手就看。别等体检报告提醒——点击了解→

对比:

维度 写法1 写法2 写法3
产品信息 有名称 有名称+数据
目标人群 有+痛点切入
文案风格 模板废话 还行 短句冲击力
行动号召
说服力 1分 4分 10分

差距不是模型能力,是提示词设计。 同一个AI,写法3的输出质量是写法1的10倍。


翻车现场:

写一篇关于Python的文章

AI给你2000字的泛泛之谈——从历史讲到语法再讲到应用,看完啥也没学到。

本质原因: 大模型是概率预测引擎,不是思考引擎。你给的信息越少,AI脑补的空间越大,输出就越泛化。

类比理解(Java开发者秒懂): 就像写接口没有入参校验——String name不限定长度和格式,用户传什么你都接受,结果数据库里一堆乱数据。提示词就是AI的"入参校验",限定越清晰,输出越可控。

修复方式: 把开放式提问改成封闭式:

# 用LangChain做结构化提示词
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template(
    """角色:Python技术博主,3年写作经验
任务:写一篇Python列表推导式的入门教程
约束:
1. 800字以内
2. 包含3个代码示例,从简单到复杂
3. 每个示例配有1句话解释
4. 禁止讲历史、禁止泛泛介绍Python"""
)

chain = prompt | model | StrOutputParser()
result = chain.invoke({})

翻车现场:

帮我优化这段代码

AI以为你要"提升性能",给你重构了算法逻辑。但其实你要的是"提升可读性"——加注释、改命名。

本质原因: "优化"这个词在人类语境里是模糊的——性能优化?可读性优化?安全优化?AI会按概率最高的理解走,而概率最高的理解未必是你的需求。

修复方式: 用具体动词+明确目标替代模糊词:

模糊词 替换为
"优化" "提升可读性:加注释+改命名" 或 "提升性能:减少循环次数"
"写好" "写一篇1000字、逻辑严谨、适合初学者的教程"
"简单说" "用3句话概括,每句不超过20字"
"分析" "从3个维度分析:性能、安全、可读性,每个维度列1个指标"

给AI赋予专业身份,等于给它装了个"职业滤镜"——只从该角色的视角思考和表达。

公式: 角色 + 能力/经验 + 风格/擅长领域 + 任务

实战代码(LangChain版):

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 角色设定模板
prompt = ChatPromptTemplate.from_template(
    """你是一位{role},拥有{experience}年{domain}经验,
擅长{style}的表达风格。

请完成以下任务:{task}

输出要求:
1. {constraint_1}
2. {constraint_2}"""
)

# 不同角色,不同风格
configs = [
    {"role": "资深Java架构师", "experience": "8", "domain": "分布式系统",
     "style": "严谨+代码驱动", "task": "分析微服务拆分方案",
     "constraint_1": "给出3种方案对比", "constraint_2": "每种方案配代码片段"},

    {"role": "技术自媒体博主", "experience": "3", "domain": "AI应用开发",
     "style": "通俗易懂+踩坑视角", "task": "写LangChain入门教程",
     "constraint_1": "800字以内", "constraint_2": "至少2个踩坑案例"},
]

for config in configs:
    chain = prompt | model | StrOutputParser()
    result = chain.invoke(config)
    print(result)

关键: 角色设定不只是开头加一句"你是XX",而是让角色贯穿整段提示词——能力限定思考深度,风格限定表达方式,任务限定输出范围。


约束就像代码里的if-else边界检查——明确告诉AI"可以做什么"和"不能做什么"。

5种常用约束:

约束类型 示例 效果
字数约束 "200字以内" 杜绝啰嗦
结构约束 "分3点回答" 杜绝流水账
格式约束 "输出JSON格式" 杜绝自由文本
禁忌约束 "禁止用'不可或缺'" 杜绝模板化表达
必含约束 "必须包含1个数据点" 杜绝空洞论述

实战代码(结构化输出约束):

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field

# 用Pydantic定义输出结构(Java开发者类比:定义DTO类)
class ProductReview(BaseModel):
    product_name: str = Field(description="产品名称")
    score: int = Field(description="评分1-10")
    pros: list[str] = Field(description="优点列表,最多3条")
    cons: list[str] = Field(description="缺点列表,最多3条")
    summary: str = Field(description="一句话总结,不超过30字")

parser = PydanticOutputParser(pydantic_object=ProductReview)

prompt = ChatPromptTemplate.from_template(
    """请对以下产品做评价:{product}

{format_instructions}

约束:
1. 评分必须是1-10整数
2. 优点缺点各不超过3条
3. 总结不超过30字"""
).partial(format_instructions=parser.get_format_instructions())

chain = prompt | model | parser
result = chain.invoke({"product": "星环Watch Pro智能手表"})
print(result)
# 输出:ProductReview(product_name='星环Watch Pro', score=8,
#        pros=['7天续航', '实时心率', '轻量设计'],
#        cons=['App功能偏少', '无NFC支付'],
#        summary='续航强+监测准,功能待完善')

类比理解: Pydantic约束 ≈ Java的DTO + @NotNull + @Size(max=30)。用代码结构约束AI输出,比文字约束靠谱得多。


复杂推理任务直接让AI给结论,错误率极高。加上"分步思考",准确率大幅提升。

翻车对比:

# 没有CoT——AI直接给错误答案
问:一个餐厅有23桌客人,每桌平均消费185元,总营收是多少?
答:4255元  ← 错了(23×185=4255是对的,但AI可能算错)

# 加CoT——AI一步步算,准确率提升
问:请分步计算:一个餐厅有23桌客人,每桌平均消费185元,总营收是多少?
    第一步:列出计算公式
    第二步:代入数字计算
    第三步:给出最终答案
答:第一步:总营收 = 桌数 × 平均消费 = 23 × 185
    第二步:23 × 185 = 4255
    第三步:总营收为4255元  ← 正确!

实战代码(LangChain CoT版):

from langchain_core.prompts import ChatPromptTemplate

cot_prompt = ChatPromptTemplate.from_template(
    """请分步回答以下问题:

问题:{question}

思考步骤:
1. 先分析问题涉及的关键信息
2. 列出解题思路/推理逻辑
3. 逐步推导,不要跳步
4. 最后给出结论

请严格按照以上步骤输出。"""
)

chain = cot_prompt | model | StrOutputParser()

# 代码调试场景——CoT让AI排查bug更靠谱
result = chain.invoke({
    "question": "这段Python代码输出None而不是预期列表,为什么?\n"
    "def get_items(data):\n"
    "    result = []\n"
    "    for item in data:\n"
    "        if item > 0:\n"
    "            result.append(item)\n"
    "    # 忘记return result"
})
print(result)

Java开发者类比: CoT ≈ Debug时的断点调试。不加CoT = print(result) 直接看最终值;加了CoT = 一步步print()追踪中间变量,更容易定位问题。


把以上3个技巧整合成一个可复用模板,1分钟填完就能用:

角色:请你扮演【专业角色】,具备【核心能力/经验】,擅长【表达风格】

背景:本次任务的场景是【具体场景】,目标受众是【人群描述】,核心目的是【想要什么结果】

任务:请完成【具体任务描述】

约束:
1. 字数/格式:【如:200字以内/分3点/JSON格式】
2. 风格/语言:【如:口语化/专业严谨/代码驱动】
3. 禁忌:【如:禁止模板化表达/禁止编造数据】
4. 必含:【如:必须包含1个数据点/必须给出代码示例】

思考步骤(可选):
1. 先分析【XX】
2. 再推导【XX】
3. 最后结论【XX】

输出格式:【如:先给结论,再给3条理由/表格对比/代码+注释】

实战:1分钟生成技术文章提示词

角色:资深技术博主,3年AI应用开发写作经验,擅长通俗易懂+踩坑视角

背景:面向Java后端开发者转大模型方向,核心目的是让读者看完就能用CoT技巧优化自己的提示词

任务:写一篇思维链提示(CoT)的实战教程

约束:
1. 800字以内
2. 包含2个对比案例(有CoT vs 无CoT)
3. 禁止讲学术理论
4. 必含1段可直接复制的LangChain代码

输出格式:先给翻车案例→再给修复案例→最后给代码模板

从Java转大模型,最容易犯的思维误区:

Java思维 提示词思维 区别
写函数先定义入参类型 写提示词先定义角色和约束 入参是数据,提示词是"语境"
代码逻辑靠if-else控制 AI输出靠"约束+禁忌"控制 if-else是硬规则,提示词是"软引导"
出bug看日志定位 AI答偏了看提示词定位 日志是代码问题,答偏是提示词问题
接口返回定义DTO AI输出定义Pydantic/JSON DTO约束Java对象,Pydantic约束AI文本
单元测试验证逻辑 对比测试验证提示词 测试代码是确定性的,测试提示词是概率性的

核心转换: Java开发者习惯"确定性思维"——代码写了什么就执行什么。但AI是概率模型,提示词不是"命令",是"引导"。同样的提示词跑两次,结果可能不同。

所以提示词设计要像写防御性代码一样: 多加约束、多设边界、多给示例,把AI"脑补"的空间压缩到最小。


技巧 解决什么问题 一句话用法 对应代码工具
角色设定 AI输出不够专业 "扮演XX角色,完成XX任务" ChatPromptTemplate.from_template()
约束限定 AI废话太多/格式不对 "字数XX/禁止XX/必须XX" PydanticOutputParser
思维链CoT AI推理出错 "请分步思考" CoT模板 + StrOutputParser
结构化模板 提示词写得慢/质量不稳 填模板1分钟出高质量提示词 模板变量 + prompt.partial()

提示工程的核心不是"写得长",是"写得准"。 就像Java代码——最优雅的代码不是最长的,是最精准的。

有问题评论区交流,你写提示词踩过什么坑?

更多推荐