Prompt Engineering

发布于:2025-09-03 ⋅ 阅读:(24) ⋅ 点赞:(0)

概述

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. 模板复用:组件化设计便于维护和复用

示例:

<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

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

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


网站公告

今日签到

点亮在社区的每一天
去签到