当前位置: 首页 > news >正文

通过符号程序搜索提升prompt工程

原文地址:supercharging-prompt-engineering-via-symbolic-program-search

通过自动探索​​大量提示变体来找到更好的提示

2024 年 4 月 22 日

众所周知,LLMs的成功在很大程度上仍然取决于我们用正确的指导和例子来提示他们的能力。随着新一代LLMs变得越来越强大,提示已经变得足够复杂,足以被视为课程本身。这些提示程序很像菜谱——都有一套遵循和转换原材料的指令,无论是数据还是成分。

因此,提示工程类似于改进配方。家庭厨师通常会坚持整体食谱,但会做出一些小改变—例如在面食中省略大蒜或添加欧芹。像DSPy这样的框架在优化上下文示例时遵循这个整体范例。然而,专业级厨师以食谱为灵感,经常完全重新诠释菜肴的成分。例如,他们可能将面食中的意大利面视为淀粉成分,并可能将其替换为新鲜制作的面疙瘩以获得类似的成分。

是什么让专业级厨师能够如此富有创意地工作?他们以抽象的方式思考食谱,就像上面的意大利面例子一样。手动提示工程类似于专业级烹饪。它可以获得令人印象深刻的结果,但需要大量的时间和知识。我们真正想要的是手动提示工程的创造力,但又不需要付出努力。

抽象提示的力量

假设我们想改进一个用于标注说话人回答的提示。我们最终会用许多不同的输入来运行它,但现在先插入一个具体的输入:

Instructions: Does Speaker 2's answer mean yes or no?
Output labels: no, yes
Input: Speaker 1: "You do this often?" Speaker 2: "It's my first time."
Output:

暂且假设我们有一个抽象的提示表示法,它可以抽出不同的组成部分,并且易于操作。也许可以这样:

5

有了它,你就可以自动完成在及时原型开发过程中必须进行的大量(半)手工修补工作。进行诸如转述之类的小编辑只是一个开始。想试试思维链推理吗?添加一段 “让我们逐步思考”。将数据格式改为 JSON 格式如何?只需更改 InputData 参数的 formatattribute 即可。你还可以探索:

  • 从单一示例到批量注释
  • 在 RAG 场景中更改检索器和排序功能
  • 重新排列某些段落的顺序
  • 压缩说明的某些部分
  • ETC

从本质上讲,你可以输入你最喜欢的提示工程启发式。这种抽象的提示表示法让我们能够真正发挥创意,自动探索大量可能的提示。

将提示转化为抽象程序

要表示抽象提示符,我们首先要将其转换为非符号提示符程序,将其分解为单独的组件,以 Python 类的形式实现:

class Component:def __init__(self, **kwargs): pass
class Metaprompt(Component): pass
class Paragraph(Component): pass
class InputData(Component): passprompt = Metaprompt(children=[Paragraph(text="Instructions: "),Paragraph(id="instructions",text="Does Speaker 2's answer mean yes or no?",),Paragraph(id="labels", text="Output labels: yes, no"),InputData(),Paragraph(text="Output: "),]
)

到目前为止,一切顺利。这与 DSpy 所做的工作类似,但更为通用,因为我们还表示了提示符的内部结构。

接下来,我们要把它变成一个符号提示程序,这样就可以进行任意修改(这也超出了静态 DSPy 程序的范围)。pyGlove 将 Python 类转化为可操作的符号对象,其属性在实例化后仍可完全编辑。

有了 pyGlove,我们只需添加 pg.symbolize 装饰器即可:

import pyglove as pg
@pg.symbolize
class Component:def __init__(self, **kwargs): pass

现在,我们可以通过大量的说明符来查询和修改提示程序,就像使用 DOM 树一样。比方说,我们想把上面的程序转化为下面的程序:

6

请注意,我们现在问的是 "回答是否表示是?",而不是提供 "是 "和 "否 "的输出标签。为此,我们需要 (i) 更改指令文本,(ii) 删除第三个节点。有了 pyGlove,这就很容易了:

prompt.rebind({'children[1].text': 'Does the response mean yes?'})'children[1].text': 'Does the response mean yes?'})
prompt.rebind({'children[2]': pg.MISSING_VALUE})
print(prompt)

打印输出确认我们成功了:

Metaprompt(children = [0 : Paragraph(text = 'Instructions: '),1 : Paragraph(id = 'instructions',text = 'Does the response mean yes?'),2 : InputData(),3 : Paragraph(text = 'Output: ')]
)

就是这样!从根本上说,pyGlove 给了我们一种处理 Python 类(和函数)的方法,就像处理源代码一样,而且开销很小。现在,我们有了灵活且易于操作的表示法,让我们来使用它们吧。

等一下。我们现在可能有了表示和修改提示的方法,但还缺少一个自动优化提示的过程。

一旦厨师们了解了菜谱的抽象概念和组成部分,他们就会尝试多种变体,改进口味、成本或表现形式,直到感觉合适为止。要对提示抽象进行同样的处理,我们需要一种搜索算法、一个目标以及一组标注样本,这样才能知道我们是否取得了进展。

使用 SAMMO 调整指令

为了说明 SAMMO 的核心工作流程,我们现在将展示如何调整上面提示示例中的指令部分。一旦我们完成了这个玩具示例,我们就可以讨论更高级的应用,如 RAG 优化或压缩。

关键步骤如下:

  1. 确定起始提示
  2. 准备好数据--几百个带标签的示例就足够了。
  3. 确定目标
  4. 选择一组突变体
  5. 运行优化

步骤 1:定义开始提示

这一步我们在上文已经做得差不多了。SAMMO 期望使用一个函数,因此我们必须将其封装为一个函数。如果你想存储额外的信息,可以用 Callable 代替。我们还将把它封装在一个输出组件中以运行它。

def starting_prompt():instructions = MetaPrompt(Paragraph(text="Instructions: "),Paragraph(id="instructions",text="Does Speaker 2's answer mean yes or no?",),Paragraph(id="labels", text="Output labels: yes, no"),InputData(),Paragraph(text="Output: "),)return Output(instructions.with_extractor())

步骤 2:准备好数据

SAMMO 使用名为 DataTable 的简单数据结构将输入与输出(标签)配对。这将有助于我们进行评估和记账。

mydata = DataTable.from_records(records, # list of {"input": <>, "output": <>}# list of {"input": <>, "output": <>}constants={"instructions": default_instructions}, 
)

步骤 3:确定目标

我们感兴趣的是优化精确度,因此这就是我们下面要实现的目标:

def accuracy(y_true: DataTable, y_pred: DataTable) -> EvaluationScore:y_true = y_true.outputs.normalized_values()y_pred = y_pred.outputs.normalized_values()n_correct = sum([y_p == y_t for y_p, y_t in zip(y_pred, y_true)])return EvaluationScore(n_correct / len(y_true))

步骤 4:选择一组突变体

在这里,你可以尽情发挥自己的创造力。你可以实现自己的运算符来生成新的提示变体,也可以简单地依赖 SAMMO 提供的预置变异运算符。

在下文中,我们将采用后者,从一些标注的示例中混合使用转述和诱导指令,基本上实现了自动提示工程(APE)。

mutation_operators = BagOfMutators(starting_prompt=StartingPrompt(d_train),InduceInstructions({"id": "instructions"}, d_train),"id": "instructions"}, d_train),Paraphrase({"id": "instructions"}),
)

步骤 5:运行优化

runner = OpenAIChat(model_id="gpt-3.5-turbo-16k","gpt-3.5-turbo-16k",api_config={"api_key": YOUR_KEY},cache="cache.tsv",
)
prompt_optimizer = BeamSearch(runner, mutation_operators, accuracy, depth=6)
transformed = prompt_optimizer.fit_transform(d_train)

介绍性提示示例实际上取自 BigBench 含义任务,我们将用它来运行本实验。如果使用 100 个样本进行训练和测试,并以 48 个候选评估为预算进行优化,你会发现 SAMMO 将起始提示的准确率从 0.56 提高到了 0.77 - 提高了 37.5%。哪些指令效果最好?

...
Paragraph("Consider the dialogue, context, and background ""Consider the dialogue, context, and background ""information provided to determine the most suitable output label",id="instructions",
)
...

有趣的是,不同的 LLM 喜欢的指令大相径庭。如上所述,GPT-3.5 最喜欢通用指示。在相同的训练和预算设置下,SAMMO 选择的 Llama-2 最佳提示在指令部分使用了空字符串:

...
Paragraph("","",id="instructions",
)
...

实际操作: RAG 调整

现在,我们将展示如何将 RAG 管道转换为符号程序,并使用 SAMMO 对其进行调整。我们将使用语义解析作为应用任务,将用户查询转化为特定领域语言 (DSL) 结构,例如,查询某些数据库或调用外部 API。

为了创建起始提示,我们列出了所有运算符的列表,使用基于嵌入的检索器获取五个少量示例,然后指示 LLM 以与示例相同的格式输出答案。

class RagStartingPrompt:def __init__(self, dtrain, examples, embedding_runner):self._examples = examplesself._dtrain = dtrainself._embedding_runner = embedding_runnerdef __call__(self, return_raw=False):structure = [Section("Syntax", self._dtrain.constants["list_of_operators"]),Section("Examples",EmbeddingFewshotExamples(self._embedding_runner, self._examples, 5),),Section("Complete and output in the same format as above",InputData(),),]instructions = MetaPrompt(structure,render_as="markdown",data_formatter=JSONDataFormatter(),)  return Output(instructions.with_extractor(),on_error="empty_result",)

现在我们有了一个符号程序,让我们发挥创意吧。对于突变,我们探索:

  • 不同数量的少量示例
  • 少量示例的不同格式(XML、JSON、逐行格式
  • 是否提供有关 DSL 的附加信息
  • 显示输入输出对或输入输出组

使用这些示例和总共 24 个候选示例运行 SAMMO,我们可以看到一个明显的趋势。以下是四个不同 LLM 的三个不同数据集的测试集准确率。在绝大多数情况下,我们可以看到 SAMMO 可以大幅提升性能,即使是性能最高的 LLM 也不例外。

7

结论

将提示语转换为符号程序是一个非常强大的想法,可以探索可能的提示语和设置的巨大设计空间。就像专业厨师通过解构和重新诠释食谱来进行烹饪创新一样,符号编程也能让我们在自动提示工程中发挥同样的创造力和实验精神。

相关文章:

通过符号程序搜索提升prompt工程

原文地址&#xff1a;supercharging-prompt-engineering-via-symbolic-program-search 通过自动探索​​大量提示变体来找到更好的提示 2024 年 4 月 22 日 众所周知&#xff0c;LLMs的成功在很大程度上仍然取决于我们用正确的指导和例子来提示他们的能力。随着新一代LLMs变得越…...

js开启子线程及其使用

众所周知&#xff0c;js是单线程&#xff0c;但是可以开启子线程来帮忙处理一些数据&#xff0c;但是这个子线程是有限制的 1.必须是同源 2.完全受主线程控制 3.不能在子线程中操作dom节点 4.子线程没有window&#xff0c;可以使用self 5.等等 具体的查看官网 进程切换是要耗时…...

excel办公系列-图表元素及其作用

Excel图表元素及其作用 Excel图表由各种元素组成&#xff0c;每个元素都有其特定的作用&#xff0c;可以帮助我们更清晰地传达数据信息。下面将介绍Excel图表中常见的一些元素及其作用&#xff0c;并附上相关截图。 原始数据 月份 网站访问量 (万次&#xff09; 销售额 (万…...

rocketmq dashboard控制台中topic状态无法展示

现象 在使用rocketmq控制台查看topic状态和订阅状态时&#xff0c;出现错误和没有信息的情况。 原因 rocketmq控制台版本问题&#xff0c;最新版本为1.0.1&#xff0c;支持rocketmq5版本&#xff0c;如果使用rocketmq4版本的服务无法兼容对应的数据。同理1.0.0版本也无法兼容ro…...

GPT每日面试题-Typescript中type和interface的区别

充分利用ChatGPT的优势&#xff0c;帮助我们快速准备前端面试。今日问题&#xff1a;typescript中type和interface的区别? Q&#xff1a;如果在前端面试中&#xff0c;被问到typescript的type和interface的区别是什么&#xff0c;怎么回答最好&#xff1f; A&#xff1a;当谈…...

python数据分析——大数据伦理风险分析

大数据伦理风险分析 前言一、大数据伦理二、大数据技术伦理风险2.1算法安全性、可信赖性及稳定性风险及其应对2.2算法的可解释性风险及其应对2.3算法的决策不可预见性风险及其应对2.4数据收集与储存中的泄漏风险及其应对2.5案例&#xff1a;某大型电商平台内部员工涉嫌窃取50亿…...

配置 Trunk,实现相同VLAN的跨交换机通信

1.实验环境 公司的员工人数已达到 100 人&#xff0c;其网络设备如图所示。现在的网络环境导致广播较多网速慢&#xff0c;并且也不安全。公司希望按照部门划分网络&#xff0c;并且能够保证一定的网络安全性。 其网络规划如下。 PC1和 PC3为财务部&#xff0c;属于VLAN 2&…...

Python 植物大战僵尸

文章目录 效果图项目结构实现思路源代码 效果图 项目结构 实现思路 下面是代码的实现思路&#xff1a; 导入必要的库和模块&#xff1a;首先&#xff0c;我们导入了Python的os、time库以及pygame库&#xff0c;还有植物大战僵尸游戏中用到的各个植物和僵尸的类。 初始化游戏和…...

SpringBoot:实战项目TLIAS智能学习辅助系统1.1

SpringBootWeb项目 TILAS智能学习辅助系统 需求 部门管理 查询部门列表 删除部门 新增部门 修改部门 员工管理 查询员工列表(分页) 删除员工 新增员工 修改员工 准备工作 导入依赖 web(2.7.6) mybatis mysql驱动 lombok 准备好包结构 Controller->Servi…...

ubuntu-meta-22.04桌面版+ros2-humble 镜像

ubuntu-meta-22.04桌面版ros2-humble 镜像 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1PSBe4EqWch44OQUlkCCEig?pwdknty 提取码&#xff1a;knty 镜像文件较大&#xff0c;分成了两个压缩包&#xff0c;下载后直接解压ubuntu22.04-desk-meta-ros2-arm (…...

『大模型笔记』Code Example: Function Calling with ChatGPT

Code Example: Function Calling with ChatGPT 文章目录 一. Code Example: Function Calling with ChatGPT二. 参考文献一. Code Example: Function Calling with ChatGPT from openai import OpenAI from dotenv import load_dotenv import json# --------------------------…...

【智能算法应用】混合粒子群算法求解CVRP问题

目录 1.算法原理2.数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】粒子群算法&#xff08;PSO&#xff09;原理及实现 经典PSO算法用于连续空间优化问题&#xff0c;VRP问题为离散组合优化问题&#xff0c;涉及如何有效地分配一组车辆去访问多个客户点&…...

Python项目开发实战:飞机大战游戏(案例教程)

一、引言 飞机大战游戏是一款经典的射击类游戏&#xff0c;玩家需要驾驶飞机在空中与敌人进行战斗&#xff0c;躲避敌人的攻击&#xff0c;同时发射子弹消灭敌人。本文将详细介绍如何使用Python及其相关库来开发一款简单的飞机大战游戏&#xff0c;包括游戏的设计思路、开发过…...

音频压缩的方法有哪些?3种简单的压缩工具分享

音频压缩的方法有哪些&#xff1f;音频压缩是处理音频文件时的一个重要步骤&#xff0c;旨在减小文件大小&#xff0c;同时尽量保持原始音频的质量。随着数字媒体的普及&#xff0c;音频文件的大小成为了一个重要的考虑因素。通过有效的音频压缩技术&#xff0c;我们能够在保持…...

阿里云CentOS7 打开/关闭防火墙 开放端口

#查看防火墙状态# systemctl status firewalld #关闭防火墙# systemctl stop firewalld #打开防火墙# systemctl start firewalld #添加开放2375端口# firewall-cmd --add-port2375/tcp --permanent #重载入添加的端口# firewall-cmd --reload #查询2375端口是否开启成…...

React 组件性能优化

React 组件性能优化的核心是减少渲染真实 DOM 节点的频率&#xff0c;减少 Virtual DOM 比对的频率。 1. 组件卸载前进行清理操作 window 注册的全局事件, 以及定时器 useEffect(()>{return ()>{// do somethingclearTimeout(tiemr)window.removeEventListener(xxx, c…...

jvm 马士兵 01 JVM简介,class文件结构

01.JVM是什么 JVM是一个跨平台的标准 JVM只识别class文件&#xff0c;符合JVM规范的class文件都可以被识别 u1 是一个字节 u2是两个字节...

PostgreSQL自带的命令行工具02- createdb

PostgreSQL自带的命令行工具02- createdb 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777createdb 是 Postgr…...

软件设计师-重点的构造型设计模式

一、桥接模式&#xff08;Bridge&#xff09;&#xff1a; 意图&#xff1a; 将抽象部分与其实现部分分离&#xff0c;使它们都可以独立地变化。 结构&#xff1a; 适用性&#xff1a; 不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如&#xff0c;这种情况可能是…...

Java面试问题及答案

Java面试问题及答案 以下是几个Java面试中可能会问到的问题及其答案。 1. 解释Java中的多态性是什么&#xff0c;以及它是如何工作的&#xff1f; 问题&#xff1a; 在Java中&#xff0c;多态性是指允许不同类的对象对同一消息做出响应的能力&#xff0c;即同一个接口可以被…...

STM32 01

1、编码环境 1.1 安装keil5 1.2 安装STM32CubeMX 使用STM32CubeMX可以通过界面的方式&#xff0c;快速生成工程文件 安装包可以从官网下载&#xff1a;https://www.st.com/zh/development-tools/stm32cubemx.html#overview 安装完要注意更新一下固件包的位置&#xff0c;因为…...

学习笔记:【QC】Android Q - phone 模块

一、phone init 流程图 二、phone MO 流程图 三、phone MT 流程图 四、Log分析(MO_qcril_hal_分析) 1、RILJ请求dial enqueue进队列&#xff0c;QCRIL-hal pop出来处理&#xff0c;最后还是调用qmi_client_send_msg_async发送给modem 11-07 17:29:23.598 2758 2758 D RILJ …...

webscoket+webrtc实现语音通话

1.项目方案 前端采用webrtc创建音频上下文&#xff0c;后创建音频源输入和音频处理器&#xff0c;连接音频输入与处理器&#xff0c;处理器再连接到音频输出&#xff08;扬声器&#xff09;&#xff0c;再通过事件获取音频数据&#xff0c;把音频数据转换成字节数据通过webscok…...

PHP源码_众筹商城

众筹商城源码 众筹商品平台 商城加共识元富之路 网上商城众筹 前端是编译后的&#xff0c;后端PHP&#xff0c;带商城 运行截图 源码贡献 https://githubs.xyz/boot?app39 部分数据库表 CREATE TABLE ti_shopro_store (id int(11) NOT NULL AUTO_INCREMENT COMMENT ID,nam…...

智能小程序 Ray 开发——表单组件 Button 和 Checkbox 实操讲解

Button 多端按钮基础组件&#xff0c;可用于进行强交互的操作。 导入 import { Button } from ray-js/ray; 属性说明 属性类型默认值必填说明支持平台sizekeyof Sizedefault否按钮的大小涂鸦、微信typekeyof Typedefault否按钮的样式类型涂鸦、微信plainbooleanfalse否按钮…...

渗透之sql注入联合查询的注入

sql注入产生的原因&#xff1a; 由于程序过滤不严谨&#xff0c;导致用户有一些异常输入&#xff0c;最终触发数据库的查询。所以会出现sql注入这个问题。有些恶意的人就会利用这些信息导致数据库泄露。 注意&#xff1a;一般我们存在注入点我们会查询管理员的账号和密码&#…...

NLP transformers - 文本分类

Text classification 文章目录 Text classification加载 IMDb 数据集Preprocess 预处理EvaluateTrainInference 本文翻译自&#xff1a;Text classification https://huggingface.co/docs/transformers/tasks/sequence_classification notebook : https://colab.research.googl…...

QT 开发COM(ActiveX)组件基础介绍和方案验证

一、COM简介 1.1 COM是什么&#xff1f; COM&#xff0c;Component Object Model&#xff0c;即组件对象模型&#xff0c;是一种以组件为发布单元的对象模型&#xff0c;这种模型使各软件组件可以用一种统一的方式进行交互。COM 既提供了组件之间进行交互的规范&#xff0c;也…...

[1673]jsp在线考试管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 在线考试管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…...

每日一算法

问题 等待登机的你看着眼前有老有小长长的队伍十分无聊&#xff0c;你突然 想要知道&#xff0c;是否存在两个年龄相仿的乘客。每个乘客的年龄用 1个0 到 36500 的整数表示&#xff0c;两个乘客的年龄相差 365 以内 就认为是相仿的。 具体来说&#xff0c;你有一个长度为 n 的…...

ps怎么做网站分隔线/域名注册服务网站

题目 题目描述 给你两个二进制字符串&#xff0c;返回它们的和&#xff08;用二进制表示&#xff09;。 输入为 非空 字符串且只包含数字 1 和 0。 示例 1 输入: a “11”, b “1” 输出: “100” 示例 2 输入: a “1010”, b “1011” 输出: “10101” 提示 每个字符串…...

网站推广软文是什么/全网关键词搜索工具

github下载 adb 下载 brew install android-platform-toolsadb 配置; 设置里面, use detect adb location关闭并指定下载的adb 程序下载问题 The APK failed to install. Error: Could not parse error string可使用adb指令安装解决 网络问题 关闭模拟器并关闭平板wifi,…...

德格网站建设/网络营销大赛策划书

今天给大家分享一位Java程序员小伙去阿里应聘的经历&#xff01;从Java开发要掌握的技术来讲&#xff0c;前面已经说得差不多了。我主要想从面试者的角度谈一谈看法。如果是我面试&#xff0c;就给应聘者一个开放的项目&#xff0c;可以提供服务器端API或数据服务&#xff0c;限…...

b2b网站发布信息平台/公司网站推广方案

8 机器学习中的特征选择8.1 特征选择特征选择是机器学习实践中的一步&#xff0c; 帮你在所有特征中选择对结果贡献最多的特征。 显然&#xff0c; 使用不相关数据会减少模型的精确性&#xff0c; 尤其是线性算法&#xff1a;线性回归&#xff0c; 逻辑回归。为什么&#xff0c…...

wordpress去掉google/bt磁力搜索引擎索引

通过万岁&#xff01;&#xff01;&#xff01; 题目&#xff1a;给你一个数组&#xff0c;然后让你删除5%的小值&#xff0c;然后删除5%的大值&#xff0c;求最后的平均值。思路&#xff1a;排序&#xff0c;然后将前面的5%设置为0&#xff0c;然后后面的5%设置为0&#xff0…...

dede title 我的网站/百度问答官网

EPLAN Electric P8 2.7 win 10系统安装完后出现黄色Multiusb key 的处理方法。链接为安装包 链接&#xff1a;https://pan.baidu.com/s/1Pc7y5kPWMYSLYX8YTQEm1Q 提取码&#xff1a;of5w工具/原料win 10系统电脑EPLAN Electric P8 2.7下载完安装包后解压&#xff0c;解压完后…...