做大模型产品,如何设计prompt?

2024-04-25 14:04

本文主要是介绍做大模型产品,如何设计prompt?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

做GenAI产品,除了要设计好的AI任务流程,合理的拆分业务以外,最重要的就是写好prompt,管理好prompt,持续迭代prompt。

prompt一般有两种形式:结构化prompt对话式prompt

结构化prompt的优点是通过规范的结构把任务介绍得很清楚,缺点就是往往很长,比较复杂。而对话式prompt更加简单,更符合日常的说话习惯,缺点是难以一句话描述清楚任务,最后得不到满意的结果,需要进行多轮对话才能获得最终结果。

两种prompt都有自己的适合场景,结构化的prompt更合适用来内置到产品工作流中,由开发者编写、维护,非对话类AI产品基本采用的就是这种复杂的prompt形式。对话式prompt就合适用在chatbot场景,直接由用户发出。

关于对话式prompt,关键是引导用户持续对话下去,很多时候,用户其实是不知道怎么提问的,我们可以通过搜索query推荐策略来给用户推荐话题相关的prompt,当然也可以把上下文丢给大模型并让模型针对上面的对话提出x个最相关的问题。

如果大家对推荐query感兴趣(评论留言),后面我将单独写一篇文章,本文主要关注非对话类(即“任务型”)AI产品的设计,因此下面着重介绍下结构化prompt的设计思路。

1、结构化prompt

结构化prompt一般可以包括以下几个部分:

  • 定义角色
  • 介绍背景和输入的数据格式
  • 提出任务(可能会有多个任务)
  • 执行所有任务的步骤
  • 定义输出格式
  • 给定输出例子

这是一个结构化prompt的大概框架,这个框架可以采用markdown来描述。结构化prompt有两个很关键的地方需要注意,第一个是多任务,第二个就是输出格式的控制。

  • 关于多任务:首先,一定要明白在一个prompt里面内置多个任务,绝对不是一个好的选择,除非你有强烈的这样做的理由。但是选择做多任务可以「降低成本」,我相信对大多数独立开发者来说,都是重要的事情。
  • 如果在一个prompt同时执行「总结章节」,「抽取highlight」,「抽取关键字」等任务,就是为了让这些事情只需要输入一遍transcript就可以同时获取这些结果。如果单独执行每一个任务,那就需要把相同的transcript数据输入LLM多次,这将会多消耗数倍的成本。
  • 但一定要明白,多任务无疑增加了LLM执行的复杂度,这并不符合「尽量给LLM简单、明确、较小的任务的原则」。经过测试,多任务执行的结果质量赶单任务是有差距的,这就需要不断的打磨和权衡吧。
  • 关于输出格式控制:由于LLM总结结果是需要在任务型产品页面上进行结构化展示,并不是chatbot那样直接输出给用户,所以这类产品对LLM的输出格式就需要严格定义,并且希望LLM能够稳定且正确的输出。对于程序员来说,一般会选择json作为输出。但考虑到LLM的输出可能不稳定,且偶尔输出的json可能是非法的,这种情况下只能重试LLM,导致浪费token,增加成本。因而,建议选择LLM的输出格式为markdown,并通过以下几点来控制输出,减少重试LLM。
  1. prompt中提供输出示例
  2. 输出格式使用简单的markdown语法,自己解析markdown
  3. 借助编程做好容错处理

2、prompt管理

我们采用模板技术来定义prompt,然后通过模板变量去控制prompt,比如多语言等。使用模板来管理prompt后,就不需要为不同的情况都写一份prompt,只需要抽象好prompt模板+模板变量即可。

3、prompt测试

可以在大模型第一梯队或者专门的prompt playground上测试:

  • Open AI playground
  • Google AI studio
  • Knit - The best beta AI playground for prompt developers

在调试prompt的时候,温度(temperature)应该是最常用的一个选项。也就是设置不同的温度,可能会得到不同的效果。像总结文章这种需求,需要基于原文的事实,那最好是温度设置低一些,倾向0都可以。温度设置得很高,大于1,LLM就会更大概率做自由发挥了。还是看自己的业务场景,以及更多的测试。

4、prompt迭代

在开发AI产品的时候,不要纠结一步到位写好prompt,还是需要将重心放到完成整个业务流程和功能上。prompt的编写也和代码一样,需要持续的迭代、优化。所以,需要好的prompt管理方式,方便持续的迭代、测试改进。

虽然对prompt不断地打磨,调试,并不是一件roi很高的事情,但有时候你又不得不做。

5、实战示例

比如我想做一个文章阅读助手的任务型产品,你可以参考上述结构化prompt的要素来设计prompt模版:

你是一个文章阅读助手,我会给你一个文章链接,请根据以下步骤输出markdown格式的内容:

一、我们一步一步思考,阅读我提供的内容,并做出以下操作:
1、提取文章的元数据
- 标题:
- 作者:
- 标签:(阅读文章内容后给文章打上标签,标签通常是领域、学科或专有名词)
2、一句话总结这篇文章;
3、总结文章内容并写成摘要;
二、精读文章内容,并作出以下操作:
1、请详细地列举文章的大纲,并叙述大纲中每一部分的内容,
2、总结文章的结论;
3、列举读这篇文章,我可以学到哪些知识?
三、好的,接着
1、提取文章中的金句;
2、这篇文章里,作者有哪些独到的见解?

为你提供的文章链接为:{url}

由于国内月之暗面的kimi模型在阅读长文本上表现很好,我在kimi chat上测试了一下,能够比较好满足我们结构化的要求(当然如果输出的格式不满足我们的要求,在prompt设计时可以把预期的示例加上)。

最后,必须强调下,做任务型AI产品最好选择那些在chat bot中很难满足的场景或工作流,否则一旦用户掌握了在chat中使用prompt的方法,任务型AI产品的价值很快就被对话产品覆盖掉

这篇关于做大模型产品,如何设计prompt?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934886

相关文章

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

Java领域模型示例详解

《Java领域模型示例详解》本文介绍了Java领域模型(POJO/Entity/VO/DTO/BO)的定义、用途和区别,强调了它们在不同场景下的角色和使用场景,文章还通过一个流程示例展示了各模型如何协... 目录Java领域模型(POJO / Entity / VO/ DTO / BO)一、为什么需要领域模

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA