ライフサイエンス企業検索・リサーチBot Part4 RAGによる高度検索
| 目次 |
1. 導入
前回までは、
- Slackでボットにメンション → Web検索 → 企業レポートを生成
- スレッド構造を利用して「前回レポート+追加質問」に文脈応答
という 「一問一答から、スレッド単位の対話」 への進化を扱いました。
本記事ではさらに一歩進めて、RAG(Retrieval-Augmented Generation)を導入した STEP3 のワークフローを解説します。
RAGを導入することで、Botは
- 過去に取得した企業情報を ベクターストア(Vector Store)として蓄積
- 追加質問時には、まずそのDBを検索
- DBになければ追加でWeb検索・スクレイピングを実行し、結果を取り込む
という “継続学習型の企業リサーチBot” へ進化します。
2. 背景と目的
これまでのワークフローにも強みはありましたが、次のような課題が残っていました:
- 同じ企業に複数回質問するたびにフル検索しており、非効率 & コスト高
- 過去の検索結果が 「使い捨て」 になっていた
- 追加質問が増えると、回答の一貫性を保つのが難しい
RAG を導入する STEP3 の目的は:
- 検索結果を知識ベースとして蓄積(Vector Store 化)
- 同一スレッド・同一企業に対する質問であれば、まずDBから回答
- 足りない部分だけ再検索し、LLMに統合させる
これにより、“調べるほど賢くなる企業Bot” を目指します。
3. RAG対応ワークフローの全体像
STEP3 のワークフローは、STEP2までの構成に 「ベクターストア」と「AIエージェント」を追加した形になっています。
● 親スレッドなし(新規企業検索)
- Slackでボットにメンション(例:@bot 第一三共)
- Firecrawl でWeb検索 → URL一覧を取得(Split out / Loop Over Items)
- 各URLをスクレイピング(Firecrawl / Wait / On Error: Continue)
- スクレイピング結果をまとめて LLM に渡し、企業レポートを生成
- スクレイピング結果やレポートを Simple Vector Store に保存
● 親スレッドあり(既存企業に対する追加質問)
- スレッドの親メッセージ(ルートメッセージ)を取得
- これまでのスレッド情報&企業情報を RAG用DBとして検索
- DBに関連情報があれば、それをもとにAIエージェントが回答
- DBに十分な情報がなければ、Sub Workflowを使って追加検索
- 回答結果と新規情報を再度 DB に保存
このように、STEP3 では
「新規 → Web検索 → DB保存」
「追加質問 → DB検索 → 不足分だけWeb再検索」
という二段階構造になっています。

4. ベクターストアの設定
RAGの要となるのが Simple Vector Store ノードです。
● 追加ノード
• ノード名(例):Simple Vector Store • 挿入位置: o 企業レポートを生成した後 o Slackへ返信する直前
● 主な設定項目
• Model:Embedding Model o small で十分だが、将来的には medium 以上も検討可能 • Default Data Loader:Default Data Loader • Mode:Load Specific Data • Data: o Merge ノードから集約した Markdown テキスト全体 o スクレイピング結果を結合したフィールド(例:output)
これにより、「スレッド単位の企業情報」が Embedding として蓄積されます。
以降の質問では、このDBを検索することで効率的に回答できます。

5. AIエージェントノードによる応答フロー
STEP2 までは、通常の OpenAI ノードを使っていましたが、STEP3 では AI Agent ノード に切り替えます。
● Agentノードの設定例
• Model:OpenAI Chat Model(GPTベース) • Memory:Simple Memory o ここで、先ほどの Simple Vector Store を指定 • Tools:Sub Workflow o 後述する「追加Web検索用ワークフロー」を Tool として登録
● 役割
AIエージェントは、以下のように振る舞います:
- まず Vector Store を検索し、関連コンテキストを取得
- それだけで十分な回答ができそうなら、そのまま回答生成
- 不足がありそうなら、Tool(Sub Workflow)を呼び出し、Web再検索
- 再検索結果と既存DBの情報を統合して回答文を作成
これにより、「ある程度自律的に情報を取りに行くエージェント」が実現します。

6. Sub Workflow を用いた再検索ロジック
今回のポイントは、Firecrawl が Agent の標準ツールとしては提供されていないことです。
そのため、以下のような構成を取ります。
● Sub Workflow の役割
- Agent から渡されたクエリ(企業名や質問文)を受け取る
- Firecrawl でWeb検索 → URL取得
- Loop Over Items + Firecrawl でスクレイピング
- コードブロックで Markdown を結合
- Agent に返すデータを整形して返却
● なぜ Sub Workflow が必要か?
- Agent ノードは「ツール」としてあらかじめ定義された機能しか呼び出せない
- Firecrawl はそのままでは Tool として見えないため、
Firecrawl を内部に持つ Sub Workflow を Tool として登録 する、というアプローチになります。

7. フィールド統一による安定化
分岐(OpenAI ノード側 / Agent ノード側)ごとに出力フィールド名が異なると、最後の Slack Message ノードで 値を見失う ことがあります。
それを防ぐために、Edit Fields ノード を使用します。
● 設定のポイント
• 両方の経路の直前に Edit Fields を挿入
• フィールド名を共通の output などに揃える
• これにより、Slack Message ノードでは
o Message Text に {{$json["output"]}} のように一意指定が可能に
こうすることで、「初回投稿(OpenAI 経由)」でも、「スレッド返信(Agent 経由)」でも常に安定して Slack へ返信できるという状態が作れます。

8. 実行結果
STEP3 まで進めると、Slack での体験はかなり“人間味”を帯びてきます。
● 新規企業の調査
- @bot アステラス製薬
- → Web検索 + スクレイピング + レポート生成
- → 同時に、スクレイピング結果が Vector Store に保存
● 追加質問
ユーザー:
「この会社のAI/DXの取り組みをもう少し詳しく知りたい」
Bot(内部処理):
- Vector Store を検索し、以前取得した AI/DX の記述を抽出
- それだけでは足りなければ Sub Workflow で追加検索
- 既存+新規の情報を統合して、スレッドに回答
ユーザー側から見ると
「一度調べた企業について、何度質問しても“前回の内容を踏まえた回答”が返ってくる」
という体験になります。

9. まとめ
● STEP3 で実現したこと
本記事(STEP3)では、
- Simple Vector Store による 企業情報のベクターストア化
- AI Agent ノードを用いた RAGベースの応答生成
- Sub Workflow をツールとして利用する 再検索ロジック
- Edit Fields による フィールド名の統一と安定動作
といった実装を通じて、「問い合わせるほど学習する企業リサーチBot」 を形にしました。
● シリーズ最終回として
STEP1〜3を通じて、Slack + n8n + Firecrawl + OpenAI + Vector Store
を組み合わせた ライフサイエンス企業向けリサーチBot の全体像を見てきました。
- STEP1:企業検索の自動化
- STEP2:スレッド文脈を踏まえた質疑応答
- STEP3:RAG による継続学習 & 再検索
これで、実務で使えるレベルの「AI企業アナリスト」がほぼ完成形になります。
本シリーズはここで一区切りですが、今後はこのBotをベースに、
- 特定疾患領域ごとのテーマBot
- 特許・論文・治験情報に特化したリサーチBot
- 社内ナレッジとのハイブリッドRAG
など、用途別の派生も十分狙える構成になっています。
Appendix. 詳細ステップ
STEP3. RAGを実装する

一連の流れ
- Slack上でボットをメンションすることでワークフローが起動
- メッセージが親スレッドを持つか否かで条件分岐
- 親スレッドなし・・・新規企業として新たに情報検索開始
- 1.Firecrawlを用いてWeb検索を実施し、複数のURLを取得(Firecrawl / Split out)
- 2.URL群に対してスクレイピングを実施(Loop Over Items / Firecrawl)
- 3.結果をまとめて企業情報に関するレポートを生成(OpenAI)
- 親スレッドあり・・・既存企業としてまずはDBを探索(RAG)
- 1.スレッドの一番親となるルートメッセージを取得
- 2.メッセージをLLMに読み込ませやすい形に変換
- 3.エージェントノードにRAGを指示、DBにもない情報なら再度検索
- 親スレッドなし・・・新規企業として新たに情報検索開始
- LLMが生成したレポートをSlackの返信として送信
- 今回、Web検索によって収集されたデータをRAG用のデータベースに追加
0. 既存のワークフロー部分は割愛
- 基本的なシステムについてはSTEP0を参照
- Slack返信周りについてはSTEP1,2を参照
1. 最終的な結果をDBに保存するノードの追加

- Simple Vecoter Storeノードをフローの最後に追加。
- ModelはEmbedding Modelを選択(smallで十分)

- Default Data Loaderをセット。ModeフィールドではLoad Specific Dataを選択。Dataにはスクレイピングの結果をまとめて追加したいのでMergeノードの結果を書き込み

2. Reply側のLLMをAI Agentノードに変更。

- Model・・・OpenAI Chat Model
- Memory・・・Simple Memory(先ほど書き込んだもの)
- Tool・・・Sub workflowを設定
3. Sub Workflowについて。
- 必要性・・・Slackスレに記載された企業について深掘りしたい時に情報が存在しない場合もある。そういう時、さらに洗練したクエリで検索をかけたいような場合がある。そこで以下画像のようなSub Workflowを設定。こちらをAgentのToolとして与えることで、Agentが自由に検索機能を使えるようになる。
- SubWorkflowはワークフローの中でワークフローを呼び出したい時などに使える。今回は、FirecrawlというTool候補がAgentには存在しなかったため、直接使えないことが判明。そこでSub Workflowを通じてAgentが自由に検索できるようにした。


4. (追記)LLMの出力の後、フィールド名を合わせてあげるために、「Edit Fields」ノードを配置する。これは上部の分岐(OpenAI Chat Messageの後)にも追加してあげる

- 以下のように設定する。ポイントは「output」という項目名をちゃんと合わせること。これで「初回投稿の場合」「スレッドへの返信の場合」、どちらの分岐においても安定して返信できるようになる。(Edit Fieldsで項目名を合わせてあげないと、SlackMessageを送信する時に、値を見失ってしまうことがある模様)



ヘルツレーベンでは、ライフサイエンス業界に特化したDX・自動化支援を提供しています。
PubMedや学術情報の自動収集をはじめ、Slack・Gmailなどを活用したナレッジ共有の仕組みまで、実務に直結するワークフローを設計・導入いたします。
提供サービスの例
- 製薬・医療機器業界での提案活動や調査業務の自動化支援
- アカデミアや研究者向けの文献レビュー・情報共有フローの最適化
- 医療従事者のキャリア開発を支援するリスキリングプログラム
👉 ご興味をお持ちの方はぜひお気軽にお問い合わせください。
お問い合わせフォームはこちら

監修者 株式会社ヘルツレーベン代表 木下 渉
株式会社ヘルツレーベン 代表取締役/医療・製薬・医療機器領域に特化したDXコンサルタント/
横浜市立大学大学院 ヘルスデータサイエンス研究科 修了
製薬・医療機器企業向けのデータ利活用支援、提案代行、営業戦略支援を中心に、医療従事者向けのデジタルスキル教育にも取り組む。AI・データ活用の専門家として、企業研修、プロジェクトPMO、生成AI導入支援など幅広く活動中





















































































