概述
Prompt定义:对LLM提出的问题。
Prompt Engineering定义:针对不同场景构造prompt,最大程度发挥出LLM能力。
常见内容:
- 角色:不同场景(领域、任务)设置不同角色
- 示例:零样本、单样本、少样本示例,让AI举一反三发现规律
- 证据:引导模型深入思考,说明推理依据,再得出结论
- 要求:清晰明确地表达要求和意图,提供充足问题背景和上下文
- 详细:详尽说明期望输出内容包含哪些部分
- 格式:指定输出框架与格式,如列表、示意图、表格、代码等
- 语言:指定语言如中英文,风格如严谨或幽默…模型训练语料中含有大量的英文远超中文,则使用英文Prompt的效果会更好,推理结果更准确。
Prompt和RAG从不同的角度优化LLM输出。
种类
Zero-Shot Prompt:零样本提示,只提需求,不给样例。核心在于利用模型预训练知识直接完成任务。节省token;适合文本分类、简单问答和内容摘要任务。指令越清晰,效果越好。最佳实践:使用明确的动词指令,指定输出格式,加上约束条件。
Few-Shot Prompt:少样本提示,提供几个示例。利用模型的上下文学习能力。适合需要特定输出格式、专业领域、自定义分类系统任务。缺点:对示例质量高度敏感,容易出现标签偏见。
Chain-of-Thought(CoT) Prompt:思维链提示,引导模型将复杂问题分解为连续的中间步骤,利用其推理能力,通过显式推理减少错误累积。适合数学问题、多步逻辑推理、需要解释答案来源的任务。
Chain Prompt:链式提示,和CoT不太一样,CoT注重think step by step
,在Prompt里写明一个个步骤。每一步都提供合理的线索和指导,以帮助模型形成有条理的回答。
Tree of Thoughts(ToT):思维树。ToT将CoT扩展为树状结构,通过将思考过程构建为树状结构,在每个决策点生成多个思考分支,结合搜索算法(如BFS、DFS、Beam Search)探索解决方案空间,利用自评估机制选择最优路径,解决需要探索或战略前瞻的复杂问题。适合需要探索多种解决方案的复杂任务,如24点。缺点:高效的评估机制实现难,可能仅找到局部最优解。
图片来自论文。涉及几个关键步骤:
- Thought decomposition:思维分解,将问题分解为一系列连贯的思维步骤,每个步骤都是一个语言序列,作为问题解决的中介。
- Thought generator:思维生成,为每个树状结构的状态生成潜在的思维步骤。
- State evaluation:状态评估,评估每个状态的潜在价值,作为搜索算法的启发式标准。
- Search algorithm:搜索算法,探索思维树以找到最优解决方案。
ReAct Prompt:Reasoning+Acting,推理+行动,可利用外部工具获取实时信息。适合需要外部知识的问答系统。缺点:高度依赖外部工具质量。
应用场景:
- 信息检索与验证:如查询实时数据、验证事实
- 复杂问题求解:如数学计算、编程调试
- 动态决策制定:如投资决策、旅行规划
- 交互式任务处理:如智能客服、数据采集
Reflexion:反思,使用三阶段循环:行动、评估、反思,提供语言化反馈而非数值奖励,记忆过去错误并形成改进策略,培养自我批评和元认知能力,使模型从错误中学习,实现自我改进的闭环系统。
适合需要从错误中学习的迭代任务,如Bug调试和优化。
Graph Prompt:图提示。将提示结构化为有向图,通过将提示组织为节点和边的图结构,每个节点代表特定子任务或推理步骤,边表示任务之间的依赖关系和信息流,并支持条件分支和循环结构,允许模型按照预定义的路径进行推理和决策,实现更复杂的任务流程控制。
适合具有明确流程和依赖关系的复杂任务,如多步骤规划、条件决策和递归问题解决。通过将大型任务分解为相互连接的子任务,有效降低复杂性并提高可控性,支持非线性推理路径和条件执行,使其在处理需要明确流程控制的任务时表现出色。支持模块化设计,便于重用和维护。缺点:设计有效的图结构需要专业知识,实现复杂度较高,且在执行过程中可能出现错误累积。大型图结构可能超出上下文窗口限制。
实现:Graph Prompt可通过多种方式实现:静态图预定义完整任务流程;动态图根据中间结果实时调整结构;嵌套图允许节点包含子图。
总结:对于简单任务,Zero-Shot是首选;复杂推理问题适合使用CoT或ToT;需要外部知识时,ReAct表现出色;长期学习场景则应考虑Reflexion;而结构化流程任务则适合图提示。
CoT
对CoT加以改进,这方面的论文不要太多。
Auto-CoT:自动思维链,两个阶段:
- 问题聚类:将给定问题划分为几个聚类
- 演示抽样:从每组数组中选择一个具有代表性的问题,并使用带有简单启发式的 Zero-Shot-CoT生成其推理链
Self-Consistency:自我一致性,旨在替换链式思维提示中使用的天真贪婪解码方法
。想法是通过少样本CoT,采样多个不同的推理路径,并选择使用生成结果最一致的答案。有助于提高CoT提示在涉及算术和常识推理的任务中的性能。
ART:自动推理并使用工具,使用LLM自动生成包含中间推理步骤的程序,在完成任务时交替运用CoT提示和工具。工作原理:
- 接新任务时从任务库选多步推理和工具使用示范;
- 测试中调用外部工具时暂停生成,整合输出后继续;
- 引导模型总结示范,拆分新任务并在合适处用工具,采用零样本形式,可手动扩展。
提示词漂移
Prompt Drift,在对话或生成过程中,模型对初始Prompt的理解或回应逐渐偏离原始意图,导致输出内容与最初设定的目标不一致甚至完全偏离。即,越聊越跑题。
常见原因:
- 多轮交互中的上下文累积偏差:每一轮对话都基于之前的输出,如果中间某次回应略有偏离,后续会不断放大;
- 用户反馈或指令不一致:用户需求(措辞)变更,模型难以保持一致风格;
- 模型对模糊指令的理解偏差:模型可能对“扩展一下”“说得更好”这类模糊指令做出不符合原意的解释;
- 上下文长度限制导致信息丢失:在长对话中,早期的提示可能被挤出上下文窗口,导致模型忘记最初要求。
解决:
- 定期重申核心要求:在关键节点重复初始提示中的关键约束
- 使用系统提示(System Prompt)固化角色和风格:在系统层面设定模型角色,比用户提示更稳定
- 结构化输出格式:要求模型按固定结构输出,减少自由发挥空间
- 限制对话轮次,分阶段生成:不依赖长对话连续生成,而是分步骤、每次基于原始提示重新生成
- 使用锚定提示技术:在每次输入中嵌入原始提示的关键部分
优化
LLM对输入的格式极为敏感,换个列表符号或把数据从JSON换成Markdown,结果可能天差地别。
拓展
PDL
论文,IBM提出Prompt Programming Language,提示词声明语言,GitHub。
POML
论文,微软开源的专门用来写Prompt的标记语言。Prompt Orchestration Markup Language简称。
论文总结的提示词编写过程中的四大痛点:
- 结构混乱:复杂的Prompt往往是指令、上下文、示例等信息的大杂烩,可读性差;
- 数据集成复杂:当需要让AI处理PDF、Excel、代码时,手动复制粘贴和格式化数据的过程不仅效率低下,且极易出错;
- 格式敏感:LLM对输入的格式极为敏感,缺乏一套系统性的方法来测试和验证哪种格式最好;
- 严重缺乏专业工具:纯文本编辑器或笔记本来管理Prompt,没有语法高亮、版本控制、实时预览等现代软件开发的基础设施。
POML的设计目标:提供一种可复用和可维护的提示标记语言,实现全面的数据处理能力,将表现形式(样式)与内容解耦,并提供强化的开发者工具,从而给出一套完整的工程化解决方案。
POML是一种类似HTML的标记语言,通过层级嵌套的组件来组织Prompt的逻辑:
- Intention Components:语义化的意图组件,如
<role>
、<task>
、<example>
; - Data Components:数据组件,无缝集成和处理外部数据,包括:
<document>
:用于嵌入文本文件(如.txt
、.docx
、.pdf
)内容,灵活控制只读取特定页码范围,处理长文档时非常有用;<table>
:支持从CSV、Excel等文件加载表格数据,并且能自由控制输出的格式(如Markdown、JSON、HTML等)和需要显示的行列,解决手动格式化表格的痛点;<folder>
:能够将一个文件目录结构直接渲染成树状图,可用于代码理解或文件系统操作的任务;<img>
:可直接在提示中插入图片,支持alt
属性,为那些不支持视觉的模型提供替代文本,增强Prompt兼容性。
解耦的样式系统与内置模板引擎
为了系统性地解决LLM的格式敏感性问题,POML设计一套类似CSS的样式系统,彻底将Prompt的内容和表现形式分离开来。可以在一个独立的样式表里定义所有表格都以Markdown格式输出,或所有示例都采用对话格式,从而系统性地测试不同Prompt对模型性能的影响。内置模板引擎,支持变量替换、循环和条件渲染,可支持创建动态的、由数据驱动的Prompt,而无需依赖外部的编程语言。
相比传统的字符串模板,提供:
- 结构化组织:语义化的组件如
<role>
、<task>
、<stepwise-instructions>
- 可读性:清晰的层级结构和组件分离
- 类型安全:组件参数验证和自动补全
- 多格式输出:可渲染为Markdown、JSON、HTML等格式
- 模板复用:组件化设计便于维护和复用
示例:
<poml>
<role>你是一名资深的内容策略专家和主题分析师,具有10年以上的学术研究和内容策划经验。你善于从复杂的多源信息中提炼出核心主题,并能准确把握不同领域的专业术语和概念关联。</role>
<task>基于提供的资源内容,运用系统性分析方法推断出最佳的文章主题</task>
<input caption="待分析资源内容">{{resources_content}}</input>
<examples captionStyle="header" caption="学习示例">
<example captionStyle="bold" caption="示例一:计算机视觉主题">
<input caption="资源内容" syntax="text">论文1: 深度学习在图像识别中的应用研究</input>
<output caption="完整分析过程">
<section>
<h>第一步:关键概念提取</h>
<list listStyle="dash">
<item>深度学习、图像识别、卷积神经网络、优化算法、计算机视觉</item>
</list>
</section>
</output>
</example>
</examples>
<stepwise-instructions caption="分析步骤指南">
<list listStyle="decimal">
<item><b>深度阅读</b>:逐一仔细阅读所有资源内容,理解每个资源的核心观点和专业词汇</item>
</list>
</stepwise-instructions>
<cp caption="思维链分析结构">
<p>请严格按照以下结构进行逐步分析,展示你的完整推理过程:</p>
<list listStyle="decimal">
<item><b>第一步:关键概念提取</b> 列出从各个资源中识别出的关键术语、概念和主题词</item>
</list>
</cp>
<output-format caption="输出格式要求">
<p>请严格按照以下格式输出:</p>
<section>
<h>思维链分析</h>
<p>[按照上述四个步骤展示完整推理过程]</p>
</section>
</output-format>
</poml>
提供VSCode插件,支持:语法高亮、自动补全、悬停文档提示、实时渲染、内联诊断(检查标签、属性是否有误,引用文件是否存在)、一键测试。
标签:
- poml:根标签
- role:角色
- task:任务
- input:用户输入
- examples:提示示例,为空则对应零样本提示…
- example:示例,必须要包括input和output
- stepwise-instructions:CoT,步骤提示
- output-format:输出格式要求
- captionStyle:header、bold
- listStyle:star、decimal、dash
提供Node.js、Python SDK,用编程的方式动态生成和管理这些结构化的Prompt,轻松融入现有的AI工作流。
示例:
import asyncio
from pathlib import Path
import poml
from typing import Any
class POMLLoader:
"""POML提示词加载器"""
def __init__(self, prompts_dir: str | Path = None):
"""初始化加载器
Args:
prompts_dir: POML提示词文件目录,默认为当前模块的prompts目录
"""
if prompts_dir is None:
prompts_dir = Path(__file__).parent / 'prompts'
self.prompts_dir = Path(prompts_dir)
async def load_prompt(self, name: str, variables: dict[str, Any] = None) -> str:
"""加载并渲染POML提示词
Args:
name: 提示词名称(不含扩展名)
variables: 传入的变量字典
Returns:
渲染后的提示词文本
"""
poml_file = self.prompts_dir / f'{name}.poml'
if not poml_file.exists():
raise FileNotFoundError(f'POML文件不存在: {poml_file}')
# 使用POML SDK 的context参数进行变量注入
messages = poml.poml(poml_file, context=variables, parse_output=True)
# 从消息列表中提取内容
if isinstance(messages, list) and messages:
# 合并所有消息的content字段
contents = []
for msg in messages:
if isinstance(msg, dict) and 'content' in msg:
contents.append(msg['content'])
return '\n\n'.join(contents)
return str(messages)
def load_prompt_sync(self, name: str, variables: dict[str, Any] = None) -> str:
"""同步版本的加载提示词方法"""
return asyncio.run(self.load_prompt(name, variables))
# 默认加载器实例
default_loader = POMLLoader()
async def load_theme_infer_prompt(resources_content: str) -> str:
"""加载主题推断提示词"""
return await default_loader.load_prompt('theme_infer', {'resources_content': resources_content})
心得:
- 能将Python代码里的若干处散乱的字符串提示词统一放在resources目录下的多个
.poml
文件里统一管理; - 内容与渲染分离,更有拓展性;
此外,该论文给出几个经过验证的结论:
- 性能差异巨大:对于同一个模型,最好和最差的提示风格导致的准确率差异悬殊。如对于GPT-3.5 Turbo,最好格式比最差格式,准确率提升9倍以上;而对于Phi-3 Medium,更是达到44倍。
- 模型偏好各异:并不存在一种万能的最优格式。有的模型喜欢CSV格式的表格,有的则偏爱HTML或XML,这凸显为不同模型定制提示风格的重要性。
grok-prompt
grok-prompts,xAI的Grok bot系统提示词。采用jinja2(Python模板引擎,文件后缀为.j2
),共5个:
PrompterHub
中文网站
提供Chrome插件,类似的插件不要太多。
分文本、图片、代码三种类型,还有结构化解读和Remix功能。
功能:
- 提示词:支持创建、导入、点赞、收藏、管理、分享、优化…
- 社区与模板库:分类清晰,支持搜索
- Remix功能:模板快速变身新提示词
- 支持自定义模型,支持多模型测试Prompt,也支持多提示词测试单一模型
- 浏览器插件:Chrome提示词助手,随时调用。
- 教程与资源:集齐OpenAI、Claude等AI指南
- 分类与扩展:多模态支持,新闻教程全都有
注:在搜索时,还发现2个类似的英文站点:
PromptPilot
最开始是集成在火山方舟控制台里,涵盖生成、调优、评估和管理全阶段。
https://promptpilot.volcengine.com/home
提供两种调优模式,建议选择评分模式。
五步流程:拆解问题-规划流程-自动调优-用户反馈-多轮对比。