从写代码到写 Prompt:一个 AI Native 开发者的提示词工程入门
v010 学了 JavaScript 的底层——作用域、var/let/const、变量提升。那些是"写代码"的基本功。
今天,v011,我换了一个方向:不写代码,写提示词。
学习来源是吴恩达(Andrew Ng)在 deeplearning.ai 上的 Prompt Engineering 课程。和之前学 JS 语法、Python API 不同,这门课教的是一种全新的"编程方式"——用自然语言告诉 AI 做什么,然后让 AI 来写代码。
v001 做生日卡片时,我就体验过 Prompt 的力量——一句"创建一个网页来帮我写生日贺卡"就能生成完整应用。但那时候是"凭感觉"写 prompt,今天是系统学习 prompt 背后的规则。
这篇文章聊三个东西:① Prompt 的五个构建块 ② 四条核心规则的实战 ③ LLM 幻觉——当 AI 一本正经地胡说八道。
一、get_completions 函数:LLM API 的"第一行代码"
在学 prompt 规则之前,先搭了一个调用 LLM 的工具函数。v009 学 Python 函数时,我理解了参数默认值的用法。今天第一次把它用在"正经事"上——调用 DeepSeek 的 API。
from openai import OpenAI
client = OpenAI(
api_key="sk-42f...283e",
base_url="https://api.deepseek.com/v1"
)
def get_completions(prompt, model="deepseek-chat"):
response = client.chat.completions.create(
model=model,
messages=[
{"role": "user", "content": prompt}
]
)
return response.choices[0].message.content
这个函数做了三件事:① 封装了 API 调用逻辑 ② 用参数默认值指定模型(model="deepseek-chat") ③ 返回 LLM 的文本响应。以后所有实验都用 get_completions(prompt) 一行搞定。
学到这里,我理解了 LLM API 的两种接口:
- completions:纯文本生成。给一段 prompt,返回一段补全。简单直接。
- chat.completions:对话形式。用
messages数组传入多轮对话,支持system(系统指令)、user(用户输入)、assistant(AI 回复)三种角色。
messages = [
{"role": "system", "content": "你是一个专业的助手"},
{"role": "user", "content": "你好"},
{"role": "assistant", "content": "你好,有什么我可以帮助你的吗?"}
]
v009 说 Python 是 AI 工程的"母语"。今天我理解了为什么——Python 的函数封装 + API 调用,就是人和 LLM 之间的"桥梁"。写好这个桥梁,后面的 prompt 实验才能顺畅进行。
二、Prompt 的五个构建块
v001 做生日卡片时,我发现了一个问题:prompt 不够清晰时,AI 靠猜,结果不好用。 后来通过不断补充需求——"加上节日风格配色"、"把卡片放在右侧"、"在页面顶部加标题"——才逐步得到满意的结果。
吴恩达把这个过程提炼成了五个构建块:
- Goal(目标):你想要什么
- Input(输入):给 AI 什么素材
- Output(输出):期望什么格式
- Layout(布局):结果怎么排版
- Features(特性):额外的功能需求
回头再看 v001 的生日卡片 prompt 设计,其实就是这五个构建块的逐步补充。Prompt 不是"随便说句话",而是有结构的"需求规格书"。
v003 做落地页时,我用了一个完整的 prompt 来指导 Claude Code 生成代码。现在想想,那个 prompt 之所以好用,就是因为它无意中覆盖了这五个构建块——有目标(做一个落地页)、有输入(品牌信息)、有输出(React 组件)、有布局(Hero + Features + CTA)、有特性(响应式、动画)。
Prompt 就是 AI 时代的 PRD(产品需求文档)。 产品经理写 PRD 给开发看,AI Native 开发者写 Prompt 给 LLM 看。结构越清晰,输出越靠谱。
三、规则一:清晰且具体的表达
吴恩达的第一条规则:通过尽可能清晰、具体的指令,来明确你希望模型完成的任务。
两个关键词:清晰和具体。
清晰,是让大模型理解你的目的,不偏离主题。具体,是提供足够的上下文。
实战中最重要的技巧是用分隔符标记输入文本。比如要让 LLM 总结一段文字:
text = """
你应当通过尽可能清晰、具体的指令,来明确你希望模型完成的任务。
这能引导模型产出符合预期的结果,同时降低回复内容偏离主题或出现错误的概率。
不要把编写清晰的提示词和精简提示词混为一谈。
很多时候,篇幅更长的提示词能为模型提供更完整的说明与背景信息,
进而让输出内容更加详实、贴合需求。
"""
prompt = f"""
将三个反引号之间的文本总结为一句话
```{text}```
"""
get_completions(prompt)
输出:"清晰的指令有助于引导模型输出符合预期的结果,而更长的提示词往往能提供更完整的背景信息,不应将其与精简混淆。"
这里的关键是用 ``` 反引号把待处理的文本"框"起来,告诉 LLM:"这段是输入素材,不是给你的指令。" 没有这个分隔符,LLM 可能会把文本内容当成指令来理解,导致输出偏离。
另一个关键洞察:"清晰的指令"不等于"简短的指令"。 吴恩达特别强调,更长的 prompt 能提供更完整的背景信息,让输出更贴合需求。不要怕 prompt 长——怕的是模糊。
v010 学 JS 模板字符串 ${text} 时,我理解了"占位符"的概念。Python 的 f-string {text} 做的是同样的事——把变量嵌入到字符串模板中。Prompt 工程大量使用这种模板化写法,把固定的指令和动态的输入拼接在一起。
四、规则二:约束输出格式——JSON 的力量
LLM 默认返回的是"散文体"——一段自然语言文本。但程序需要结构化数据才能处理。所以第二条规则是:约束输出格式,一般用 JSON。
实战案例:
prompt = f"""
请列出四大名著,并标注对应的作者与书籍类型。
使用JSON 格式呈现,需要包含以下字段:
book_id(书籍编号),title(书名),author(作者),genres(书籍类型)。
"""
get_completions(prompt)
输出:
[
{"book_id": 1, "title": "红楼梦", "author": "曹雪芹(高鹗续写)", "genres": "长篇小说(章回体) / 人情小说 / 古典小说"},
{"book_id": 2, "title": "西游记", "author": "吴承恩", "genres": "长篇小说(章回体) / 神魔小说 / 古典小说"},
{"book_id": 3, "title": "三国演义", "author": "罗贯中", "genres": "长篇小说(章回体) / 历史演义 / 古典小说"},
{"book_id": 4, "title": "水浒传", "author": "施耐庵(罗贯中增补)", "genres": "长篇小说(章回体) / 英雄传奇 / 古典小说"}
]
注意 prompt 里不只是说"用 JSON",还指定了字段名和中文注释。这就是"丰富 JSON 的 key,加点自然语义的加持"——字段名用英文(程序友好),注释用中文(语义清晰)。LLM 同时理解两种语言,所以这种写法既规范又实用。
这个认知很重要:Prompt 不只是"对话",更是"编程"。 你在用自然语言写接口规范——输入什么、输出什么格式、包含哪些字段。v006 聊模块化时说"JSON 约定就是模块之间的接口协议"。Prompt 里的 JSON 约定,就是人和 LLM 之间的接口协议。
五、规则三:分布式提示——让 AI 一步一步来
第三条规则:复杂任务不要一次性交给 LLM,拆成多个步骤效果更好。
这就是"分布式提示"(Prompt Chaining)。
实战案例一:泡茶指令的分步整理。
text = """
泡一杯茶其实很简单。首先把水烧开,烧水的同时,拿出茶杯,放入茶包。
水烧开后,将热水冲入杯中浸泡茶包,静置片刻让茶香析出。几分钟后取出茶包。
根据个人口味,还可以加入糖或牛奶。
这样一杯美味的茶饮就泡好了。
"""
prompt = f"""
你将收到有三个引号包括的文本,若文本中包含一系列操作指令,
请按照以下步骤重新整理这些指令,
步骤一 ...
步骤二 ...
...
步骤 N ...
如果文本中没有一系列操作指引,直接输出**没有必要的步骤**
\"\"\"
{text}
\"\"\"
"""
print(get_completions(prompt))
输出:
步骤一:把水烧开。
步骤二:烧水的同时,拿出茶杯,放入茶包。
步骤三:水烧开后,将热水冲入杯中浸泡茶包。
步骤四:静置片刻让茶香析出。
步骤五:几分钟后取出茶包。
步骤六:根据个人口味,加入糖或牛奶。
注意 prompt 里的"如果文本中没有一系列操作指引,直接输出没有必要的步骤"——这是一个边界条件处理。好的 prompt 不只告诉 LLM "做什么",还告诉它"什么情况不做"。
实战案例二:多步骤 NLP 任务链。
prompt = f"""
执行以下操作:
将三个反引号内的内容概括成一句话。
把这句话翻译成法语。
列出法语摘要中出现的所有人名。
输出JSON对象,包含字段:french_summary(法语摘要),
num_names(人物数量),names(名字,用&链接)。
答案分行展示。
{text}
"""
一个 prompt,四步操作:概括 → 翻译 → 提取 → 结构化输出。LLM 按顺序执行,最终返回一个包含法语摘要、人名数量和人名列表的 JSON。
v008 聊数组去重时说"分步思考是编程思维的核心"。分布式提示也一样——把大任务拆成小步骤,每一步的输出是下一步的输入,最终得到完整的结果。
六、规则四:Few-shot 提示——用示例教 AI
第四条规则:在 prompt 中提供少量示例(2-5 个),引导模型理解任务格式和期望输出。 这就是 Few-shot 提示。
实战案例:诗歌风格匹配。
prompt = f"""
你的任务是保持统一的行文风格作答。
提问:请讲讲何为耐心。
回答:能凿出深幽峡谷的江河,源自涓涓细流;
恢弘壮阔的交响乐,起于单个音符;
精美繁复的织锦,始于一缕丝线。
提问:请讲讲何为韧性。
"""
输出:
能折不断青竹的暴雪,终成压弯的弓背抵住山崩;
炼钢百锻不碎的铁砧,终在千度火焰中纹丝不动;
荒原上枯荣百年的胡杨,根系早与大地血脉相连。
只给了一个"耐心"的示例,LLM 就学会了这种"以物喻理"的诗体风格,用同样的结构回答了"韧性"。这就是 Few-shot 的威力——不需要微调模型,只需要"教"它几次。
v007 学 FDE 时说"用最少的样本做最大的事"。Few-shot 的本质也一样——用 2-5 个示例,就能让 LLM 理解复杂的任务格式和风格要求。这比从头训练一个模型高效太多了。
七、LLM 幻觉:当 AI 一本正经地胡说八夫
学完四条规则,我用两个"陷阱"测试了 LLM 的诚实度。结果令人震惊。
陷阱一:博伊品牌 AeroGlide 超薄智能电动牙刷
prompt = """
介绍一下博伊品牌的AeroGlide 超薄智能电动牙刷
"""
这个产品根本不存在。但 LLM 编造了一份完整的产品介绍:
博伊品牌(Boyue,这里推测可能指代的是博皓……)的 AeroGlide 超薄智能电动牙刷是其旗舰或高端线产品,主打"极致纤薄"、"高频振动"和"智能交互"。
它甚至编造了具体参数:40000次/分钟震动、6-8mm刷头厚度、IPX7防水、30天续航。还给出了"购买前建议"——建议用户"查看电商平台该型号的用户追评"。
一个不存在的产品,它建议你去看用户评价。
陷阱二:蜜雪冰城的滑雪装备
prompt = """
介绍一下蜜雪冰城的滑雪装备
"""
蜜雪冰城从未推出过滑雪装备。但 LLM 编造了"雪王IP衍生周边"、"网友二创设计"等内容,还分了两大类、列了六七种具体产品。虽然最后承认"不是真实商品",但中间大段的描述极具迷惑性——如果你不了解蜜雪冰城,很可能会信以为真。
为什么会幻觉?
LLM 的本质是**"预测下一个最可能的 token"**,不是"检索事实数据库"。它根据训练数据中的模式生成文本,所以能编造出"听起来很合理"但完全虚构的内容。博伊牙刷那段,它甚至先承认不确定品牌名("博伊"还是"博皓"),然后继续自信地编造——这种"先犹豫后自信"的模式,恰恰是幻觉最危险的地方。
如何应对幻觉?
- 不要盲信 LLM 的输出,尤其是涉及具体品牌、产品、数据、引用时
- 用"请基于以下事实回答" + 提供参考文本来约束 LLM 的"想象力"
- 关键信息一定要人工验证,不能因为 AI 说得头头是道就当真
v001 说 vibe coding 的理念是"感觉对了就行"。今天学完幻觉,我理解了这种理念的最大风险:如果 AI 生成的代码有隐蔽 bug,而你"感觉"它运行正常,那问题可能要到生产环境才会暴露。 理解幻觉,就是理解"为什么要验证 AI 的输出"。
结语
今天学到的不只是"怎么写 prompt"。是三件事:
第一,Prompt 是有结构的"需求规格书。 五个构建块(Goal + Input + Output + Layout + Features)让 prompt 从"随便聊天"变成"精确描述"。Prompt 写得越好,LLM 的输出越靠谱。
第二,四条规则减少 LLM 的随机性。 清晰表达、JSON 约束、分布式提示、Few-shot 示例——这四条规则的本质,都是通过"给 LLM 更多信息"来"减少它的自由发挥空间"。LLM 智能很高,但需要规则来约束它的随机性。
第三,幻觉是 LLM 的本质缺陷。 不存在的产品、不存在的业务线,LLM 都能编造出完整、详细、自信的介绍。理解幻觉,才能在使用 AI 时保持清醒。
回顾十一篇文章的完整路径:
- v001-v004:AI 工具链(OPC → Prompt → Agent → CLI)
- v005-v006:工程基本功(Git → 模块化)
- v007:业务视角(FDE)
- v008-v010:编程基本功 + 语言扩展(数组去重 → Python + API → JS 底层)
- v011:Prompt Engineering(从写代码到写提示词)
v001 用 Prompt 做了生日卡片,那时候是"凭感觉"写 prompt。v011 理解了 Prompt 背后的"工程学"——五个构建块、四条规则、幻觉风险。从"会用"到"懂原理",这就是进步。
AI Native 开发者的核心能力,不只是会写代码,更是会用自然语言编程。Prompt 写得好,LLM 就是你最高效的"程序员"。Prompt 写得差,LLM 就是你最自信的"胡说八道机器"。
下篇见。