第07讲:提示词的本质:为什么你写的Prompt总是让AI误解

3 阅读1分钟

「问对问题,比得到答案更重要。」


开场:同一个 AI,为什么别人用起来比你强

小维和他的同事老李,都在用 Cursor 做 Vibe Coding。

两个人都让 AI 帮忙写一个"用户登录功能"。

老李的提示词:

写一个用户登录功能

小维的提示词:

用 Express.js + JWT 实现用户登录接口:
POST /api/auth/login
请求体:{ email: string, password: string }
处理逻辑:
1. 检查 email 格式是否合法
2. 查询数据库验证用户是否存在
3. 用 bcrypt 验证密码
4. 生成 JWT Token(有效期 7 天)
5. 返回:{ token: string, user: { id, email, username } }
错误处理:
- 用户不存在 → 401 { error: "邮箱或密码错误" }
- 密码错误 → 401 { error: "邮箱或密码错误" }(不区分,防止枚举攻击)
- 参数缺失 → 400 { error: "参数错误" }
使用已有的 User Model(文件在 models/user.js)

结果可想而知:老李得到了一个不完整的、需要大量修改的实现;小维得到了一个可以直接使用的完整接口。

两个人用的是同一个 AI——差别在提示词。


全局视角:提示词工程的知识体系

mindmap
  root((提示词工程))
    第07讲-本讲
      提示词的本质
      为什么会被误解
      信息完整性理论
    第08讲
      结构化提示词
      黄金公式
    第09讲
      上下文管理
    第10讲
      迭代式提示词
    第11讲
      系统提示词
    第12讲
      提示词模板库
    第13讲
      元提示词

核心知识点一:AI 误解提示词的三个根本原因

原因一:歧义性——同一句话有多种理解

人类在交流时,依赖大量的"默认共识"来消除歧义。

比如:"帮我做一个登录功能"——我们脑子里有很多默认假设:

  • 是 Web 登录?还是 App 登录?还是 CLI 登录?
  • 用什么技术栈?
  • 密码要加密吗?
  • 需要"记住我"功能吗?
  • 需要多因素认证吗?

这些默认假设在不同人、不同场景下完全不同。

AI 没有这些默认共识——或者更准确地说,它有自己的默认假设,但那些假设未必和你一样。

解决方案:在提示词里明确消除歧义——把你的"默认假设"写出来。

原因二:不完整性——缺少关键上下文

人类的大脑非常擅长"脑补"——即使信息不完整,我们也能推断出说话者的意图。

AI 的脑补能力远不如人类,特别是在技术细节上。

典型场景

你说:"帮我优化这个数据库查询,让它更快"

AI 给你了几个优化方案,但它不知道:

  • 你的数据量是多大?(100行 vs 1亿行的优化策略完全不同)
  • 哪些字段已经有索引了?
  • 查询现在的执行时间是多少?
  • 你能接受多大的代码复杂度增加?

解决方案:在提示词里提供关键上下文信息。

原因三:抽象层次不匹配

有时候提示词太抽象,AI 不知道你想要什么;有时候提示词太具体,AI 的回答反而变窄了。

太抽象

帮我优化这段代码

(AI 不知道从哪个维度优化:性能?可读性?安全性?代码量?)

太具体(但具体点选错了)

把第 47 行的 for 循环改成 map

(如果问题不是在 for 循环上,这个改动毫无意义)

恰当的抽象层次

这段代码的执行时间在数据量 10 万条时超过了 3 秒,
帮我分析性能瓶颈在哪里,并给出优化方案,
目标是将执行时间降到 1 秒以内,
允许增加适当的代码复杂度

解决方案:用"目标+约束"的方式描述需求,而不是"具体操作"。


核心知识点二:提示词的信息完整性理论

一个好的提示词,需要包含以下四个维度的信息:

graph TD
    A["完整的提示词"] --> B["意图 (What)\n你想要什么结果"]
    A --> C["上下文 (Context)\n相关的背景信息"]
    A --> D["约束 (Constraints)\n不能做什么、限制是什么"]
    A --> E["格式 (Format)\n你希望输出是什么形式"]
    
    B --> B1["功能需求\n业务逻辑\n预期效果"]
    C --> C1["已有代码\n技术栈\n数据结构\n业务背景"]
    D --> D1["不使用X框架\n不改变Y接口\n必须兼容Z版本\n性能限制"]
    E --> E1["代码?文档?\n步骤说明?\n对比表格?"]

框架记忆意图 + 上下文 + 约束 + 格式 = ICCE

不是每个提示词都需要所有四个维度,但复杂任务通常都需要。


核心知识点三:信息密度 vs 提示词长度

很多人有一个误区:提示词越长越好。

错。提示词的质量不在于长度,而在于信息密度——每一句话是否都包含了对 AI 有用的信息。

低信息密度的提示词(长但没用)

我是一个 Python 程序员,我在做一个项目,这个项目需要处理一些数据。
我有一个需求,就是需要对一些数据进行处理,具体来说是要把这些数据从
一种格式转换成另一种格式。希望你能帮我实现这个功能,谢谢。

高信息密度的提示词(短但有用)

把 JSON 格式的用户数据转换成 CSV 格式。
输入:[{"name": "John", "age": 30}, ...]
输出:CSV 文件,第一行是 name,age 的列头
用 Python,使用 csv 模块,不用第三方库

原则:去掉所有对 AI 没有指导意义的废话,保留所有具体的、有用的信息。


深度拆解:解析 5 种常见的糟糕提示词

类型一:纯任务型(缺少上下文)

帮我写一个排序函数

问题:排序什么数据?升序还是降序?什么语言?有没有性能要求?

改进

用 Python 写一个函数,对字典列表按某个键排序:
- 函数签名:sort_by_key(data: list[dict], key: str, reverse: bool = False)
- 如果 key 不存在,该元素排到最后
- 时间复杂度要求:O(n log n)

类型二:抽象型(缺少具体需求)

帮我优化用户体验

问题:哪个页面?哪个流程?什么样的用户体验问题?

改进

我的用户注册流程目前是三步页面跳转,
用户反馈感觉很慢,想要更流畅的体验。
帮我把它改成单页面的步骤组件(类似 GitHub 注册的那种),
用 React,不用引入额外的 form

类型三:矛盾型(约束互相冲突)

帮我写一个函数,要求代码简洁,但同时要处理所有可能的异常情况

问题:"简洁"和"处理所有异常"在很多情况下是矛盾的。AI 不知道哪个优先级更高。

改进

写一个文件读取函数,优先考虑代码简洁性,
只处理最常见的异常(文件不存在、没有权限),
其他异常可以直接抛出

类型四:多任务型(一个提示词里塞了太多需求)

帮我做用户注册、登录、找回密码、修改密码、注销账号这些功能

问题:这是 5 个独立的功能,一起做质量会很差。

改进:分开来说,一次一个功能。

类型五:假设型(假设 AI 知道你知道的)

按照上次的方式,帮我再做一个类似的功能

问题:AI 没有"上次"的记忆(每次对话都是全新开始),不知道"上次的方式"是什么。

改进:每次都提供完整的上下文,不依赖 AI 记住历史。


案例解析:一个提示词的逐步升级过程

需求:写一个发送邮件的功能

版本一(糟糕)

帮我写一个发送邮件的功能

版本一的问题

  • 不知道用什么邮件服务(SMTP?SendGrid?AWS SES?)
  • 不知道用什么语言
  • 不知道邮件内容是什么格式
  • 不知道是否需要 HTML 邮件

版本二(好一点)

用 Node.js 写一个发送邮件的功能,使用 Nodemailer 库

版本二的问题

  • 虽然指定了语言和库,但仍缺少:邮件服务器配置方式、错误处理、是否支持 HTML、异步处理方式

版本三(好很多)

用 Node.js + Nodemailer 写一个发送邮件的工具函数:

函数签名:sendEmail({ to, subject, html, text })
- to: 收件人(字符串或字符串数组)
- subject: 邮件标题
- html: HTML 格式的邮件内容(可选)
- text: 纯文本格式的邮件内容(可选,html 不存在时使用)
- 返回: Promise<{ messageId: string }>

SMTP 配置从环境变量读取:
- SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS
- 发件人用 SMTP_USER

错误处理:
- 连接失败时抛出 Error('SMTP connection failed')
- 发送失败时抛出 Error('Email send failed: [原始错误信息]')

额外要求:
- 用 async/await,不用回调
- 包含 TypeScript 类型定义

最终效果:版本三得到的代码几乎可以直接使用,版本一得到的代码还需要大量补充。


实操指南:提示词自检清单

在发送每个提示词之前,用这个清单检查一遍:

基础检查(每次都做)

  • 意图清晰了吗?AI 能知道你要做什么吗?
  • 技术栈指定了吗?(语言、框架、库)
  • 有没有关键的上下文缺失?

完整性检查(复杂任务)

  • 输入/输出格式说清楚了吗?
  • 错误处理要求说了吗?
  • 不能做什么(负向约束)说了吗?
  • 和已有代码的集成方式说了吗?

质量检查(高要求任务)

  • 性能要求说清楚了吗?
  • 测试要求说清楚了吗?
  • 代码风格要求说了吗?

本讲小结

mindmap
  root((提示词本质))
    误解的三个原因
      歧义性
      不完整性
      抽象层次不匹配
    完整提示词四要素
      意图What
      上下文Context
      约束Constraints
      格式Format
    信息密度原则
      去掉废话
      保留具体信息
      长度服从质量
    五种糟糕提示词
      纯任务型
      抽象型
      矛盾型
      多任务型
      假设型

思考题

  1. 回顾你过去一周用 AI 编程的经历,找一个 AI 给你的结果和你期望不符的案例。用这一讲的框架分析,是什么原因导致了误解?

  2. 有人说"会写提示词是一种新的编程语言",你同意这个类比吗?提示词和编程语言有哪些相似之处,哪些根本不同?

  3. 在这一讲里,我们强调了"信息完整性"。但有些情况下,给 AI 太多信息也会让它表现变差(比如会被无关信息分散注意力)。你怎么判断一个信息应不应该放进提示词?


下一讲预告

这一讲我们搞清楚了提示词为什么会失败。

下一讲,我们来讲最实用的工具:结构化提示词的黄金公式——角色 + 任务 + 上下文 + 约束的组合方式。

这是一个可以立刻套用的模板,能让你的提示词质量提升一个等级。