返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

构建企业级提示词工程

[复制链接]
链载Ai 显示全部楼层 发表于 前天 18:03 |阅读模式 打印 上一主题 下一主题

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;padding: 0px 0.2em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);">引言

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">今天的提示是与大型语言模型(LLM)互动的主要方式。提示需要根据用户需求进行调整,提供正确的背景和指导以最大限度地提高获取“正确”回应的可能性。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">这导致了提示工程[1]作为专业学科的兴起,在该领域中提示工程师系统地进行试验并记录其发现,从而得出能够引出“最佳”答复的“正确”提示。这些成功的提示列表随后被组织成一个具有高效重用功能的形式——称为提示库。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">不幸的是,梳理和维护高质量的提示库仍然极具挑战性。提示库的根本目标是在无需重复整个实验过程的情况下检索给定任务的最佳提示。然而,由于提示之间的重叠性,这种检索并不容易实现。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;padding-left: 8px;color: rgb(63, 63, 63);">问题陈述

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">让我们尝试通过内容写作领域(当今最具AI采用率的领域之一)中的几个示例来理解重叠提示的问题:

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">提示1:为一篇宣布八十年代主题咖啡馆开业的博客文章生成有吸引力的小引。突出氛围和菜单。使用友好的语气,以吸引老年客户。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">提示2:撰写一份不超过200字的新闻报导摘要,公告一个现代风格的主题酒吧开业情况。强调室内装潢和菜单内容。用友好的语言去打动年轻顾客。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">既然是两个提示都能生成经(人类)评审员批准的“良好”回应(甚至不考虑以LLM作为裁判的技术),就出现了问题——应该将哪个提示添加到提示库中?以下是至少四种选择:

    ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;color: rgb(63, 63, 63);" class="list-paddingleft-1">
  1. 1. 两者都加入,但是它们如此相似,这样一来在检索时很难区分。
  2. 2. 只选其中的一个,但这样会丢失每个提示所特有的上下文信息,例如报纸版面和博客文章的区别、老年客户与年轻客户的区别等;同样还包括对响应长度的限制条件(如第二个提示的要求)。
  3. 3. 两者都不加入。因为库中已经有一个涵盖类似范围的提示了。(这同样适用于LLM缓存)
  4. 4. 增加一个模板,该模板捕捉上述两个提示通用特征,并带有特定变量的位置符和值列表。比如生成两个示例提示的一个一般性摘要模板如下所述: 为一篇关于以下活动的文章生成具有吸引力的小引(导语)。强调主题风格并使用指定的语气限制回答字数。
  • • 发布类型:[报纸、博客文章、报道…]
  • • 活动:[咖啡馆或餐厅的开启……]
  • • 风格主题:[氛围,装饰品,菜单….]
  • • 用语风格:[友好的,正式的,信息性的...]

这是推荐的方法,并在下一节中,我们将展示如何借助像LangChain这样的框架通过提示模板来组织提示,以及哪些类型的模板受到支持。

提示模板

LangChain 提供了以下预定义的提示模板类[2]:

  • • PromptTemplate 是默认模板。
  • • 用于建模聊天消息的ChatPromptTemplate。
  • • 用于应用少样本学习技术的FewShotPromptTemplate

可以合并模板,例如将ChatPromptTemplate与FewShotPromptTemplate合并以满足使用场景。

让我们从最基本的PromptTemplate:开始

fromlangchain_core.promptsimportPromptTemplate
prompt_template = PromptTemplate.from_template(
"Generate an engaging abstract for a {post} on the following {event}."
)
prompt_template.format(post="blog", event="opening of cafe")

它基本上适用于将提示符建模为带有变量(占位符)的字符串(句子),就像我们在前一节中考虑的示例提示那样。

如果你曾与之前的聊天机器人(pre-ChatGPT)合作,使用过诸如IBM Watson Assistant[1]、AWS Lex[2]、Google Dialogflow[3]等工具,这些概念可能对你来说是熟悉的。它们涉及意图(intents)、用户表达(utterances)和实体(entities)。这类引导式的聊天机器人需要通过提供一组提示语句、相应变体及其对应回复来进行训练。提示语可以按意图进行分类。在聊天机器人的术语中,用户提出的相同问题的不同表述方式称为用户表达或话语。最后,实体指的是特定领域的词汇表,也就是变量允许值的列表。

接下来,我们考虑ChatPromptTemplate,它可以建模用户和AI系统之间的多步骤对话。可以指定如 user(用户)、assistant(助理)、system(系统)等角色。允许的角色取决于底层大语言模型支持的类型。例如,OpenAI聊天完成API[4]允许指定以下角色:AI 助理、一个或系统的人。这些角色为对话提供了额外的背景信息,并有助于 LLM 更深入地理解对话。

fromlangchain_core.promptsimportChatPromptTemplate
chat_template = ChatPromptTemplate.from_messages(
[
("system","You are a knoweldgeable AI bot. You are called {name}."),
("human","Hi, how are you today?"),
("ai","I'm doing great, thanks! How can I help you?"),
("human","{user_input}"),
]
)
messages = chat_template.format_messages(name="Emily",
user_input="How should I call you?")

最后,让我们考虑FewShotPromptTemplate类,该类通过首先使用样本问题-响应词典训练大型语言模型(LLM),然后提出实际问题来进行少量学习。

fromlangchain_core.prompts.few_shotimportFewShotPromptTemplate
fromlangchain_core.prompts.promptimportPromptTemplate
examples = [
{"question":"What is the second largest ocean on Earth?","answer":"Atlantc Ocean"},
{"question":"What is the tallest mountain in Asia?","answer":"Mount Everest"},
]
example_prompt = PromptTemplate(
input_variables=["question","answer"], template="Question: {question}\n{answer}"
)
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix="Question: {input}",
input_variables=["input"],
)
print(prompt.format(input="What is the tallest mountain in Africa?"))

基于强化学习的提示存储管理

LangChain的提示模板是将提示模板化和组织起来的一个很好的解决方案。然而,当处理包含100多个提示(模板)的企业级提示库时,很快就变得很难以手动方式管理它们。对于每一个新的(已批准且推荐的)提示,

  1. 1. 提取提示模板和实体值。
  2. 2. 确定与现有提示模板的重叠部分。
  3. 3. 如果不存在覆盖提示模板,则将模板添加到提示存储中。
  4. 4. 如果存在覆盖模板,但覆盖率低于某个阈值(例如70%),可能需要针对缺失的实体和计数值来调整该模板。

提示存储的精选过程如下图所示:

图:Prompt库策划流程

例如,给定下面的(现有的)提示模板

Generate an engaging abstract for aposton the followingevent. Highlight thetheme. Use the specifiedtoneof voice_. Post (type):_ [newspaper, blog, article, ...]Event:[opening of cafe, restaurant, diner, ...]Theme:[ambience, menu]Tone:[informative, formal]

新的提示词

Generate an engaging abstract of no more than 200 words for a newspaper post announcing the opening of a modern-themed cafe. Highlight the decor and menu. Use a friendly tone to appeal to a young customer base.

有必要对现有的提示模板进行适应性修改,增加200字数限制,并添加以下实体值:主题:[氛围、装饰、菜单];语气:[友好、信息丰富、正式]

在接下来的内容中,我们将概述一个基于用户反馈的强化学习方法来实现提示库维护自动化。

该RL模型并不旨在从零开始建立提示库,而是利用带有用户反馈的提示来自动生成并优化提示库内容。

我们方法的核心是一个评分模型,它被训练用来根据用户的反馈对提示-响应元组进行打分。这个模型预测出来的分数作为强化学习代理的奖励。策略学习离线实现,借助于一个用户模拟器,该模拟器利用提示库存中的模板生成预设的提示实例来工作。策略学习使用带有ε贪婪探索机制的深度Q网络(DQN)代理执行,并且能够有效包含超出范围提示的备用响应。

强化学习模型

RL模型的架构如下图所示.


基于RL的提示存储库管理架构(作者供图)

RL模型的关键组件是:NLU单元,用于在预热阶段最初训练RL代理;用户模拟器,从提示数据库(Prompts DB)中随机抽取候选提示以添加到新的用例、场景等中;基于用户的反馈对提示进行训练的评分模型以及基于深度Q网络(DQN)的RL代理。

自然语言理解

自然语言理解(NLU)组件是一个意图识别的NLU,该NLU使用提示库中现有的(且已批准的)提示模板进行训练。为了简化问题,我们仅在此工作中考虑了LangChain的基本PromptTemplate,并使用Rasa[5]开源NLU和TensorFlow[6]管道。然而,强化学习方法与所选择的NLU独立,并且可以轻松地扩展到如Google DialogFlow、IBM Watson或Amazon LEX等其他NLU引擎。

用户反馈

我们在开发实际内部聊天机器人的过程中获得的用户反馈为基础进行了工作。该聊天机器人的范围是回答员工关于办公大楼设施、人力资源政策和福利等问题的查询。

所有参与反馈过程的十位用户均被告知,他们的反馈将用于提高提示的质量。用户对每个提示-响应对给予了二元评价。因此,历史数据包含以下格式的四元组:(提示、响应、NLP置信度水平和用户反馈)。

强化学习奖励函数

自然语言理解(NLU)性能评估是计算语言学中的一个长期存在的问题。从机器翻译中借鉴的评估指标在短句上表现不佳,例如我们这种情况下的回复(模板)。另一方面,用户(人工)审核提示和响应现在被认为是评估质量、准确性、相关性等事实上的标准——尽管这些评分通常难以收集且成本高昂。

为了以离线强化学习的方式应用用户反馈,我们使用了一个能够为新(未见过的)提示-响应元组建模二进制反馈的得分模型。句子的向量表示通过TensorFlow Hub提供的通用句编码器计算得出。

给定上述条件,评分模型学习将提示和响应的向量表示投影到线性变换的空间中,使得相似的向量表示给出较高的分数。

为了训练强化学习奖励模型,优化是基于模型预测与人工反馈之间的平方误差损失以及L2正则化来进行的。评估该模型时,将预测分数转换为二进制结果并与目标(用户反馈)进行比较。对于那些具有被识别模板且同时包含正面反馈和接近1的目标语言理解置信度水平的提示对,我们执行数据增强,将低分分配给提示与备选意图组合。

基于DQN的强化学习智能体策略学习

RL智能体使用带有DQN架构的Q学习算法来学习策略。我们采用文献[6]提出的方法,利用一个完全连接的网络,该网络由一个经验回放池缓冲区提供,其中包含提示和响应的一_hot表示以及对应的奖励。

在预热阶段,DQN 使用 NLU 的置信度级别对 NLU 进行训练。每当状态-动作元组的置信值超过阈值时,通过将给定状态及所有其他可用操作的权重设为零来增强 DQN 训练集。因此,在 RL 训练开始时,RL 代理的表现与 NLU 单元类似。

在强化学习训练过程中,我们使用了epsilon(ε)-贪婪探索策略,根据概率ε随机选择动作进行探索。我们采用了一个随时间变化的ε值,在训练初期使ε为0.2,而在最后一个时期使其降至0.05以促进探索。

在一个纪元中,我们模拟一个大小为_n-episodes_(在我们的实验中范围从10到30)的对话批次,并使用三元组_(s_t, a_t, r_t)_填充经验回放缓存。缓存具有固定大小,在强化学习代理性能首次超过指定阈值时刷新。在一个纪元中的那些状态-动作元组获得大于50%奖励的情况下,我们通过将分配给当前状态的任何其他动作赋零奖励来进行数据增强。

结论

在本文中,我们重点关注了构建企业提示库所面临的挑战。不幸的是,由于提示的重叠性质,整理和维护一个提示库仍然是一项具有挑战性的任务。对于每个新的候选提示(需要添加到提示库中),我们需要回答以下问题:

  • • 我们应该直接将其添加到提示存储库中吗?但如果这样做,提示获取过程会变得复杂。
  • • 我们如何解决与提示库中现有提示的重叠/冲突?在这些情况下,我们如何调整现有的提示以覆盖新候选提示的范围?

我们在详细讨论中强调了以提示模板的形式组织提示的结构化方法。我们给出了LangChain支持的提示模板类型的具体示例。最后,我们展示了如何使用带有用户反馈的强化学习半自动地进行提示库管理过程。

今后,需要更好的工具和策略来解决提示范围冲突的问题,特别是在多领域提示库的情况下,各自用户组(业务单位)对同一提示的实用性持有不同的观点。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ