Prompt Engineering

概述

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,而无需依赖外部的编程语言。

相比传统的字符串模板,提供:

  1. 结构化组织:语义化的组件如<role><task><stepwise-instructions>
  2. 可读性:清晰的层级结构和组件分离
  3. 类型安全:组件参数验证和自动补全
  4. 多格式输出:可渲染为Markdown、JSON、HTML等格式
  5. 模板复用:组件化设计便于维护和复用

示例:

xml 复制代码
<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工作流。

示例:

py 复制代码
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

提供两种调优模式,建议选择评分模式。

五步流程:拆解问题-规划流程-自动调优-用户反馈-多轮对比。

相关推荐
sulikey1 分钟前
Anaconda 无法找到 Anaconda Prompt 的原因
prompt·anaconda·anaconda prompt
兜兜转转了多少年5 小时前
《Prompt Engineering白皮书》笔记08 我用 Gemini 10 分钟写完脚本,100 个文件自动改名
笔记·prompt
Robot侠2 天前
极简LLM入门指南4
大数据·python·llm·prompt·提示工程
陈建1112 天前
Prompt工程 智能客服推荐应用案例
prompt
PPIO派欧云2 天前
PPIO上线Prompt Cache:让模型调用更快、更省、更稳
大数据·人工智能·prompt
sztomarch3 天前
Windows-PowerShell-prompt
windows·prompt
路边草随风3 天前
langchain agent动态变更系统prompt
人工智能·python·langchain·prompt
CNRio4 天前
从“手搓Prompt“到“物理世界提示词“:Looki L1如何重塑AI交互范式
人工智能·prompt·交互
阿杰学AI4 天前
AI核心知识55——大语言模型之PE工程师(简洁且通俗易懂版)
人工智能·ai·语言模型·prompt·prompt engineer·提示词工程师·pe工程师
viperrrrrrrrrr74 天前
Prompt Tuning
人工智能·深度学习·prompt