11-Prompt Engineering完全指南
引言
Prompt Engineering(提示工程)是与大语言模型交互的核心技能。一个好的prompt能让模型准确理解任务、生成高质量输出,而差的prompt则会导致混乱、错误或无关的回答。本章将系统介绍Prompt设计的原则、技巧和最佳实践,包含50+实用模板和完整代码示例。
1. Prompt基础
1.1 什么是Prompt
定义:
Prompt是发送给语言模型的输入文本,用于指导模型生成期望的输出。
组成部分:
Prompt = 指令(Instruction) + 上下文(Context) + 输入(Input) + 输出格式(Output Format)
示例:
# 简单prompt
prompt = "翻译成英文:你好"
# 复杂prompt
prompt = """
任务:将中文翻译成英文
要求:
- 保持原意
- 使用正式语气
- 如果有多种翻译,选择最常用的
输入:你好
输出:
"""
1.2 Prompt的类型
1. Zero-shot Prompt
不提供任何示例,直接描述任务。
# Zero-shot示例
prompt = """
将以下句子分类为积极、消极或中性:
句子:这部电影真不错!
分类:
"""
# 使用OpenAI API
import openai
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "user", "content": prompt}
]
)
print(response.choices[0].message.content)
# 输出:积极
2. One-shot Prompt
提供一个示例。
# One-shot示例
prompt = """
将句子分类为积极、消极或中性。
示例:
句子:这部电影真精彩!
分类:积极
现在分类这个:
句子:这部电影一般般。
分类:
"""
3. Few-shot Prompt
提供多个示例。
# Few-shot示例
prompt = """
将句子分类为积极、消极或中性。
句子:这部电影真精彩!
分类:积极
句子:这部电影太无聊了。
分类:消极
句子:这部电影还可以。
分类:中性
句子:这是我看过最好的电影!
分类:
"""
效果对比:
def compare_shot_types():
"""对比不同shot类型的效果"""
# 测试任务:实体识别
test_text = "苹果公司的CEO蒂姆·库克昨天访问了中国。"
# Zero-shot
zero_shot = f"""
从文本中提取所有实体(人名、地名、组织名)。
文本:{test_text}
实体:
"""
# Few-shot
few_shot = f"""
从文本中提取所有实体(人名、地名、组织名)。
示例1:
文本:微软的创始人比尔·盖茨访问了印度。
实体:微软(组织)、比尔·盖茨(人名)、印度(地名)
示例2:
文本:特斯拉在上海建立了新工厂。
实体:特斯拉(组织)、上海(地名)
现在提取:
文本:{test_text}
实体:
"""
# 测试(这里只是演示,实际需要调用API)
prompts = {
'Zero-shot': zero_shot,
'Few-shot': few_shot,
}
return prompts
# 示例
prompts = compare_shot_types()
for name, prompt in prompts.items():
print(f"=== {name} ===")
print(prompt)
print()
选择建议:
- Zero-shot:简单任务、模型能力强
- Few-shot:复杂任务、需要特定格式、提高准确率
1.3 Prompt的结构
标准结构
def create_structured_prompt(
task_description,
context=None,
examples=None,
input_data=None,
output_format=None,
constraints=None,
):
"""
创建结构化prompt
Args:
task_description: 任务描述
context: 背景信息
examples: 示例列表
input_data: 输入数据
output_format: 输出格式说明
constraints: 约束条件
Returns:
完整的prompt
"""
parts = []
# 1. 任务描述
parts.append(f"任务:{task_description}")
# 2. 背景信息
if context:
parts.append(f"\n背景:\n{context}")
# 3. 约束条件
if constraints:
parts.append("\n要求:")
for constraint in constraints:
parts.append(f"- {constraint}")
# 4. 示例
if examples:
parts.append("\n示例:")
for i, example in enumerate(examples, 1):
parts.append(f"\n示例{i}:")
parts.append(f"输入:{example['input']}")
parts.append(f"输出:{example['output']}")
# 5. 输出格式
if output_format:
parts.append(f"\n输出格式:\n{output_format}")
# 6. 实际输入
if input_data:
parts.append(f"\n输入:\n{input_data}")
parts.append("\n输出:")
return '\n'.join(parts)
# 使用示例
prompt = create_structured_prompt(
task_description="文本摘要",
context="为新闻文章生成简洁的摘要",
constraints=[
"摘要长度不超过50字",
"保留关键信息",
"使用客观语气",
],
examples=[
{
'input': "北京时间今天上午,美国宇航局宣布发现了一颗类地行星...",
'output': "美国宇航局发现类地行星,位于宜居带内。"
}
],
output_format="一句话摘要",
input_data="今天,OpenAI发布了最新的GPT-5模型,该模型在多个基准测试中创造了新纪录..."
)
print(prompt)
2. Prompt设计原则
2.1 清晰性原则
**原则:**明确、具体地描述任务。
差的示例:
# 模糊不清
prompt = "分析这段文本"
好的示例:
# 清晰明确
prompt = """
分析以下产品评论的情感倾向(积极/消极/中性),
并提取关键优点和缺点。
评论:{review_text}
输出格式:
情感:[积极/消极/中性]
优点:[列出要点]
缺点:[列出要点]
"""
实践技巧:
def make_prompt_clear(vague_prompt, specifics):
"""
将模糊prompt改进为清晰prompt
Args:
vague_prompt: 模糊的prompt
specifics: 具体化要素
Returns:
清晰的prompt
"""
clear_prompt = vague_prompt
# 添加具体任务
if 'task' in specifics:
clear_prompt += f"\n\n具体任务:{specifics['task']}"
# 添加输出格式
if 'format' in specifics:
clear_prompt += f"\n\n输出格式:{specifics['format']}"
# 添加约束
if 'constraints' in specifics:
clear_prompt += "\n\n要求:"
for c in specifics['constraints']:
clear_prompt += f"\n- {c}"
return clear_prompt
# 示例
vague = "总结这篇文章"
clear = make_prompt_clear(vague, {
'task': '为文章生成3个要点的摘要',
'format': '使用项目符号列表',
'constraints': [
'每个要点不超过20字',
'保持客观中立',
'突出主要论点',
]
})
print("模糊prompt:", vague)
print("\n清晰prompt:", clear)
2.2 具体性原则
**原则:**提供具体的指导和示例。
# 不具体
prompt = "写一篇关于AI的文章"
# 具体
prompt = """
写一篇800字的文章,介绍AI在医疗领域的应用。
要求:
1. 结构:引言、应用场景(3个)、挑战、展望
2. 应用场景:诊断辅助、药物发现、个性化治疗
3. 包含具体案例
4. 目标读者:医疗从业者
5. 语气:专业但易懂
"""
具体化检查清单:
def check_prompt_specificity(prompt):
"""
检查prompt的具体性
Returns:
检查结果和建议
"""
checks = {
'是否指定任务类型': False,
'是否说明输出长度': False,
'是否定义输出格式': False,
'是否提供示例': False,
'是否说明目标受众': False,
'是否指定语气/风格': False,
}
suggestions = []
# 检查任务类型
task_keywords = ['翻译', '摘要', '分类', '生成', '分析', '提取']
if any(kw in prompt for kw in task_keywords):
checks['是否指定任务类型'] = True
else:
suggestions.append("添加明确的任务类型(如:翻译、摘要等)")
# 检查输出长度
length_keywords = ['字', '词', '句', '段落', '行']
if any(kw in prompt for kw in length_keywords):
checks['是否说明输出长度'] = True
else:
suggestions.append("指定期望的输出长度")
# 检查输出格式
format_keywords = ['格式', 'JSON', 'Markdown', '列表', '表格']
if any(kw in prompt for kw in format_keywords):
checks['是否定义输出格式'] = True
else:
suggestions.append("定义输出格式(如:列表、JSON等)")
# 检查示例
if '示例' in prompt or '例如' in prompt:
checks['是否提供示例'] = True
else:
suggestions.append("提供具体示例")
# 检查目标受众
audience_keywords = ['读者', '用户', '受众', '专业人士', '初学者']
if any(kw in prompt for kw in audience_keywords):
checks['是否说明目标受众'] = True
else:
suggestions.append("说明目标受众")
# 检查语气
tone_keywords = ['语气', '风格', '正式', '专业', '友好', '简洁']
if any(kw in prompt for kw in tone_keywords):
checks['是否指定语气/风格'] = True
else:
suggestions.append("指定期望的语气或风格")
return {
'checks': checks,
'score': sum(checks.values()) / len(checks),
'suggestions': suggestions,
}
# 测试
test_prompts = [
"总结这篇文章",
"为以下文章生成200字的摘要,使用客观语气,面向普通读者",
]
for prompt in test_prompts:
result = check_prompt_specificity(prompt)
print(f"Prompt: {prompt}")
print(f"具体性评分: {result['score']:.0%}")
print(f"建议: {', '.join(result['suggestions'])}")
print()
2.3 上下文原则
**原则:**提供必要的背景信息。
# 缺乏上下文
prompt = "这个决定好吗?"
# 提供上下文
prompt = """
背景:
你是一位职业咨询顾问。客户是一名有5年经验的软件工程师,
目前年薪50万,收到两个offer:
- A公司:创业公司,年薪80万,股票期权,工作强度大
- B公司:大厂,年薪65万,稳定,朝九晚五
客户个人情况:
- 已婚,有一个2岁的孩子
- 希望职业发展,但也重视家庭
- 风险承受能力中等
问题:客户应该选择哪个offer?
请分析利弊并给出建议。
"""
上下文模板:
class ContextBuilder:
"""上下文构建器"""
def __init__(self):
self.context = {}
def set_role(self, role):
"""设置AI角色"""
self.context['role'] = role
return self
def set_background(self, background):
"""设置背景信息"""
self.context['background'] = background
return self
def set_constraints(self, constraints):
"""设置约束条件"""
self.context['constraints'] = constraints
return self
def set_goal(self, goal):
"""设置目标"""
self.context['goal'] = goal
return self
def build(self, task):
"""构建完整prompt"""
parts = []
if 'role' in self.context:
parts.append(f"角色:{self.context['role']}")
if 'background' in self.context:
parts.append(f"\n背景:\n{self.context['background']}")
if 'goal' in self.context:
parts.append(f"\n目标:{self.context['goal']}")
if 'constraints' in self.context:
parts.append("\n约束:")
for c in self.context['constraints']:
parts.append(f"- {c}")
parts.append(f"\n任务:\n{task}")
return '\n'.join(parts)
# 使用示例
builder = ContextBuilder()
prompt = builder \
.set_role("专业的财务顾问") \
.set_background("客户是一名30岁的工程师,月收入3万,有20万存款") \
.set_goal("帮助客户规划投资,实现财务自由") \
.set_constraints([
"风险偏好:保守",
"投资期限:10年",
"不投资加密货币",
]) \
.build("制定一个投资组合方案")
print(prompt)
2.4 格式控制原则
**原则:**明确指定输出格式。
JSON格式
# JSON输出
json_prompt = """
从文本中提取人名、地名和组织名。
文本:{text}
输出格式(JSON):
{{
"persons": ["人名1", "人名2"],
"locations": ["地名1", "地名2"],
"organizations": ["组织名1", "组织名2"]
}}
"""
# 使用
import json
def extract_entities(text, model="gpt-4"):
"""提取实体(JSON格式)"""
prompt = json_prompt.format(text=text)
# 调用API(示例)
# response = call_llm(prompt, model)
# entities = json.loads(response)
# 模拟返回
return {
"persons": ["张三", "李四"],
"locations": ["北京", "上海"],
"organizations": ["阿里巴巴", "腾讯"]
}
# 测试
text = "张三在北京的阿里巴巴工作,李四在上海的腾讯。"
entities = extract_entities(text)
print(json.dumps(entities, ensure_ascii=False, indent=2))
Markdown格式
# Markdown输出
markdown_prompt = """
为产品写一篇评测文章。
产品:{product_name}
输出格式(Markdown):
# 产品名称
## 概述
[简短介绍]
## 优点
- 优点1
- 优点2
## 缺点
- 缺点1
- 缺点2
## 评分
[1-10分]
"""
结构化表格
# 表格格式
table_prompt = """
比较以下编程语言的特点。
语言:Python, Java, JavaScript
输出格式(Markdown表格):
| 语言 | 类型 | 主要用途 | 难度 | 性能 |
|------|------|----------|------|------|
| ... | ... | ... | ... | ... |
"""
格式验证:
def validate_output_format(output, expected_format):
"""
验证输出格式
Args:
output: 模型输出
expected_format: 期望格式('json', 'markdown', 'csv')
Returns:
是否符合格式
"""
try:
if expected_format == 'json':
json.loads(output)
return True
elif expected_format == 'markdown':
# 检查Markdown标记
has_headers = '#' in output
return has_headers
elif expected_format == 'csv':
# 检查CSV格式
lines = output.strip().split('\n')
if len(lines) < 2:
return False
# 检查列数一致
n_cols = len(lines[0].split(','))
return all(len(line.split(',')) == n_cols for line in lines)
else:
return False
except Exception:
return False
# 测试
outputs = {
'json': '{"name": "test", "value": 123}',
'markdown': '# Title\n## Section\nContent',
'csv': 'name,age\nAlice,30\nBob,25',
}
for format_type, output in outputs.items():
is_valid = validate_output_format(output, format_type)
print(f"{format_type}: {'' if is_valid else '✗'}")
2.5 迭代优化原则
**原则:**通过测试和反馈不断改进prompt。
class PromptOptimizer:
"""Prompt优化器"""
def __init__(self):
self.history = []
def test_prompt(self, prompt, test_cases, llm_func):
"""
测试prompt
Args:
prompt: 要测试的prompt
test_cases: 测试用例列表
llm_func: LLM调用函数
Returns:
测试结果
"""
results = []
for case in test_cases:
# 填充prompt
filled_prompt = prompt.format(**case['input'])
# 调用LLM
output = llm_func(filled_prompt)
# 评估
is_correct = output.strip() == case['expected'].strip()
results.append({
'input': case['input'],
'expected': case['expected'],
'actual': output,
'correct': is_correct,
})
# 计算准确率
accuracy = sum(r['correct'] for r in results) / len(results)
# 记录历史
self.history.append({
'prompt': prompt,
'accuracy': accuracy,
'results': results,
})
return {
'accuracy': accuracy,
'results': results,
}
def suggest_improvements(self, results):
"""根据结果建议改进"""
suggestions = []
# 分析失败案例
failed_cases = [r for r in results if not r['correct']]
if not failed_cases:
return ["Prompt表现完美!"]
# 常见问题模式
if len(failed_cases) > len(results) / 2:
suggestions.append("准确率过低,考虑添加更多示例(few-shot)")
# 检查是否格式问题
format_issues = sum(
1 for r in failed_cases
if type(r['actual']) != type(r['expected'])
)
if format_issues > 0:
suggestions.append("添加明确的输出格式说明")
# 检查是否理解问题
suggestions.append("为失败案例添加针对性的示例")
return suggestions
def get_best_prompt(self):
"""获取历史最佳prompt"""
if not self.history:
return None
return max(self.history, key=lambda h: h['accuracy'])
# 使用示例
def mock_llm(prompt):
"""模拟LLM调用"""
# 简单的规则模拟
if '积极' in prompt or '好' in prompt or '棒' in prompt:
return "积极"
elif '消极' in prompt or '差' in prompt or '糟' in prompt:
return "消极"
else:
return "中性"
optimizer = PromptOptimizer()
# 测试用例
test_cases = [
{
'input': {'text': '这部电影真好看!'},
'expected': '积极'
},
{
'input': {'text': '太糟糕了。'},
'expected': '消极'
},
{
'input': {'text': '还可以吧。'},
'expected': '中性'
},
]
# 版本1:简单prompt
prompt_v1 = "文本:{text}\n情感:"
results_v1 = optimizer.test_prompt(prompt_v1, test_cases, mock_llm)
print(f"版本1准确率: {results_v1['accuracy']:.0%}")
suggestions = optimizer.suggest_improvements(results_v1['results'])
print("改进建议:")
for s in suggestions:
print(f"- {s}")
# 版本2:改进后的prompt
prompt_v2 = """
分类文本的情感为:积极、消极或中性。
文本:{text}
情感:
"""
results_v2 = optimizer.test_prompt(prompt_v2, test_cases, mock_llm)
print(f"\n版本2准确率: {results_v2['accuracy']:.0%}")
# 获取最佳prompt
best = optimizer.get_best_prompt()
print(f"\n最佳prompt (准确率{best['accuracy']:.0%}):")
print(best['prompt'])
3. 高级Prompt技巧
3.1 Chain of Thought (CoT)
**原理:**引导模型展示推理过程。
# 不使用CoT
simple_prompt = """
问题:一个数字是12的倍数,也是15的倍数,这个数字最小是多少?
答案:
"""
# 使用CoT
cot_prompt = """
问题:一个数字是12的倍数,也是15的倍数,这个数字最小是多少?
让我们一步步思考:
1. 首先,找出12和15的质因数分解
2. 然后,找出它们的最小公倍数
3. 最后,给出答案
解答:
"""
# CoT with examples (Few-shot CoT)
few_shot_cot = """
问题:一个数字是6的倍数,也是8的倍数,这个数字最小是多少?
解答:
让我们一步步思考:
1. 6 = 2 × 3
2. 8 = 2³
3. 最小公倍数 = 2³ × 3 = 24
答案:24
问题:一个数字是12的倍数,也是15的倍数,这个数字最小是多少?
解答:
让我们一步步思考:
"""
自动CoT生成:
def add_chain_of_thought(problem, domain='math'):
"""
为问题添加思维链提示
Args:
problem: 问题描述
domain: 领域(math, logic, coding等)
Returns:
添加CoT的prompt
"""
cot_templates = {
'math': "让我们一步步解决这个数学问题:\n1. 理解问题\n2. 列出已知条件\n3. 选择合适的方法\n4. 计算\n5. 验证答案",
'logic': "让我们逻辑地分析这个问题:\n1. 列出所有前提\n2. 识别逻辑关系\n3. 推导结论\n4. 检查推理是否有效",
'coding': "让我们一步步设计这个程序:\n1. 理解需求\n2. 分解问题\n3. 设计算法\n4. 编写代码\n5. 测试验证",
'general': "让我们系统地思考这个问题:\n1. 分析问题\n2. 收集信息\n3. 制定方案\n4. 执行\n5. 总结",
}
template = cot_templates.get(domain, cot_templates['general'])
return f"{problem}\n\n{template}\n\n解答:"
# 使用示例
problems = [
("计算 15 + 28 × 3", "math"),
("如果所有A是B,所有B是C,那么所有A是C吗?", "logic"),
("写一个函数判断回文字符串", "coding"),
]
for problem, domain in problems:
prompt = add_chain_of_thought(problem, domain)
print(f"=== {domain.upper()} ===")
print(prompt)
print()
3.2 Self-Consistency
**原理:**多次采样,选择最一致的答案。
def self_consistency(
prompt,
llm_func,
n_samples=5,
temperature=0.7,
):
"""
Self-Consistency采样
Args:
prompt: 输入prompt
llm_func: LLM调用函数
n_samples: 采样次数
temperature: 温度参数
Returns:
最一致的答案
"""
from collections import Counter
# 多次采样
responses = []
for _ in range(n_samples):
response = llm_func(prompt, temperature=temperature)
responses.append(response.strip())
# 统计频率
counter = Counter(responses)
# 返回最常见的答案
most_common = counter.most_common(1)[0]
return {
'answer': most_common[0],
'confidence': most_common[1] / n_samples,
'all_responses': responses,
'distribution': dict(counter),
}
# 模拟示例
def mock_llm_with_variance(prompt, temperature=0.7):
"""模拟有方差的LLM输出"""
import random
# 模拟:80%概率正确答案,20%其他答案
if random.random() < 0.8:
return "60"
else:
return random.choice(["61", "59", "62"])
# 使用
prompt = """
问题:一个数字是12的倍数,也是15的倍数,这个数字最小是多少?
让我们一步步思考:
1. 12 = 2² × 3
2. 15 = 3 × 5
3. LCM = 2² × 3 × 5 = 60
答案:
"""
result = self_consistency(prompt, mock_llm_with_variance, n_samples=10)
print(f"最终答案: {result['answer']}")
print(f"置信度: {result['confidence']:.0%}")
print(f"所有答案: {result['all_responses']}")
print(f"分布: {result['distribution']}")
3.3 Tree of Thoughts (ToT)
**原理:**探索多个推理路径,选择最优解。
class TreeOfThoughts:
"""思维树"""
def __init__(self, llm_func):
self.llm_func = llm_func
self.tree = {}
def generate_thoughts(self, problem, parent_id=None, n_thoughts=3):
"""
生成思路
Args:
problem: 问题
parent_id: 父节点ID
n_thoughts: 生成思路数量
Returns:
思路列表
"""
prompt = f"""
问题:{problem}
请生成{n_thoughts}个不同的解题思路(仅列出思路,不需要完整解答):
思路1:
思路2:
思路3:
"""
response = self.llm_func(prompt)
# 解析思路
thoughts = []
lines = response.strip().split('\n')
for line in lines:
if line.strip().startswith('思路'):
thought = line.split(':', 1)[1].strip()
thoughts.append(thought)
return thoughts
def evaluate_thought(self, thought, problem):
"""
评估思路质量
Args:
thought: 思路
problem: 原问题
Returns:
评分(0-10)
"""
prompt = f"""
问题:{problem}
思路:{thought}
请评估这个思路的质量(0-10分),考虑:
- 是否正确
- 是否高效
- 是否完整
仅输出分数(0-10):
"""
response = self.llm_func(prompt)
try:
score = float(response.strip())
return min(max(score, 0), 10)
except:
return 5.0 # 默认中等分数
def solve_with_thought(self, thought, problem):
"""
使用特定思路解决问题
Args:
thought: 选定的思路
problem: 问题
Returns:
完整解答
"""
prompt = f"""
问题:{problem}
采用以下思路解决:
{thought}
请给出完整的解答过程和最终答案:
"""
return self.llm_func(prompt)
def solve(self, problem, max_depth=2):
"""
使用ToT解决问题
Args:
problem: 问题
max_depth: 最大深度
Returns:
最佳解答
"""
# 生成初始思路
thoughts = self.generate_thoughts(problem)
# 评估每个思路
evaluated = []
for thought in thoughts:
score = self.evaluate_thought(thought, problem)
evaluated.append({
'thought': thought,
'score': score,
})
# 选择最佳思路
best_thought = max(evaluated, key=lambda x: x['score'])
print(f"选择的思路(评分{best_thought['score']}):")
print(best_thought['thought'])
print()
# 使用最佳思路求解
solution = self.solve_with_thought(best_thought['thought'], problem)
return {
'solution': solution,
'best_thought': best_thought,
'all_thoughts': evaluated,
}
# 模拟使用
def mock_llm_tot(prompt):
"""模拟ToT的LLM"""
if '生成' in prompt and '思路' in prompt:
return """
思路1:直接暴力枚举所有可能
思路2:使用动态规划优化
思路3:数学公式直接计算
"""
elif '评估' in prompt:
# 给数学公式最高分
if '数学公式' in prompt:
return "9"
elif '动态规划' in prompt:
return "7"
else:
return "5"
else:
return "使用数学公式:LCM(12, 15) = 60"
# 使用ToT
tot = TreeOfThoughts(mock_llm_tot)
problem = "一个数字是12的倍数,也是15的倍数,这个数字最小是多少?"
result = tot.solve(problem)
print("最终解答:")
print(result['solution'])
3.4 ReAct (Reasoning + Acting)
**原理:**结合推理和行动,适合需要外部工具的任务。
class ReActAgent:
"""ReAct智能体"""
def __init__(self, llm_func, tools):
"""
Args:
llm_func: LLM调用函数
tools: 可用工具字典
"""
self.llm_func = llm_func
self.tools = tools
self.history = []
def think(self, question, max_steps=5):
"""
使用ReAct模式思考
Args:
question: 问题
max_steps: 最大步数
Returns:
最终答案
"""
prompt_template = """
问题:{question}
你可以使用以下工具:
{tools_desc}
请使用以下格式:
思考:[你的推理]
行动:[工具名称]
行动输入:[工具输入]
观察:[工具输出]
... (重复思考/行动/观察)
思考:我现在知道最终答案了
最终答案:[答案]
开始!
问题:{question}
{history}
"""
tools_desc = '\n'.join([
f"- {name}: {tool['description']}"
for name, tool in self.tools.items()
])
for step in range(max_steps):
# 构建提示
history_text = '\n'.join(self.history)
prompt = prompt_template.format(
question=question,
tools_desc=tools_desc,
history=history_text,
)
# LLM推理
response = self.llm_func(prompt)
# 解析响应
if '最终答案:' in response:
# 找到答案
answer = response.split('最终答案:')[1].strip()
return {
'answer': answer,
'steps': self.history,
}
# 解析行动
if '行动:' in response and '行动输入:' in response:
action = response.split('行动:')[1].split('\n')[0].strip()
action_input = response.split('行动输入:')[1].split('\n')[0].strip()
# 执行工具
if action in self.tools:
observation = self.tools[action]['func'](action_input)
# 记录历史
self.history.append(f"思考:{response.split('思考:')[1].split('行动:')[0].strip()}")
self.history.append(f"行动:{action}")
self.history.append(f"行动输入:{action_input}")
self.history.append(f"观察:{observation}")
else:
self.history.append(f"错误:工具 {action} 不存在")
return {
'answer': "无法在限定步数内找到答案",
'steps': self.history,
}
# 定义工具
def calculator(expression):
"""计算器工具"""
try:
result = eval(expression)
return str(result)
except Exception as e:
return f"计算错误:{e}"
def search(query):
"""搜索工具(模拟)"""
# 模拟搜索结果
mock_db = {
"中国人口": "14.1亿(2021年)",
"美国人口": "3.3亿(2021年)",
"印度人口": "13.8亿(2021年)",
}
for key, value in mock_db.items():
if key in query:
return value
return "未找到相关信息"
# 工具配置
tools = {
'Calculator': {
'description': '执行数学计算,输入为Python表达式',
'func': calculator,
},
'Search': {
'description': '搜索信息,输入为查询关键词',
'func': search,
},
}
# 模拟LLM
def mock_llm_react(prompt):
"""模拟ReAct的LLM"""
if '中国和美国的人口' in prompt:
if '观察' not in prompt:
return """
思考:我需要分别查询中国和美国的人口数据
行动:Search
行动输入:中国人口
"""
elif prompt.count('观察') == 1:
return """
思考:我已经知道了中国的人口,现在需要查询美国的人口
行动:Search
行动输入:美国人口
"""
elif prompt.count('观察') == 2:
return """
思考:我已经有了两国的人口数据,现在可以计算差值
行动:Calculator
行动输入:14.1 - 3.3
"""
else:
return """
思考:我现在知道最终答案了
最终答案:中国人口约14.1亿,美国人口约3.3亿,相差约10.8亿。
"""
return "思考:无法回答这个问题"
# 使用ReAct
agent = ReActAgent(mock_llm_react, tools)
question = "中国和美国的人口相差多少?"
result = agent.think(question)
print("问题:", question)
print("\n推理过程:")
for step in result['steps']:
print(step)
print("\n最终答案:", result['answer'])
3.5 Prompt Chaining
**原理:**将复杂任务分解为多个简单步骤。
class PromptChain:
"""Prompt链"""
def __init__(self, llm_func):
self.llm_func = llm_func
self.steps = []
def add_step(self, name, prompt_template, output_key):
"""
添加步骤
Args:
name: 步骤名称
prompt_template: Prompt模板(可以使用前序步骤的输出)
output_key: 输出变量名
"""
self.steps.append({
'name': name,
'prompt_template': prompt_template,
'output_key': output_key,
})
return self
def run(self, initial_input):
"""
运行链
Args:
initial_input: 初始输入
Returns:
所有步骤的输出
"""
context = {'input': initial_input}
for step in self.steps:
print(f"执行步骤: {step['name']}")
# 填充模板
prompt = step['prompt_template'].format(**context)
# 调用LLM
output = self.llm_func(prompt)
# 保存输出
context[step['output_key']] = output.strip()
print(f"输出: {output[:100]}...\n")
return context文章生成链
def create_article_chain(llm_func):
"""创建文章生成链"""
chain = PromptChain(llm_func)
# 步骤1:生成大纲
chain.add_step(
name="生成大纲",
prompt_template="""
为以下主题生成文章大纲:
主题:{input}
要求:
- 3-5个主要章节
- 每个章节2-3个子要点
大纲:
""",
output_key="outline"
)
# 步骤2:扩展第一章节
chain.add_step(
name="写第一章节",
prompt_template="""
根据以下大纲,详细写第一章节的内容:
大纲:
{outline}
第一章节内容(300字):
""",
output_key="section1"
)
# 步骤3:写引言
chain.add_step(
name="写引言",
prompt_template="""
为文章写一个引人入胜的引言:
主题:{input}
大纲:{outline}
第一章节:{section1}
引言(100字):
""",
output_key="intro"
)
# 步骤4:写总结
chain.add_step(
name="写总结",
prompt_template="""
为文章写总结:
主题:{input}
大纲:{outline}
总结(100字):
""",
output_key="conclusion"
)
return chain
# 模拟LLM
def mock_llm_chain(prompt):
"""模拟链式LLM"""
if '生成文章大纲' in prompt or '生成大纲' in prompt:
return """
1. AI的定义和历史
- 什么是AI
- AI的发展历程
- 重要里程碑
2. AI的主要技术
- 机器学习
- 深度学习
- 自然语言处理
3. AI的应用
- 医疗健康
- 金融科技
- 自动驾驶
"""
elif '第一章节' in prompt:
return """
人工智能(AI)是指由机器展现出的智能行为。自1950年代诞生以来,AI经历了多次起伏。
图灵测试的提出标志着AI研究的开始,随后专家系统、机器学习、深度学习相继出现。
近年来,深度学习的突破使AI在图像识别、语音识别等领域超越人类水平。
"""
elif '引言' in prompt:
return """
人工智能正在改变世界。从智能手机到自动驾驶,AI技术已经渗透到我们生活的方方面面。
本文将全面介绍AI的发展历史、核心技术和实际应用,帮助读者理解这个正在塑造未来的技术。
"""
elif '总结' in prompt:
return """
AI技术正处于快速发展阶段,它带来了巨大机遇也伴随着挑战。
理解AI的原理和应用,对于把握未来发展方向至关重要。
让我们拥抱AI,共同创造更美好的未来。
"""
return "生成的内容..."
# 使用链
chain = create_article_chain(mock_llm_chain)
result = chain.run("人工智能的发展和应用")
print("=" * 50)
print("最终结果:")
print("\n引言:")
print(result['intro'])
print("\n第一章节:")
print(result['section1'])
print("\n总结:")
print(result['conclusion'])
4. 50+实用Prompt模板
4.1 内容生成类
1. 文章写作
ARTICLE_TEMPLATE = """
写一篇关于【{topic}】的文章。
要求:
- 字数:{word_count}字
- 目标读者:{audience}
- 语气:{tone}
- 结构:{structure}
文章:
"""
# 使用示例
prompt = ARTICLE_TEMPLATE.format(
topic="量子计算的未来",
word_count=1000,
audience="科技爱好者",
tone="专业但通俗易懂",
structure="引言、现状、挑战、展望、总结"
)
2. 博客文章
BLOG_POST_TEMPLATE = """
写一篇博客文章:
标题:{title}
关键词:{keywords}
目标:{goal}
要求:
- SEO优化(包含关键词)
- 吸引眼球的开头
- 结构清晰(使用小标题)
- 包含实用建议
- 以号召行动结尾
博客内容:
"""
3. 社交媒体文案
SOCIAL_MEDIA_TEMPLATE = """
为【{platform}】平台创作一条帖子:
主题:{topic}
目标:{goal}
字数限制:{max_chars}字符
语气:{tone}
要求:
- 吸引注意力
- 包含话题标签
- 鼓励互动
- {platform_specific}
文案:
"""Twitter
twitter_prompt = SOCIAL_MEDIA_TEMPLATE.format(
platform="Twitter",
topic="新产品发布",
goal="增加关注和转发",
max_chars=280,
tone="兴奋、友好",
platform_specific="使用emoji,创建话题标签"
)
4. 产品描述
PRODUCT_DESCRIPTION_TEMPLATE = """
为以下产品撰写吸引人的描述:
产品名称:{product_name}
产品类型:{product_type}
目标客户:{target_audience}
主要特点:
{features}
要求:
- 突出独特卖点
- 强调客户利益
- 包含规格参数
- 以购买号召结尾
产品描述:
"""
5. 邮件撰写
EMAIL_TEMPLATE = """
撰写一封【{email_type}】邮件:
收件人:{recipient}
目的:{purpose}
语气:{tone}
关键信息:
{key_points}
要求:
- 主题行醒目
- 开头有礼貌
- 正文简洁明了
- 结尾得体
- 包含明确的行动呼吁
邮件:
"""商务邮件
business_email = EMAIL_TEMPLATE.format(
email_type="商务合作提案",
recipient="潜在客户",
purpose="提出合作方案",
tone="专业、友好",
key_points="- 介绍我们的服务\n- 说明合作价值\n- 提议会面讨论"
)
4.2 内容分析类
6. 情感分析
SENTIMENT_ANALYSIS_TEMPLATE = """
分析以下文本的情感倾向:
文本:{text}
请提供:
1. 总体情感:积极/消极/中性
2. 情感强度:1-10分
3. 情感词汇:列出关键的情感表达词
4. 细粒度情感:喜悦/悲伤/愤怒/恐惧/惊讶等
输出格式(JSON):
{{
"overall": "积极/消极/中性",
"intensity": 0-10,
"keywords": ["词1", "词2"],
"emotions": {{"喜悦": 0.8, "悲伤": 0.1}}
}}
"""
7. 文本摘要
SUMMARIZATION_TEMPLATE = """
为以下文本生成摘要:
文本:
{text}
要求:
- 长度:{summary_length}字
- 类型:{summary_type}
- 保留:{key_points}
摘要:
"""
# 类型:
# - extractive: 抽取式(从原文选句子)
# - abstractive: 生成式(重新组织)
# - bullet_points: 要点列表
8. 关键词提取
KEYWORD_EXTRACTION_TEMPLATE = """
从以下文本中提取关键词:
文本:{text}
要求:
- 提取{num_keywords}个关键词
- 按重要性排序
- 包含词性标注
- 给出相关性分数(0-1)
输出格式(JSON):
{{
"keywords": [
{{"word": "关键词1", "pos": "名词", "score": 0.95}},
{{"word": "关键词2", "pos": "动词", "score": 0.88}}
]
}}
"""
9. 实体识别
NER_TEMPLATE = """
从文本中识别并提取所有命名实体:
文本:{text}
实体类型:
- PERSON: 人名
- ORG: 组织/公司名
- LOC: 地名
- DATE: 日期
- MONEY: 金额
- PRODUCT: 产品名
输出格式(JSON):
{{
"entities": [
{{"text": "实体文本", "type": "类型", "start": 0, "end": 5}}
]
}}
"""
10. 文本分类
TEXT_CLASSIFICATION_TEMPLATE = """
将以下文本分类到最合适的类别:
文本:{text}
可选类别:
{categories}
输出:
- 主要类别:[类别名]
- 置信度:[0-1]
- 理由:[简短说明]
{examples}
分类:
"""
4.3 代码相关类
11. 代码生成
CODE_GENERATION_TEMPLATE = """
编写一个{language}程序:
功能:{functionality}
要求:
{requirements}
请提供:
1. 完整代码
2. 代码注释
3. 使用示例
4. 时间复杂度分析
代码:
```{language}
"""
12. 代码解释
CODE_EXPLANATION_TEMPLATE = """
解释以下代码的功能和原理:
```{language}
{code}
请说明:
- 代码的整体功能
- 主要步骤(逐行或逐块解释)
- 使用的算法/数据结构
- 时间和空间复杂度
- 潜在的改进点
解释: """
#### 13. 代码审查
```python
CODE_REVIEW_TEMPLATE = """
审查以下代码:
```{language}
{code}
审查维度:
- 正确性:是否有bug
- 性能:是否可以优化
- 可读性:命名、注释、结构
- 安全性:潜在的安全问题
- 最佳实践:是否符合规范
输出格式:
总体评价
[简短总结]
问题列表
- [严重/中等/轻微] 问题描述
- 位置:第X行
- 建议:如何修复
改进建议
[整体改进建议]
审查: """
#### 14. 代码转换
```python
CODE_CONVERSION_TEMPLATE = """
将以下{source_lang}代码转换为{target_lang}:
原代码:
```{source_lang}
{code}
要求:
- 保持功能完全相同
- 使用目标语言的惯用写法
- 添加注释说明关键转换
- 指出两种语言的主要差异
转换后代码:
"""
15. 调试帮助
DEBUG_HELPER_TEMPLATE = """
帮助调试以下代码:
代码:
```{language}
{code}
错误信息: {error_message}
预期行为: {expected_behavior}
实际行为: {actual_behavior}
请:
- 分析错误原因
- 定位问题代码
- 提供修复方案
- 解释为什么会出现这个错误
分析: """
### 4.4 数据分析类
### 16. 数据洞察
```python
DATA_INSIGHT_TEMPLATE = """
分析以下数据并提供洞察:
数据:
{data}
分析维度:
- 趋势:数据随时间的变化
- 异常:不寻常的数据点
- 相关性:变量之间的关系
- 分布:数据的分布特征
请提供:
1. 主要发现(3-5个要点)
2. 数据可视化建议
3. 进一步分析建议
洞察:
"""
17. SQL查询生成
SQL_GENERATION_TEMPLATE = """
根据需求生成SQL查询:
数据库结构:
{schema}
需求:{requirement}
要求:
- 查询高效
- 包含必要的索引提示
- 添加注释
- 考虑边界情况
SQL:
```sql
"""
18. 数据清洗建议
DATA_CLEANING_TEMPLATE = """
分析数据质量并提供清洗建议:
数据样本:
{data_sample}
数据问题:
{issues}
请提供:
1. 问题诊断:识别数据质量问题
2. 清洗方案:具体的处理步骤
3. Python代码:实现数据清洗
4. 验证方法:如何验证清洗效果
建议:
"""
4.5 教育学习类
19. 概念解释
CONCEPT_EXPLANATION_TEMPLATE = """
解释【{concept}】的概念:
目标受众:{audience}
深度级别:{level}
请包含:
1. 简单定义(一句话)
2. 详细解释(200字)
3. 类比或示例(帮助理解)
4. 实际应用(在哪里会用到)
5. 相关概念(延伸阅读)
解释:
"""
# level: 初学者/中级/高级/专家
20. 学习路径
LEARNING_PATH_TEMPLATE = """
为学习【{topic}】创建学习路径:
当前水平:{current_level}
目标:{goal}
可用时间:{time_available}
请提供:
1. 学习阶段(分为3-5个阶段)
2. 每个阶段的学习内容
3. 推荐资源(书籍、课程、项目)
4. 里程碑和检查点
5. 预计时间分配
学习路径:
"""
21. 练习题生成
EXERCISE_GENERATION_TEMPLATE = """
为【{topic}】生成练习题:
难度:{difficulty}
数量:{num_exercises}
类型:{exercise_types}
对每道题提供:
1. 题目描述
2. 难度标记
3. 参考答案
4. 解题思路
5. 常见错误
练习题:
"""
# exercise_types: 选择题/填空题/编程题/问答题
4.6 创意写作类
22. 故事创作
STORY_CREATION_TEMPLATE = """
创作一个故事:
类型:{genre}
主题:{theme}
长度:{word_count}字
要素:
- 主角:{protagonist}
- 背景:{setting}
- 冲突:{conflict}
要求:
- 情节引人入胜
- 人物性格鲜明
- 有起承转合
- 结局{ending_type}
故事:
"""
# genre: 科幻/奇幻/悬疑/爱情/历史
# ending_type: 圆满/开放/悲剧/反转
23. 诗歌创作
POETRY_TEMPLATE = """
创作一首诗:
主题:{theme}
风格:{style}
形式:{form}
情感:{emotion}
要求:
- 意境优美
- 韵律和谐
- 意象生动
- {special_requirement}
诗歌:
"""
# style: 古典/现代/自由诗
# form: 五言/七言/十四行诗/俳句
24. 广告语创作
SLOGAN_TEMPLATE = """
为产品创作广告语:
产品:{product}
目标客户:{target_audience}
产品特点:{features}
品牌定位:{brand_positioning}
要求:
- 简短有力(不超过{max_words}字)
- 朗朗上口
- 突出卖点
- 易于记忆
- 创意独特
请生成5个备选广告语,并说明每个的创意点。
广告语:
"""
4.7 商业分析类
25. SWOT分析
SWOT_ANALYSIS_TEMPLATE = """
对【{company}】进行SWOT分析:
背景信息:
{context}
请分析:
## 优势(Strengths)
- 内部优势1
- 内部优势2
...
## 劣势(Weaknesses)
- 内部劣势1
- 内部劣势2
...
## 机会(Opportunities)
- 外部机会1
- 外部机会2
...
## 威胁(Threats)
- 外部威胁1
- 外部威胁2
...
## 战略建议
基于SWOT分析的3-5条战略建议
分析:
"""
26. 市场分析
MARKET_ANALYSIS_TEMPLATE = """
分析【{market}】市场:
维度:
1. 市场规模:当前规模和增长趋势
2. 市场细分:主要细分市场
3. 竞争格局:主要玩家和市场份额
4. 客户画像:目标客户特征
5. 趋势预测:未来3-5年趋势
数据来源:{data_sources}
输出格式:
- 执行摘要(200字)
- 详细分析(各维度)
- 可视化建议
- 结论和建议
分析报告:
"""
27. 竞品分析
COMPETITOR_ANALYSIS_TEMPLATE = """
对比分析以下竞品:
我方产品:{our_product}
竞品:{competitors}
对比维度:
- 功能对比
- 定价策略
- 目标客户
- 营销策略
- 优势劣势
- 市场定位
输出格式(Markdown表格):
| 维度 | 我方 | 竞品A | 竞品B |
|------|------|-------|-------|
| ... | ... | ... | ... |
结论:
- 我方差异化优势
- 需要改进的地方
- 应对策略建议
分析:
"""
4.8 翻译本地化类
28. 专业翻译
TRANSLATION_TEMPLATE = """
将以下{source_lang}文本翻译成{target_lang}:
原文:
{text}
领域:{domain}
要求:
- 保持专业术语准确
- 符合目标语言习惯
- 保持原文语气和风格
- 如有歧义,提供多个翻译选项
译文:
"""
# domain: 技术/医学/法律/商务/文学
29. 本地化
LOCALIZATION_TEMPLATE = """
将内容本地化为{target_market}市场:
原内容:
{content}
本地化要求:
- 文化适配:避免文化冲突
- 单位换算:{unit_conversions}
- 日期格式:{date_format}
- 俚语替换:使用本地表达
- 法律合规:符合当地法规
本地化内容:
"""
4.9 问答对话类
30. FAQ生成
FAQ_GENERATION_TEMPLATE = """
为【{topic}】生成常见问题解答(FAQ):
背景:{context}
请生成{num_questions}个常见问题,每个包含:
- 问题(用户的角度)
- 详细答案(50-100字)
- 相关链接或参考
格式:
## 问题1:[问题]
**答案:**[答案]
**参考:**[链接]
FAQ:
"""
31. 客服对话
CUSTOMER_SERVICE_TEMPLATE = """
你是一位专业的客服代表。
公司:{company}
产品/服务:{product}
客户问题:{customer_message}
回复要求:
- 友好、专业的语气
- 先表示理解和同情
- 提供清晰的解决方案
- 如无法立即解决,说明后续步骤
- 以积极的方式结束
客服回复:
"""
4.10 创意头脑风暴类
32. 创意生成
BRAINSTORMING_TEMPLATE = """
为【{problem}】进行头脑风暴:
背景:{context}
目标:{goal}
约束:{constraints}
请使用以下创意方法:
1. SCAMPER法(替代、组合、调整、修改、用途、消除、重排)
2. 六顶思考帽
3. 反向思考
生成{num_ideas}个创意想法,每个包含:
- 创意描述
- 创新点
- 可行性(1-10分)
- 潜在影响
创意:
"""
33. 问题重构
PROBLEM_REFRAMING_TEMPLATE = """
重新定义问题:
原始问题:{problem}
请从以下角度重新描述问题:
1. 用户视角:用户真正想解决什么?
2. 系统视角:系统层面的根本原因?
3. 未来视角:5年后这个问题是什么样?
4. 反向视角:如果我们想让问题更严重,会怎么做?
每个视角的重构:
1. [视角]
问题重述:[...]
新洞察:[...]
重构后,建议:
- 优先解决的核心问题
- 新的解决思路
重构:
"""
4.11 数学科学类
34. 数学问题求解
MATH_PROBLEM_TEMPLATE = """
解决以下数学问题:
问题:{problem}
要求:
1. 理解问题:用自己的话重述问题
2. 制定策略:选择合适的解题方法
3. 执行计算:详细的计算过程
4. 验证答案:检查答案是否合理
解答:
### 理解问题
[重述问题]
### 解题策略
[选择的方法和原因]
### 计算过程
[步骤1]
[步骤2]
...
### 最终答案
[答案]
### 验证
[验证过程]
"""
35. 科学解释
SCIENCE_EXPLANATION_TEMPLATE = """
解释科学概念/现象:
主题:{topic}
受众:{audience_level}
请按以下结构解释:
## 简单定义
[用最简单的语言定义]
## 工作原理
[解释基本原理]
## 日常例子
[举3个生活中的例子]
## 深入理解
[稍微专业的解释,包含关键术语]
## 常见误解
[澄清常见的错误理解]
## 延伸阅读
[推荐资源]
解释:
"""
4.12 内容改写类
36. 改写润色
REWRITING_TEMPLATE = """
改写以下文本:
原文:
{text}
目标:{goal}
风格:{style}
长度:{length_instruction}
要求:
- {specific_requirements}
- 保持核心意思不变
- 提升可读性
- 修正语法错误
改写后:
"""
# goal: 简化/专业化/口语化/书面化
# style: 正式/非正式/学术/商务/创意
# length_instruction: 保持不变/缩短50%/扩展2倍
37. 语法纠错
GRAMMAR_CORRECTION_TEMPLATE = """
纠正以下文本的语法错误:
原文:
{text}
请:
1. 标出所有错误
2. 提供修正后的文本
3. 解释每个错误的类型和修正原因
输出格式:
## 错误列表
1. 原文:"[错误片段]"
错误类型:[语法/拼写/标点/用词]
修正:"[正确版本]"
原因:[简短解释]
## 修正后全文
[完整的正确文本]
修正:
"""
38. 格式转换
FORMAT_CONVERSION_TEMPLATE = """
将内容从{source_format}转换为{target_format}:
原内容:
{content}
转换要求:
- 保持信息完整
- 符合目标格式规范
- 优化可读性
- {special_requirements}
转换后:
"""
# 示例格式:
# Markdown <-> HTML
# JSON <-> XML
# 表格 <-> 列表
# 代码 <-> 伪代码
4.13 决策支持类
39. 利弊分析
PROS_CONS_TEMPLATE = """
分析【{decision}】的利弊:
背景:
{context}
考虑因素:
{factors}
请提供:
## 优点(Pros)
1. [优点1]
- 详细说明
- 影响程度:[高/中/低]
2. [优点2]
...
## 缺点(Cons)
1. [缺点1]
- 详细说明
- 风险程度:[高/中/低]
2. [缺点2]
...
## 量化评分
- 总体评分:[1-10]
- 推荐指数:[1-10]
## 建议
[综合建议]
分析:
"""
40. 方案对比
OPTION_COMPARISON_TEMPLATE = """
对比以下方案:
方案A:{option_a}
方案B:{option_b}
方案C:{option_c}
对比维度:
{comparison_dimensions}
输出格式:
## 对比表格
| 维度 | 方案A | 方案B | 方案C |
|------|-------|-------|-------|
| ... | ... | ... | ... |
## 详细分析
### 方案A
优势:[...]
劣势:[...]
适用场景:[...]
### 方案B
[同上结构]
### 方案C
[同上结构]
## 推荐
情况1:[推荐方案X,原因]
情况2:[推荐方案Y,原因]
对比:
"""
4.14 个性化推荐类
41. 个性化推荐
RECOMMENDATION_TEMPLATE = """
基于用户画像提供个性化推荐:
用户信息:
{user_profile}
需求:{need}
候选项:
{candidates}
请为每个候选项评分(0-100)并说明:
1. 推荐理由
2. 匹配度分析
3. 注意事项
输出格式:
## 推荐排名
1. [候选项1](评分:95)
- 推荐理由:[...]
- 匹配分析:[...]
- 注意:[...]
2. [候选项2](评分:88)
...
推荐:
"""
42. 兴趣发现
INTEREST_DISCOVERY_TEMPLATE = """
基于用户行为发现潜在兴趣:
用户历史行为:
{behavior_history}
已知兴趣:
{known_interests}
请分析:
1. 潜在兴趣点(5-10个)
2. 每个兴趣的置信度(0-1)
3. 推荐理由
4. 可以尝试的相关活动/内容
输出格式(JSON):
{{
"interests": [
{{
"interest": "兴趣名称",
"confidence": 0.85,
"reason": "基于用户行为X推断",
"recommendations": ["推荐1", "推荐2"]
}}
]
}}
分析:
"""
4.15 总结报告类
43. 会议纪要
MEETING_MINUTES_TEMPLATE = """
根据会议记录生成会议纪要:
会议记录:
{meeting_transcript}
会议信息:
- 日期:{date}
- 参与者:{participants}
- 主题:{topic}
纪要格式:
# 会议纪要
## 基本信息
- 时间:{date}
- 参与人:{participants}
- 主题:{topic}
## 讨论要点
1. [要点1]
2. [要点2]
...
## 决议事项
1. [决议1]
2. [决议2]
...
## 行动计划
| 任务 | 负责人 | 截止日期 | 状态 |
|------|--------|----------|------|
| ... | ... | ... | ... |
## 下次会议
- 时间:[...]
- 议题:[...]
纪要:
"""
44. 工作总结
WORK_SUMMARY_TEMPLATE = """
生成工作总结:
时间周期:{period}
工作内容:
{work_details}
总结格式:
## 工作概述
[简要概述本期工作]
## 主要成果
1. [成果1]
- 具体内容
- 量化指标
2. [成果2]
...
## 遇到的挑战
1. [挑战1]
- 问题描述
- 解决方案
- 经验教训
## 数据统计
- 关键指标1:[数值]
- 关键指标2:[数值]
...
## 下期计划
1. [计划1]
2. [计划2]
...
总结:
"""
45. 读书笔记
READING_NOTES_TEMPLATE = """
为《{book_title}》生成读书笔记:
书籍信息:
- 作者:{author}
- 主题:{topic}
- 阅读章节:{chapters}
笔记格式:
# 《{book_title}》读书笔记
## 核心观点
[3-5个主要观点]
## 章节摘要
### 第X章:[章节名]
- 要点:[...]
- 金句:[...]
- 个人思考:[...]
## 启发与思考
[个人的思考和启发]
## 行动计划
[如何应用到实践]
## 推荐指数
[1-10分] - [推荐理由]
笔记:
"""
4.16 创意营销类
46. 营销文案
MARKETING_COPY_TEMPLATE = """
为{campaign_type}活动撰写营销文案:
产品/服务:{product}
目标受众:{target_audience}
营销目标:{goal}
独特卖点:{usp}
促销信息:{promotion}
文案要求:
- 标题:吸引眼球(10字内)
- 副标题:说明价值(20字内)
- 正文:详细介绍(100-200字)
- CTA:行动号召(简短有力)
输出格式:
## 标题
[标题]
## 副标题
[副标题]
## 正文
[正文内容]
## 行动号召
[CTA按钮文案]
## A/B测试版本
[提供2-3个替代版本]
文案:
"""
# campaign_type: 新品发布/促销活动/品牌推广/节日营销
47. Landing Page文案
LANDING_PAGE_TEMPLATE = """
为{product}设计Landing Page文案:
目标转化:{conversion_goal}
目标用户:{target_user}
核心价值:{value_proposition}
Landing Page结构:
## Hero区域
- 主标题:[抓住注意力]
- 副标题:[说明价值]
- CTA按钮:[行动号召]
- 配图建议:[描述]
## 痛点部分
你是否遇到这些问题?
- 痛点1
- 痛点2
- 痛点3
## 解决方案
我们的{product}如何帮助你:
- 功能1 → 价值1
- 功能2 → 价值2
- 功能3 → 价值3
## 社会证明
- 用户评价:[3条]
- 数据证明:[统计数字]
- 客户案例:[简短案例]
## 定价区域
[定价方案和对比]
## FAQ
[5个常见问题]
## 最后CTA
[紧迫感 + 明确行动]
文案:
"""
4.17 技术文档类
48. API文档
API_DOCUMENTATION_TEMPLATE = """
为以下API编写文档:
API名称:{api_name}
功能:{functionality}
端点:{endpoint}
方法:{method}
文档格式:
# {api_name}
## 描述
[API的功能描述]
## 端点
{method} {endpoint}
## 请求参数
| 参数名 | 类型 | 必需 | 描述 | 示例 |
|--------|------|------|------|------|
| ... | ... | ... | ... | ... |
## 请求示例
```json
{{
"param1": "value1",
"param2": "value2"
}}
响应
成功响应(200)
{{
"status": "success",
"data": {{...}}
}}
错误响应(400)
{{
"status": "error",
"message": "错误描述"
}}
错误码
| 错误码 | 含义 | 解决方案 |
|---|---|---|
| ... | ... | ... |
示例代码
Python
[示例代码]
JavaScript
[示例代码]
注意事项
- [注意点1]
- [注意点2]
文档: """
#### 49. 用户手册
```python
USER_MANUAL_TEMPLATE = """
为{product}编写用户手册:
产品类型:{product_type}
目标用户:{target_users}
主要功能:{main_features}
手册结构:
# {product} 用户手册
## 1. 快速开始
### 1.1 安装/注册
[步骤说明,配图]
### 1.2 首次使用
[引导流程]
### 1.3 基本概念
[核心概念解释]
## 2. 功能详解
### 2.1 功能A
- 功能说明
- 使用步骤
- 截图示例
- 常见问题
### 2.2 功能B
[同上结构]
## 3. 高级功能
### 3.1 [高级功能1]
[详细说明]
## 4. 故障排除
### 4.1 常见问题
Q: [问题]
A: [解答]
### 4.2 错误信息
[错误码及解决方法]
## 5. 附录
### 5.1 快捷键列表
[表格]
### 5.2 术语表
[专业术语解释]
手册:
"""
4.18 职场沟通类
50. 求职信
COVER_LETTER_TEMPLATE = """
为以下职位撰写求职信:
职位:{job_title}
公司:{company}
求职者背景:{candidate_background}
关键匹配点:{key_matches}
求职信结构:
尊敬的招聘经理:
## 开头段
[表达兴趣,说明职位来源]
## 主体段1:相关经验
[匹配工作经验,量化成果]
## 主体段2:技能匹配
[展示关键技能如何满足职位要求]
## 主体段3:价值主张
[强调能为公司带来什么]
## 结尾段
[表达期待,留下联系方式]
此致
敬礼
[姓名]
[联系方式]
求职信:
"""
51. 绩效自评
PERFORMANCE_REVIEW_TEMPLATE = """
撰写绩效自评:
评估周期:{period}
职位:{position}
主要工作:{main_responsibilities}
重要成果:{achievements}
自评格式:
# 绩效自评
## 工作业绩
### 目标完成情况
| 目标 | 计划 | 实际完成 | 完成率 | 说明 |
|------|------|----------|--------|------|
| ... | ... | ... | ... | ... |
### 重要成果
1. [成果1]
- 背景:[...]
- 行动:[...]
- 结果:[量化数据]
- 影响:[...]
## 能力发展
### 提升的能力
- [能力1]:[具体事例]
- [能力2]:[具体事例]
### 需要改进
- [方面1]:[改进计划]
## 困难与挑战
[遇到的困难及克服方法]
## 下期目标
1. [目标1]
2. [目标2]
## 自我评分
[1-5分] - [理由]
自评:
"""
5. Prompt工程最佳实践
5.1 提示词库管理
class PromptLibrary:
"""Prompt模板库"""
def __init__(self):
self.templates = {}
self.categories = {}
def add_template(self, name, template, category, metadata=None):
"""
添加模板
Args:
name: 模板名称
template: 模板内容
category: 分类
metadata: 元数据(描述、参数等)
"""
self.templates[name] = {
'template': template,
'category': category,
'metadata': metadata or {},
}
if category not in self.categories:
self.categories[category] = []
self.categories[category].append(name)
def get_template(self, name):
"""获取模板"""
return self.templates.get(name)
def list_by_category(self, category):
"""按分类列出模板"""
return self.categories.get(category, [])
def search(self, keyword):
"""搜索模板"""
results = []
for name, info in self.templates.items():
if keyword.lower() in name.lower() or \
keyword.lower() in info['template'].lower():
results.append(name)
return results
def render(self, name, **kwargs):
"""渲染模板"""
template_info = self.templates.get(name)
if not template_info:
raise ValueError(f"模板 {name} 不存在")
template = template_info['template']
try:
return template.format(**kwargs)
except KeyError as e:
raise ValueError(f"缺少必需参数: {e}")
def save(self, filepath):
"""保存到文件"""
import json
with open(filepath, 'w', encoding='utf-8') as f:
json.dump({
'templates': self.templates,
'categories': self.categories,
}, f, ensure_ascii=False, indent=2)
def load(self, filepath):
"""从文件加载"""
import json
with open(filepath, 'r', encoding='utf-8') as f:
data = json.load(f)
self.templates = data['templates']
self.categories = data['categories']
# 使用示例
library = PromptLibrary()
# 添加模板
library.add_template(
name='email_formal',
template=EMAIL_TEMPLATE,
category='商务沟通',
metadata={
'description': '正式商务邮件模板',
'required_params': ['email_type', 'recipient', 'purpose', 'tone', 'key_points'],
}
)
library.add_template(
name='code_review',
template=CODE_REVIEW_TEMPLATE,
category='代码开发',
metadata={
'description': '代码审查模板',
'required_params': ['language', 'code'],
}
)
# 搜索模板
results = library.search('邮件')
print(f"搜索结果: {results}")
# 渲染模板
prompt = library.render(
'email_formal',
email_type='合作提案',
recipient='张总',
purpose='讨论合作事宜',
tone='正式友好',
key_points='- 产品介绍\n- 合作方案'
)
print(prompt)
# 保存库
library.save('prompt_library.json')
5.2 A/B测试框架
class PromptABTest:
"""Prompt A/B测试框架"""
def __init__(self, llm_func):
self.llm_func = llm_func
self.results = []
def run_test(self, prompt_a, prompt_b, test_cases, eval_func):
"""
运行A/B测试
Args:
prompt_a: 版本A的prompt
prompt_b: 版本B的prompt
test_cases: 测试用例列表
eval_func: 评估函数(返回0-1的分数)
Returns:
测试结果
"""
scores_a = []
scores_b = []
for case in test_cases:
# 测试版本A
filled_a = prompt_a.format(**case['input'])
output_a = self.llm_func(filled_a)
score_a = eval_func(output_a, case.get('expected'))
scores_a.append(score_a)
# 测试版本B
filled_b = prompt_b.format(**case['input'])
output_b = self.llm_func(filled_b)
score_b = eval_func(output_b, case.get('expected'))
scores_b.append(score_b)
# 统计
import statistics
result = {
'prompt_a': {
'mean_score': statistics.mean(scores_a),
'median_score': statistics.median(scores_a),
'std_dev': statistics.stdev(scores_a) if len(scores_a) > 1 else 0,
'scores': scores_a,
},
'prompt_b': {
'mean_score': statistics.mean(scores_b),
'median_score': statistics.median(scores_b),
'std_dev': statistics.stdev(scores_b) if len(scores_b) > 1 else 0,
'scores': scores_b,
},
'winner': 'A' if statistics.mean(scores_a) > statistics.mean(scores_b) else 'B',
'improvement': abs(statistics.mean(scores_a) - statistics.mean(scores_b)),
}
self.results.append(result)
return result
def statistical_significance(self, result, alpha=0.05):
"""
计算统计显著性
Args:
result: 测试结果
alpha: 显著性水平
Returns:
是否有统计学显著差异
"""
from scipy import stats
scores_a = result['prompt_a']['scores']
scores_b = result['prompt_b']['scores']
# t检验
t_stat, p_value = stats.ttest_ind(scores_a, scores_b)
return {
't_statistic': t_stat,
'p_value': p_value,
'significant': p_value < alpha,
}
def visualize_results(self, result):
"""可视化测试结果"""
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
# 分数分布
axes[0].hist(result['prompt_a']['scores'], alpha=0.5, label='Prompt A', bins=10)
axes[0].hist(result['prompt_b']['scores'], alpha=0.5, label='Prompt B', bins=10)
axes[0].set_xlabel('Score')
axes[0].set_ylabel('Frequency')
axes[0].set_title('Score Distribution')
axes[0].legend()
# 对比
means = [result['prompt_a']['mean_score'], result['prompt_b']['mean_score']]
stds = [result['prompt_a']['std_dev'], result['prompt_b']['std_dev']]
axes[1].bar(['Prompt A', 'Prompt B'], means, yerr=stds, capsize=5)
axes[1].set_ylabel('Mean Score')
axes[1].set_title('Prompt Comparison')
axes[1].set_ylim(0, 1)
plt.tight_layout()
plt.show()
# 使用示例
def mock_eval_func(output, expected):
"""模拟评估函数"""
# 简单的相似度评分
if expected is None:
return 0.5
# 这里应该使用更复杂的评估方法
return 0.8 if output.strip() == expected.strip() else 0.3
ab_test = PromptABTest(mock_llm)
# 定义两个版本
prompt_a = "文本:{text}\n情感分类:"
prompt_b = "请分类以下文本的情感(积极/消极/中性):\n{text}\n\n分类:"
# 测试用例
test_cases = [
{'input': {'text': '太棒了!'}, 'expected': '积极'},
{'input': {'text': '真糟糕。'}, 'expected': '消极'},
{'input': {'text': '还行吧。'}, 'expected': '中性'},
]
# 运行测试
result = ab_test.run_test(prompt_a, prompt_b, test_cases, mock_eval_func)
print(f"版本A平均分: {result['prompt_a']['mean_score']:.2f}")
print(f"版本B平均分: {result['prompt_b']['mean_score']:.2f}")
print(f"获胜者: 版本{result['winner']}")
print(f"提升: {result['improvement']:.2%}")
5.3 成本优化
class CostOptimizer:
"""Prompt成本优化器"""
def __init__(self, pricing):
"""
Args:
pricing: 定价信息 {'input': 价格/1K tokens, 'output': 价格/1K tokens}
"""
self.pricing = pricing
def estimate_cost(self, prompt, expected_output_tokens):
"""估算成本"""
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
input_tokens = len(enc.encode(prompt))
output_tokens = expected_output_tokens
input_cost = (input_tokens / 1000) * self.pricing['input']
output_cost = (output_tokens / 1000) * self.pricing['output']
return {
'input_tokens': input_tokens,
'output_tokens': output_tokens,
'input_cost': input_cost,
'output_cost': output_cost,
'total_cost': input_cost + output_cost,
}
def optimize_prompt(self, prompt, min_quality_score=0.8):
"""
优化prompt以降低成本
Returns:
优化建议
"""
suggestions = []
# 1. 检查冗余
if prompt.count('\n\n\n') > 0:
suggestions.append({
'type': '移除多余空行',
'savings': '~5%',
'impact': '无',
})
# 2. 检查重复指令
lines = prompt.split('\n')
if len(lines) != len(set(lines)):
suggestions.append({
'type': '移除重复指令',
'savings': '~10%',
'impact': '无',
})
# 3. 简化语言
wordy_phrases = {
'in order to': 'to',
'due to the fact that': 'because',
'at this point in time': 'now',
}
found_wordy = []
for wordy, simple in wordy_phrases.items():
if wordy in prompt.lower():
found_wordy.append((wordy, simple))
if found_wordy:
suggestions.append({
'type': '简化措辞',
'examples': found_wordy,
'savings': '~5-15%',
'impact': '低',
})
# 4. 考虑Few-shot vs Zero-shot权衡
if '示例' in prompt or 'example' in prompt.lower():
suggestions.append({
'type': '评估是否需要所有示例',
'savings': '~20-50%',
'impact': '中-高(需要测试)',
})
return suggestions
def batch_optimization(self, prompts, batch_size=10):
"""
批量处理优化
Args:
prompts: 提示列表
batch_size: 批次大小
Returns:
优化方案
"""
# 如果任务可以批量处理,合并多个请求
total_tokens_separate = sum(
len(tiktoken.get_encoding("cl100k_base").encode(p))
for p in prompts
)
# 合并后的prompt
batched_prompt = self._create_batch_prompt(prompts[:batch_size])
batched_tokens = len(tiktoken.get_encoding("cl100k_base").encode(batched_prompt))
savings = (total_tokens_separate - batched_tokens) / total_tokens_separate
return {
'separate_tokens': total_tokens_separate,
'batched_tokens': batched_tokens,
'savings': savings,
'recommendation': '批量处理' if savings > 0.2 else '单独处理',
}
def _create_batch_prompt(self, prompts):
"""创建批量prompt"""
batch = "请处理以下多个任务:\n\n"
for i, prompt in enumerate(prompts, 1):
batch += f"任务{i}:\n{prompt}\n\n"
batch += "请按顺序输出每个任务的结果。"
return batch
# 使用示例
optimizer = CostOptimizer({
'input': 0.03, # GPT-4定价
'output': 0.06,
})
# 估算成本
prompt = """
请帮我分析以下文本的情感倾向。
文本:这部电影真的太棒了!
请提供:
1. 情感分类
2. 情感强度
3. 关键词
输出格式:JSON
"""
cost = optimizer.estimate_cost(prompt, expected_output_tokens=50)
print(f"估算成本: ${cost['total_cost']:.4f}")
print(f"输入tokens: {cost['input_tokens']}")
print(f"输出tokens: {cost['output_tokens']}")
# 优化建议
suggestions = optimizer.optimize_prompt(prompt)
print("\n优化建议:")
for s in suggestions:
print(f"- {s['type']}: 节省{s['savings']}, 影响{s['impact']}")