今天给大家分享一下如何基于扣子构建识别用户意图工作流。首先给大家看一个效果,比如说我们现在要做这么一个功能,我去问这个智能体,比如说长沙今天天气怎么样,那么它就会给你一些反馈,识别到你这个意图。他知道你问的是天气,然后去调用天气的一些插件,或者说一些API去帮你查询。然后如果说我去问他,要他推送一条最新的科技新闻的话,那他又会去调用新闻的一些插件,然后帮我们去做一些新闻的推荐,就是这么一个功能,这个叫用户意图识别。就是你问他有关天气或者新闻的一些问题的话,他会走不同的一个逻辑,那这个在我们的一个业务场景里面的话,比如说用户的需求有很多,但是我们这个里面我们功能是有限制的,就是说我们有的功能才可以给用户提供服务。当用户问到跟我们这个功能相关的话题的时候,我们AI的话就要去调用一些我们的这个能力去给用户一些反馈,这就是我们这个叫用户意图识别的这么一个功能。
那这么一个工作流或者整体的话一般我们怎么来搭建呢?我就带大家一步步的从0到1去把这个流程给实现。我们的需求的话就是要大概是要搭这么一个工作流,那要解决几个事情,就是首先我们去用户去问到这个天气的时候,我们有一个节点。第一个节点是处理天气相关的,第二个节点是处理新闻相关的,我们要做一个判断,一二三我们要识别到。比如说用户问的是天气的话,那我要把这个意图识别为一,如果用户他问到的是新闻的话,我要把它识别为二。如果说它既不是新闻又不是天气的话,那我们把它处理为三,那这个就默认就不处理了,那我就带大家来搭建一下,我们到这个扣子的这个后台。
然后首先的话因为我们是先要搭建一个工作流,所以说这里我们首先得建一个这么一个工作流,那我们点这个右边创建,但是这个是项目开发里面是创建智能体,我们先到资源库里面,大家在这个右上角这个资源加,然后我们点工作流,我们就这个叫with the new task,就是我们去处理新闻,或者是这个天气的这么一个任务,那我们描述这里,我们也复制一下,就这个工作流的话,它是什么呢?用于识别用户意图并且获取相关信息,天气只处理天气跟新闻,其他的我们就不管了。好,然后确认我们创建了一个工作流。
好,到这里的话,我们就从一步步的给大家来搭建首先先确定一下需求,就是我们要开始去搭建的时候,默认会有两个节点。关于这个工作流节点这一块,大家如果不是很清楚的话,可以听一下我之前的一些分享。就是扣子工作流这个入门那那一期专门就讲到了这个口子工作流的一些节点,包括一些有各种各样的一个节点,一些细节,大家可以去听一下那一些好,我们现在的话就是首先这个需求的话,它要做一个意图识别,对不对?
意图识别最关键的点就是我们要调用大模型的这个能力去做意图识别。也就是当用户我去输入一个一段话,比如说我问今天天气怎么样,然后你或者说因为新闻上最新的科技新闻,那这句话怎么我可以把它识别出来,就是那个意图。比如说怎么把它输出为一或者二呢?这个我们就要用到大模型的人力,所以说我们首先要把这个大模型给加进去,我们添加一个大模型节点,然后把这个刚开始的一个节点跟大模型节点连接。那大模型节点首先的话那个输入参数这一块,我们要接收开始里面输入的用户提示词,就是这个对话,要把这个内容拿到,拿到完之后,现在最关键的就是要做意图识别。这个怎么来实现的呢?这个也是通过提示词来实现的。在这个资料里面给大家提供了一个提示词。
大家看啊其实也很简单,首先让他做分析,分析一下什么什么括起来的这个文本,这个就是我们用户传进来的这么一个参数。大家看就这个参数传进来的时候,就是把这些题词一起丢给大模型,让大模型去判断。如果大模型觉得你输入这个文本跟天气有关的话,它就会给你返回一。如果说这个跟新闻有关的话就返回2,否则的话就返回3。所以说现在要做的我们就是把这个提示复制一下,然后粘贴到哪里呢?粘贴到这个系统提示词这一块,就是啊我们要用这个大模型的时候,要让系统就相当于你调用它的时候,给它一个系统提示词,让他帮我去做一个处理。
好,然后这个里面的话这个里面有一个参数,就是这里默认的话它是一个input的参数。但是因为下面引用的这个变量是query,所以说我们要把它改成这个quarrel。好,把它这个query改完之后,这里大家看啊,就是你引用变量的话有两种方式。一种的话大家直接在这里写,就是你把这个块写在这里就可以了。还有一种方式,大家写这个打一个花括号,它会自动引用到这个变量,就是这里它会有一个比如说我们点花括号这里,大家看啊你可以在这里,它就可以引用这个变量,就是它会跳出一个框,然后你点击就可以了。好,有了这个之后,这个里面它就可以帮你做一个输出了。
最终的一个输出的话,我们把叫这个intel ent叫意图,就我们要输出一个意图的值,但是这个值的话我们需要注意,要选into,这是一个整形的,就是数值类型的那我们想选这个的。好,然后完了之后,也就是说经历了这个大模型之后,它就能把这个意图识别的这么一个代码给你返回了。但有了这个代码之后,我们接下来需要干一个什么事情呢?我们要一个选择器,说白了就是一个分支的一个判断。也就是说我们现在如果说这个地图这一块,如果它是一的话,我们要走那个?吧走天气的一个查询走天气的一个查询。如果是二的话,我们要走这个新闻的一个查询。
那这种情况我们一般怎么来实现的呢?来我们先加一个选择器,有一个选择器节点,就是if else判断,那我们加到这里来,我们连接起来,把它连接起来。连接起来之后,如果我们这里写如果什么,如果这个输入的一个值,我们这里选大模型,大模型它会输出一个intellect,就是这个意图,它是一个into类型的那我们这里的话,比如说它输入的是一的话是吧一如果什么呢?如果等于,这里大家注意,一定要选这个。如果这个条件它是等于一的话,等于一的话干嘛呢?等于一的话我们就要去查询天气,对不对?
那查询天气怎么办?查询天气的话,原则上我们是可以通过一个插件去查询的,通过一个插件去查询的。但是通过插件去查询的话,它只能返回插件的一些内容。我先给它这个加一下,比如说天气。天气,比如说我们现在就用这个墨迹天气,指定日期的天气。大家看啊如果说我们只是用这个天气的话,那我们就在这个地方来看。因为天气它是要明确的去输入什么名称,是吧?然后你看CT就是城市,结束时间,开始时间。
那我们这里的话你如果说只是输一个长沙的话,传一个参数没有问题。但是如果说你问的是一段话的话,那用这个插件可能就会有一些问题,所以说这里事实上的话,我们要去换另外一种实现方式,就是用大模型结合这种插件的方式。因为你单纯的用这个插件去连接的话,他只能去帮你输入一些什么CT,然后什么什么之类的是吧?你就固定的。
比如说比如说我们现在来测一下,比如说我现在输入,比如说我这个city城市,在这个地方,我选这个大模型,这个开始input,我们来给大家先看一个效果,我们把它连起来,然后我们最终结束这个变量的话,就拿到这个消息的这么一个什么,看一下data,应该是这个message data,然后返回这个消息的这个数据,然后我给它试运行一下选择器force。否则否则就是否则的一个情况,我们就直接就结束了,就不返回了。所以这里把它连起来就可以了。试运行来看,我输入这个长这个长沙。
好,这里大家看啊长沙这里输出失败是吧?我们看一下这个为什么会失败,如果等于一的话,否则首先等于一的话,我们会执行一个节点。看一下这里为啥没执行,看是不是一,因为你输入的是这个长沙是吧,你没有输入天气相关的,所以它识别到是一个force。那我们说的更具体一些,我们叫长沙天气。
好,大家看它返回了,你看长沙的什么什么天气,小雨什么什么是吧?这里它是不是就有了?所以这里的话但是会有一个问题,就是大家看啊它是给你的一段报文,就是它是原生的去调用这个天气的API直接给你一个报文。你什么它是一个Jason格式的一个报文,给你这种就是纯英文的这种。我们其实希望的是一段比较好的中文描述,对不对?我们不希望要这种英文报文,这个是开发人员他可能看的明白一些。但是如果对普通用户的话,你要看这个东西的话就比较费劲,所以说我们不想要它原始的API的这个数据,我只希望要一段描述。
所以说这个时候我们得换一种方式实现,你不能直接用插件就调用了,我们换另外一种比较人性化的一种实现,我们叫什么呢?叫大模型,用大模型这里我们就改一下,这个叫什么呢?叫大模型加天气插件,就是把大模型跟天气这个插件做一个什么呢?做一个技能上的组合,我就用这个天气一个能力,我们叫技能。技能也就是说把天气这个API本身这个插件的能力跟大模型做一个整合,就让大模型具备了这个天气的这么一个技能,所以我们来整合起来。
然后在这里大家看啊我们配置一个技能,在这个地方有一个技能模型的话,本身用的是豆包大模型。然后技能的话大家看我们点这个加号技能,这里我们选搜索这个天气,然后把墨迹天气加进去。OK大家看这个技能就有了这个过程,大家能理解吧?就是我们把大模型,就是我们既用大模型也用这个技能,首先让大模型帮我们去组装这个参数,就是我不管为什么长沙天气什么新闻也好,他最终都会调用这个墨迹天气,并把它的一个结果做一个人性化的输出,这个就是我们想要的这么一个效果,但是前提的话我们要把这个提示词给写好啊。
来我们看一下怎么来实现。首先我们有了这个大模型加这个能力之后,接下来我们首先要给大模型输入一个参数,对不对?我们参数的话还是用这个,在这个里面我们首先把它连起来,我们把它这个连起来,连起来之后我们这里大家看啊选择大模型的这个,我选开始的这个输入参数,也就是我们把提示词要传给大模型。
好,接下来很关键的一个地方,大家注意看啊,就是要提示词要写好,怎么写呢?比如说根据根据这个什么呢?这个input根据这个参数提示词。干嘛呢?调用调用这个我们有一个墨迹天气,大家就可以这么写,调用墨迹天气工具,我们叫技能,或者叫技能,天气这个技能干嘛呢?查询天气信息。就这么来写,就是根据我们现在输入的这个提示词,然后我们调用这个天气的这么一个技能去查询它的一个天气信息,这是我们的需求对不对?然后最终输出的话可以这么来写。格式化。
格式化输出,我们接着就是人性化查询人性化的输出,天气信息关键点,我们让他人性化一点,就是输出的这个格式比较友好一点,就把一些关键性的信说出来,不要说一堆这个多余的,就给他说关键点。好,这么来好,完了之后的话干嘛呢?然后就把这个结果给它输出了,我们把它连起来明显,我们再看一下优化后的一个效果,来试运行一下。然后我再问长沙天气。结束,这个输出变量这里选一输出变量,选大模型的一个输出,最终以这个结果为准,来试运行来跑一下。
大家看长沙今天什么什么日期天气为小雨,最高温度30度,最低气温什么什么什么。大家看这个是不是人性化的一个输出了,就直接说关键点,最高最低什么小雨还给你一些人性化的注意事项,什么携带雨具什么之类的,是吧,这个就比较人性化了。这个就是我们想要的一个效果,就是给一个用户看起来比较好理解的这么一段描述,而不是刚刚那一堆报文数据OK,这个就是第一个点,需求我们就实现了。然后第二点就是我们刚刚提到了这个用户意图识别的话。我们还要去查新闻是吧,所以触类旁通,我们现在还需要加个东西,如果是二的时候怎么办?大家看这里,如果是2,我们还要加一个节点,加一个看一下一个选择器选择器。如果如果这个什么这个大模型intel ent等于2,等于2,就是我们单独再开一个分支,如果等于二的话干嘛呢?
等于二的话,我们依旧的,接下来要干嘛呢?要去使用到大模型加上新闻的一个能力,对不对?跟上面那个例子一样的,我们选大模型,然后大模型比如说我们这里改一下,重命名大模型加新闻技能,我们把这个技能组合起来,然后输入这里。同样的我们要去用最开始的一个输入用户提示词,然后新闻这里其实依旧,就是大家需要把这个提示词写好就可以了。来我们写,根据根据什么呢?
我们把这个input,那把它把这个input这个变量输入进来,根据input提示词什么调用,我们等下会用一个新闻插件,我们先把那个新闻插件给它引进来,同样的把这个技能给配一下,在这里大家看技能配置好技能这里我们找一个新闻的,新闻的话,我推荐用这个头条新闻,用这个头条新闻。在这里头条新闻我们就调用头头条新闻技能,查询新闻。信息资讯资讯,同样的,我们让他人性化。人性化输出。新闻关键信息关键点,我让他说出关键点,就不用说一堆了,就直接说关键点就可以了。
好,然后完了之后,接下来同样的就是要把这个结果给干嘛呢?给做一个输出,给做一个输出。好,到这里的话大家看啊,因为刚刚不是已经接收到了一个天气的一个输出的。如果说你还想把什么咱们的一个什么新闻一的输出的话,你可以自己再加一个变量。比如说我们刚刚那个叫天气reader。那我们现在再加一个加一个啥加一个news新闻,然后这个就是新闻的这么一个输出,来给大家看一个结果,都搭建好了,然后试运行一下。
比如说我们现在说那个我直接推荐一条,我就一条,这里给他限制一下数量,推荐一条最新的科技新闻,科技新闻来让他学习一下。他说选择这个选择还有一这种force情况,就是给V3的1个情况。就是我们刚刚文档里面123是吧?一是走什么,二是走什么,三是什么,把这个三再给它连起来,这个是三的情况,就直接结束就完事了。所以说大家点视觉型的时候,你发现下面有一个编译报错,就是有个错误列表,你看一看,就是要把它处理的话,它这个没法试运行,来跑一下。好,大家看现在是二的这个情况了,我们查询新闻去了让他新闻稍微有点慢。
他已经走到这个节点了,就是等于I的这个情况。大家看啊他帮我找到几则信息,什么什么2025年什么中关村,然后什么什么新闻,然后他就给你输出了,包括一个新闻的一个链接,其实都已经有了,一些这个新闻的信息是不是都已经有了,是吧?搜索看一下。这个就是整个我们新闻的一个实现逻辑,然后在这个地方实现的话,其实我们就是有一个问题,我说让他推荐一条,他其实给了我多条,对不对?那这里的话他其实有时候去还是会出现一些误差,就是你说一条他有时候可能还是会给你多条,我们其实可以在智能体里面去再做一些处理,现在我们其实是搭了一个工作流去做这个啊,这个只是做一个简单测试,那接下来我们要在智能体给用户搭建一个绘画的这么一个界面。所以我们到这个项目开发里面来这里创建一个智能体,名叫新闻,我们叫意图识别小助理,我们就加这么一个正方体。
好,然后这里的话大家把这个工作流加进来,我们点这个加号添加工作流,把我们刚刚的那个我们刚刚那个其实没有发布,这个with the new task,就是我们刚刚那个意图识别。所以这里大家注意,一定要点这个发布,不然用不了的,一定要点发布,比如说发布版本。0.1,一定要把这个发布。好,发布完之后大家看我们就它会默认弹一个框,就是直接添加这个意图识别的这个工作的就可以了。好,然后就是下面一个对话,那你就直接问他,比如说我们说成都。
成都天气那你看当你输入成都天气的时候,它就会默认调用这个工作流,它会帮你去做意图识别。就看大家可以看到这个流程,你看它已经在调这个v new task,然后这里面会涉及到一些插件的调用细节。比如说大家看啊,你看这里它会默认的把一些成都的参数给你做一些封装,对不对?然后最终给你一个响应。然后大家看到就是什么成都今天天气是什么,什么时候会携带什么什么是吧,这个就是天气的一个识别。
然后的话比如说我问一下推送一条AI新闻,我要让他推送一条AI新闻。然后大家看这个意图,你看它走的插件逻辑就不一样了。来看他执行这个工作流了。新闻稍微有点慢。
大家看啊,这个就是我们用智能体的一个好处。你看他其实帮你查了一堆新闻出来,你看什么什么最近AI界十大什么新闻热点是吧?但其实我只要一条,对不对?这一条的话,那智能体其实帮你做了优化处理的。你看他会帮你输出一条,但是他也会丢一个链接在这里,你可以打开什么的一个链接去查看最近的。
就上面那个新闻的话,API他给你返回的是一堆这个新闻,一堆什么新闻。但是其实我们只想要一条?所以说这个时候我们就用整体的话,用agent的这种方式,他就是帮你做一些优化处理,他最终只保留一条,但是你可以点击查看AI新闻热点综述,你可以打开这个链接,它会帮你找到近期AI新闻的热点综述。大家可以看到就是他把这个新闻的单条数据,还有一些详情页丢都丢给你了,所以说这个就是智能体这一块的一个它的一个优点所在。就是说不管那个插件返回的是什么结果,他都会帮你去做一些优化。
因为你的需求是推荐一条AI新闻,这是咱们的一个目标。你一篇里面即使返回了多条的话,那我这个阵容体的话它也要做一个反思,做一个总结是吧?最终给你输出一条,但是你也可以他可以丢一个总结性的东西给你,这就是智能体的一个强大之处。我们这边,其实大家看也可以做一些描述,大家可以在右侧,左侧这里你可以写一些技能。
比如说你将这个工作流的时候,你希望做一些更加细节化的一个处理?比如说我们要加一些这个技能。我们这里可以去生成一下,看一下提示词库。大家看啊就是你如果你不知道怎么写的话,你可以在这个地方点一下它这个提示词库。就是它有一个结构,它有几种写法,通用结构,然后做任务执行什么,第一步干嘛,第二步干嘛,这个是适合于做一些复杂任务的时候,然后包括角色扮演怎么样,技能调用怎么样。他都把这个格式给你列的非常清楚了,你只需要去什么呢?去按它的格式去写就可以了。
比如说我们就用通用结构插入这个提示词那个角色,我们我们可以简单写一下,就是我们这个叫意图识别小助手是吧?这个描述我们也不写,我们主要就是目标,目标这里的话我们其实也不用管,就是输出,你要输出这个用户希望看到的内容,我们就简单写一下。然后这个技能的话,这里大家就可以做一些细化。比如说我们这个工作流的这个细节,比如说我们输出格式,比如说我现在改一个格式,希望输出的内容是以表格表格形式呈现的,就我们希望我再改一个格式,就是我现在希望用表格来呈现,大家看一下这个结果,比如说我们现在推荐三条AI新闻,推荐三条,看他会不会以表格输出。
这里稍微可能有点慢,这个是一个整个整体的一个提示词,就是整个的一个编排的一个逻辑,就是这个智能体的逻辑。大家看是不是以表格输出了,就是我不管你调用插件它的格式是怎么样的,我这个智能体它的要求是在这边,他左边。如果大家没有任何要求,它就是按照智能体本身的一些默认的系统设置好的一些通用逻辑去做。如果说你希望它以表格的输出格式输出的话,那大家看它其实就是一个表格的什么新闻标题,是吧?是不是就比较详细了。比如说你希望以这个mark down,它默认其实就是markdown,我要把它换种格式,我们再问他,你让他markdown格式的,你就是你想改什么格式就改什么格式,这个都是OK的,你直接在这里写就可以了。包括你对新闻的次数的一些限制,整个的一些具体的细节,你都可以做一些管控,这个都没有问题的。来看现在是不是markdown格式,你看这个格式,这个就是偏mark down的,也就是说这个格式大家都可以自己去写,包括工作流执行的一个细节,就是你想对这个工作流里面来做一些什么细节描述,就是一些场景的话,大家都可以去尝试一下,其实也不是很复杂,这个就是我们要去做一个意图识别的一个逻辑。
首先我们要就是说一下刚才那个流程,到这个图里面,就大家首先要去做意图识别的话,你首先得要有一个大模型,大模型那你去做总结归纳,就是你把提示词给他,然后把这个提示词完了之后的话,大家需要把这个一些关键点写好啊,就是一些系统提示词,比如说分析一下这个提示词,然后输出。如果与天气有关就返回一,如果与新闻有关就返回2。这里你要注意意图识别,然后就加一个选择器,就是if else判断,如果等于一的话,就去查询这个什么天气。
但是纯粹的调用天气插件的话,我们刚刚说有个问题,就是它是一个报文形式呈现的。我们希望的格式的话其实是一个什么呢?是一个文本,就是一个人性化的一个文本描述。所以说这时候的话,我们希望把大模型的能力也整合进来,所以说我们建了一个大模型节点,给大模型配上了这个天气的一个技能。有了这个技能之后,这个技能输出的内容会有大模型帮你做一个人性化的输出。这样你看到的结果就会比较舒服一些,比较人性细化一些,这是我们具体优化的一个步骤。然后完了之后把这个内容输出出来。
然后还有一块就是第二种情况,等于二我们需要调用新闻插件,那新闻插件逻辑跟上面也是一样的。然后大家把这个意图,还有给等于三的这个情况,我们就直接就结束了。那就是1233种情况我们都带大家去实现了,这个就是整个做分支判断的一个逻辑。
然后最后的话就是大家如果还想对工作流的一些细节做一些优化。比如说我现在要把内容格式输出成表格形式的,大家可以在左侧的这个编排这个逻辑里面,你可以把这个加上去,就是你的格式。比如这里我们希望是表格。我们希望是表格形式呈现的那你就把这个表格加进去就完事了。你希望任何格式的你在这里改,就是我们可以定义全局工作流的一个逻辑,这个就是整个我们去做构子构建,识别用户意图工作流的一个流程 。