iPaaSツール×kintoneでAIに情報収集してもらう

## はじめに

おはようございます。最近、朝が寒くて起きられませんね！
「冬眠暁を覚えず※」という感じです。
※[春眠暁を覚えず](https://kotobank.jp/word/%E6%98%A5%E7%9C%A0%E6%9A%81%E3%82%92%E8%A6%9A%E3%81%88%E3%81%9A-530154)

さて、早速ですが情報収集をAIに任せてみました。
というのも、朝の時間に情報収集をしているのですが、時間がない日（起きられない）もあるし、収集しているだけで時間が溶けることもありまして...そんな課題を感じている時にこちらの記事を読んで「AIに任せる」選択肢を見つけたので、やってみました。
- [「ChatGPT」にニュースを自動で集めるプログラムを作らせてみたら、コードが書けない私でも「Discord BOT」ができちゃった話](https://forest.watch.impress.co.jp/docs/serial/yajiuma/1538111.html)
- [AIにニュースの収集を任せている方法（GPT-4からSlack投稿）](https://toyoshi.hatenablog.com/entry/2023/10/13/103701)

基本的には、上記の記事を参考にiPaaSツールで手軽にフローを作成しています。

### こんな人におすすめ
- 毎朝ウェブ上で情報収集している人
- 定期実行を簡単に設定したい人
- 複数のサービスとkinotneの連携を手軽にやりたい人

## シナリオ

完成形がこちらです。makeというiPaaSツールを使用します。
https://make.com/

![シナリオ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/69f79d7d-8b9e-2cba-31b4-5cd41d9c8d55.png)

### 手順

||使用するモジュール|やること|
|:--|:--|:--|
|1|RSS（Watch RSS feed items）| ニュース情報取得<br>毎朝7時に実行<br>（15分単位でシナリオを実行させる設定も可能）|
|2|Text parser（HTML to text）|取得したデータのHTMLタグを取り除く|
|3|Array aggregato|1 で取得した複数のデータを1つの配列にまとめる|
|4|OpenAI（Create a Completion）|プロンプトに情報収集役を入れて、3のデータを渡す。<br>アウトプット形式も指定する|
|5|HTTP（Make a request）|4で収集したデータをkintoneに登録する|

## 設定

### 1. RSS（Watch RSS feed items）

今回は、はてなブックマークのテクノロジーのRSSフィードを登録します。
RSSフィードのURLはこちらの記事にまとまっているので、ご参考までに！
https://sprint-life.hatenablog.com/entry/2014/01/15/203535

![RSS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/ca633f98-b7ff-fb09-622b-f8bec1cf2106.png)

また、定期実行は時計マークをクリックすると設定できます。
![schedule.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/269680c1-3b3c-120e-2f45-cc9c34ea1425.png)


### 2. Text parser（HTML to text）

1で取得した値の中にHTMLタグが入っているものがあるため、Text parserで取り除きます。
![textparser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/7bace182-cd11-d6ca-aa9b-24006d41ed08.png)

### 3. Array aggregator

RSSフィードで取得したitemの数だけBundleというデータのまとまりになっているため、複数のデータを1つの配列にまとめます。

![aggregator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/a6f39bb1-bf41-fd66-383d-cb827531bc3c.png)

:::note info
make用語
- Aggregator
  - 細かいデータ(bundle)をまとめる機能
- Iterator
  - 大きなデータを細分化する(bundleに分ける)機能
:::

### 4. OpenAI（Create a Completion）

Open AIのAPIキーを用意します。
https://platform.openai.com/api-keys

|設定項目|値|
|:--|:--|
|Connection|OpenAIのAPIキー<br>Ogamization IDを入れる|
|Select Method|Create a Chat Completion(GPT Models)|
|Model|gpt-3.5-turbo-16k-0613|
|Messages|item1<br>Role: System<br>Message Content: プロンプトは下記参照|
||item2<br>Role: User<br>Message Content: プロンプトは下記参照|

<details><summary>Systemプロンプト</summary>

```:Systemプロンプト
あなたはnaberina社の情報収集係です。naberina社はWebエンジニアが多く在籍しています。最近ホットなトピックは、生成AI、kintoneです。

渡された情報から、nabeirna社に関係ありそうなニュースを3つ選び、最後にnaberina社にこのニュースがどのように役に立つかコメント（AIより一言）を入れてください。
出力形式は、記事のタイトル、記事のURL、記事の要約、AIからのコメントをJSON形式でアウトプットしてください。

アウトプット例

[
    {
      "title": {
        "value": "ニュースのタイトル"
      },
      "url": {
        "value": "https://xxx.com"
      },
      "summary": {
        "value": "記事の要約"
      },
      "comment": {
        "value": "AIから一言"
      }
    },
    {
      "title": {
        "value": "ニュースのタイトル"
      },
      "url": {
        "value": "https://xxx.com"
      },
      "summary": {
        "value": "記事の要約"
      },
      "comment": {
        "value": "AIから一言"
      }
    },
  ]
```

</details>

<details><summary>Userプロンプト</summary>

もう少し改善できそうなのですが、ベタ書きでChatGPTに投げています。
```:Userプロンプト
以下の情報をもとに情報をピックアップしてください。

{{40.array[0].text}}
{{40.array[0].title}}
{{40.array[0].text}}
{{40.array[0].summary}}
{{40.array[0].author}}
{{40.array[0].url}}

:

{{40.array[9].text}}
{{40.array[9].title}}
{{40.array[9].text}}
{{40.array[9].summary}}
{{40.array[9].author}}
{{40.array[9].url}}

```
</details>

![chatgpt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/cc963ffc-3b61-4338-d972-a4c66a749127.png)

![GPT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/d904cd81-151e-e1e0-4d58-d5cdb049fa84.png)


### 5. HTTP（Make a request）

どこかに通知させる仕様でも良かったのですが、流れてしまったりメモを一緒に残せなかったりするので、あえてkintoneに保存しておきます。（~~後付けではないです~~）

makeにはkintoneのモジュールが存在するのですが、一括登録するモジュールがないので今回はHTTPリクエストモジュールを使用します。
項目は、[kintone REST APIの複数のレコードを登録する](https://cybozu.dev/ja/kintone/docs/rest-api/records/add-records/)を確認しながら、URL、リクエストヘッダー、リクエストボディを設定していきます。

![HTTP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/b38821ec-cc3a-b9c7-2780-010a06309986.png)


今回、リクエストボディのrecordsの中身は、OpenAIのレスポンスをそのまま使用します。
あらかじめ、OpenAIのレスポンスを指定しておけば整形する必要がないので、便利です！

![リクエストボディ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/1c813c2d-e4d2-d093-dba2-111321fa91cf.png)

#### kintone
最終的に、kintoneにはこのようにデータが溜まります。

![kintone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/1453f969-dae2-376e-2005-7253ad24de3e.png)

### 全体設定

フローがアクティブで定期実行が設定できていると、決まった時間に実行されます。
make上の定期実行の設定は簡単ですね。
![最新ニュース取得___Make.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/8113948f-6796-3086-0d53-09eaf7112f8f.png)

## おわりに

これで毎朝kintoneを見るだけで溜まった情報を得ることができました！めでたし🎉
また、定期実行×ChatGPT連携は、AIが能動的に動いてくれるような仕組みになりかなり活用の幅が広がりそうです！🤝