1. 别怕,工作流其实就是“搭积木”

如果你听到“工作流”这个词就觉得头大,感觉是那种只有程序员大神才能玩转的东西,那我得先给你吃颗定心丸。咱们今天要聊的,在扣子平台上搭建AI智能体工作流,本质上和你小时候搭积木、玩乐高没什么区别。你不需要懂复杂的代码,甚至不需要知道“API”怎么拼写,你只需要搞清楚一件事:你想让这个智能体帮你完成一件什么事,然后把这件“事”拆成几个“步骤”,最后把这些“步骤”像拼图一样连起来。

就拿咱们这篇文章要做的“个性化电影推荐智能体”来说吧。你平时是怎么找电影看的?是不是先想想自己现在想看什么类型的(比如“今晚想看点轻松的喜剧”),然后可能会去豆瓣看看评分,或者问问朋友有没有推荐,最后综合一下信息,决定看哪一部。这个“想类型 -> 查评分/问推荐 -> 做决定”的过程,就是一个最简单的工作流。

在扣子平台里,你的每一个“想法”和“动作”,都可以变成一个独立的“节点”。比如,“理解你想看什么类型”可以交给一个大模型节点;“去豆瓣查评分”可以调用一个搜索插件节点;“综合信息给出最终推荐”可以再交给另一个大模型节点。你的任务,就是把这些节点用线连起来,告诉它们:“嘿,你先干这个,干完了把结果传给下一个伙计。” 整个过程都在一个可视化的画布上拖拽完成,非常直观。

我刚开始接触的时候也犯怵,觉得这玩意儿肯定很复杂。但上手做了两个之后发现,它的逻辑特别直白。你不需要从零造轮子,扣子已经把最常用的“积木块”(节点)都给你准备好了,比如处理文本的“大模型”、连接外部信息的“插件”、最终输出的“消息”等等。你要做的,就是根据你的目标,挑选合适的积木,然后把它们按正确的顺序摆好。所以,放轻松,咱们这就开始动手,从一张白纸开始,搭建你的第一个能真正干活的AI助手。

2. 开工第一步:创建你的空白工作流

万事开头难,但在扣子这里,开头可能是最简单的。咱们直接进入实战。

首先,你需要登录扣子平台。别担心,它有个非常友好的个人免费额度,足够我们折腾学习。登录后,在控制台界面,你应该能看到一个醒目的“创建智能体”或“新建Bot”的按钮,大胆点下去。给你的智能体起个名字,比如“我的电影推荐小助手”,描述可以写“根据你的心情和喜好推荐电影”。

创建完智能体,你就进入了它的“后台”。这里有很多选项卡,比如“提示词”、“知识库”、“插件”等等。我们今天的主角是“工作流”,所以你找到并点击“工作流”标签页。第一次进来,这里应该是空的,点击“新建工作流”,给它也起个名字,比如“电影推荐主流程”。

好了,魔法画布出现了。你会看到画布上已经有两个默认的节点:一个绿色的“开始”节点和一个红色的“结束”节点。这就像你写文章要有开头和结尾一样,所有的工作流都必须从“开始”出发,最终到达“结束”。这两个节点目前孤零零的,中间一片空白,等着你去填充。这就是我们梦想开始的地方。

让我们先来认识一下这个“开始”节点。 你点一下它,右侧会弹出它的配置面板。这里最关键的是“输入”部分。你可以把它理解成这个工作流的“耳朵”,专门用来接收用户说的话。比如,用户说“我想看一部感人的爱情电影”,这句话就会从这里传进来。

配置面板里通常会有一个默认的变量,叫 BOT_USER_INPUT,它自动记录了用户最原始的输入。我个人的习惯是,为了后面引用起来更清晰,会在这里手动添加一个变量,比如就叫 user_query。怎么加呢?一般会有一个“添加变量”的按钮,你点一下,输入变量名 user_query,然后在下拉框里选择“引用” -> “用户问题”或者类似的选项。这样,user_query 这个变量就和 BOT_USER_INPUT 一样,保存了用户的那句“我想看一部感人的爱情电影”。

提示:变量名就像给一个盒子贴标签。你后面会有很多节点需要用到用户输入的这句话,通过 user_query 这个标签,你就能在任何节点里轻松找到并使用这个“盒子”里的内容。这是串联整个工作流的基础,一定要理解。

3. 核心大脑:配置大模型节点理解用户意图

工作流有了“耳朵”(开始节点),接下来就需要一个“大脑”来理解耳朵听到的话。这个大脑,就是大模型节点。在扣子里,大模型节点是你的核心处理器,所有复杂的文本理解、信息提取、内容生成,都得靠它。

在画布左侧的节点库(通常是一列图标)里,找到“大模型”或者“LLM”这个类别,点击它,然后把它拖拽到画布上,放在“开始”节点的右边。现在,用鼠标从“开始”节点右侧的小圆点(输出点)拖出一条线,连接到“大模型”节点左侧的小圆点(输入点)。这条线就建立了数据流:用户输入的话,会沿着这条线,从“开始”节点“流”到“大模型”节点。

现在,点击这个新的大模型节点进行配置。 右侧面板会刷新。第一步是“选择模型”。扣子集成了很多模型,比如豆包、GPT-4等。对于我们的电影推荐场景,选择“豆包”就行,它足够聪明且响应快,关键是免费额度够用。

第二步是“输入”。这里你要告诉大模型:“你要处理的数据来自哪里”。点击输入框,你会看到一个下拉列表,里面列出了所有上游节点能提供的变量。选择我们之前在开始节点创建的 user_query。这样,大模型就知道它要分析的是用户那句原始请求了。

第三步,也是最关键的一步:编写提示词。 提示词就是你给大模型下的“指令”,它的质量直接决定了智能体聪不聪明。我们的目标是让大模型从用户模糊的请求里,提取出明确的、结构化的信息。

举个例子,用户说“下班累了,想找点刺激的片子看看”。这句话很口语化。我们需要大模型把它翻译成机器能理解的几个字段:mood(心情:累)、genre(类型:刺激、可能是动作/惊悚)、intention(意图:放松解压)。我们可以这样写提示词:

你是一个专业的电影需求分析师。请仔细分析用户的以下请求,并从中提取关键信息,以JSON格式输出。

用户请求:{{user_query}}

请提取并输出以下字段:
1. `user_mood`: 用户当前的心情或状态(例如:疲惫、开心、无聊、悲伤等)。
2. `preferred_genre`: 用户想看的电影类型(例如:喜剧、动作、爱情、科幻、悬疑等)。如果用户描述模糊,请根据上下文推断最可能的1-2种类型。
3. `watch_intention`: 用户看电影的主要目的(例如:放松、寻求刺激、感动流泪、学习知识等)。
4. `time_period`: 用户可能偏好的电影时代(例如:经典老片、近年新片、不限)。如果未提及,则输出“不限”。

请确保输出仅为合法的JSON对象,不要有任何额外的解释或文本。

注意 {{user_query}} 这个写法,它表示这里会动态插入我们之前设置的变量值。写好提示词后,别忘了在节点的“输出”部分,定义好变量名来接收大模型的分析结果。比如,你可以添加一个输出变量叫 parsed_request,用来保存大模型生成的这个JSON字符串。这样,下游节点就能用 parsed_request 来获取结构化的用户需求了。

4. 连接外部世界:使用插件获取实时信息

光靠大模型自己“空想”是不够的,它需要最新的、实时的信息来做出靠谱的推荐。比如,用户想找“最近上映的高分科幻片”,大模型自己并不知道最近上映了哪些电影,豆瓣评分是多少。这时,我们就需要“插件”来帮忙。插件就像是智能体伸向互联网的“手”和“眼睛”。

扣子平台有一个插件商店,里面有很多现成的插件,比如“豆瓣搜索”、“百度搜索”、“天气查询”、“航班查询”等等。对于电影推荐,我们最需要的就是一个能查询电影信息的插件。假设我们使用“豆瓣搜索”插件。

回到画布,在左侧节点库找到“插件”类别,搜索并拖拽一个“豆瓣搜索”节点到画布上,把它放在大模型节点的后面,并用线连接起来。这意味着,先由大模型分析出用户意图,然后把意图交给豆瓣插件去执行搜索。

配置插件节点。 点击它,在右侧面板,你需要设置搜索的“关键词”。关键词不能再用原始的 user_query 了,那样太模糊。我们应该用大模型分析好的结构化信息。比如,我们可以这样设置:

  • 搜索关键词:结合 preferred_genre(类型)和 time_period(年代)。例如,如果大模型输出 {“preferred_genre”: “科幻”, “time_period”: “近年新片”},那么关键词可以配置为“{{parsed_request.preferred_genre}} {{parsed_request.time_period}} 电影 推荐”。(这里假设插件支持这种变量嵌套引用,具体语法需参考扣子文档)。

插件执行搜索后,会返回一堆结果,比如电影列表,包含片名、简介、评分、链接等。这些结果通常也会以一个变量(比如 search_results)的形式输出。现在,你的工作流里就有了来自豆瓣的真实数据。

但是,这些原始数据可能很杂乱,不适合直接扔给用户。我们需要再请出“大脑”来处理一下。所以,在“豆瓣搜索”插件节点后面,再连接一个大模型节点。这个节点的任务是:阅读插件返回的原始搜索结果,然后根据用户最初的 user_mood(心情)和 watch_intention(意图),筛选、排序,并组织成一段友好、个性化的推荐语。

这个节点的提示词可能是这样的:

你是一个贴心的电影达人。以下是根据用户需求搜索到的电影列表原始数据:

用户心情:{{parsed_request.user_mood}}
用户意图:{{parsed_request.watch_intention}}
原始搜索结果:{{search_results}}

请根据用户的心情和意图,从结果中精选出最多3部最合适的电影。为每部电影撰写一段简短的推荐理由,重点说明它如何契合用户当前的状态(例如,如果用户累了,就推荐轻松不费脑的;如果用户寻求刺激,就推荐情节紧凑的)。最后,以热情、朋友般的口吻整体输出你的推荐。

通过“大模型 -> 插件 -> 大模型”这样的组合拳,你的智能体就完成了“理解需求 -> 获取事实 -> 加工输出”的完整链条,变得既有“情商”又有“信息量”。

5. 串联与调试:让工作流真正跑起来

现在,你的画布上应该有几个节点了:开始 -> 意图分析大模型 -> 豆瓣搜索插件 -> 推荐生成大模型。最后,我们还需要一个“嘴巴”把结果告诉用户,这就是“消息”节点。从左侧拖一个“消息”节点出来,连接到最后一个大模型节点之后。

在消息节点的配置里,你只需要选择输入源为上一个节点的输出变量。比如,上一个节点输出变量叫 final_recommendation,你就在这里引用它。消息节点会把这个变量的内容,直接作为智能体的回复发送给用户。

所有节点连线完毕,看起来像一条流水线了,但先别急着庆祝。 工作流搭建最核心也最容易出错的环节来了:调试。扣子平台通常提供了一个非常棒的“调试”或“预览”功能。你可以模拟用户输入一句话,然后一步步跟踪数据在每个节点间的流动。

点击调试按钮,在输入框里键入我们的测试用例:“今天心情有点低落,想找一部温暖治愈的老电影看看”。然后点击运行。

  1. 第一步,看开始节点。 检查 user_query 变量是否正确捕获了你的测试语句。
  2. 第二步,看第一个大模型节点。 点击它,查看它的输入(是否收到了 user_query)和输出(生成的 parsed_request JSON 是否合理)。它是否准确提取出了 mood: 低落genre: 治愈intention: 寻求温暖time_period: 老电影?如果这里出错,后面的全错。问题多半出在提示词不够清晰,回去修改提示词。
  3. 第三步,看插件节点。 检查它收到的搜索关键词是什么。是不是 “治愈 老电影 推荐”?插件返回的 search_results 里有没有数据?是不是一堆乱码或错误信息?这可能是插件配置不对,或者插件需要的参数格式不对。
  4. 第四步,看第二个大模型节点。 检查它是否同时收到了结构化的用户意图(parsed_request)和原始的搜索结果(search_results)。它生成的 final_recommendation 是否通顺、贴心、符合要求?
  5. 最后,看消息节点。 它输出的最终话术是不是你想要的?

这个调试过程可能会反复多次。我踩过的坑包括:变量名拼写错误、节点连线顺序错了、提示词里忘了引用变量、插件返回的数据结构和大模型期望的不匹配等等。每解决一个bug,你对工作流运作机制的理解就会深一层。别怕麻烦,这是从“知道”到“会用”的必经之路。

6. 进阶优化:让你的智能体更聪明更稳定

一个能跑通的工作流只是及格线。要让你的电影推荐智能体从“能用”变得“好用”,甚至让人惊喜,还需要一些进阶优化。这里分享几个我实战中觉得特别有用的技巧。

第一,增加异常处理分支。 不是所有用户输入都是友好的。比如用户可能说“你好”,或者输入一段完全无关的乱码。如果你的工作流只会机械地执行“分析意图->搜索->推荐”这条主线,遇到这种情况就会卡住或者输出莫名其妙的结果。怎么办?我们可以利用工作流的“条件分支”节点。

在第一个大模型节点(意图分析)之后,不直接连插件,而是先连一个“条件判断”节点。在这个节点里,我们可以设置规则:检查 parsed_request 里是否成功提取出了 preferred_genre 字段?或者,检查用户输入是否过短、是否包含电影相关关键词?如果判断为“是”(即正常电影请求),就流向豆瓣搜索插件那条主线。如果判断为“否”(即非电影请求或无效请求),就流向另一个分支。这个分支可以连接一个大模型节点,专门用来处理闲聊或者提示用户“请告诉我你想看什么类型的电影呀”。这样,你的智能体就显得更健壮、更人性化了。

第二,实现多轮对话记忆。 基础工作流每次对话都是独立的。用户如果说“我不要看动画片,换一个”,智能体会忘记上一句说了什么。要实现上下文记忆,你需要用到“变量”的持久化存储。扣子平台通常提供了“数据库”节点或“存储”变量类型。你可以把用户的历史偏好(比如他多次提到喜欢某位导演)、或者本次对话中已拒绝的电影类型,存储到一个持久化变量里。在每次分析用户新意图时,不仅看当前输入,也查询这个存储变量,把历史偏好考虑进去,从而实现越聊越懂你的个性化推荐。

第三,优化提示词的工程化。 不要把所有的逻辑都堆在一个提示词里。可以尝试“链式思考”(Chain-of-Thought)的技巧。比如,在第一个大模型节点,提示词只让它做“信息提取和分类”。在第二个大模型节点(推荐生成),提示词让它做“基于分类结果的精细筛选和文案润色”。这样每个节点的职责更单一,效果往往更好。你也可以为不同电影类型准备不同的推荐文案模板,存放在“知识库”中,让大模型节点去检索调用,这样输出的风格会更稳定。

最后,进行大量测试。 找几个朋友,让他们用各种稀奇古怪的方式向你的智能体提问。“给我推荐电影”、“科幻片”、“周星驰的搞笑电影”、“像《肖申克的救赎》那种有深度的”、“我失恋了该看什么”。观察它的反应,记录下失败案例,然后回到画布上,思考是哪个环节的规则或提示词需要调整。这个过程就像打磨一个产品,迭代越多,它就越聪明。当你看到它终于能理解“我失恋了”背后是想要“温暖治愈”而非“悲伤爱情”时,那种成就感是无与伦比的。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐