掌握你的第一个魔法
现代魔法编程思想
n8n 使用教程
n8n 实战案例
杂项
🔰制作第一个与大模型配合的 n8n 程序
type
status
date
slug
summary
tags
category
icon
password
author
标签
第三方接入
这篇文章适合谁阅读?
适合对n8n完全没有了解,并且运维技巧几乎未 0 的人阅读。
这篇文章不但会基于一个简单的 Case 讲解 n8n 的使用方法,还会讲述在制作程序中遇到的每一个坑,并且遇到这些坑如何解决,以及从用户心理的角度去做一些分析,希望能够通过这篇教程降低 n8n 学习曲线的陡峭程度,尤其是对于新手来说。
这篇文章所涉及到的程序,需要用到 Google 的 API,所以需要读者已经购买了 n8n 的官方云服务版,或者在自己的服务器上部署了 n8n,关于如何部署,详细方法见:如何在服务器部署/安装 n8n。
需求描述
假如你是一个 SaaS 系统的负责人,客户在使用 SaaS 的时候都会产生大量的疑问(每天超过 100 个),这些疑问变成工单提交给客服。
现在你计划对这个 SaaS 做 3 项改进,你希望知道这 3 项改进完成之后,会带来多少的收益,有多少工单里面涉及的问题可以得到彻底的解决,所以客户不再不需要提交工单。
所以这本质上是一个将所有工单的聊天记录内容和 3 个已知的问题去匹配的过程。
为什么需要 n8n 才能解决这个需求?
这个需求乍一听,可以通过上传 excel 直接让 ChatGPT/kimi 来解决,但实际上而这都不能很好的解决这个问题。
因为 ChatGPT 在读取文件的时候,会以 RAG 的方式读取,无法确保针对工单内的每一行数据都进行处理。如果将工单作为文字直接发出来,一次对话的上下文大概能容纳 30000 字左右,假定一个工单的聊天记录长度为 500 个字,那么一次处理仅支持 60 个工单,如果我们要处理 3000 个工单(1个月的量)就需要循环 50 次这样的操作。
此外由于大模型的幻觉问题,大量的数据以非结构化的方式提供给 AI,很难保证最终的效果。
ChatGPT 是一个产品,在工程设计上,它不被允许在对话过程中自我调用。这意味着,你无法让 ChatGPT 根据 Excel 中的某一列单元格里的内容,去输出另一列单元格里的内容。
所以合理的方式是把 3 个已知问题的定义写清楚,作为提示词的一部分,然后每次只给 AI 提供一个工单的内容,询问 AI 是否判定这个工单命中已知的 3 个问题。
把 AI 作为逻辑的一部分,而不是全部,是更好的选择。
拓展阅读:
欢迎来到 n8n 中文教程工作思路
程序设计原则
- 免费:尽量使用免费的 API;
- 可复用;
工作方法
- 一切看不懂的东西,第一时间询问 ChatGPT,比如错误码看不懂,就可以直接问 ChatGPT;
- 理解 n8n 的界面设计思路,可以阅读:熟悉 n8n 的界面 ;
- 每个步骤都要做单步调试;
- 涉及到大模型的环境,单步调试的循环次数要降低,以节省 API 调用次数;
- 大模型 API 往往会在其官网提供调试环境,这种调试环境给出的结果和 API 实际调用可能会有出入,所以在调教 Prompt 时,单步调试 + 看 log 是非常有有必要的,值得庆幸的是 n8n 的 log看起来很好懂;
详细配置步骤
第一步:如何触发程序运行
选择新增第一个节点时,系统会询问你希望通过什么方式来触发这个程序的运行。
假定我们每个月只需要分析一次工单,一次分析 3000 条,那么完全可以考虑选择第一个选项,每次需要分析的时候手动点击一下启动即可。
所以我们的第一个节点如下图所示:
第二步:让程序获取到所有工单
假定我们有 3000 条工单需要被分析,那么这 3000 条工单最好能够以 Excel 的形式给到程序,这样程序就可以循环处理 3000 次,完成我们的工单分类目标。
那么程序要怎么读取到这 3000 条工单呢?
点击界面上的 + 号,就可以发现我们有不少选项,他们分别是:
- 外界服务的API,比如 Google Sheets;
- 数据处理节点,用来做数据的过滤或者转化;
- Flow 节点,主要是条件、循环、合并等逻辑操作;
- Core 节点,主要是代码节点;
- 人工智能节点;
- 添加另一个触发器,里面有一个节点叫做 Local File,意思是如果本地文件发生变化,系统自动执行流程;
所以我们现在有两个选择:
- 将数据存储在 Google Sheets 之中;
- 将数据存储在本地文件,本地文件发生变化,自动触发;
针对这个需求我建议我们使用第一个选项,将数据存储在 Google Sheets 之中,原因如下:
- 我们使用的版本是部署在服务器上面的,更改本地文件很不方便,使用 Google Sheets,每次把需要处理的内容贴到对应的 Sheet 页即可;
- 我希望这个程序运行是我手工控制的,而不是文件变更就自动进行;
所以我们选择 Google Sheets 的 Get rows in sheet的节点。因为我们这一个步骤是需要读取 Sheets 中的信息。
配置节点的第一个步骤是需要配置相关的授权凭证,这样n8n才能读取到 Google Sheets中的数据。
在n8n的界面上,一些需要配置的界面通常都会有文档的超链接,但是n8n的官方文档写的真的是一言难尽,非常不好读,怎么办?
打开官方文档,把官网文档的标题(Google:OAuth2 single service)复制出来,加上一个 How to create 作为关键词去 Google 里面搜索,搜到的教程一般比 n8n 官方文档的更好。比如 Google Sheets, 。我利用关键词:how to create Google sheets OAuth2 single service 我就搜到了这个教程,排名第一:
因为实际上我们在这个场景下面要搜索的本质上是如何配置一个 Google Sheets API 凭证,这本身不是 n8n 功能的一部分,所以 n8n 的文档写的非常敷衍了事,但是我们可以通过搜索引擎找到好用的文档,一些常用的服务,甚至是能搜到中文文档的。
按照上面的文档,跟随步骤操作即可。
配置好之后,就需要正式开始读取操作,把 Document 设置成通过URL 读取,然后把你希望程序读取的 Sheets的网址复制进去,就可以读取到对应的 Sheet 页了。
然后这个时候选择 Test Step,我们就可以从 Sheet中读取到对应的数据,第一步就大获成功了。
回到 Workflow的界面,我们可以看到一个绿色的 7 items 的文案,这代表刚刚系统已经从 Sheets 中读取到了 7 条独立的记录。
第三步:添加大模型节点
首先我们选择添加下一个节点,在 AI 节点内选择 Basic LLM Chain。关于所有 AI 节点的区别,在 AI 节点详细介绍内会有更详细的说明。
新添加的 AI 节点默认都会带一个接收聊天消息的触发器,但是在咱们的场景里面,我们就是希望 AI 节点能够处理 Excel 的文件内容即可,所以我们可以把这个触发器删掉。
接下来就是要给 LLM 的节点配置一个大模型的 API,我们点击 Model 的 + 号,并且选择 Google Gemini Chat Model。如果你有别的大模型的 API,也可以直接使用。我们这里选择 Google Gemini 的原因是它有免费的额度。
登录到 https://aistudio.google.com/ 可以在 google 的 AIStuido 白嫖免费的 Gemini 的 API;
注意,Gemini 目前只面向特定区域的用户开放 API,所以你一定要确保自己上网的方式是正确的。
然后把创建好的密钥填写到 n8n 的界面上面去,这样模型就挂载好了。
第四步:撰写提示词+调试
在 Google AI Studio 中调试提示词
进入 Google AI Studio 的界面中,选择 New Prompt,然后选择 Chat prompt 模式。就可以在对话框中开始调试 Prompt,这个环境调试 Prompt 是免费的,不需要花钱。
但是在这个环境内调试出来的 Prompt 不代表是万能的,因为 API 实际调用的时候,大模型返回的结果可能会不一样,所以在这个环境调试出来的 Prompt 还需要在 n8n 内被配置之后再进行测试。
在 n8n 的 LLM 节点配置 Prompt,并且进行调试
在第三步的时候,我们已经为 LLM 节点配置好了 Google 的 Token,接下来我们需要把 Prompt 配置节点到里面去。
首先我们需要设置 Prompt 的来源,这里面有两个选项:
- Take From previous node automatically(从上游自动获取):它将自动将上游的 Chat Trigger(聊天触发器)中的最新一条消息作为 Prompt 发送给大模型。这个选项有一定迷惑性,如果你的 Prompt 是在上游节点中生成的动态 Prompt,但它并不来自一个 Chat Trigger,那你应该选 Define below。
- Define below(在下方定义):当节点在这个选项下时,它会在参数页面额外增加一个 Text 参数,这里可以直接填写你所需要的 Prompt。
在我们的场景里面,需求是把 3 个已知问题的定义写清楚,作为提示词的一部分,然后每次只给 AI 提供一个工单的内容,询问 AI 是否判定这个工单命中已知的 3 个问题,循环多次直到所有需要处理的工单都被处理完了。
所以大模型接收的内容样例可能是下面这个样子的:
拆解下来,我们希望大模型能够接收的其实是一个固定的提示词模板,其中有一些变量(数据来源是上游节点)在循环的过程中替换。
所以我们应该选择 Define Below 这个选项。
当我们把 Prompt 参数设置为 Define below 时,下方就会出现一个 Text 的文本框,这个文本框可以填写提示词。
我们就可以把上面的提示词写进去,但是这个时候就会有一个问题,我们要如何才能把变量也写入文本框内呢?
Text 的这个文本框是支持填写变量的,你只需用鼠标要把变量拖拽到文本框内即可,并且文本框的最下方会显示一个 Result,预览一个效果,帮助你判断自己填写的内容是否正确。
这个时候我们就完成提示词的配置,接下来可以点击 Test Step 来实现这一个步骤的测试。
点击测试之后,就会显示大模型给出的结果,这个时候可以切换到 Logs 查看入参和出参是否符合自己的诉求,如果不符合就需要调整 Prompt。
上面这个章节非常简要的介绍了关于 LLM 节点的应用,关于更多的 LLM 节点的详细介绍,请参考文档:
AI节点详细介绍第五步、将打标结果输出到最初的 Sheets 之中
现在我们获得了已经大模型打标的结果,下一步就应该讲这些结果回填到 Sheets 之中。
所以我们需要在大模型节点的下一个步骤新增一个 Google Sheets 的节点。和上一个节点有所不同,上个节点我们的需求是读取这个 Sheets 页的全部数据,这次我们需要更新数据,给每一行数据附上大模型打标的结果。
所以我们需要根据自己的需求选择 Append or update row in sheet 的选项。由于 Token 之前已经配置过了,所以这次这个节点不需要再额外配置 Token。
选择这个节点界面如下图所示:
将大模型的结果填充到表格内,首先需要一列数据,比如工单编号作为唯一的关联标识,不然程序就不知道该将哪个值填充到哪里去。
这个时候就会发现大模型输出的时候只输出了问题分类,没有输出编号,但是这个时候不需要调整 Prompt,因为 n8n 自带了隐式参数传递。
在选择入参区域的变量时,不仅仅可以选择上一个节点的变量,也可以选择上上个,上上上个等所有前序节点的变量。这些复数个数据之间经过多个程序处理传递,但是 n8n 会在系统内部自动把他们关联起来,确保他们内部是唯一关联的,所以你不需要担心数据会不会“串错”。这就是 n8n 内部很重要的隐式传递的设计思路。
所以我们可以选择 Key A 作为关联的变量,同时把上上个节点读取到的 Key_A 的值填充进去,选中作为关联键的变量会有一个 useing to match 的标识。
然后把大模型的结果填充到 Key_B 之中去,这样程序就会把 Key_B 的值替换成大模型输出的 Text 信息。
点击 Test Step,程序开始之行,Key B 的数据已经被得到了替换。
打开 Google Sheets,也会发现已经被替换了。
实践之后,再体会 n8n 的设计思路
经过上面的实践,n8n 的基本能力已经被展示出来了,通过这个简单的 Case 我们就可以体会到 n8n 的一些设计思路,他们分别是:
- 循环:n8n 非常重视循环,如果从 Excel 里面读取数据,那么接下来的整个流程会自带一个循环操作,非常便于批量处理,帮助打工人节省时间,并且每个步骤批量处理了多少个 items,会在界面上外显出来;
- 参数的隐式传递:n8n 为了解决单个 item 在处理过程过于复杂,到最后输出时需要返回第一步去匹配标识位的问题,自动关联了每一个 item 在每一个步骤的所有变量,确保他们不会串错,极大降低了使用成本;
- 单步调试:n8n 的每个节点都支持单步调试,可以极大程度的降低低代码配置门槛,每配置完一个节点都可以选择执行一下,不需要全部配置完再之行,这样可以发现每个步骤可能会出现的错误,便于调试和开发;
在这里我想强调一下循环的重要性,作为普通打工人,我们希望借助大模型 or 计算机解决的大部分都是重复劳动,n8n 高度集成了循环相关的功能模块,对于打工仔来说意义重大。
广告
Loading...
Last update: 2024-06-15
🎉简单易懂的现代魔法 1.0 已经上线🎉
-- 感谢您的支持 ---
👏欢迎体验低代码的魅力👏