動のAIネットワークリサーチャー:プレーンTextからカスタムCSV

上級

これはMiscellaneous, AI Summarization, Multimodal AI分野の自動化ワークフローで、16個のノードを含みます。主にSet, Code, SplitOut, FormTrigger, HttpRequestなどのノードを使用。 GPT-4とLinkupを活用したカスタムCSVへのテキスト変換を実現する動のAIウェブリサーチャー

前提条件
  • ターゲットAPIの認証情報が必要な場合あり
  • OpenAI API Key
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
  "nodes": [
    {
      "id": "7df78b4d-8c66-4353-a87e-7b151913f856",
      "name": "フォーム送信時",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        0,
        16
      ],
      "webhookId": "0d4374b6-84a6-4a71-834b-40dd3d3e3adf",
      "parameters": {
        "options": {},
        "formTitle": "New research",
        "formFields": {
          "values": [
            {
              "fieldType": "textarea",
              "fieldLabel": "Describe your research",
              "requiredField": true
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "3c8ad682-a662-4266-bdb5-732f6bb8614c",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        304,
        240
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5-chat-latest",
          "cachedResultName": "gpt-5-chat-latest"
        },
        "options": {
          "responseFormat": "json_object"
        }
      },
      "credentials": {
        "openAiApi": {
          "id": "dMiSy27YCK6c6rra",
          "name": "Duv's OpenAI"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "074eea9f-b07e-4677-8b58-75b92155df44",
      "name": "分割",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1008,
        16
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "List"
      },
      "typeVersion": 1
    },
    {
      "id": "e9d5daa7-aa07-4873-888f-b704cf0d6d7c",
      "name": "アイテムをループ処理",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1344,
        16
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "baf2d169-9593-4ec2-9415-1ed45cb303d0",
      "name": "オブジェクト名と値を取得",
      "type": "n8n-nodes-base.set",
      "position": [
        1584,
        256
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "3de0459c-a3bf-4db0-94cc-ce007fa5db55",
              "name": "={{ $('Prepare prompts and schema').item.json.ObjectName }}",
              "type": "string",
              "value": "={{ $json.PropertyValue }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "84f376a1-3ab5-4bab-b962-357e4f57854c",
      "name": "付箋",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        -176
      ],
      "parameters": {
        "color": 5,
        "width": 288,
        "height": 384,
        "content": "## AI web-search to find all items that match the conditions\n\nDon't forget to connect your Linkup credentials."
      },
      "typeVersion": 1
    },
    {
      "id": "53b2a08a-f61f-4c60-8c25-9edc8731a9d4",
      "name": "Linkupにクエリしてリストを検索",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        736,
        16
      ],
      "parameters": {
        "url": "https://api.linkup.so/v1/search",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "q",
              "value": "={{ $json.discoveryQuery }}"
            },
            {
              "name": "depth",
              "value": "deep"
            },
            {
              "name": "outputType",
              "value": "structured"
            },
            {
              "name": "structuredOutputSchema",
              "value": "={{ JSON.stringify($json.discoverySchema) }}"
            },
            {
              "name": "includeImages",
              "value": "false"
            }
          ]
        },
        "genericAuthType": "httpBearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "W7AgeoVOv60DlvyS",
          "name": "Linkup - web search AI"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "74957f1e-01ba-4cfd-a5e7-2fec11e0a7ad",
      "name": "アイテムの最終JSONを準備",
      "type": "n8n-nodes-base.code",
      "position": [
        2128,
        448
      ],
      "parameters": {
        "jsCode": "// Get the first key-value from the \"Get object name and value\" node\n// Replace 'Get_object_name_and_value' with the actual name of your node\nconst firstNodeData = $node[\"Get object name and value\"].json;\n\n// Get the previous node data (the one with multiple keys)\nconst previousNodeData = items[0].json;\n\n// Create the output object\nconst output = {};\n\n// Add the first key-value pair from the first node\n// Assuming the node only has one key-value pair\nconst firstKey = Object.keys(firstNodeData)[0];\noutput[firstKey] = String(firstNodeData[firstKey]);\n\n// Add all key-value pairs from the previous node, stringified\nfor (const [key, value] of Object.entries(previousNodeData)) {\n    if (Array.isArray(value)) {\n        output[key] = value.join(', ');\n    } else if (typeof value === 'object' && value !== null) {\n        output[key] = JSON.stringify(value);\n    } else {\n        output[key] = String(value);\n    }\n}\n\n// Return the new item\nreturn [{ json: output }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "d170bc2a-68a3-497c-803b-78f904ec9351",
      "name": "Linkupにクエリしてアイテムの全プロパティを検索",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1840,
        256
      ],
      "parameters": {
        "url": "https://api.linkup.so/v1/search",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "q",
              "value": "=For item: {{ $('Loop Over Items').item.json.PropertyValue }}\n{{ $('Prepare prompts and schema').item.json.enrichmentQuery }}"
            },
            {
              "name": "depth",
              "value": "standard"
            },
            {
              "name": "outputType",
              "value": "structured"
            },
            {
              "name": "structuredOutputSchema",
              "value": "={{ JSON.stringify($('Prepare prompts and schema').item.json.enrichmentSchema) }}"
            },
            {
              "name": "includeImages",
              "value": "false"
            }
          ]
        },
        "genericAuthType": "httpBearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "W7AgeoVOv60DlvyS",
          "name": "Linkup - web search AI"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "c4b50e76-3ff0-4d07-830e-7141a6d90d4d",
      "name": "プロンプトとスキーマを準備",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        256,
        16
      ],
      "parameters": {
        "text": "={{ $json['Describe your research'] }}",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "=# Role\n\nYou are an AI research strategy generator for an automated research workflow. Your first task is to identify the primary **object** of the user's research (e.g., Company, Person, City, Product).\n\nYou will always return a valid JSON object with **five** keys, starting with `ObjectName`:\n\n{\n  \"ObjectName\": \"string\",\n  \"discoveryQuery\": \"string\",\n  \"discoverySchema\": { ... },\n  \"enrichmentQuery\": \"string\",\n  \"enrichmentSchema\": { ... }\n}\n\n\n## Step 0: Identify the ObjectName\n\n**Goal**: First, identify the core subject of the user's request and create a simple label for it.\n\n  * Based on the user's prompt, determine the primary object being researched.\n\n  * The **ObjectName** must be a simple, **singular noun** (e.g., \"Company\", not \"Companies\").\n\n  * This name should be a general category, not overly specific.\n\n  * **Examples**:\n\n      * If the request is `\"List 50 German fashion companies...\"`, the object is a company. So, **ObjectName** should be `\"Company\"`.\n      * If the request is `\"Find 25 CEOs of technology companies...\"`, the object is a person. So, **ObjectName** should be `\"Person\"`.\n      * If the request is `\"Provide 25 HEX color codes...\"`, the object is a color. So, **ObjectName** should be `\"Color\"`.\n\n\n## Step 1: Object Discovery\n\n**Goal**: Define **what to search for** and how to structure the list of results into a predictable array.\n\n  * **`discoveryQuery`**:\n\n      * This is a single sentence prompt that describes EXACTLY what list of items needs to be found.\n      * It must be explicit, concise, and human-readable.\n      * It must include a mention \"if not enough relevant items have been found, don't force adding the requested number, quality prevails\"\n\n  * **`discoverySchema`**:\n\n      * A JSON Schema that forces the output into a specific, non-changing structure.\n\n      * The structure is **fixed** and must be used exactly as shown below.\n\n      * **CRUCIAL**: You must set the `\"description\"` for `\"PropertyValue\"` to tell the AI what content to find. This description should correspond to the unique identifier of the `ObjectName` you identified in Step 0 (e.g., 'The official name of the company').\n\n      * **Fixed Structure Example**:\n\n        {\n          \"type\": \"object\",\n          \"properties\": {\n            \"List\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"PropertyValue\": {\n                    \"type\": \"string\",\n                    \"description\": \"A clear description of what this value should be. E.g., 'The official name of the company'.\"\n                  }\n                },\n                \"required\": [\"PropertyValue\"]\n              }\n            }\n          },\n          \"required\": [\"List\"]\n        }\n\n\n### Step 2: Object Enrichment\n\n**Goal**: For each item discovered in Step 1, define **what extra information to research**. If not specified by the user, aim for 5-8 properties that make the most sense. Mention them in the enrichmentQuery, and give them easily readable names in the enrichmentSchema (e.g., prefer \"Company Name\" over \"companyName\").\n\n  * **`enrichmentQuery`**:\n\n      * A single sentence prompt for Linkup. Refer to the object generically based on your identified `ObjectName` (e.g., \"For that company...\", \"For that person...\"). The actual name of the item will be provided contextually, so do not use a placeholder.\n\n  * **`enrichmentSchema`**:\n\n      * A detailed JSON Schema object that defines all the fields to capture for each object, based on the user's goal.\n      * The root must be `\"type\": \"object\"`.\n      * All properties must be required (see example later)\n\n\n\n## Output Format\n\n  * Return a single, valid **JSON object** with five keys: `\"ObjectName\"`, `\"discoveryQuery\"`, `\"discoverySchema\"`, `\"enrichmentQuery\"`, and `\"enrichmentSchema\"`.\n  * Do not stringify the schemas; they must remain as JSON objects.\n  * Do not include explanations or any text outside the final JSON.\n\n\n### Example JSON Output\n\nHere is a complete example for the request: \"I need 50 german companies in fashion industry between 40 and 130 employees...\"\n\n{\n  \"ObjectName\": \"Company\",\n  \"discoveryQuery\": \"List 50 German fashion industry companies with 40 to 130 employees. If not enough relevant companies have been found, don't force adding the requested number, quality prevails\",\n  \"discoverySchema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"List\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"PropertyValue\": {\n              \"type\": \"string\",\n              \"description\": \"The official name of the German fashion company.\"\n            }\n          },\n          \"required\": [\"PropertyValue\"]\n        }\n      }\n    },\n    \"required\": [\"List\"]\n  },\n  \"enrichmentQuery\": \"For that company, provide detailed business information useful for personalized outreach including its Website, employee count, headquarters, key contacts, and recent news.\",\n  \"enrichmentSchema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"Company Name\": {\n        \"type\": \"string\",\n        \"description\": \"The official company name\"\n      },\n      \"Website\": {\n        \"type\": \"string\",\n        \"description\": \"Official website URL\"\n      },\n      \"Employee Count\": {\n        \"type\": \"integer\",\n        \"description\": \"Number of employees\"\n      },\n      \"Headquarters\": {\n        \"type\": \"string\",\n        \"description\": \"Headquarters location\"\n      },\n      \"Key Contacts\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\"\n        },\n        \"description\": \"List of key contact persons (e.g. CEO, Marketing Head)\"\n      },\n      \"Recent News\": {\n        \"type\": \"string\",\n        \"description\": \"Any recent news or updates about the company for outreach personalization\"\n      }\n    },\n    \"required\": [\n  \"Company Name\",\n  \"Website\",\n  \"Employee Count\",\n  \"Headquarters\",\n  \"Key Contacts\",\n  \"Recent News\"\n    ]\n  }\n}"
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "ef93d5c6-48bc-4afb-80e9-5511c4143d7f",
      "name": "CSVに変換",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        1664,
        -400
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "fa8be6ed-db4f-43a6-b5cf-b33ff400f266",
      "name": "付箋2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -512,
        -416
      ],
      "parameters": {
        "width": 448,
        "height": 752,
        "content": "# **Dynamic AI Web Researcher**\n\nThis workflow turns any plain-text research request into a custom-built, structured spreadsheet (CSV). It uses a \"thinker\" AI to plan the research and a \"doer\" AI to execute it.\n\n## **How it works**\n1.  **Plan:** An AI \"thinker\" analyzes your request and dynamically creates a custom plan, deciding on the perfect spreadsheet columns for your goal.\n2.  **Discover:** An AI \"researcher\" (Linkup) performs a deep web search to find an initial list of items based on the plan.\n3.  **Enrich:** It then loops through each item, performing fast web searches to fill in all the detailed columns defined by the planner.\n4.  **Output:** The final, structured data is converted into a CSV file.\n\n## **How to use**\n1.  **Connect your AI provider** to the **OpenAI Chat Model** node.\n2.  **Connect Linkup:** Add your **Linkup API Key** to the two HTTP Request nodes that query Linkup.\n3.  **Run:** Activate the workflow and use the form to submit a research request.\n\n\n\n\n*This template was created by Guillaume Duvernay*"
      },
      "typeVersion": 1
    },
    {
      "id": "04ecb528-4934-4565-8677-e69917a56f58",
      "name": "付箋3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        192,
        -176
      ],
      "parameters": {
        "color": 6,
        "width": 352,
        "height": 576,
        "content": "## The architect brain\n\nThis AI step defines how the output of the research will look like (CSV schema), and how to get there (prompts).\n\nMake sure to connect a powerful AI model"
      },
      "typeVersion": 1
    },
    {
      "id": "48f2305c-5ef5-41c0-8705-37a8582502e5",
      "name": "付箋1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1760,
        64
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 384,
        "content": "## AI web-search to find all information about one item\n\nDon't forget to connect your Linkup credentials."
      },
      "typeVersion": 1
    },
    {
      "id": "29343905-2b7c-4d34-8455-066039945a6a",
      "name": "付箋4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1216,
        -112
      ],
      "parameters": {
        "color": 5,
        "width": 1088,
        "height": 816,
        "content": "## Running a loop on each item\n\nWithin this loop, each item from the list will go through an AI web search that will find all the values for the properties that the initial AI step had identified. These values will be cleaned and prepared before the outcome gets converted into a CSV."
      },
      "typeVersion": 1
    },
    {
      "id": "2cc1bca9-29ba-4d79-9e3f-6217c39d495a",
      "name": "付箋5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1520,
        -592
      ],
      "parameters": {
        "color": 4,
        "width": 384,
        "height": 352,
        "content": "## The output: A custom CSV\n\nThis CSV contains one row per item that was found, and each column is a property that got enriched thanks to the Web AI search. "
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "074eea9f-b07e-4677-8b58-75b92155df44": {
      "main": [
        [
          {
            "node": "e9d5daa7-aa07-4873-888f-b704cf0d6d7c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e9d5daa7-aa07-4873-888f-b704cf0d6d7c": {
      "main": [
        [
          {
            "node": "ef93d5c6-48bc-4afb-80e9-5511c4143d7f",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "baf2d169-9593-4ec2-9415-1ed45cb303d0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3c8ad682-a662-4266-bdb5-732f6bb8614c": {
      "ai_languageModel": [
        [
          {
            "node": "c4b50e76-3ff0-4d07-830e-7141a6d90d4d",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "7df78b4d-8c66-4353-a87e-7b151913f856": {
      "main": [
        [
          {
            "node": "c4b50e76-3ff0-4d07-830e-7141a6d90d4d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "baf2d169-9593-4ec2-9415-1ed45cb303d0": {
      "main": [
        [
          {
            "node": "d170bc2a-68a3-497c-803b-78f904ec9351",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c4b50e76-3ff0-4d07-830e-7141a6d90d4d": {
      "main": [
        [
          {
            "node": "53b2a08a-f61f-4c60-8c25-9edc8731a9d4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "53b2a08a-f61f-4c60-8c25-9edc8731a9d4": {
      "main": [
        [
          {
            "node": "074eea9f-b07e-4677-8b58-75b92155df44",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "74957f1e-01ba-4cfd-a5e7-2fec11e0a7ad": {
      "main": [
        [
          {
            "node": "e9d5daa7-aa07-4873-888f-b704cf0d6d7c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d170bc2a-68a3-497c-803b-78f904ec9351": {
      "main": [
        [
          {
            "node": "74957f1e-01ba-4cfd-a5e7-2fec11e0a7ad",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
よくある質問

このワークフローの使い方は?

上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。

このワークフローはどんな場面に適していますか?

上級 - その他, AI要約, マルチモーダルAI

有料ですか?

このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。

関連ワークフロー

AIによる計画、Linkup検索、GPT-5を使って研究支援記事を作成
AIによる計画、Linkup検索、GPT-5を使って研究支援記事を作成
Set
Split Out
Aggregate
+
Set
Split Out
Aggregate
19 ノードGuillaume Duvernay
コンテンツ作成
GPT-4 と Airtable を使用してワークフローを自動のに記録・バックアップ
GPT-4 と Airtable を使用してワーキ弗洛ーを自動のに記録しバックアップする
If
N8n
Set
+
If
N8n
Set
38 ノードGuillaume Duvernay
AI要約
毎日の WhatsApp グループ スマート分析:GPT-4.1 による分析と音声メッセージの transcrição
毎日の WhatsApp グループ インタラクティブ分析:GPT-4.1 分析と音声メッセージ文字起こし
If
Set
Code
+
If
Set
Code
52 ノードDaniel Lianes
その他
LookioとOpenAI GPTを使用して知識源から事実に基づく記事を作成
Lookio と OpenAI GPT を使って、知识源から基礎のな記事を作成する
Set
Split Out
Aggregate
+
Set
Split Out
Aggregate
19 ノードGuillaume Duvernay
コンテンツ作成
Super RAGとGPT-5を使用して知識源から事実に基づく記事を作成
Super RAG と GPT-5 を使って、知识源から基礎のな記事を作成する
Set
Split Out
Aggregate
+
Set
Split Out
Aggregate
19 ノードGuillaume Duvernay
AI RAG検索拡張
デモ - テンプレート共有 - 職務記述書から候補者候補リストの構築
AI採用ワークフロー:ApolloとAirtableを使用して職務から候補者候補リストを作成
Set
Limit
Switch
+
Set
Limit
Switch
40 ノードFabian Herhold
その他
ワークフロー情報
難易度
上級
ノード数16
カテゴリー3
ノードタイプ10
難易度説明

上級者向け、16ノード以上の複雑なワークフロー

作成者
Guillaume Duvernay

Guillaume Duvernay

@duv

AI and automation expert

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34