
Agentforce 平台概览
Agentforce 是 Salesforce 平台上的 Agent 驱动层,帮助你部署能够与员工协同工作的 AI Agent,实现 7×24 小时的客户服务。信任层将你的数据与大语言模型(LLM)的安全连接。在开始实战之前,让我们先回顾一下关键的开发工具和指南。
概览指南
Agentforce APIs 和 SDKs —— 学习使用各种 API 和 SDK 构建强大的 Agentforce 解决方案
Agentforce Actions —— 学习如何构建和增强你的 Agentforce 动作
开发工具
Agent Script —— 在 Agentforce Builder 中构建 Agent 的语言
Agentforce DX —— Salesforce CLI 和 VS Code 的专业代码工具
注意:从 2026 年 4 月开始,Agent 的 topics 现已更名为 subagents(子代理),功能上没有变化。

示例一:Apex 代码示例 — 自定义 Apex 动作处理复杂查询
本示例将从零开始,带你一步步实现一个能够处理复杂客户问题的 Agent,使用自定义 Apex 动作将多部分的客户问题转换为可执行的 SOQL 查询。你将深入理解每个组件的配置方式以及它们在 Agentforce 解决方案中的协作关系。

场景说明
我们将构建一个客户服务 Agent,处理关于产品库存的复杂查询。使用 Salesforce CLI 将产品和价格数据从 CSV 文件导入到标准对象 Product2 和 PriceBook 中。然后创建一个自定义 Apex 类,根据 Agent 传入的参数动态查询产品库存。最后构建 Agent、子代理和动作来调用自定义 Apex 类。

步骤 1:设置 Salesforce Developer Edition 组织
注册免费的 https://www.salesforce.com/form/developer-signup/?d=pb Salesforce Developer Edition 组织
从设置中,在快速查找框中输入
Einstein Setup,选择 Einstein Setup 并启用 Einstein搜索 Agentforce Agents 并打开
启用 Agentforce
注意:如果你使用其他 Salesforce 组织,请验证:Einstein 已启用、Agentforce 已启用、可以添加个案。用户权限和其他组织设置可能会影响你完成所有步骤。


步骤 2:导入数据
我们的自定义 Apex 类查询组织内的结构化数据。首先需要将数据清理、整理并放入适当的 Salesforce 对象中。示例数据包含 100 个家具条目,包含名称、描述、SKU、价格、颜色和重量字段。
创建自定义字段
在 Product2 对象上创建两个自定义字段:
Color(颜色):Picklist 类型,可选值包括 Black, White, Brown, Grey, Navy, Beige, Green, Red, Oak, Walnut
Weight (kg)(重量):Number 类型,长度 16,小数位 2
使用 Salesforce CLI 导入数据
认证到你的组织:
sf org login web --alias your-org-alias
导入 Product2 数据:
`sf data import bulk --sobject Product2 --file /full/path/to/product2_import.csv --target-org your-org-alias --wait 10 --line-ending CRLF`
导入 PricebookEntry 数据
获取标准 Pricebook ID:
sf data query --query "SELECT Id, Name FROM Pricebook2 WHERE IsStandard=true" --target-org your-org-alias导出 Product2 ID:
sf data query --query "SELECT Id, ProductCode FROM Product2 ORDER BY ProductCode ASC" --target-org your-org-alias --result-format csv > product2_ids.csv构建 PricebookEntry CSV 文件(包含 Pricebook2Id, Product2Id, UnitPrice, IsActive 列)
导入:
sf data import bulk --sobject PricebookEntry --file /full/path/to/pricebook_entry_import.csv --target-org your-org-alias --wait 10 --line-ending CRLF
验证数据
从应用启动器中进入 Products 应用,将列表视图切换为所有产品,你应该看到 100 个家具条目。点击任一产品,在详细信息中应看到 Color 和 Weight (kg) 字段。


步骤 3:创建 Apex 类
创建名为 InventoryRetriever 的自定义 Apex 类,该类的核心组件包括:
RetrieverInput —— 定义 Agent 可以传入的参数:category(产品类别)、color(颜色)、maxPrice(最高价格)
RetrieverOutput —— 定义动作返回的内容:productSummary 字符串,包含匹配的产品列表
@InvocableMethod —— 标记为 Agent 调用的入口点,标签为 "Search Furniture Inventory"
查询逻辑的关键设计:
从 Product2 的基础查询开始,动态追加 WHERE 子句
根据 Agent 提供的参数值按需过滤类别和颜色
从 PricebookEntry 查询价格信息,构建查找映射
如果 Agent 指定了最高价格,过滤超出预算的产品
返回格式化的摘要字符串:Name | SKU | Color | Price | Weight
代码包含详尽的注释,解释每个部分的功能。从设置 → Apex Classes → New 创建并保存。


步骤 4:配置 Agent 的子代理和动作
现在构建 Agent、自定义子代理和自定义动作:
创建 Agentforce Service Agent:从应用启动器进入 Agentforce Studio → 新建 Agent → 选择 Agentforce Service Agent 模板 → 命名为 "Furniture Helper Agent"
创建新子代理:命名为 "Search Inventory",描述为 "处理所有关于产品、家具、库存、定价、颜色和可用性的问题"
创建新动作:命名为 "Search Furniture Inventory",参考动作类型选择 Apex → Invocable Method,选择我们创建的 Apex 动作
重要:子代理的推理指令必须明确指示 Agent 调用动作,否则 Agent 可能会忽略它。动作的描述也非常重要,因为 Agent 使用它来判断是否应该执行该动作。


步骤 5:授予 Agent 用户正确的权限
Agent 需要权限才能访问库存数据和自定义 Apex 类:
从设置 → 权限集,找到 "Agentforce Agent [your agent name] Permissions"
在对象设置中,为 Product2、PricebookEntry 和 Pricebook2 启用读取权限和所有字段的读取访问
返回 Apex 类,点击安全,将 Einstein Agent User 简档添加到已启用简档列表中


步骤 6:测试你的 Agent
在激活之前务必充分测试你的 Agent:
返回 Agentforce Builder 中的 Agent,点击预览
将模拟切换为实时测试模式
向 Agent 提问,如 "What chairs do you have under $400 that are white or grey?"
在交互摘要列中查看 Agent 的推理过程


步骤 7:保存、提交和激活
点击保存
点击提交版本(Commit Version)—— 锁定当前状态为完整版本,后续更改需要创建新版本
点击激活(Activate)—— Agent 现在在其连接的渠道上正式上线


示例二:Agent Script 示例 — 客户支持
本示例展示如何使用 Agent Script 构建一个帮助客户查询订单信息的客户支持 Agent。该 Agent 包含三个子代理:
agent_router —— 提供通用指令并暴露两个工具,供 LLM 选择调用,根据用户输入路由到对应的子代理
Identity —— 验证用户身份。如果用户邮箱不存在,LLM 会请求用户提供邮箱,然后发送验证码,最后验证客户提供的验证码
order_management —— 允许用户查询订单详情,包括当前订单摘要和历史订单查询

架构设计
三个子代理协同工作,形成了清晰的分层架构。agent_router 作为每次客户对话的入口点,分析用户输入并决定路由到 Identity(验证身份)或 Order_Management(处理订单)。这种设计使得每个子代理职责单一,易于维护和扩展。

Agent Script 结构与关键模式
Agent Script 遵循清晰的结构模式:
system 块 —— 定义 Agent 的角色、欢迎消息和错误消息
config 块 —— 设置 developer_name、default_agent_user、description
variables 块 —— 声明可变字符串、布尔值、数字及其描述
start_agent —— 入口点,包含推理指令和动作声明
subagent 块 —— 每个子代理有自己的描述、推理指令和动作
actions 块 —— 基于 Flow 的动作定义,包含输入、输出和目标
使用的关键模式:
@utils.transition —— 子代理之间的确定性路由
available when —— 基于变量状态的条件可用性
Flow 目标 —— 如 flow://Get_Verification_Code 用于后端处理

示例三:Agent Script 示例 — 使用更新术语关联 Agent
确保你的关联 Agent(Grounded Agent)理解组织不断演变的行业术语、领域特定词汇或更新后的产品名称 — 无需更新和重新索引你的信息源。

问题陈述
关联 Agent 使用 Agentforce Data Library 或 RAG(检索增强生成)进行信息关联。然而,关联信息可能只包含正式名称,而客户使用行话、缩写或新名称。即使关联信息同时包含正确术语和行话,它可能只对正确名称进行了索引 — 因此检索器或数据库会遗漏相关片段,即使正确的信息确实存在。
更新和重新索引 Agent 的关联信息(通常包含数千篇文章)非常耗时且需要特定角色。此外,行业术语变化非常快!
解决方案
在检索之前将非正式术语映射为正确术语。在 Salesforce Knowledge(或其他对象)中维护一个轻量级的新旧术语映射表,每个会话获取一次映射信息,并为提示词注入上下文,使 Agent 能够在需要时翻译用户的问题。

适用与不适用场景
适合使用此方案的情况:
关联内容大部分正确,但用户使用与索引内容不同的术语提问
产品名称、缩写或内部术语频繁变更,但数据库中的核心内容仍然准确
术语映射表不会过大以至于影响上下文工程
不适合使用此方案的情况:
术语映射表过大,开始影响 Agent 性能
信息源容易更新和重新索引

实施步骤概览
1. 设置组织、Agent 和数据库
注册 Developer Edition 组织(包含 Agentforce 和 Data Cloud)
验证 Data Cloud 已配置(Einstein 生成式 AI 和 Agentforce 功能的必要条件)
启用 Einstein 生成式 AI 和 Agentforce
创建名为 "Aura & Ash Service Agent" 的默认服务 Agent
创建数据库,上传产品说明 PDF,等待状态变为 "Ready" 后分配给 Agent

2. 使用 Salesforce Knowledge 创建术语映射
分配 Knowledge User 许可证并启用 Salesforce Lightning Knowledge
在 Knowledge__kav 对象上创建 "Alternate Product Names" 自定义字段(长文本区)
授予 Agent 用户对 Knowledge__kav 的读取权限
创建 Knowledge 文章,将新旧产品名称映射粘贴到字段中,保存并发布

3. 创建 Flow 获取 Knowledge 文章
构建一个自动启动的 Flow(无触发器),命名为 "Alternate Product Names":
添加针对 Knowledge__kav 的获取记录元素,按文章编号过滤
将 Alternate_Product_Names__c 字段存储在输出变量 alternateProductNames 中
调试并激活 Flow

4. 更新 Agent 获取并存储映射的产品名称
创建 Old2NewProductNames 字符串变量,默认值为 "NotRun"
创建 GetNewProductNames 动作,引用 "Alternate Product Names" Flow
在 Script 模式中添加确定性指令,仅运行一次动作
更新 Agent 指令:当知识内容中找不到提及的产品时,查询 Old2NewProductNames 确定是否映射到旧产品名称

5. 测试与验证
使用新术语测试 Agent,验证其能够正确映射到旧产品名称。确认 GetNewProductNames 动作每个会话仅运行一次。

示例四:Agent Script 示例 — 使用变量强制执行子代理顺序
在多轮对话中,使用步骤变量(Step Variable)来确保 Agent 遵循你要求的工作流程。Agent 路由器根据步骤变量的值选择子代理,在每个子代理中,LLM 评估客户的回答并设置步骤变量的下一个值。

何时使用此模式
当你的 Agent 需要满足以下场景时,使用此模式:
按定义的顺序在必需的子代理之间进行转换,顺序可以根据客户之前的回答而变化
处理长时间的多轮对话 —— 评估每个客户回答是否完整有效,必要时返回同一子代理进行追问
仅当前一个子代理的任务完成后才进入下一个子代理
示例 —— 面试 Agent:面试 Agent 按特定顺序向求职者提问筛选问题。后续问题可能取决于求职者对当前问题的回答。某些回答(如不具备所需资质)会导致面试终止。每个子代理处理一个问题并决定答案是否充分。

路由机制详解
start_agent 子代理充当路由器,检查 currentInterviewStep 变量的值并转换到相应的子代理:
if @variables.currentInterviewStep == "Permission": transition to @subagent.permission if @variables.currentInterviewStep == "Eligibility": transition to @subagent.eligibility
```
步骤变量的七个值对应不同的面试阶段:
Permission —— 确认候选人有合法工作权利
Eligibility —— 检查是否通过 NCLEX-RN 考试
Availability —— 确定最早可开始日期
Competency —— 测试专业知识
Salary —— 讨论薪资期望
Human —— 通过筛选,转交人工跟进
End —— 不符合条件,结束面试
在每个子代理中,Agent 可以调用 @utils.setVariables 更新 currentInterviewStep。如果客户尚未完全回答问题,Agent 可以选择不改变步骤。

体验示例
下载 https://resources.docs.salesforce.com/rel1/doc/en-us/static/misc/InterviewAgent.agent InterviewAgent.agent 示例文件
在 Agent Script 中,点击新建 Agent 旁边的下拉箭头,选择从脚本新建
粘贴 Interview Agent Script 代码到新 Agent 中
点击预览,输入 "I'd like to apply for the position" 进行测试
注意:此 Agent 提供了使用步骤变量的示例,并非生产就绪的 Agent。

相关模式
多轮对话中通过子代理强制执行必需工作流
子代理转换
在推理之前获取数据
使用条件语句
有效使用变量
感谢阅读本指南。如需更详细的信息,请参阅 Agentforce 开发者指南。
发布来源:https://www.salesforcecrm.cn/article/agentforce/agentforce-examples-guide.html