DEX801

Agent Script 参考手册

课程介绍

同学们,咱们今天来看看代理脚本的语法和一些最基本的概念,这一页就像个“地图”,帮我们快速摸清后面的路该怎么走。 先看左边这个语法表,就几个符号,但特别重要。第一个是井号`#`,你把它当成你在脚本里给自己留的小笔记就行,代理读到它就会直接跳过,纯粹是给我们看的。 然后是箭头`->`,它表示“逻辑指令”,比如告诉代理“去做这个”“去检查那个”,相当于下达一个行动命令。 再往下是竖线`|`,这个专门用来写“提示指令”,比如说你给代理一个自然语言的提示,让它理解你想干什么,用竖线开头最方便。 还有一个很常用的,就是艾特符号`@`。你后面会经常见到`@`后面跟上操作名、子代理名、变量名或者输出名,意思就是“调用”或“引用”那个东西,就像喊它的名字让它出来干活。 最后还有一个工具引用,也是类似的引用方式,不过专门指向我们配好的实用工具。 这些符号就像是代理脚本里的标点,知道了它们,你再看脚本就能马上分出哪是注释、哪是命令、哪是提示了。 右边呢,列出了一串概念,动作、推理后、块、条件、推理指令……这些都是我们后面会一个个深入讲的内容。现在你只需要心里有个印象就行,比如“块”就是把一组指令打包,“条件”就是让代理在不同情况下走不同的路,“子代理”就像是把小代理请过来帮忙。每一样都是让咱们的代理变得更聪明的积木。 好,符号认全了,关键词也眼熟了,待会儿我们一个一个拆开,保证你都能玩转。

课程章节

本课程共有 22 个章节

  • 1

    Key Syntax Reference

    第 105 页

    好,同学们,我们来看这张幻灯片——Agentforce 里会用到的几个关键语法符号和实用工具。你就把它们想象成搭积木时的基本组件,理解了这些,后面搭建智能代理会很轻松。 首先是单行注释,用井号 `#`。你写流程的时候,可以在后面加个 `#` 写点儿备注,提醒自己这一步是干嘛的,特别方便。 然后我们看箭头 `->`,这个表示开启一段确定性的运行逻辑。什么叫确定性?就是完全按照你定义的步骤来,不靠大模型凭空发挥,比如执行一段公式或者调用一个流程,很靠谱。 竖线 `|` 就不一样了,它是要跟大语言模型“说话”了。后面接提示指令,而且可以用花括号加感叹号、表达式的方式来动态插入变量,比方说把客户名字实时填进去,这样大模型给出的回应就个性化了。 要引用资源的时候,全都用 `@` 打头。像 `@actions` 调动作,`@outputs` 拿输出,`@subAgent` 唤子代理,还有 `@predicate` 这种谓词变量,一看就明白是引用现成的东西,不用自己重新造轮子。 几个实用工具函数也很有用:`@utils.transition to` 能把对话交接给另一个子代理;`@utils.setVariables` 用来做插槽填充,比如一步步问到了姓名、地址,就用它统一存起来;还有 `@utils.calculate`,可以处理人工切换或者做一些计算。 最后呢,你在搭建智能体时还会经常撞见这些关键词,比如“运行”、“设置”、“使用”、“何时可用”、`if/else` 条件判断、“过渡到”、“变量”、“链接”以及“插槽填充令牌”。它们就像智能体对话里的路标,帮你把整个交互逻辑组织起来。 这些符号和工具就是 Agentforce 的语法骨架,刚开始可能会觉得有点儿陌生,多练两次就顺手了。咱们下一张幻灯片来实际看个例子。

    查看详情
  • 2

    Reference Concepts

    第 106 页

    各位同学,今天我们要聊一聊 Agentforce 里那些最核心的概念,一共十一个,听起来可能有点多,但别担心,我用最简单的话把它们串起来,你一听就懂。 首先想象一下,Agentforce 就像一个能自己动脑筋干活的小助手。它要完成一个任务,就会先进入一个,启动代理块,,这相当于它接到活儿的地方。然后它会在脑袋里琢磨怎么干,靠的就是,推理指令,,这些指令会变成大语言模型能理解的提示词,告诉它下一步该做什么。 推理过程中,它可能会碰到需要做选择的情况,这时候就用到了,条件表达,,也就是如果符合某个条件就走上边那条路,否则走下边那条路,确定性很强。做选择的时候,经常要比较大小、判断是不是相等,那就有,支持的运算符,,像比较的、逻辑的、算术的,都配齐了。 当它想清楚了,需要真刀真枪干活了,就会调用,动作,,动作可以执行一个 Flow 或者一段 Apex 代码,真正去创建记录、发邮件什么的。这些动作通常被包装成,工具,,让大语言模型可以直接喊来用。如果任务特别复杂,它还能把一部分活儿分出去,交给一个专门负责那件事的,子代理,,那个子代理自己又是一个独立的小助手,可以独立定义和运作。 在整个对话和思考的过程中,它需要记住之前说过什么、结果是什么,这就靠,变量,来跟踪每一步的状态。另外,我们写脚本的时候,会把一段段内容组织成,块,,块就是脚本的结构单元,让逻辑更清晰。 有时候推理完成了,主流程退出之前,可能还有点收尾的事情要处理,那就在,推理后,这个环节来运行。 最后,还有一些顺手就能用的小功能,比如处理日期、字符串这些,不用重复造轮子,都收在了一个叫,Utils, 的实用工具包里。 好了,这十一个概念就是 Agentforce 工作的基础零部件,后面我们还会一个个展开细讲。现在你只要有个大概印象,知道它们分别管什么,就已经领先很多人了。下节课,咱们就从一个真正的启动代理块开始,动手搭你的第一个智能助手。

    查看详情
  • 3

    Reference: Actions

    第 107 页

    好,我们来看看这一页的内容,它讲的是怎么给子代理定义它能执行的任务。 简单来说,一个子代理可以做的事情,我们叫做“操作”。这些操作可以是调用一个Flow,也就是流程自动化;或者调用一个提示模板,让大语言模型按照特定方式生成内容;还可以是调用一段Apex代码,执行一些后台的业务逻辑。 在执行操作的时候,如果你需要把操作产生的结果记录下来,后面再用,那你可以把它的输出存到一个变量里。这个变量可以被整个推理引擎访问,这样后面的决策就能参考前面的结果了。 还有一个挺实用的点,就是你可以选择要不要让大语言模型把操作的输出直接展示给客户看。有些信息适合让客户看到,比如查询出来的订单状态;有些内部处理结果,可能就不适合展示,这点完全由你来控制。 每个子代理可以绑定很多个操作,而且这些操作都是专属于它自己的,别的子代理用不了,这样分工明确,维护起来也清楚。 在配置的时候,操作是放在一个叫“动作块”的地方来定义的。调用方式有两种:一种是按照你设定的逻辑,在确定的条件下按顺序执行,这叫确定性调用;另一种是把操作开放给大语言模型,作为它可以自主选择使用的工具,让模型根据对话上下文来判断什么时候调用。这样既保证了流程的可控性,又给了AI一定的灵活性。

    查看详情
  • 4

    Action Definition & Properties

    第 108 页

    好,我们来看动作的几个关键属性,一个一个说。 先说操作名称。这个名字要符合Salesforce的开发人员命名规则,什么意思呢?就是只能以字母开头,后面可以用字母、数字,还有下划线。总长度不能超过80个字符。我们推荐用snake_case这种风格,就是全部小写,单词之间用下划线分开,比如`send_email`。这样一目了然,AI处理起来也方便。 接下来是描述,这个是可选的,但是很关键。因为大语言模型,也就是那个做决策的LLM,它在决定要不要调用你这个动作时,会去读这段描述。所以你哪怕一句话,也要把动作干什么说清楚,这样LLM才能准确判断。 然后是输入和输出。输入就是你这个动作需要什么参数,输出就是执行完会返回什么。参数的类型有很多,比如字符串、数字、布尔值、对象、日期,还有列表类型。你要根据实际需求去定义,这样Agent才知道传什么给你,你又会还给Agent什么。 再往下看,目标引用。这个是告诉系统,你这个动作具体执行什么东西。格式是固定的,用大括号把类型括起来,后面跟着冒号和标识符。比如Apex类,就是`apex://`开头,后面跟类名;如果是Flow,就用`flow://`;如果是提示模板,就用`prompt://`。这个格式必须写对,不然系统找不到你要执行的东西。 最后还有一个属性,叫“滤镜_from_代理输出”。这个有什么用呢?它可以把一些敏感的信息从代理的输出里隐藏掉。比如,动作返回了内部错误代码,你不想让最终用户看到,就可以用这个属性过滤掉。这样既保护了安全,又让输出更干净。 简单总结一下:名称要规范,描述帮LLM理解,输入输出定义清楚参数类型,目标引用指向真正的执行体,滤镜能保护敏感信息。记牢这几点,你定义的Actions就能被Agent准确调用,还能控制好安全和体验。

    查看详情
  • 5

    Using Actions: Deterministic Calls & LLM Tools

    第 109 页

    同学们,我们来看看这一页,讲的是在Agentforce里面使用动作的三种方法,非常简单实用。 第一种叫确定性调用。你可以在推理指令的逻辑部分,直接写上 `run @动作名称`,就像一条固定命令。这样做,每次子代理运行的时候,这个动作都会被执行,毫无例外,很靠谱。 第二种是让大模型自己去选择。你把动作暴露出来,变成一个工具,同时给它起个清晰的名字和描述。这时候大模型会根据对话的上下文,自己决定要不要调用它,特别灵活。它会参考你给的动作名称和描述来做判断。 第三种是动作链接。你可以在一个工具的定义里面,用 `run @另一个动作` 这样的写法,让前一个动作完成后,自动去触发后面的动作。这样就能把一连串操作串起来,省去人工编排的麻烦。 另外提醒一下,你还可以在提示里用 `{! @动作名称 }` 这种方式来明确提醒大模型使用某个工具。不过大多数时候,大模型自己就能猜对,除非你真的需要特别强调某个动作才这么用。 记住这三种方法,你就可以更好地控制子代理什么时候做什么事了。

    查看详情
  • 6

    Reference: After Reasoning

    第 110 页

    好,同学们,我们来看这一页。刚才我们讲了推理循环,Agent(代理)在里面思考怎么处理用户的请求。那么当推理循环退出之后,它并不是直接就结束一次交互了,接下来还会做一件事——在每个请求上运行子代理的`after_reasoning`块。 你可能会问,这个`after_reasoning`块到底是做什么的?其实,它就是推理结束后,留给子代理的一小段“善后处理”空间。在这个块里面,你可以放逻辑判断、执行一个动作、做一个转换,或者放其他指令,总之就是一些收尾性质的操作。但是要特别注意,它里面不能用管道提示指令的命令,也就是说像`|`这种格式的提示写法,不能在`after_reasoning`块里出现。 那它典型的用例有哪些呢?最常见的,就是把客户在对话里输入的一些信息保存到变量里面去,比如用户说了自己的名字,你把它存起来;或者根据推理的结果,跳转到另一个不同的子代理继续处理;也可以直接运行一个流程里的操作,比如发一封邮件,更新一条记录等等。这样一来,推理结束后的流程就更灵活了。 最后还有一个很重要的注意点:如果你的子代理使用的是EinsteinHyperClassifier模型,那么很遗憾,`before_reasoning`和`after_reasoning`都不能用。所以设计的时候要弄清楚模型类型,不然功能会受限。 好,这一页的内容就是这些。有什么问题可以随时提。

    查看详情
  • 7

    After Reasoning Usage & Transitions

    第 111 页

    好,我们来看这一页讲的是什么。这里提到两个很有用的块:after_reasoning 和 before_reasoning。咱们先别被名字吓到,其实它们就是帮我们在智能体运行的不同阶段插一脚,做一些额外处理的小工具。 先说 after_reasoning。这个块在子代理完成它的推理、准备给出最后回复之前执行。你可以把它想象成“收尾工作”。比如,我们可以在 after_reasoning 里根据事情的紧急程度,自动调整预约时长——紧急的任务多预留点时间,不急的就短一点。这样,最终给用户或下一步系统的输出就更合理了。 但有个小注意点:如果子代理在运行中,因为某种原因被切换到了另一个子代理,那原来那个子代理的 after_reasoning 就不会执行了。因为流程都换了嘛,原来的收尾工作自然就不做了。另外,如果你在 after_reasoning 里想要主动把任务转给别的代理,记得直接用“transfer to”这个动作关键词,不要用“@utils.transfer to”这种代码写法。Agent Script 更认前者,用起来也更直接。 那 before_reasoning 呢?它和 after_reasoning 刚好反过来,是在子代理开始推理之前执行。你相当于在它动手之前先塞进去一段逻辑,比如先判断一下这个请求合不合理,或者提前准备一些信息。其实它的效果,就和你把这段逻辑直接写到子代理指令的最前面一样。那为什么还要单独弄个 before_reasoning 块呢?因为这样结构更清晰,方便管理,也更容易复用。 总结一下:after_reasoning 做收尾,before_reasoning 做预处理,功能一样,语法也相似。记住切换代理时别用代码写法,以及跨子代理切换后原 after_reasoning 会失效就行。这样我们就能更灵活地控制智能体的行为了。 好了,这一页就讲到这儿。有什么疑问随时提出来。

    查看详情
  • 8

    Reference: Conditional Expressions

    第 112 页

    来,同学们,我们看这一页。在Agentforce的代理脚本里,你可以用if和else来做条件判断,明明白白地告诉代理:什么情况下做什么动作,或者应该引用哪一段提示。如果条件比较复杂,比如既要满足这个又要满足那个,或者两者满足一个就行,那你就可以用and或者or把它们连起来。但是记住,如果有多个条件混在一起,要用括号把同一层的条件括起来,这样才能确保运算顺序不会乱。目前咱们这个脚本还只是支持if和else,不支持else if这种多路分支。也就是说,一个条件,要么走if这边,不然就走else那边,没法再往下继续判断另一个分支。好,这个点大家记住就行。

    查看详情
  • 9

    Conditional Expression Patterns

    第 113 页

    我们来看这一页,讲的是Agentforce里的“条件表达式”,简单来说,就是你让代理做事情的时候,可以加上“如果……就……”的逻辑。 首先,条件表达式支持好几种用法模式。比如,你可以根据某个变量的状态,来决定要不要执行某一个操作。举个例子,如果订单状态是“已发货”,那就发送一封通知邮件;如果不是,就不发。 你还可以用括号把多个条件组合起来,加上“且”或者“或”的关系,来构建更复杂的判断。同时,你还可以根据条件直接设置变量的值,比如“如果用户是VIP,就把折扣设为20%”。 更有意思的一点是,你可以根据不同的上下文,有条件地放进不同的提示行。也就是说,提示词本身也可以动态变化,这会让代理的对话更加灵活。 然后这里有一个很重要的细节:当你需要检查一个变量是否有值的时候,正确的写法是用“is None”,而不是拿它去跟空字符串比较。不管你的变量是什么类型,你要判断它是不是空的,就用“is None”。这点和普通的字符串比较不一样,一定要记住。 最后,这一页还提醒我们,目前代理脚本支持“if”和“else”,但还不支持“else if”这种多分支逻辑。如果你想做多种情况的判断,得用嵌套的if-else来变通实现。 好了,这一页很简单,就是告诉我们条件表达式能做什么、怎么写,以及那个“is None”的小坑要注意。下一节我们继续。

    查看详情
  • 10

    Reference: Reasoning Instructions

    第 114 页

    好,我们来看看这个关于子代理推理块的内容。你可以把它想象成给AI助手下达任务时的“说明书”。 首先,什么是子代理?它就像Agentforce这个大管家手下的小帮手,专门处理某类具体问题。而这个推理块呢,就是这个小帮手的“大脑”里的一段指令,用来告诉它该怎么思考、怎么干活。 这段指令最后会被发送给一个叫做“大语言模型”的AI,也就是LLM,就像我们用自然语言跟ChatGPT对话一样。LLM通过这段指令,就明白了它要完成什么任务。 这个推理块里面其实分两部分,咱们分开来看: 第一部分叫“逻辑指令”,它是确定性的,也就是说这部分是Agentforce自己就能严格把控的,像固定的操作步骤,说一就是一,不会有歧义,比如调用哪个工具、检查什么条件。 第二部分叫“提示指令”,这才是真正用自然语言写出来,直接发给LLM去理解的。它告诉LLM:“嘿,你是一个客服助手,请根据客户的问题做这做那……” 特别要记住的一点是:尽量让推理指令简短。为什么?因为写得越简洁、越聚焦,LLM就越能理解得精准,结果也就更可靠。就像你拜托别人办事,话说得越清楚简短,对方越不容易会错意。 所以,设计子代理的时候,逻辑部分就交给系统规则,提示部分就用一两句大白话把核心任务说明白,这样效果最好。记着这个原则,你就能让Agentforce里的子代理干活又快又稳了。

    查看详情
  • 11

    Logic vs Prompt Instructions

    第 115 页

    同学们,今天我们来聊聊Agentforce里一个很关键的概念,叫做推理指令。你可以把它想象成给AI大脑下达任务的一套“操作手册”。这套手册呢,其实是由两个部分配合着工作的。 第一部分叫逻辑指令。它像一条严格的生产线,每一步都是确定好的,按顺序执行。逻辑指令主要负责处理业务规则、跑一些操作、或者给变量赋值。这就好比你去餐厅点餐,服务员必须先确认你有没有会员卡、能不能用优惠券,然后再下单,这个流程是固定的,不会随便变。 第二部分叫提示指令。这个就灵活多了,因为它直接跟大语言模型(LLM)对话。提示是用自然语言写的,就像你跟人说话一样。而且提示里可以引用变量,或者调用动作的返回结果。写法上你会看到用花括号、感叹号、@符号这样的语法。比如引用一个客户姓名变量,就可以{!@CustomerName}这样写。 那它们怎么配合呢?重点来了:推理指令运行的时候,会先跑逻辑部分,这部分是确定性的,一步步执行。等到所有逻辑都走完了,Agentforce会把符合条件的提示指令挑出来,拼成一个完整的提示,再一次性发给大语言模型。也就是说,逻辑先处理现实世界的规则,最后才把需要AI发挥的部分交给LLM。 这里还有一个灵活的点,你可以在逻辑指令里,通过一个叫“管道命令”的东西,随时切回到提示模式,让AI继续用自然语言来参与下一步思考。 最后记住一个小窍门:推理指令越短,通常结果就越准。因为信息越精简,LLM理解起来就越不容易跑偏,输出的质量也更高。所以写指令的时候,尽量简单明了,别堆太多无关的话。 好,这一页的核心就是这些——推理指令=逻辑(定流程)+提示(交AI),顺序是逻辑先行,然后拼好提示发给LLM。大家理解了吗?

    查看详情
  • 12

    Reference: Supported Operators

    第 116 页

    好,我们来看一下代理脚本里常用的一些运算符。这些运算符啊,主要就是帮我们去做比较、做逻辑判断、做简单的数学计算,还有把一些条件组合起来。 你可以把它们想象成写公式的工具。比如,你想判断一个客户是不是高价值客户,就可以用比较运算符,看他的消费金额是不是大于一万块。如果你想同时满足多个条件,比如消费金额大于一万并且注册时间超过一年,那就用逻辑运算符把这两个条件连起来。有时候还需要做点算术,比如算一下折扣后的价格,就用算术运算符。分组运算符呢,其实就是括号,用来明确先算哪一部分,跟数学里一样,避免歧义。 这些运算符不光能在过滤条件里用,像“只处理金额大于一万的订单”,还能在整个代理脚本里给变量赋值的时候用,比如计算一个总分,再存到变量里。所以它们算是代理脚本里很基础的工具,掌握之后你就能很灵活地写出各种判断和处理逻辑了。

    查看详情
  • 13

    Complete Operator Reference

    第 117 页

    同学们,咱们今天来聊聊表达式里会用到的操作符,也就是运算符。大家可以把它们想象成我们写条件、做计算时的小工具,一共分成四大类,咱们一个一个来说。 第一类是比较运算符。很简单,就是用来比大小的:等于用两个等号,不等于是感叹号加等号,小于、小于等于、大于、大于等于,这些跟数学里一样。还有两个特别的,is 和 is not,用来判断是不是同一个对象。尤其是跟 null 做空值检查的时候,我们直接写 “变量 is 无” 或者 “变量 is not 无”,这样不管什么类型都能统一判断,非常方便。 第二类是逻辑运算符,负责把多个条件组合起来。就三个词:和、或、不是。记住,和 就是两边都要满足,或 是满足一个就行,不是 用来取反。 第三类是算术运算符,这里只有加法和减法,做最基本的数值计算。 最后一类是括号。别看它简单,但特别重要。当你把 和、或 这些逻辑运算符混在一起写复杂条件的时候,一定要用括号把想先算的部分括起来,这样才能明确告诉系统你想先判断哪一块。不然,执行顺序可能跟你想的不一样,结果就容易出 bug。 这四类操作符,就是咱们在表达式里能用的全部家当,以后写公式的时候,拿它们灵活组合,就能表达各种业务逻辑了。

    查看详情
  • 14

    Reference: Tools (Reasoning Actions)

    第 118 页

    好,我们来看看Agentforce里一个很核心的概念——工具。你可以把它想成是给AI助手配备的一把瑞士军刀,每次需要完成某个具体任务时,它就从中挑选合适的功能来用。 在技术上说,工具就是一段可以被大语言模型调用的可执行函数。我们把它定义在子代理里一个叫“推理.actions”的块里面。别被名字吓到,其实很简单:子代理就是帮你处理某一类问题的专属小助手,而“推理.actions”就是这个小助手的工具箱。 工具箱里可以放两种东西:一种是“动作”,比如帮你创建一条客户记录、发送一封邮件;另一种是“实用功能”,比如查一下今天的日期、做一次数学计算。 这里有一个非常重要的区别,你一定要理解。当我们通过基于逻辑的指令去访问时,用的是“subAgent.actions”——这是你作为开发者,在流程里明确指定要用哪个工具。而另一种情况呢,是让大语言模型根据当前对话的上下文,自己去判断、自己去调用,这时候它在“subAgent.reasoning.actions”里面选。 简单来说,前者是你说“必须用这个工具”,后者是AI自己说“这个时候我应该用那个工具”。这个灵活性,正是Agentforce变聪明的地方。 我再说一遍:你安排好的固定步骤用actions,AI自主决策时用reasoning.actions。掌握了这个,你就理解了Agentforce工具体系的关键。

    查看详情
  • 15

    Tools vs Actions & available when

    第 119 页

    同学们,咱们来看这一页,讲的是代理脚本里两个非常重要的动作块,它们听起来有点像,但用途完全不同,一定得搞清楚。 第一个块叫 SubAgent 的 actions。这个块是给逻辑指令用的。什么叫“逻辑指令的确定性调用”呢?就是说,当我们的流程走到某一步,铁定要执行某个操作时,就放在这里。它不依赖大模型去猜,而是由程序逻辑直接触发。比如说,一旦判断客户想查余额,就必定调用查余额的动作。这种就是确定性的,没有选择余地。 第二个块叫 SubAgent 的 reasoning 点 actions。注意这里的 reasoning,说明它跟推理有关。这个块是给大语言模型,也就是 LLM,自己选择的工具集。LLM 会根据当前对话的上下文,从这些工具里挑一个或多个来用。这些工具不仅包括常规操作,还可以直接引用别的子 Agent,或者一些实用程序。所以它更灵活,让 Agent 自己判断什么时候该用什么。 那 LLM 怎么决定用哪个工具呢?它是通过看每个工具的名称和描述来做决定的。所以,这里给大家提个醒——给工具起一个有意义、好懂的名字,写一段清晰的描述,特别重要。名字起得模棱两可,模型就容易会错意。我们还可以在提示指令里,明确地提到某个工具,给它提供更多上下文,帮模型做出更精准的选择。 另外,你还能给每个工具定义一个“available when”条件。这个条件必须用系统支持的运算符写成有效的表达式。它的作用是,只有当这个条件满足了,这个工具才会出现在 LLM 的可选列表里。这样就能根据场景动态地控制工具是否可用,避免模型在不合适的时候乱用。 好,简单总结一下:记住两个块的区别——actions 是给逻辑固定调用的,reasoning 点 actions 是给大模型做选择题的;工具的名字和描述是关键;提示里可以主动提及工具;再用 available when 管住工具的出场时机。掌握这几点,你就能更精确地控制 Agent 的行为了。咱们继续看下一页。

    查看详情
  • 16

    Referencing Subagents as Tools

    第 120 页

    好,我们来看这一页,它讲的是在 Agentforce 里,一个代理在推理做动作的过程中,怎么去“叫”另一个子代理来帮忙。 你可以想象子代理就像不同的专家,有的管订单,有的管客服。而调用他们的方式有两种,区别很大,一定要理解清楚。 第一种方式,叫做 ,@utils.transfer to,,也就是“转移”。这就像打内线电话,你把用户直接转给另一个部门,转完之后你自己就挂了,再也不会回来。执行也是一样,把流程完全交给那个被转过去的子代理,而且它会从那个子代理最开始的逻辑重新走起,原代理不再关心后面的事。这有点像编程里的 goto 语句,直接跳过去,不回头。 什么时候用呢?比如用户本来在闲聊,突然说“我要退货”,那你就直接把他转给专门的退货处理子代理,自己彻底放手,这就是用转移来做,路由切换,。 第二种方式就灵巧多了,直接用 ,@子代理名字, 来引用。你把它当成一个工具来用,就像调用一个函数。比如说 `@weather_expert`,你问它“明天伦敦天气怎么样?”,它会跑过去查完结果,然后,返回给你,。注意,执行权会回到你手里,你可以拿到它的回答,消化一下,再决定下一步做什么——可能再调另一个工具,或者再问它一句。 这非常像我们熟悉的函数调用,问它拿结果,回来后还能接着干活。所以这种方式特别适合做,咨询,,或者帮用户做一次,专业的查找,,但主线剧情还在你手里。 简单记: 如果任务彻底转交,你们以后不再见,用 ,transfer to,,那是“路由”; 如果只是想请教一下专家,拿个结果继续聊,就用,直接@子代理名,,那是“顾问”。 这样讲,是不是就清晰多了?

    查看详情
  • 17

    Reference: Utils

    第 121 页

    好,我们来看这一页,它讲的是Agentforce里一个很实用的小模块,叫Utils。你可以把Utils理解成我们工具箱里的一套现成工具,专门用来控制对话的走向和处理一些动态逻辑。 在你的Agent跟客户聊天的时候,经常会碰到这样的场景:聊着聊着,需要把对话转给另一个更专业的子代理去处理,或者是想根据客户刚刚说的话,悄无声息地在后台记录一个变量值,又或者是碰到解决不了的问题,要马上把会话升级给人工客服,再或者就是服务结束了,需要得体地收个尾。这些动作,在Agentforce里不需要写复杂的代码,直接用Utils就能搞定。 页面上一共给我们列出了四个最常用的实用程序。第一个叫 utils.transferTo ,这个工具就是负责“转接”的,它能让对话无缝地过渡到另一个子代理那里,比如从通用的问答机器人转到一个专门处理退换货的子代理。 第二个是 utils.setVariables ,它非常聪明,能让我们“指挥”大语言模型,让它根据客户的言论去动态地设置某个变量的值。举个例子,我们可以设定一个规则,当客户说“我买的东西到哪了”,就让LLM自动把当前会话的意图变量设置成“物流查询”,后边逻辑就能顺着走。 第三个呢,叫 utils.evplate ,这个名字你可能一下子看不太懂,先别急。它其实是一个能动态评估模板的工具,也可以理解成它能根据对话的上下文智能地生成一小段回复内容或一个计算结果,让回复更灵活、更像真人。 最后一个就是 utils.end_service ,这个更好理解,就是用来“结束服务”的。你可以直接结束当前的整个会话,也可以在结束前把对话升级给人工代表,让客户无缝衔接真人。 这四个小工具各司其职,把它们组合起来,就能让你的Agent在处理复杂对话时显得既有条理,又不会掉链子。好,这一页的内容我们就先聊到这儿。

    查看详情
  • 18

    utils.transition to & utils.setVariables

    第 122 页

    好,咱们来看看这两个工具函数,一个是 `utils.transferTo`,另一个是 `utils.setVariables`。它们都是让代理更智能地流转对话和动态设置变量的关键。 先说 `utils.transferTo`。你可以把它想象成打个电话转接到别的部门。这个函数就是告诉主代理:“把当前对话转给另一个专门的子代理来处理”。注意几个特点: - 转接是单向的,也就是你从主代理转给子代理,等子代理把事情办完,对话就结束了,不会再自动回到主代理这里。 - 如果你真的需要再回到主代理,那你得自己在子代理里再设一个返回的转接,而且返回之后,流程是从子代理的开头重新开始,并不会接着刚才断开的地方继续。 - 什么时候转接?这是由大模型在推理过程中决定的。它会根据你的自然语言指令来判断。 - 在写推理指令时,如果希望某个条件下确定地转过去,你可以直接用“过渡到”子代理名称,注意不用加 `@utils.` 前缀。 再说 `utils.setVariables`。这个工具是用来让代理在对话过程中动态地设置或更新变量的值。 - 我们告诉代理:“嘿,你需要根据用户说的话,推断出一个值,然后把它存起来”。 - 具体怎么做呢?我们会给大模型一个提示(token),让它知道“哦,这个地方需要一个值”,然后通过描述告诉它如何去确定这个值。比如:“把用户的订单号提取出来存在订单号变量里”。 - 这样代理就能一边聊天一边记住关键信息,以便后续使用。 所以记住两个点: - `transferTo` 是单向转接,需要返回的话要手动设返回路径,而且不保留断点。 - `setVariables` 是让代理动态理解并赋值变量。 有什么不清楚的可以随时问我。

    查看详情
  • 19

    utils.escalate & utils.end_session

    第 123 页

    哈喽,同学们,我们来看看这张幻灯片上两个特别实用的工具:一个叫 `utils.scalate`,另一个叫 `utils.end_service`。别看名字带英文,其实就是帮我们智能体在跟客户聊天时,知道什么时候该“摇人”,什么时候该“下班”。 先说 `utils.scalate`,你把它想成智能体的“升级按钮”。当它发现自己搞不定客户的问题,或者客户强烈要求跟真人说话,它就需要把对话转给人类客服。但是注意,这个升级不是随便喊一句“来人啊”就行,它必须通过一个已经配置好的 Omni-Channel 连接。Omni-Channel 你可以理解成一个排队系统,它负责把客户的聊天请求分配给有空的人类客服。所以要想升级成功,我们事先得在聊天消息的配置里指定好这个 Omni-Channel 连接。幻灯片里还提醒我们,也可以用“升级实用程序”来代替一个专门的升级子代理,意思是不用额外创建一个小机器人来做转接,直接用这个现成功能就好。另外,`escalate` 这个词是系统保留的关键字,你可别把它用在子代理的名字或者操作的名字上,不然会冲突。 接着看 `utils.end_service`,它是智能体的“下班铃”。当智能体完成所有任务,或者满足结束条件了,比如客户说“谢谢你,没别的事了”,它就应该主动结束对话,不要赖着线不放。这个结束操作可以直接让大语言模型自己调用,也可以交给一个专门的“结束会话”子代理来触发。总之,就是优雅地终止服务,节省资源。 这两招一学会,你的智能体就能更丝滑地把复杂问题甩给人类,把简单问题干净利落地闭合,用户体验会好很多。大家理解了吗?有问题随时问。

    查看详情
  • 20

    Reference: Variables

    第 124 页

    同学们,咱们今天来说说Agentforce里的变量。你可以把变量想象成代理的记忆力——它能让代理确确实实地记住整个对话里发生了什么,跟踪当前进度,并且保留上下文,不会聊着聊着就忘了前面说过的事。 在Agentforce里,所有变量都定义在一个叫“变量块”的地方,而且这个块里的变量,不管主代理还是它下面的子代理,都能访问得到,很方便。 变量本身呢,又分成三种类型。第一种是常规变量,它有个默认值,状态可以变来变去,非常灵活。第二种叫链接变量,这种变量会跟外部数据源绑定在一起,比如一个消息会话,这样数据就能实时从外面传进来了。第三种是系统变量,系统预先定义好的,你只能读,不能改,它提供一些固定的会话信息。 简单来说,变量就是代理的记事本,让对话有条不紊,不会乱。我们后面的课程会再详细看每种变量的用法。有什么问题,现在可以提出来。

    查看详情
  • 21

    Regular & Linked Variables

    第 125 页

    好,我们接下来看这个页面讲的是变量(Variables)。它把变量分成了两类,一类叫“常规变量”,一类叫“链接变量”。理解这两类很重要,因为它们在代理里的行为完全不一样。 先看“常规变量”。你可以把它想象成一个代理想临时记住的便签条。比如你让代理记住用户名、一个数字、今天是星期几,这些就可以用常规变量。它的好处是,你可以给它一个默认值,比如默认用户名是“访客”,然后代理自己也可以在对话过程中修改它。这种变量支持的类型其实挺丰富的,有字符串、数字、布尔值,还有对象——这里说的对象就是复杂的 JSON,以及日期,另外还支持列表。也就是说,你可以用一个变量存一个数组。变量命名呢,和 Salesforce 的标准开发规范一样,就是那种 API 名称的写法,不能乱写。在 Agentforce 里,你要引用它,得分两个地方:如果你在脚本逻辑里用,要写 @variables.变量名;如果你在提示指令(也就是给大模型的自然语言指令里)要引用它,就得用 {! @variables.变量名 } 这个语法。注意花括号和感叹号的位置,有点类似我们之前在 Flow 或者公式里看到的写法,但不完全一样。 再来看“链接变量”。这类变量比较特殊,它像是代理和外部的消息通道之间的连接器,用来直接读取或写入外部来源的数据。比如说,你的代理是通过短信(Messaging)回复用户,或者是在语音通话(Voice Call)里,你就需要用到链接变量。它的特点跟常规变量几乎是相反的:它没有默认值,代理也不能去设置它的值,而且它不能是对象或者列表类型,只能是简单的字符串这类。为什么?因为它的值是直接绑定的,比如你从短信会话里拿到当前用户的输入,或者把代理的输出直接发回去,它更像是读和写的管道,而不需要你手动给它赋值。可用的来源其实就是那几个命名空间:@MessagingResponse、@MessagingEnduser 和 @VoiceCall。你需要根据你用的渠道,去用对应的那个来源。 总结一下,你可以这样记:凡是你想让代理自己算一算、记一记的东西,用常规变量;凡是和外部输入输出通道自动同步的,用链接变量。这样就不容易混淆了。

    查看详情
  • 22

    System Variables & None vs Empty String

    第 126 页

    同学们,今天我们来讲一个在Agentforce里非常实用的知识点,关于系统变量和空值检查。 首先,系统变量里有一个很常用的东西,它只包含客户最近说的那句话,而不是整个对话历史。为什么这样设计呢?因为大语言模型本身已经记住了完整的对话上下文,所以在很多时候,你只需要把客户的最后一句话拿来用就行了。比如,你想做情绪分析,就可以把这句话塞进专门设计的提示模板里,让模型去判断客户是不是生气了、着急了,这样效率很高,还不会浪费token。 接下来,我们说说空值检查。在代码或流程里,检查一个变量是不是“空”,有两种常见写法:`is None` 和 `== ""`。但很多人搞不清它们的区别,这里一定要分清楚。 用 `is None` 是问“这个变量有没有被赋值”。如果一个变量压根儿没被分配任何东西,它就是 None。这适用于任何类型的变量。 而 `== ""` 专门用来检查字符串变量是不是一个空字符串。空字符串的意思是:它已经被分配了值,只不过这个值是一串长度为0的文本。换句话说,变量不是空的,它有东西,但东西是空的。 这两种状态含义完全不同:None 表示“未分配”,空字符串表示“分配了,但内容是空的”。在逻辑处理时,弄混可能会造成bug,所以一定要根据业务含义选择合适的检查方式。 好了,这一部分就讲这么多,大家结合着情绪分析的例子再体会体会。下节课我们继续深入。

    查看详情