本篇参考:
https://salesforce.vidyard.com/watch/UUAxcUfHYGAxH3D9wV1RxJ
https://help.salesforce.com/s/articleView?id=sf.prompt_builder_about.htm&type=5
https://www.lightningdesignsystem.com/guidelines/conversation-design/overview/
一. 什么是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"
4.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 Description
- Instructions 指示:告诉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<Response> getCasesPrompt(List<Request> 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<Case> 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<Object>{c.Subject, c.Description});
}
}
List<Response> responses = new List<Response>();
Response res = new Response();
res.Prompt = responseData;
responses.add(res);
return responses;
}
public class Request {
@InvocableVariable(required=true)
public Account RelatedEntity;
}
public class Response {
@InvocableVariable
public String Prompt;
}
}
- Current Organization Merge Field: 当你想要用当前org的信息接地进行动态输入时,可以选择此类型,比如需要用到当前Org的Fax信息作为动态参数接地使用。
- Current User Merge Field: 当你想要用当前运行用户的信息接地进行动态输入时,可以选择此类型,比如需要用到当前用户的Email作为动态参数接地使用。
- Record Merge Field: 当你想要当前记录的一些字段值接地进行动态输入时,可以选择此类型,比如想要用到当前记录的Case Type作为动态参数接地使用。
- Record Related List Merge Field: 当你想要当前记录的关联列表数据接地进行动态输入,可以选择此类型,比如你需要当前记录的 Case Histroy作为动态参数接地使用。例如点击下方图中的Case,然后就可以在最下方选择到Case Histories(全部的histories,如果想要进行filter,需要使用apex/flow merge field)
-
Configuration: 允许你选择当前的Prompt你想使用哪种模型类型来生成动态内容,比如你可以选择 GPT 3.5 / GPT 4.0等。
-
Selected Record:当我们的内容区域包含了merge field,我们需要选择数据,这个数据将会替换merge field动态接地。
-
Resolution:允许你选择具体的数据来查看Prompt,这个选择的数据会替换我们内容区域的merge field信息。
-
Response:允许你预览生成的内容,我们可以通过Response模型来知道我们的内容是否符合要求以及是否进行了我们预期内容的生成。
四. Prompt Template Type
通过上述步骤,我们就可以开始着手创建Prompt template了。那么Salesforce支持哪些类型以及这些类型的介绍是什么呢。
|----------------------|---------------------------------------------------------------------------------------------------------------------------------------------|
| Prompt Template Type | Description |
| Field Generation | 为 Lightning Experience 中的记录字段生成内容。在 Salesforce 中,用户单击按钮来运行此提示并使用输出填充该字段。 |
| Record Summary | 汇总记录数据以获得记录的全面视图。记录摘要提示模板由 Summarize Record standard invocable action使用。在 Einstein Copilot 中,它们由Summarize Record standard copilot action使用。 |
| Sales Emails | 根据记录数据生成个性化的客户电子邮件。 |
| Flex | 为其他模板未涵盖的任何商业目的生成内容。 Flex 提示模板可让您定义自己的资源。最灵活的一种。 |
这些是我们在创建的时候可以选择到的template type,除了我们自定义Prompt以外,salesforce还提供了一些标准的prompt template. 其中标准的template type还包括一个:Record Prioritization,用于Einstein Copilot,这里不做展开,当前只关注上述4种类型。这里我们只举例一下 Field Generation 以及 Sales Email,其他的类型大家可以自行查看官方文档。
1. Field Generation举例
我们的需求是整理一下当前的Account有哪些 open case,并且对这些 open case做一些简洁的总结。我们在开发实施以前先思考一下需要考虑哪些内容?
- open case而不是所有case,所以我们无法使用 related list,只能通过apex或者flow进行变量传递。
- 针对open case信息进行总结而不是针对当前的数据进行总结,所以使用Field Generation类型。
- 这个字段的赋值是需要基于AI生成,所以需要开启dynamic form,然后可以针对这个字段选择基于指定的prompt template进行生成。
那么我们根据上述的步骤进行实施。具体的步骤可以参考:https://help.salesforce.com/s/articleView?id=sf.prompt_builder_add_flow_without_data_cloud_field_gen.htm&type=5
构建Flow:我们选择的Flow类型是 Template-Triggered Prompt Flow,然后input是auto input,并且设置object为account。针对当前的Account是否拥有Open Case有两个分支,如果没有Case,则增加一个No Case的Prompt Instruction。如果包含Open Case,则将Subject以及Description都加入 Prompt Instruction. 最终的output我们可以看到就是Prompt Instruction。
构建Prompt Builder:我们通过instruction将template内容补齐,通过merge field达成动态输入,我们可以看到demo中有两个动态的变量,AccountId以及Open Case的信息。通过Preview我们可以看到open AI可以基于系统数据进行动态接地,点击Preview以后的response如果符合我们的预期,我们便可以active这个template。
配置字段:首先需要将form升级为dynamic form,然后选择对应的prompt template,这样在详情页点击字段右侧,就可以弹出einstein bot来动态输入内容,如果我们觉得满意,就可以点击use从而完成此功能。
所有的模板的原则, Human-in-the-loop,一定要保证最终用户在这个流程中进行review。
2 . Sales Email举例
这里我们直接用官方的demo进行举例。向Lead推荐公司的某款Product,发送会议邀请。篇中我们可以看到大部分都用的merge field,其他的没有额外特殊的地方。
我们进行一下演示。
**总结:**篇中主要介绍Prompt Builder的使用以及Prompt Template的一些规则。篇中有错误地方欢迎指出,有不懂欢迎留言。其他部分可以基于文档自行查看。