【NLP笔记】大模型prompt推理(提问)技巧

news2024/9/22 15:22:46

文章目录

  • prompt概述
  • 推理(提问)技巧
    • 基础prompt构造技巧
    • 进阶优化技巧
    • prompt自动优化

参考链接:

  • Pre-train, Prompt, and Predict: A Systematic Survey of
    Prompting Methods in Natural Language Processing
  • 预训练、提示和预测:NLP中提示的系统综述

随着LLM时代的到来,通过prompt直接对话语言模型,得到预期结果,解析后用于实际应用的模式也随之推广。那么什么是prompt,如何用好prompt去激发语言模型的潜力,成为了预训练语言模型底座+prmpt-tuning范式的重要议题。

prompt概述

prompt通俗来说就是通过设计自然语言提示词,让预训练的语言模型“回忆”预测出学习到的内容,并对提示词的问题做出解答,具体步骤如下:

  1. 设计模版:设计一个自然语言模版,该模版中一个位置用于存放输入文本[X],一个位置用于存放输出文本[Z];根据模版构造问答样本,如设计模版为"[X] The movie is [Z]“,输入内容[X]为"I love this movie.”,预测结果的位置为[Z]存放的位置,通过这样的模式去构造样本;
    • 中间位置的为完形填空prompt,还有前缀、后缀的prompt形式;
    • prompt并非局限于自然语言,也可以是向量化后的token;
    • [X] 和 [Z] 槽位数量可以根据任务需要灵活调整;

在这里插入图片描述

  1. 搜索回答:这一步主要经大模型推理预测找到得分最高的结果 z ˆ zˆ zˆ。通过预训练的大模型可能会有一组允许的 Z Z Z(生成任务可以是任意文本,分类任务可以是一组单词)被预测出来,函数 f f i l l ( x ′ , z ) f_{fill}(x', z) ffill(x,z) x ′ x' x为根据模版构造的未填充结果的文本)表示用潜在回答 z z z填充提示 x ′ x' x中的位置 [Z],得到的结果一般被称为 filled prompt,如果填充的是正确回答,则被称为 answered prompt,具体表现为,通过使用预训练的大模型计算会从相应filled prompt 从可能的回答集合 Z Z Z中找出概率最大的结果 z ˆ zˆ zˆ,得到answered prompt;
    在这里插入图片描述
  2. 映射回答:最后,基于得分最高的回答 z ˆ zˆ zˆ 到得分最高的输出 y ˆ yˆ yˆ,尤其是在分类任务中需要进行这样的结果映射(比如excellent、fabulous、wonderful 等近义词可以映射到某一情感类别);

推理(提问)技巧

prompt采用完形填空、前缀还是后缀的形式,是预训练底座或者微调时需要考虑的,当前就总结基于大模型完成推理(提问)时,该如何设计prompt以及使用什么样的技巧才能更好地激发大模型的潜能。

基础prompt构造技巧

当提问的方式与大模型的语料库更接近时,模型的预测效果可能会更好,不过大多数大模型的语料库都是非公开的,好在都是采用类似的模版设计,因此能够总结出一定的规律。
想要在推理时得到较理想的预测结果,结合很多prompt经验来看,一个合理的架构就包含了构造prompt所需的技巧,下面介绍一个ChatGPT3官方提出的prompt构造模版CRISPE(Capacity and Role、Insight、Statement、Personality、Experiment),具体为:

构造步骤技巧描述示例
Capacity and Role指定角色和能力“假设你是一个机器学习架构开发专家,并且还是一个资深博客作家。”
Insight给定一些背景信息“博客的受众是有兴趣了解机器学习最新进展的技术专业人士。”
Statement说明任务目标“全面概述最流行的机器学习框架,包括它们的优点和缺点。包括现实生活中的例子和案例研究,以说明这些框架如何在各个行业中成功使用。”
Personality控制输出格式与风格“在回复时,请使用 Andrej Karpathy、Francois Chollet、Jeremy Howard 和 Yann LeCun 的混合写作风格。”
Experiment指定输出结果的要求,如单输出/多输出“给出多个输出示例”

上述模版包含了很多构造prompt的技巧,不同的模版侧重的技巧可能有差异,但是都是可以用来尝试的范式,其他更多的模版可以参考:9个prompt构造模版范式;

还有很多prompt的设计技巧,避免模型出现幻觉等,更好地得到目标输出结果,比较基础简单的技巧如:

  • 提供更多的细节/背景信息;
  • 描述更清晰,避免模糊的表达;
  • 多尝试不同的prompt构造范式,选取最适合任务的一种提问方式;
  • 采用效果好的prompt范式,多次调用模型,选出投票结果(self-consistency);
  • 把单个问题拆分成多个子问题,一步一步地得到最终结果(least to most);
  • 知识增强,通过检索引入外部知识,构造prompt,提升效果(RAG,Retrieval Augmented Generation);
  • 把问题拆分成不同的问题后,逐步进行提问(self-ask)等;
# 采用langchain生成self-ask示例
# pip install langchain
# pip install openai
# pip install google-search-results

import os
os.environ['OPENAI_API_KEY'] = str("xxxxxxxxxxxxxxxxxxxx")
os.environ["SERPAPI_API_KEY"] = str("xxxxxxxxxxxxxxxxxxxx")

from langchain import OpenAI, SerpAPIWrapper
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType

llm = OpenAI(temperature=0)
search = SerpAPIWrapper()
tools = [
    Tool(
        name="Intermediate Answer",
        func=search.run,
        description="useful for when you need to ask with search",
    )
]

self_ask_with_search = initialize_agent(
    tools, llm, agent=AgentType.SELF_ASK_WITH_SEARCH, verbose=True
)
self_ask_with_search.run(
    "What is the hometown of the reigning men's U.S. Open champion?"
)
# 输出self-ask示例
#> Entering new AgentExecutor chain...
# Yes.
# Follow up: Who is the reigning men's U.S. Open champion?
# Intermediate answer: Carlos Alcaraz
# Follow up: Where is Carlos Alcaraz from?
# Intermediate answer: El Palmar, Spain
# So the final answer is: El Palmar, Spain
# > Finished chain.
# El Palmar, Spain

更多技巧可以参考以下内容:

  • OpenAI官方技巧教程
  • Reasoning with Language Model Prompting: A Survey
  • Awesome-Prompt-Engineering
  • 12 Prompt Engineering Techniques

如果模型的参数是可以通过入口传递的,也可以通过参数设置调整模型的预测结果:

  1. 温度系数(Temperature):控制模型输出随机性的参数。它影响模型在选择下一个词时的确定性,越接近1时模型的输出越随机;
  2. 多样性(top p):采样策略,模型仅从累计概率超过指定阈值p的最可能的词中进行选择。设置 top-p 为0.9,模型将从概率最高的一小部分词中选择,这些词的累计概率加起来接近0.9。;
  3. 重复惩罚(penalty):控制模型重复内容的输出,在长篇回答或生成文章时,使用重复惩罚可以帮助减少冗余和重复。

进阶优化技巧

上面提到的链接里有很多更细节/高阶的优化技巧,下面主要是从两种现在应用比较广泛的范式出发来介绍进阶的优化技巧,能更好地解决模型产生幻觉的问题。

把问题拆分成一步一步的小问题,并逐步进行解答,直到得到最终的目标结果。中间过程结合RAG,就能够产出更稳定、准确性更高的模型预测结果;

现在又很多AI-Agent(如:LangChain)集成了这些大模型推理优化技巧,还包含很多底层数据处理和检索等能力,可以协助使用者更好地进行大模型应用,提升模型的预测效果;

  • CoT
    论文链接:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
    是一种引导大模型进行任务分解的提问方法,作法是给出任务分解的少量示例,利用大模型的上下文学习能力(in-context learning)引导模型进行任务拆解,并得到目标结果,如图所示:
    在这里插入图片描述
  • ReAct(Reason+Act)
    论文链接:React: Synergizing Reasoning and Acting in
    Language Models
    引导大模型将问题进行更细致的拆分,在不同的子问题阶段拆分出Thought、Act和Observation三步,分步骤去检索/LLM推理并解答每个子步骤的问题,把各个问题的流程拼接成大模型的最终输入,让模型更有规划地去解决目标问题;
    在这里插入图片描述
  • ReWOO(Reasoning WithOut Observation)
    论文链接:ReWOO: Decoupling Reasoning from Observations
    for Efficient Augmented Language Models
    去掉了ReAct处理手段中的Observation阶段,并且把Thought、Act转换成Planner、Worker和Solver三个阶段,把问题拆分成不同的子问题(Planner),根据子问题去检索/LLM推理对应的结果(Worker),拼接各个子问题的问答,输入给大模型得到目标问题的预测结果;
    在这里插入图片描述
  • ToT(Tree of Thought)
    论文链接:Tree of Thoughts: Deliberate Problem Solving
    with Large Language Models
    ToT是结合了多种优化技巧的一种优化方案,在解决复杂问题时具有更大的优势。CoT是基于问题将问题划分成多个子步骤,并通过检索或者向大模型提问的方式得到各个步骤的结果,而CoT则是在会基于初始问题拆分出多个一级问题,每个问题会通过检索/LLM推理的方式解决,以此类推,就可以得到一颗树结构,最终的结果通过广度优先搜素、深度优先搜索等方式来拼接每一步的内容,最终输入给大模型得到目标答案;
    在这里插入图片描述
  • GoT(Graph of Thought)
    论文链接:Graph of Thoughts: Solving Elaborate Problems with Large Language Models
    在ToT的基础上引入了循环refine的结构,特定节点上可以想循环神经网络一样不断更新结果,使得整个过程的调整空间更大;
    在这里插入图片描述

prompt自动优化

还有一些转为优化prompt设计的架构,可以帮你优化提问的文本内容:

  • AutoPrompt:Eliciting Knowledge from Language Models with Automatically Generated Prompts
  • PromptAgent: Strategic Planning with
    Language Models Enables Expert-Level
    Prompt Optimization
  • Guiding Large Language Models via Directional Stimulus Prompting
  • Synthetic Prompting: Generating Chain-of-Thought Demonstrations for Large Language Models

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1552392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

植物大战僵尸Javascript版web游戏源码

源码介绍 植物大战僵尸Javascript版web游戏源码,非常强大,1比1还原电脑版植物大战僵尸游戏,带背景音乐,玩法和原版一模一样。 源码截图 下载地址 https://download.csdn.net/download/huayula/89048275

UE RPC 外网联机(2)

外网联机配置测试 一、网络配置 开放外网端口开放端口是为了可以进行外网访问;端口包含一个预案管理服务器端口和多个预案服务器端口;(预案管理服务器类似于大厅,预案服务器类似于房间,大厅管理多个房间;) (1)预案管理服务器端口;(如:23001) (2)预案服务器端口…

UDP send 出现大量“Resource temporarily unavailable”

背景 最近排查用户现场环境,查看日志出现大量的“send: Resource temporarily unavailable”错误,UDP设置NO_BLOCK模式,send又发生在进程上下文,并且还设置了SO_SNDBUF 为8M,在此情况下为什么还会出现发送队列满的情况…

利用R语言和curl库实现网页爬虫的技术要点解析

R语言简介 R语言是一种自由、跨平台的编程语言和软件环境,专门用于统计计算和数据可视化。它具有丰富的数据处理、统计分析和图形展示功能,被广泛应用于数据科学、机器学习、统计建模等领域。 R语言技术优势 丰富的数据处理功能: R语言拥有…

echarts 3D示例 echart, echarts-gl

echarts官网有很多的炫酷的3D模型 来尝试实现下&#xff0c;使用原本的柱状图或者折线图代码创建echarts示例,使用cdn的方式引入echarts <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewp…

windows10搭建reactnative,运行android全过程

环境描述 win10,react-native-cli是0.73&#xff0c;nodeJS是20&#xff0c;jdk17。这都是完全根据官网文档配置的。react-native环境搭建windows。当然官网文档会更新&#xff0c;得完全按照配置来安装&#xff0c;避免遇到环境不兼容情况。 安装nodeJS并配置 这里文档有详…

微信小程序更换头像的功能

微信小程序开发&#xff0c;个人中心中更换头像的更能使用频率很高&#xff0c;这里记录下实现方式&#xff1a; <view class"setting-list avatar-container"><text>头像</text><view class"avatar"><button hover-class"…

GNU Radio之OFDM Carrier Allocator底层C++实现

文章目录 前言一、OFDM Carrier Allocator 简介二、底层 C 实现1、make 函数2、ofdm_carrier_allocator_cvc_impl 函数3、calculate_output_stream_length 函数4、work 函数5、~ofdm_carrier_allocator_cvc_impl 函数 三、OFDM 数据格式 前言 OFDM Carrier Allocator 是 OFDM …

设计模式 - 简单工厂模式

文章目录 前言 大家好,今天给大家介绍一下23种常见设计模式中的一种 - 工厂模式 1 . 问题引入 请用C、Java、C#或 VB.NET任意一种面向对象语言实现一个计算器控制台程序&#xff0c;要求输入两个数和运算符 号&#xff0c;得到结果。 下面的代码实现默认认为两个操作数为Inte…

VsCode的json文件不允许注释的解决办法

右下角找到注释点进去 输入Files: Associations搜索出此项 改为项为*.json值为jsonc保存即可 然后会发现VsCode的json文件就允许注释了

ArcGIS制作风向频率玫瑰图

风玫瑰图是气象科学专业统计图表,用来统计某个地区一段时期内风向、风速发生频率,又分为“风向玫瑰图”和“风速玫瑰图” ;因图形似玫瑰花朵,故名。风玫瑰图对于涉及城市规划、环保、风力发电等领域有着重要的意义。风玫瑰图能够直观的显现某地区不同方位风向的频率特征,进…

uniApp使用XR-Frame创建3D场景(8)粒子系统

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用 本片我们详细讲解一下xr-frame的粒子系统 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{{sec8}}"><xr-asset-load t…

怎样去保证 Redis 缓存与数据库双写一致性?

解决方案 那么我们这里列出来所有策略&#xff0c;并且讨论他们优劣性。 先更新数据库&#xff0c;后更新缓存先更新数据库&#xff0c;后删除缓存先更新缓存&#xff0c;后更新数据库先删除缓存&#xff0c;后更新数据库 先更新数据库&#xff0c;后更新缓存 这种方法是不推…

Spring Boot 防护 XSS + SQL 注入攻击

XSS跨站脚本攻击 ① XSS漏洞介绍 跨站脚本攻击XSS是指攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web里面的Script代码会被解析执行&#xff0c;从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击&#xff01; ② XSS…

Linux:Jenkins:参数化版本回滚(6)

上几章我讲到了自动集成和部署 Linux&#xff1a;Jenkins全自动持续集成持续部署&#xff08;4&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136977106 当我们觉得这个页面不行的时候&#xff0c;需要进行版本回滚&#xff0c;回滚方法我这里准备了…

康耐视visionpro-CogAcqFifoTool工具详细说明

CogAcqFifoTool操作说明&#xff1a; ① 打开工具栏&#xff0c;双击或点击鼠标拖拽 添加CogAcqFifoTool ②.从图片采集设备/图像采集卡列表里选择对应的相机&#xff0c;视频格式选择图像格式。 Mono表示黑白图像&#xff0c;RGB表示彩色相机。点击初始化取相初始化相机。 ③…

提升K8S故障排除效率:详解Pod内抓包的高效策略!

在Kubernetes环境中&#xff0c;故障排除是管理者日常工作中不可或缺的一部分。随着容器化应用的广泛采用&#xff0c;需要一种高效的方法来诊断和解决Pod内部的问题。本文将重点介绍如何利用抓包技术提升Kubernetes环境中Pod内部故障排除的效率。 为什么需要Pod内抓包 在Kube…

Hadoop面试重点

文章目录 1. Hadoop 常用端口号2.Hadoop特点3.Hadoop1.x、2.x、3.x区别 1. Hadoop 常用端口号 hadoop2.xhadoop3.x访问HDFS 端口500709870访问 MR 执行情况端口80888088历史服务器1988819888客户端访问集群端口90008020 2.Hadoop特点 高可靠&#xff1a;Hadoop底层维护多个数…

软件概要设计说明书word原件(实际项目)

一、 引言 &#xff08;一&#xff09; 编写目的 &#xff08;二&#xff09; 范围 &#xff08;三&#xff09; 文档约定 &#xff08;四&#xff09; 术语 二、 项目概要 &#xff08;一&#xff09; 建设背景 &#xff08;二&#xff09; 建设目标 &#xff08;三&a…

c语言数据结构(9)——插入排序、希尔排序

欢迎来到博主的专栏——C语言数据结构 博主ID&#xff1a;代码小豪 文章目录 排序插入排序希尔排序 排序 现在有N个数据的序列&#xff0c;其对应的序列号为[r1 ,r2 ……rn];将该序列对应的数据[k1 ,k2 ……kn]排成满足递减或递减的序列的操作称为排序 插入排序 玩过斗地主…