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 组织
- 注册免费的 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 可以选择不改变步骤。
体验示例
- 下载 InterviewAgent.agent 示例文件
- 在 Agent Script 中,点击新建 Agent 旁边的下拉箭头,选择从脚本新建
- 粘贴 Interview Agent Script 代码到新 Agent 中
- 点击预览,输入 "I'd like to apply for the position" 进行测试
注意:此 Agent 提供了使用步骤变量的示例,并非生产就绪的 Agent。
相关模式
- 多轮对话中通过子代理强制执行必需工作流
- 子代理转换
- 在推理之前获取数据
- 使用条件语句
- 有效使用变量
感谢阅读本指南。如需更详细的信息,请参阅 Agentforce 开发者指南。