n8n如何添加AI节点?在自动化流程中融入AI能力

之前有介绍过一个自动化工作流:Get top5 on Product Hunt。也就是说每天定时通过邮件给你发送Product Hunt上的top5产品信息,帮你快速了解最新产品动态。(这一篇文章在这里:Get top5 on Product Hunt | n8n自动化工作流

Product Hunt网站:https://www.producthunt.com/

每天收到的邮件信息:

那么问题来了,针对产品的大篇幅的评论,看起来比较耗时,我能否用AI模型,来整理评论的重要信息?比如是正面还是负面评价,评论里是否有用户的需求,是否有用户提出了产品建议之类的。 这样帮你了解产品趋势和用户想法也是非常有价值的。

比如在之前的表格下面,加一行AI的总结。

这就需要我们在n8n的流程上增加AI的节点,今天我们就来介绍下,如何在n8n使用AI节点,来达到我们分析评论的需求。

我们先说一下这个AI节点要如何配置。

其实n8n里也内置了不少AI的模型。

我们在新建节点里点击Advanced AI,就可以进行选择了。

选择后,通过API key连接上你的AI模型即可。

不过我们今天不通过这种方法来用AI模型(主要是这些模型我都没有充值渠道,没法用 o(╥﹏╥)o )

我们直接用HTTP Request节点的方式来连接AI模型

这里我选择用阿里的通义千问AI模型来试试。因为通义千问的qwen-turbo模型,注册后的一个月内,提供了免费的1000000个token使用。还是很方便的。

官网:https://dashscope.console.aliyun.com/

API文档:https://help.aliyun.com/zh/dashscope/developer-reference/use-qwen-by-api?spm=a2c4g.11186623.0.0.47b046c1x7TXWH

在官网注册完成之后,创建一个API key,复制后妥善保管。

接下来我们通过API来使用通义千问。

可以参考API文档里的参数说明。

好的,那么我们在n8n的HTTP Request节点来配置

这几个配置项如下:

1、method:POST

2、URL:https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation 这个是AI模型的API地址

3、headers:把header的开关打开,需要配置两个参数

①name:Content-Type ;value:application/json

②name:Authorization ;value:Bearer [your api key]

4、body:把body的开关打开,body的类型选择json,然后在json的输入框内输入模型的信息。

这里需要两个字段:

model:数据类型是string,指定用于对话的通义千问模型名,如qwen-turbo

input:数据类型为object,输入模型的信息,这里重要是要输入prompt

大概得一个结构是这样的:

{
  "model": "qwen-turbo",
  "input": {
    "prompt": "请输入你的prompt"
  }
}   

比如我先这样定义了我的prompt

{
  "model": "qwen-turbo",
  "input": {
    "prompt": "以下是5个产品的产品名称Product Nam和对应的评论Comments {{ $json.escapedData }} .请对这5个产品的评论进行分析,分析内容包括:1.大家对该产品的整体评价是好还是坏。2.用户提到了哪些问题。3.用户提到了哪些需求或改进建议。4.请为每个产品给出一个总结性的结论。请用中文输出,并保持结构清晰."
  }
}   

注:{{ $json.escapedData }}是一个变量,数据是从前面节点中output出来的。 这里注意一定要是字符串的格式,不然整个json格式会有问题并且报错。

执行后大概是这样的一个效果:

这就是AI模型节点的一个配置方法。

然后我们看下其他节点的配置。

首先是prompt里的{{ $json.escapedData }},因为是字符串格式,所以从一开始的GraphQL接口输出的数据,就要在过程中进行一些加工。

接下来分别来讲讲(我这几个节点稍微麻烦了一点,主要过程中的各种调试加多了几个code节点,其实可以再简洁一点,不过没关系,我先按这样来说明逻辑,有时间可以做一些简洁和优化)

1、获取产品信息,合并评论文本

这一步主要是想把每个产品中的评论都合并在一起,为了后面统一丢给AI去分析。

因为GraphQL接口输出的数据,评论字段是如下的结构,每个评论都在一个node对象里。

所以这一步主要想把每个产品里的node的数据都分别合并起来

// 确保从名为 'GraphQL' 的节点获取输出数据
const graphqlOutput = $node['GraphQL'].json.data.posts.edges;
// 遍历产品数组,提取每个产品的评论内容,并生成新的结构
return graphqlOutput.map(edge => {
    const product = edge.node;  // 访问产品节点

    // 检查是否有评论,如果有则提取评论内容
    const commentsText = product.comments.edges.map(commentEdge => {
        return commentEdge.node.body;  // 提取每条评论的文本内容
    }).join(" ");  // 将所有评论文本合并成一个字符串,使用空格分隔


  
    // 返回一个新的对象,包含产品信息和合并的评论文本
    return {
        json: {
            product,  // 完整的产品信息
            commentsText  // 合并后的评论文本
        }
    };
});

2、获取产品名称和评论

把产品名称和合并后的评论分别都提取出来。

return items.map(item => {
    return {
        json: {
            productName: item.json.product.name,
            commentsText: item.json.commentsText
        }
    };
});

3、合并产品名称和评论,并去掉特殊字符

这一步把产品名称和评论合并在一起,并且把里面的特殊表情字符都去掉。

const serializedArray = items.map(item => {
    const sanitizedComments = item.json.commentsText.replace(/[^a-zA-Z0-9\s.,]/g, '');    
    return `Product Name: "${item.json.productName}", Comments: "${sanitizedComments}"`;
});

const serializedData = serializedArray.join("; ");


return  [
    {     
            serializedData      
    }
];

4、序列化内容,改为字符串格式

最后是需要把数据的格式改一下,变成字符串,后面给到AI模型节点,在prompt里面就不会出错。

// 获取输入数据
const items = $input.all();
// 创建一个空数组,用于存储处理后的数据
const result = [];
// 遍历每个输入项
items.forEach(item => {
  // 提取 serializedData 字段
  const serializedData = item.json.serializedData;
// 转义特殊字符并去掉外部的双引号
  const escapedData = JSON.stringify(serializedData).slice(1, -1);
  // 将处理后的数据添加到结果数组中
  result.push({
    json: {
      escapedData
    }
  });
});

// 返回处理后的结果
return result;

好了,这些处理完了,就回到我们一开始介绍的http节点来实现AI模型的调用。

调用完成后,我们用code节点把内容变成表格的样式,然后通过gmail发送即可。

修改output格式节点

return items.map(item => {
  const product = $node['GraphQL'].json.data.posts.edges.map(edge => edge.node);

  // 获取上一个 n8n 节点输出的文本内容
  let textContent = $node['AI模型引用'].json.output.text; 

  // 做一些换行的操作,让文本看着更清晰一点
  textContent = textContent
    .replace(/#### /g, '<br>#### ')
    .replace(/- \*\*/g, '<br>- **');
  
  const tableRows = product.map(prod => {
    const comments = prod.comments.edges.map((comment, index) => `${index + 1}. ${comment.node.body}`).join("<br>");
    return `<tr>
      <td>${prod.name}</td>
      <td>${prod.tagline}</td>
      <td>${prod.description}</td>
      <td>${prod.votesCount}</td>
      <td><a href="${prod.website}">${prod.website}</a></td>
      <td>${comments}</td>
    </tr>`;
  }).join("");

  // 在表格末尾追加一个合并的text列
  const tableHTML = `
    <table border="1">
      <thead>
        <tr>
          <th>Name</th>
          <th>Tagline</th>
          <th>Description</th>
          <th>Votes Count</th>
          <th>Website</th>
          <th>Comments</th>
        </tr>
      </thead>
      <tbody>
        ${tableRows}
        <tr>
          <td colspan="6">${textContent}</td> <!-- 合并所有单元格的text列 -->
        </tr>
      </tbody>
    </table>
  `;
  
  return {
    json: {
      tableHTML: tableHTML
    }
  };
});

gmail节点的配置方法我这里就不详细说了,之前这一篇文章有介绍,需要的话可以看这里:Get top5 on Product Hunt | n8n自动化工作流

那么到此,这个流程就配置完成了。

最后还是提醒一句,记得保存并且把运行开关打开。这样流程才会开始自动化运行。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部