摘要
当基础的提示技巧不足以应对复杂任务时,我们需要一套更强大的“组合拳”。本文在前一篇“提示工程基础”之上,深入探讨了七种能显著提升大型语言模型(LLM)表现的高级提示技术。我们将通过代码实战,逐一拆解思维链(Chain-of-Thought)如何增强逻辑推理,生成知识(Generated Knowledge)如何注入私有数据,从少到多(Least-to-Most)如何分解复杂问题,以及自我改进(Self-Refine)如何实现输出的迭代优化。无论您是想让AI解决数学题、基于业务数据做推荐,还是生成更高质量的代码,本文提供的“七大秘技”都将成为您工具箱中无价的利器。
引言:“启智未来”的进阶挑战
我们的教育科技初创公司“启智未来”,在掌握了基础提示工程后,产品功能开发渐入佳境。但很快,团队就遇到了新的瓶颈:
- 如何让AI导师不仅给出数学题的答案,更能像老师一样,展示详细的解题步骤?
- 如何让AI根据我们“启智未来”的独有课程列表和学生预算,做出个性化的课程推荐?
- 如何确保AI为编程课生成的示例代码,质量更高、更健壮?
这些复杂的需求,无法通过单一、简单的提示来满足。它们要求我们从“与AI对话”升级到“为AI设计工作流”。这,就是高级提示工程的用武之地。
秘技一:思维链(Chain-of-Thought, CoT)—— 让AI“想明白”再回答
这是解决复杂推理问题的“杀手锏”。CoT的核心,不是直接向模型索要答案,而是通过在提示中提供一个带有详细推理步骤的范例,诱导模型在回答时也模仿这种“思考->结论”的模式,一步步地把问题想清楚。
场景:“启智未来”的学生问了一道数学题。
-
不使用CoT的提示:
爱丽丝有5个苹果,她扔掉了3个,给了鲍勃2个,鲍勃又还给她1个。请问爱丽丝现在有几个苹果?
模型可能会因为简单的词语关联,直接给出错误的答案
5
。 -
使用CoT的提示(通过少样本示例引导):
# 假设 client 已初始化 from openai import OpenAI client = OpenAI() # CoT通过一个带有完整解题步骤的例子来引导模型 cot_prompt = """ 问题:丽莎有7个苹果,她扔掉了1个,给了巴特4个,巴特又还给她1个。请问丽莎现在有几个苹果? 思考过程: 1. 丽莎开始有7个苹果。 2. 扔掉1个后,剩下 7 - 1 = 6个。 3. 给了巴特4个后,剩下 6 - 4 = 2个。 4. 巴特还回1个后,最终有 2 + 1 = 3个。 答案:3 问题:爱丽丝有5个苹果,她扔掉了3个,给了鲍勃2个,鲍勃又还给她1个。请问爱丽丝现在有几个苹果? 思考过程: """ response = client.chat.completions.create( model="gpt-4", messages=[ {"role": "user", "content": cot_prompt} ], temperature=0 ) print(response.choices[0].message.content)
-
模型可能的输出:
1. 爱丽丝开始有5个苹果。 2. 扔掉3个后,剩下 5 - 3 = 2个。 3. 给了鲍勃2个后,剩下 2 - 2 = 0个。 4. 鲍勃还回1个后,最终有 0 + 1 = 1个。 答案:1
通过CoT,我们成功地让模型从“猜答案”模式切换到了“逻辑推理”模式。
秘技二:生成知识(Generated Knowledge)—— 为AI注入“私有数据”
在真实业务场景中,我们常常需要AI基于我们内部的、非公开的数据来做出判断。这时,“生成知识”技巧就派上了用场。其本质是通过模板化技术,在每次请求时,都将最新的、相关的业务数据动态地注入到提示的上下文中。
场景:为“启智未来”的学生,根据预算和需求推荐课程。
# 假设 client 已初始化
# 1. 模拟从公司数据库或API获取的“私有数据”
our_courses = [
{"type": "编程", "name": "Python入门", "cost": 500},
{"type": "编程", "name": "Web开发实战", "cost": 800},
{"type": "艺术", "name": "素描基础", "cost": 400},
{"type": "艺术", "name": "油画进阶", "cost": 700}
]
# 2. 学生的预算和需求
student_budget = 1000
student_requirements = "我喜欢画画,也想学点编程。"
# 3. 构建动态提示模板
prompt_template = """
你好,请根据我们“启智未来”的课程列表和学生的具体情况,为他/她推荐一个最合适的课程组合。
### 我们的课程列表 (名称, 月费) ###
{course_list_str}
### 学生情况 ###
预算上限: {budget}元
需求描述: "{requirements}"
### 推荐与说明 ###
请严格在预算范围内,根据学生的需求,推荐一个或多个课程的组合,并简要说明推荐理由。
请注意:课程组合的总费用不能超过预算!
"""
# 4. 格式化私有数据并填充模板
course_info_str = "\n".join([f"- 类型: {c['type']}, 名称: {c['name']}, 费用: {c['cost']}元" for c in our_courses])
final_prompt = prompt_template.format(
course_list_str=course_info_str,
budget=student_budget,
requirements=student_requirements
)
# 5. 发送请求
# print("--- 最终发送的动态Prompt ---")
# print(final_prompt)
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "你是一位专业的课程顾问。"},
{"role": "user", "content": final_prompt}
]
)
print("\n--- AI课程顾问的推荐 ---")
print(response.choices[0].message.content)
这个例子完美地展示了如何让AI在我们划定的“知识范围”内工作,并通过优化提示(如强调“总费用不能超过预算!”)来获得更精确、更可靠的业务建议。
秘技三:从少到多(Least-to-Most)—— 化繁为简的艺术
这个技巧的核心思想是,将一个复杂的大问题,分解成一系列更小、更容易解决的子问题,然后引导AI按顺序逐一解决。这不仅降低了问题的难度,也让整个解决过程更加清晰和可控。
场景:为“启智未来”的学生创建一个为期四周的个性化“世界历史”学习计划。
我们可以将这个复杂任务分解为如下的子问题序列,并通过一个流程图来可视化:
flowchart TD
A[1. 识别学生薄弱点<br/>(例如: "学生对古罗马历史了解较少")] --> B[2. 拆分核心主题<br/>(罗马王政、共和国、帝国...)]
B --> C[3. 分配主题到每周<br/>(第一周:王政与共和国...)]
C --> D[4. 为每周生成具体学习资源<br/>(推荐阅读章节、观看视频)]
D --> E(5. 汇总成最终学习计划)
style E fill:#4CAF50,color:white
图3: 使用“从少到多”方法设计学习计划的流程
在实际应用中,这可以通过一个“编排器”(Orchestrator)程序,按顺序调用LLM,并将上一步的输出作为下一步的输入,一步步地构建出最终的复杂结果。
秘技四:自我改进(Self-Refine)—— 让AI成为自己的“质检员”
我们不能100%信任AI的初版回答。一个非常聪明的技巧是,让AI自己来“反思”和“改进”自己的工作。这通常分两步走:
- 生成: 让AI先完成一个初始任务。
- 反思与改进: 将AI的初始答案作为新提示的一部分,要求它“批判性地审视这份答案,并提出3点改进建议,然后生成一个优化后的版本”。
场景:让AI为“启智未来”的Python课程生成一段示例代码。
# 假设 client 已初始化
# --- 第1步:生成初始代码 ---
initial_prompt = "请用Python写一个简单的函数,计算一个数字列表的平均值。"
initial_response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": initial_prompt}]
).choices[0].message.content
print("--- 初始生成的代码 ---")
print(initial_response)
# --- 第2步:要求AI自我改进 ---
refine_prompt = f"""
这是你刚才写的代码:
```python
{initial_response}
请从代码健壮性、可读性和效率三个角度,批判性地审视这段代码,并提出具体的改进建议。然后,请提供一个融合了这些建议的、更优化的最终版本。
“”"
final_response = client.chat.completions.create(
model=“gpt-4”, # 使用更强的模型来做代码审查
messages=[{“role”: “user”, “content”: refine_prompt}]
).choices[0].message.content
print(“\n\n— AI的自我反思与最终代码 —”)
print(final_response)
**模型可能的输出**:
```text
好的,这是对初始代码的审视和改进:
**批判性审视:**
1. **健壮性**: 初始代码没有处理输入列表为空的情况。如果`numbers`为空列表,`len(numbers)`会是0,导致`ZeroDivisionError`。
2. **可读性**: 变量名`s`和`l`虽然简短,但不够清晰。使用`total_sum`和`count`会更具描述性。
3. **效率**: 对于非常大的列表,使用`sum()`内置函数通常比手动循环更高效,因为它是用C语言实现的。
**优化后的最终版本:**
```python
from typing import List
def calculate_average(numbers: List[float]) -> float:
"""
计算一个数字列表的平均值。
Args:
numbers: 一个包含数字(整数或浮点数)的列表。
Returns:
列表的平均值。如果列表为空,则返回0.0。
"""
if not numbers:
return 0.0
return sum(numbers) / len(numbers)
# 示例
# print(calculate_average([1, 2, 3, 4, 5]))
这个技巧极大地提升了AI生成内容的质量,尤其是在代码生成、报告撰写等领域。
总结:从提示工程师到AI应用设计师
本文介绍的高级技巧,标志着一个重要的思维转变:
- 从编写单个提示,到设计多步、多轮的AI交互流程。
- 从**“一问一答”,到构建能分解问题、利用外部知识、并能自我优化的复杂AI工作流**。
掌握这些“秘技”,意味着您不再仅仅是一个“提示词工程师”,而是一位真正的“AI应用设计师”。您将有能力驾驭LLM,去解决更宏大、更复杂、也更有价值的现实世界问题。