一. 什么是Prompt Template
我们或多或少都用过一些生成式AI的工具,比如chat gpt。想象一下如果我们应用gpt在我们的salesforce的平台中,我们可以想象中很多的场景。比如:
我是一个酒店前台。客人定了我们公司的酒店,我给客户发送一下欢迎预定的邮件,内容包括预订信息,酒店地址,可能增加一些比如天气预报或者四周游玩的内容。我们可以将这些关键信息发送给gpt,然后gpt返回给我们一个草稿版的邮件,我们review完成觉得不错进行发送。
我是一个销售人员,有一个opportunity我刚接手,我想了解一下这个opportunity的一览信息的整理/总结。
我是一个客服,针对客户的case和客户多次沟通记录了很多的comment,我想快速对这些comment进行整理。
我是一个AE,我有一个潜在客户,我希望通过邮件向他推销我们公司的产品以便更好的宣传以及促成潜在的机会。
场景很多我们可以自行的头脑风暴。我们以场景4进行举例,demo来自官方trailhead进行简单修改。
复制代码
You are an account executive named York Zhang from a company named XXX. You are writing to Tom, who is a director at YYY. They have been a customer of yours since 2024/10/1.
You are attempting to persuade Tom to sign up for "Dream It Possible", which is described as
"I will run, I will climb, I will soar
I'm undefeated, ooh
Jumping out of my skin, pull the chord
Yeah I believe it, ooh
The past is everything we were
Don't make us who we are
So I'll dream, until I make it real".
Describe the business value of "Dream It Possible" in the context of organizations based in New Jersey.
Write the message in the form of an email directed toward a single individual, written in English.
The message should evoke enthusiasm with intensifiers, but limit the use of exclamation points. Express casualness using contractions, referring to the recipient in second person, and using discourse markers.
Limit the message to about 500 words, and do not address any content or generate answers that you don’t have complete data on.
Follow these instructions strictly to generate only the message to be sent to the customer.
复制代码
我们把这个内容发送给gpt,然后得到了它的回复。
我们会发现gpt的输出挺好的,AE可以省下了很多时间在攥写邮件,从而关注其他更重要的事情。这里有一个问题,很多人员的时间都很宝贵,总不能每次都手动输入给gpt,然后获取到内容在进行复制粘贴或者其他的操作。如何去构建一个模板争取做到用户通过点点点就可以完全搞定获取到他们的信息,这个时候就需要Prompt Template(提示模板)。
简而言之,Prompt Template是一个可重用的提示。Prompt Template包括有关客户、产品等具体详细信息的占位符。一旦这些占位符填充了真实的相关数据,提示模板就成为真正个性化的提示。成分和说明基本相同,但输出是根据您的业务和目标受众定制的。Prompt template 需要通过Prompt Builder进行构建。
二. Prompt Template组成部分
我们在第一部分通过构建了一个Prompt发送给gpt然后返回了我们相应的邮件引出了Prompt Template,那么如果我们想要做一个公用的Template,我们是否有什么准则进行参考呢? 我们可以考虑以下的几部分:
Participants 参加者: 描述谁在发送和接收模型的响应。在描述参与者时,我们可以使用引用记录字段、流、Apex 等的合并字段,这个我们后续会有介绍,上述Demo中的参加者就是 York Zhang.
Setting 设定:为模型提供上下文信息,例如响应所针对的通信渠道或内容类型。您的Prompt Template Type决定您的设置。例如,如果您选择“Field Generation”模板类型,则您的设置是Record Field。
Goal 目标:描述您希望通过模型的响应实现什么目标。确保考虑用户的背景、偏好和过去的行为。您可以使用合并字段向您的目标添加详细信息。上述Demo中的目标是: You are attempting to persuade Tom to sign up for "Dream It Possible"
Relationships 人际关系:描述所涉及的参与者之间的关系。还要提及模型的响应怎样去和参与者关联/相关。上述Demo中的人际关系是: Tom, who is a director at YYY. They have been a customer of yours since 2024/10/1
Data 数据:使用合并字段为模型提供相关的 CRM 数据以供使用。上述Demo中我们可以通过Data实现共通。比如我们可以对包括但不局限于以下的字段使用系统中的数据来替换实现共通模板:
Your Name
Your Name's Company
Customer Name
Customer Role
Customer Company
Product Name
Product DescriptionInstructions 指示:告诉LLM你想要什么类型的内容以及它必须包括什么。将指令放在三引号边界中,这有助于LLM区分提示上下文和指令。上述Demo中的指示为:
Write the message in the form of an email directed toward a single individual, written in English.
The message should evoke enthusiasm with intensifiers, but limit the use of exclamation points. Express casualness using contractions, referring to the recipient in second person, and using discourse markers.
Limit the message to about 500 words, and do not address any content or generate answers that you don’t have complete data on.
Guidelines 指南:为了减少产生幻觉的可能性,给出它必须遵循的模型指南。上述Demo中的指南为:Follow these instructions strictly to generate only the message to be sent to the customer.
Language 语言:告诉模型以哪种语言生成响应。上述Demo中的语言是English
Style and Tone 风格和基调: 给出要遵循的模型风格和语气指南。上述Demo中的风格和基调: The message should evoke enthusiasm with intensifiers, but limit the use of exclamation points. Express casualness using contractions, referring to the recipient in second person, and using discourse markers.
穿插起来,一个有效的Prompt template应该考虑:
What’s the goal of the prompt template?—By declaring the goal of the response first, you can better answer all the subsequent questions.
提示模板的目标是什么?——通过首先声明响应的目标,您可以更好地回答所有后续问题。
Who is involved?—Describe the participants who send or receive the response, the relationship between the participants, and the relationship between the participants and the response.
谁参与?—描述发送或接收响应的参与者、参与者之间的关系以及参与者与响应之间的关系。
What’s the context of the prompt template and the response?—Define a setting for the model response, the CRM data to ground the prompt in, and add a command that tells the model what to generate.
提示模板和响应的上下文是什么? - 定义模型响应的设置、提示所依据的 CRM 数据,并添加告诉模型要生成什么内容的命令。
What guardrails does this prompt template need to succeed?—You can add more information, such as instructions for the response’s style and tone.
此提示模板需要哪些防护栏才能成功? - 您可以添加更多信息,例如响应风格和语气的说明。
除此之外,下方还有一些官方推荐的最佳实践。
确保您的提示模板简洁且易于理解。避免使用行业术语或技术术语。相反,使用自然语言和对话设计指南。
迭代您的提示模板。尝试使用不同的模板实现相同的目标,看看这些部件如何影响模型的响应。获取最终用户反馈,看看您的提示模板生成所需响应的效果如何。
更多可以查看:https://help.salesforce.com/s/articleView?id=sf.prompt_builder_best_practices.htm&type=5
三. 启用Prompt Builder以及权限配置
针对Prompt Builder,有两个permission set进行使用。
权限名称 权限描述
Prompt Template Manager 要在 Prompt Builder 中创建和管理Prompt Template
Prompt Template User 在 Prompt Builder 外部访问和运行Prompt Template
我们需要先注册一个拥有ai功能的环境,可以访问这个trailhead然后点击注册14天的免费环境:https://trailhead.salesforce.com/content/learn/projects/quick-start-prompt-builder/get-started-with-prompt-builder
如何启用Prompt Builder?
- Setup 搜索 Einstein Setup 然后启用 einstein.
设置permission set。如果用户想要配置 Prompt template,需要有 Prompt Builder Manager权限。
如果需要使用einstein for Sales功能,需要启用相关功能。Setup 搜索 Einstein for Sales,然后启用Sales Emails
刷新页面以后,就可以Setup 搜索 Prompt Builder进行使用了。
四. Prompt Builder 组成部分
当我们进入Prompt Builder以后,我们可以看到下述的类似页面,我们可以将它拆分成6部分。
Prompt Template Workspace: 输入自然语言提示的位置。向LLM提供指令以帮助创建所需的输出,我们也可以使用merge field进行grounding接地。
Resource:当我们需要使用merge field进行接地时,我们可以在resource中进行选择,resource可以选择以下的内容:
Flows Merge Field:当你的逻辑当前标准的merge field无法解决时,可以采用Flow Merge Field,比如我们想要整理Account数据中所有他的Open Case的信息,我们可以考虑使用这个类型,首先通过Flow选择Template-Triggered Prompt Flow 类型进行构建,然后我们就可以在Prompt Builder中选择到了此类型。
Apex Merge Field:同Flow Merge Field,如果标准功能搞定不了,我们可以通过apex进行复杂逻辑的构建来实现接地进行动态输入。apex class需要使用InvocableMethod注解进行声明。举个官方提供的例子:
复制代码
public class OpenCasesPrompt {
@InvocableMethod(label='Open Cases'
description='Find Cases for an Account'
CapabilityType='PromptTemplateType://einstein_gpt__fieldCompletion')
public static List getCasesPrompt(List requests) {
// Validate the expected number of requests as an input
if (requests.size() != 1)
throw new ListException('The requests list must contain one entry only');
Account a = requests[0].RelatedEntity;
ID searchAcctId = a.Id;
List cases =
[SELECT Id, Subject, Description
FROM Case
WHERE AccountId = :searchAcctId AND Status != 'Closed'
WITH USER_MODE];
string responseData = null;
if(cases.isEmpty()) {
responseData = 'There are no open cases.';
} else {
for(Case c : cases) {
responseData =
(responseData != null) ? responseData + '\n' : '';
responseData += String.format('Case details: {0}, {1}.',
new List