阶段 1:LLM 基础与 Prompt 工程
📖 本阶段目标
- 深入理解大语言模型的工作原理和特性
- 掌握 Prompt 工程的核心技术和设计模式
- 学习 CoT(Chain of Thought)、ReAct 等高级提示技术
- 实践常见的 LLM 应用场景
🧠 LLM 核心概念
1. 关键参数理解
Temperature(温度)
- 范围:0.0 - 2.0
- 作用:控制输出的随机性
0.0:确定性输出,适合事实性任务0.7:平衡创造性和一致性(默认值)1.5+:高度创造性,适合创意写作
# 温度对比示例
response_creative = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "给我讲个故事"}],
temperature=1.2 # 更有创意
)
response_factual = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "什么是量子计算?"}],
temperature=0.1 # 更准确
)
Max Tokens(最大令牌数)
- 控制生成文本的长度
- 1 token ≈ 0.75 个英文单词,≈ 0.5 个中文字符
- 需要同时考虑输入和输出的 token 限制
Top P(核采样)
- 范围:0.0 - 1.0
- 作用:只从累计概率为 P 的 token 中采样
- 通常与 temperature 二选一使用
2. Token 计算与成本控制
import tiktoken
def count_tokens(text, model="gpt-4"):
"""计算文本的 token 数量"""
encoding = tiktoken.encoding_for_model(model)
return len(encoding.encode(text))
# 示例
text = "这是一段测试文本,用于计算 token 数量。"
tokens = count_tokens(text)
print(f"Token 数量: {tokens}")
# 成本估算(以 GPT-4 为例)
cost_per_1k_input = 0.03 # 美元
cost_per_1k_output = 0.06 # 美元
estimated_cost = (tokens / 1000) * cost_per_1k_input
📝 Prompt 工程核心技术
1. Prompt 基本结构
一个好的 Prompt 通常包含以下要素:
┌─────────────────────────────────┐
│ 1. 角色定义(Role) │
│ "你是一个专业的..." │
├─────────────────────────────────┤
│ 2. 任务描述(Task) │
│ "请帮我..." │
├─────────────────────────────────┤
│ 3. 上下文信息(Context) │
│ "基于以下信息..." │
├─────────────────────────────────┤
│ 4. 输入数据(Input) │
│ 具体的数据内容 │
├─────────────────────────────────┤
│ 5. 输出格式(Format) │
│ "请以JSON格式输出..." │
├─────────────────────────────────┤
│ 6. 约束条件(Constraints) │
│ "不要包含...", "必须..." │
└─────────────────────────────────┘
示例:
prompt = """
你是一个专业的数据分析师。
任务:分析以下用户评论,提取关键信息。
评论内容:
"{user_comment}"
请按以下JSON格式输出:
{{
"sentiment": "positive/negative/neutral",
"key_points": ["要点1", "要点2"],
"concerns": ["问题1", "问题2"],
"rating_estimate": 1-5
}}
约束:
- sentiment 必须是三选一
- key_points 最多3个
- 如果没有concerns则返回空数组
"""
2. Few-Shot Learning(少样本学习)
通过提供示例来引导模型输出:
prompt = """
请将以下句子分类为:问题、陈述、命令
示例:
输入:"今天天气怎么样?"
输出:问题
输入:"我喜欢吃苹果。"
输出:陈述
输入:"请打开窗户。"
输出:命令
现在请分类:
输入:"{user_input}"
输出:
"""
3. Chain of Thought (CoT) - 思维链
让模型展示推理过程,提高复杂任务的准确性:
prompt = """
问题:一个班级有60名学生,其中40%是女生,女生中有30%戴眼镜。
请问戴眼镜的女生有多少人?
请一步步思考:
1. 首先计算女生总数
2. 然后计算戴眼镜的女生数量
3. 给出最终答案
让我们开始:
"""
Zero-Shot CoT(零样本思维链):
prompt = """
{question}
让我们一步步思考这个问题。
"""
4. ReAct (Reasoning + Acting) 模式
结合推理和行动,适合需要工具调用的场景:
prompt = """
你可以使用以下工具:
- search(query): 搜索信息
- calculator(expression): 计算数学表达式
- get_weather(city): 获取天气信息
请按以下格式回答:
Thought: [你的思考过程]
Action: [要使用的工具]
Action Input: [工具的输入]
Observation: [工具的输出,由系统填充]
... (重复 Thought/Action/Observation)
Thought: 我现在知道最终答案了
Final Answer: [最终答案]
问题:北京明天的天气如何?如果下雨,建议穿什么衣服?
让我们开始:
Thought:
"""
5. 结构化输出
JSON 模式
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4-turbo-preview",
messages=[
{
"role": "system",
"content": "你是一个数据提取助手,总是以JSON格式输出。"
},
{
"role": "user",
"content": """
提取以下文本中的实体:
"苹果公司CEO蒂姆·库克于2023年访问了中国上海。"
输出格式:
{
"organizations": [],
"persons": [],
"locations": [],
"dates": []
}
"""
}
],
response_format={"type": "json_object"}
)
🛠️ 实践项目
项目 1:智能问答系统
目标:构建一个能够回答用户问题的系统
# examples/stage1/qa_system.py
import os
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
def create_qa_prompt(question, context=""):
"""创建问答 Prompt"""
if context:
return f"""
基于以下上下文回答问题:
上下文:
{context}
问题:{question}
如果上下文中没有相关信息,请明确说明。
"""
else:
return f"""
请回答以下问题:{question}
如果你不确定答案,请说"我不确定"而不是编造信息。
"""
def ask_question(question, context=""):
"""问答函数"""
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "你是一个准确、有帮助的助手。"},
{"role": "user", "content": create_qa_prompt(question, context)}
],
temperature=0.3
)
return response.choices[0].message.content
# 测试
if __name__ == "__main__":
# 无上下文问答
answer1 = ask_question("什么是量子计算?")
print("答案1:", answer1)
# 有上下文问答
context = """
量子计算是一种基于量子力学原理的计算方式。
它使用量子比特(qubit)而不是传统的二进制比特。
量子计算机在某些特定问题上可以比传统计算机快得多。
"""
answer2 = ask_question("量子计算使用什么单位?", context)
print("答案2:", answer2)
项目 2:数据结构化提取
目标:从非结构化文本中提取结构化信息
# examples/stage1/data_extraction.py
import json
from openai import OpenAI
client = OpenAI()
def extract_structured_data(text):
"""从文本中提取结构化数据"""
prompt = f"""
从以下文本中提取信息,并以JSON格式返回:
文本:
{text}
请提取:
- name: 人名
- company: 公司名
- position: 职位
- email: 邮箱
- phone: 电话
- location: 地点
如果某个字段没有信息,设置为 null。
只返回JSON,不要其他说明。
"""
response = client.chat.completions.create(
model="gpt-4-turbo-preview",
messages=[
{"role": "system", "content": "你是一个数据提取专家。"},
{"role": "user", "content": prompt}
],
response_format={"type": "json_object"},
temperature=0
)
return json.loads(response.choices[0].message.content)
# 测试
if __name__ == "__main__":
text = """
张三是ABC科技有限公司的高级工程师,
他的邮箱是zhangsan@abc.com,
办公地点在北京海淀区,联系电话是13800138000。
"""
result = extract_structured_data(text)
print(json.dumps(result, ensure_ascii=False, indent=2))
项目 3:文本摘要生成器
目标:对长文本进行智能摘要
# examples/stage1/text_summarizer.py
from openai import OpenAI
client = OpenAI()
def summarize_text(text, style="concise", max_length=100):
"""
文本摘要
Args:
text: 原始文本
style: 摘要风格 (concise/detailed/bullet_points)
max_length: 最大字数
"""
style_prompts = {
"concise": "生成简洁的摘要",
"detailed": "生成详细的摘要,保留关键细节",
"bullet_points": "生成要点列表形式的摘要"
}
prompt = f"""
请对以下文本{style_prompts[style]}(不超过{max_length}字):
{text}
摘要:
"""
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "你是一个专业的文本摘要助手。"},
{"role": "user", "content": prompt}
],
temperature=0.5,
max_tokens=500
)
return response.choices[0].message.content
# 测试
if __name__ == "__main__":
long_text = """
人工智能(AI)正在改变我们的世界。从医疗诊断到自动驾驶,
从智能客服到内容创作,AI的应用无处不在。大语言模型的出现
更是开启了AI应用的新纪元。这些模型能够理解和生成自然语言,
使得人机交互变得更加自然和高效。然而,AI的发展也带来了
一些挑战,包括数据隐私、算法偏见和就业影响等问题。
我们需要在推动技术进步的同时,也要关注这些重要的社会议题。
"""
# 不同风格的摘要
summary1 = summarize_text(long_text, style="concise", max_length=50)
print("简洁摘要:", summary1)
summary2 = summarize_text(long_text, style="bullet_points")
print("\n要点摘要:", summary2)
📊 提示工程最佳实践
✅ DO(应该做的)
- 明确具体:提供清晰、具体的指令
- 提供上下文:给出足够的背景信息
- 使用分隔符:用
"""或###分隔不同部分 - 指定输出格式:明确期望的输出结构
- 迭代优化:根据结果不断调整 Prompt
- 添加示例:使用 Few-shot Learning
- 分步思考:使用 CoT 处理复杂问题
❌ DON'T(不应该做的)
- 模糊指令:避免含糊不清的要求
- 过度复杂:Prompt 太长反而降低效果
- 假设知识:不要假设模型知道你的私有信息
- 忽略测试:未经测试就用于生产
- 暴露敏感信息:不要在 Prompt 中包含密钥或私密数据
✅ 阶段完成检查清单
- [ ] 理解 Temperature、Max Tokens、Top P 等参数的作用
- [ ] 掌握 Prompt 的基本结构(角色、任务、格式等)
- [ ] 能够使用 Few-Shot Learning 引导模型
- [ ] 理解并实践 Chain of Thought (CoT) 技术
- [ ] 了解 ReAct 模式的基本原理
- [ ] 完成至少 2 个实践项目(问答/提取/摘要)
- [ ] 能够设计结构化输出的 Prompt
- [ ] 学会通过迭代优化 Prompt 效果
🎯 下一步
完成本阶段后,进入 阶段 2:工具调用与函数式 Agent,学习如何让 LLM 调用外部工具和 API。
💡 小贴士:Prompt 工程是一门艺术,也是一门科学。好的 Prompt 往往需要多次迭代。建议建立自己的 Prompt 模板库,积累常用模式。