什么是提示技术?
提示技术是实现提示工程目标的具体技术手段,是提示工程中的“工具库”。
什么又是提示工程?
提示工程是指通过设计、优化和迭代输入到大语言模型(LLM)的提示(Prompt),系统性提升模型输出质量(如相关性、准确性、可控性)的实践领域。它是一个覆盖全流程的方法论,包括:
- 明确目标任务(如生成教学内容、问答、翻译);
- 设计提示结构(如指令、上下文、示例);
- 选择模型与参数(如温度、top_p);
- 验证与迭代(根据输出调整提示)。
其核心是“通过工程化方法控制大语言模型(LLM)的行为”。
概念
自动提示工程师(Automatic Prompt Engineer, APE),是一种通过大模型自动生成和优化提示词的技术,旨在替代人工设计提示词的过程,提升模型在特定任务上的表现。
APE 基于提示词工程的思路,即编写多个不同的提示词并对其进行测试,只不过是让整个过程自动化。
概念图解
应用场景
- 教育与学习资源开发(创建个性化的学习材料、练习题、考试模拟题等);
- 内容创作与文案生成(自动生成新闻标题、社交谋体帖子、广告文案等);
- 数据分析与报告撰写(从数据集中提取关键信息并自动生成报告);
- 编程助手与代码审查(自动生成代码片段、注解以及进行代码质量检查);
- 创意写作与故事生成(辅助作家完成小说大纲、角色设定、情节发展等工作);
- 法律咨询与合同起草(协助律师准备法律文书,如合同模板、诉讼材料等);
- ……
案例实操
实现工具:扣子
实现方式:扣子工作流
完整工作流如下:
工作流节点配置信息:
- 开始节点:
- 构建初始提示词节点:
- 循环节点:
- 生成候选提示词节点:
- 评估出最佳提示词节点:
代码具体内容:(选择的是 Python)
# 在这里,您可以通过 'args' 获取节点中的输入变量,并通过 'ret' 输出结果
# 'args' 已经被正确地注入到环境中
# 下面是一个示例,首先获取节点的全部输入参数params,其次获取其中参数名为'input'的值:
# params = args.params;
# input = params['input'];
# 下面是一个示例,输出一个包含多种数据类型的 'ret' 对象:
# ret: Output = { "name": '小明', "hobbies": ["看书", "旅游"] };
async def main(args: Args) -> Output:
params = args.params
candidate_prompt_list = params['candidate_prompts']
best_score = params['cur_score'] # 当前最高分
best_prompt = params['cur_prompt'] # 当前最高分的提示词
for i in range(len(candidate_prompt_list)):
temp = len(candidate_prompt_list[i].split()) # 简单以反馈长度模拟质量 @todo: 替换为实际评分逻辑
if best_score < temp:
best_score = temp
best_prompt = candidate_prompt_list[i]
# 构建输出对象
ret: Output = {
"key2": { # 输出一个Object
"prompt": best_prompt,
"score": best_score
}
}
return ret
- 设置循环中间变量节点:
- 结束节点:
测试JSON:
{
"question": "小明买了3个苹果,每个5元,又买了2个橘子,每个4元,总共花了多少钱?",
"student_solution": "3*5=15, 2*4=8, 15+8=20元","correct_answer": "23元"
}
运行结果如下:
大家若有编程基础的话,可以参考下面的代码案例来实现与体验不同场景下使用自动提示工程师。
代码实现自动提示工程师
技术栈:Python;LangChain
代码引用包导入:
pip install langchain_core==0.3.66;
pip install zhipuai==2.1.5.20250611;
pip install pydantic==2.11.7;
具体代码:
import os
from typing import List
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel
from zhipuai import ZhipuAI
load_dotenv()
api_key = os.getenv("ZHIPUAI_API_KEY")
# 1. 初始化智谱AI客户端
client = ZhipuAI(api_key=api_key)
# 2. 定义数据结构
class MathProblem(BaseModel):
question: str
student_solution: str
correct_answer: str
class OptimizedPrompt(BaseModel):
prompt: str
score: float # 评估分数(0-1)
# 3. APE核心流程
def automatic_prompt_engineering(
problem: MathProblem,
num_candidates: int = 3,
num_iterations: int = 2
) -> OptimizedPrompt:
"""自动生成并优化批改提示词"""
# 初始提示词种子
seed_prompt = """
你是一名小学数学老师,需要批改以下应用题:
题目:{{question}}
学生答案:{{student_solution}}
正确答案:{{correct_answer}}
请分析错误原因并生成鼓励性评语。
"""
best_prompt = None
best_score = 0
for _ in range(num_iterations):
# 生成候选提示词(使用智谱AI)
candidate_prompts = _generate_candidate_prompts(seed_prompt, num_candidates)
# 评估提示词效果
for prompt in candidate_prompts:
score = _evaluate_prompt(prompt, problem)
if score > best_score:
best_score = score
best_prompt = prompt
# 更新种子提示词
seed_prompt = best_prompt
return OptimizedPrompt(prompt=best_prompt, score=best_score)
def _generate_candidate_prompts(seed_prompt: str, num: int) -> List[str]:
"""生成候选提示词变体"""
response = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "system", "content": "你是一个优秀的提示词工程师,擅长生成高质量的批改提示词。"},
{"role": "user",
"content": f"原始提示:{seed_prompt}\n请生成{num}个更专业的变体,要求包含:1.错误类型分类 2.步骤分析 3.鼓励机制"}
],
temperature=0.7
)
return [choice.message.content for choice in response.choices]
def _evaluate_prompt(prompt: str, problem: MathProblem) -> float:
"""评估提示词效果(模拟人工评分)"""
template = ChatPromptTemplate.from_template(prompt)
messages = template.invoke({"problem": problem}).messages
feedback = messages[0].content if messages else ""
return min(len(feedback.split()) / 100, 1.0) # 简单以反馈长度模拟质量 @todo: 替换为实际评分逻辑
# 4. 测试案例
if __name__ == "__main__":
math_problem = MathProblem(
question="小明买了3个苹果,每个5元,又买了2个橘子,每个4元,总共花了多少钱?",
student_solution="3*5=15, 2*4=8, 15+8=20元",
correct_answer="23元"
)
print("正在生成和优化批改提示词,请稍候...")
optimized = automatic_prompt_engineering(math_problem)
print(f"优化后的提示词(得分:{optimized.score:.2f}):\n{optimized.prompt}")
总结与思考
自动提示工程师,概念是挺简单的,就是自动帮我们生成与优化提示词,从而减少人工手动撰写与优化提示的工作量,在大批量任务上,效果尤为明显。
而要实现生产级别的自动化,并非简单的事情。以下都是蛮有挑战的事项:
- 质量控制:需要有效评估机制来确保生成提示的质量;
- 计算资源消耗:运行自动提示生成模型需要大量的计算资源;
- 领域知识依赖:对于某些专业领域来说,可能需要深厚的知识背景才能生成有效提示。
思维树(ToT)提示在处理的过程中也涉及评估,那么它们之间有什么区别呢?
维度 | 思维树 | 自动提示工程师 |
核心思想 | 构建多路径的“思维树”,探索多种可能推理路径,并选择最优解。 | 自动生成和优化高质量提示,以提升模型任务表现。 |
主要目标 | 提升复杂问题的推理能力与决策质量。 | 自动生成并持续优化适用于特定任务的提示。 |
是否模块化处理 | 是,每个节点可独立处理。 | 是,但更偏整体流程设计。 |
资源消耗 | 高(多次调用模型 + 多路径评估) | 中等(取决于训练和评估方式) |
自动化程度 | 中等(需设定搜索策略与评估规则) | 高(端到端自动生成+优化) |
是否适合个性化定制 | 是,可针对个体差异调整路径。 | 是,可根据输入动态生成提示。 |
是否适合自动化流程 | 可实现(需工程封装) | 非常适合(天然自动化) |
是否需要领域知识 | 是(尤其在评估路径优劣时) | 是(尤其在提示设计阶段) |
是否可组合使用 | 可结合使用(如 APE 生成 ToT 路径) | 可结合使用(如 ToT 作为 APE 的评估模块) |
总而言之,简单一句话理解:
ToT 是让模型“尝试多种思路并选出最好的那一个”;
APE 是让模型“自动写出最有效的提示语”。
本文只是我学习的理解与总结,一些浅薄的认知。大家若是对自动化提示感兴趣的,可以学习以下的论文:
-
OPRO,引入使用 LLMs 优化提示的思想:让 LLMs “深呼吸”提高数学问题的表现。
-
AutoPrompt,提出了一种基于梯度引导搜索的方法,用于自动创建各种任务的提示。
-
Prompt Tuning,提出了一种通过反向传播学习软提示的机制。
论文地址:[2104.08691] The Power of Scale for Parameter-Efficient Prompt Tuning
OK,到此。
提示技术系列,接下来分享:主动提示(Active-Prompt);方向性刺激提示等等
为了方便大家学习,这里给出专栏链接:https://blog.youkuaiyun.com/quf2zy/category_12995183.html
欢迎大家一起来学习与交流……