Agentforce 实战示例指南

通过四个完整的实战示例深入学习 Agentforce 开发:使用自定义 Apex 动作处理复杂产品查询、用 Agent Script 构建客户支持 Agent、用 Knowledge 和 Flow 为关联 Agent 注入最新术语、以及使用步骤变量强制执行多轮对话中的子代理顺序。每个示例都提供完整的端到端步骤说明。...

📅 2026/7/4 ✍️ ponybai 🏷️ agentforce, salesforce, ai
Agentforce 示例概览

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 解决方案中的协作关系。

Apex 代码示例

场景说明

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

场景说明

步骤 1:设置 Salesforce Developer Edition 组织

  1. 注册免费的 Salesforce Developer Edition 组织
  2. 设置中,在快速查找框中输入 Einstein Setup,选择 Einstein Setup启用 Einstein
  3. 搜索 Agentforce Agents 并打开
  4. 启用 Agentforce
注意:如果你使用其他 Salesforce 组织,请验证:Einstein 已启用、Agentforce 已启用、可以添加个案。用户权限和其他组织设置可能会影响你完成所有步骤。
Einstein Setup 步骤 1:设置开发组织

步骤 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 数据

  1. 获取标准 Pricebook ID:sf data query --query "SELECT Id, Name FROM Pricebook2 WHERE IsStandard=true" --target-org your-org-alias
  2. 导出 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
  3. 构建 PricebookEntry CSV 文件(包含 Pricebook2Id, Product2Id, UnitPrice, IsActive 列)
  4. 导入: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 个家具条目。点击任一产品,在详细信息中应看到 ColorWeight (kg) 字段。

验证导入的产品 步骤 2:导入数据

步骤 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 ClassesNew 创建并保存。

Apex 代码 步骤 3:创建 Apex 类

步骤 4:配置 Agent 的子代理和动作

现在构建 Agent、自定义子代理和自定义动作:

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

步骤 5:授予 Agent 用户正确的权限

Agent 需要权限才能访问库存数据和自定义 Apex 类:

  1. 设置权限集,找到 "Agentforce Agent [your agent name] Permissions"
  2. 对象设置中,为 Product2PricebookEntryPricebook2 启用读取权限和所有字段的读取访问
  3. 返回 Apex 类,点击安全,将 Einstein Agent User 简档添加到已启用简档列表中
授予权限 步骤 5:授予权限

步骤 6:测试你的 Agent

在激活之前务必充分测试你的 Agent:

  1. 返回 Agentforce Builder 中的 Agent,点击预览
  2. 模拟切换为实时测试模式
  3. 向 Agent 提问,如 "What chairs do you have under $400 that are white or grey?"
  4. 交互摘要列中查看 Agent 的推理过程
测试 Agent 步骤 6:测试 Agent

步骤 7:保存、提交和激活

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

示例二:Agent Script 示例 — 客户支持

本示例展示如何使用 Agent Script 构建一个帮助客户查询订单信息的客户支持 Agent。该 Agent 包含三个子代理:

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

架构设计

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

客户支持 Agent 架构

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 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
设置组织、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
创建 Flow

4. 更新 Agent 获取并存储映射的产品名称

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

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 可以选择不改变步骤。

路由机制

体验示例

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

相关模式

  • 多轮对话中通过子代理强制执行必需工作流
  • 子代理转换
  • 在推理之前获取数据
  • 使用条件语句
  • 有效使用变量

感谢阅读本指南。如需更详细的信息,请参阅 Agentforce 开发者指南。