文書のコンプライアンス検証を自動化
上級
これはAI RAG, Multimodal AI分野の自動化ワークフローで、22個のノードを含みます。主にCode, Webhook, HttpRequest, Code, Agentなどのノードを使用。 AI とベクトルデータベースを組み合わせた自動ドキュメントコンプライアンス検証
前提条件
- •HTTP Webhookエンドポイント(n8nが自動生成)
- •ターゲットAPIの認証情報が必要な場合あり
- •Qdrantサーバー接続情報
使用ノード (22)
カテゴリー
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
"meta": {
"instanceId": "3fe077479b444bdcfece7286c569713d43d4aa028a4ec663ca89692157527a79",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "22c5f212-aeca-46d1-a684-41147efc6547",
"name": "監査ドキュメントアップロード",
"type": "n8n-nodes-base.webhook",
"position": [
-464,
-272
],
"webhookId": "ede6ddb4-91a5-4a3c-9f91-5600939bf5a8",
"parameters": {
"path": "creatorhub/audit-document-upload",
"options": {},
"httpMethod": "POST",
"responseMode": "lastNode"
},
"typeVersion": 2
},
{
"id": "bf8f5941-db69-4db3-b344-183e23b010ca",
"name": "手続き提出",
"type": "n8n-nodes-base.webhook",
"position": [
-464,
288
],
"webhookId": "9bbf9e5b-1582-40c2-9324-6927f62ca31d",
"parameters": {
"path": "creatorhub/procedure-validate",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 2
},
{
"id": "35b34dc7-27f0-446d-b052-1bf7eb990ce2",
"name": "ドキュメント取得 (Microsoft Graph)",
"type": "n8n-nodes-base.httpRequest",
"position": [
-256,
-272
],
"parameters": {
"url": "={{$env.GRAPH_BASE_URL || \"https://graph.microsoft.com\"}}/v1.0/drives/{{$json.body.spDriveId}}/items/{{$json.body.spDocumentId}}/content",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "a9520145-7f98-4f22-a477-cb24caa599b2",
"name": "古いドキュメントベクトル削除",
"type": "@n8n/n8n-nodes-langchain.code",
"position": [
0,
-272
],
"parameters": {
"code": {
"execute": {
"code": "const { QdrantVectorStore } = require(\"@langchain/qdrant\");\nconst { OllamaEmbeddings } = require(\"@langchain/community/embeddings/ollama\");\n\nconst OLLAMA_BASE_URL = $env.OLLAMA_BASE_URL || \"http://localhost:11434\";\nconst QDRANT_BASE_URL = $env.QDRANT_BASE_URL || \"http://localhost:6333\";\nconst QDRANT_COLLECTION = $env.QDRANT_COLLECTION || \"audit-docs\";\nconst EMBED_MODEL = $env.OLLAMA_EMBED_MODEL || \"nomic-embed-text\";\n\nconst embeddings = new OllamaEmbeddings({ model: EMBED_MODEL, baseUrl: OLLAMA_BASE_URL });\nconst vectorStore = await QdrantVectorStore.fromExistingCollection(embeddings, { url: QDRANT_BASE_URL, collectionName: QDRANT_COLLECTION });\n\nconst items = this.getInputData();\nconst fileIdToDelete = items[0].json.body.spDocumentId;\n\nconst filter = { must: [ { key: \"metadata.file_id\", match: { value: fileIdToDelete } } ] };\n\ntry {\n if (vectorStore?.client?.delete) {\n await vectorStore.client.delete(QDRANT_COLLECTION, { filter });\n }\n} catch (e) {\n // Non-fatal: continue import/index even if delete fails\n this.logger?.warn?.(`Qdrant delete skipped/failed: ${e?.message || e}`);\n}\n\nreturn items.map(item => ({ json: { ...item.json, file_id: fileIdToDelete }, binary: item.binary }));"
}
},
"inputs": {
"input": [
{
"type": "main",
"required": true
}
]
},
"outputs": {
"output": [
{
"type": "main"
}
]
}
},
"typeVersion": 1,
"alwaysOutputData": false
},
{
"id": "a0be08c7-54b0-41ad-9b8a-326601c0e6b8",
"name": "PDFテキスト抽出",
"type": "n8n-nodes-base.extractFromFile",
"position": [
416,
-272
],
"parameters": {
"options": {},
"operation": "pdf",
"binaryPropertyName": "=data"
},
"executeOnce": true,
"typeVersion": 1,
"alwaysOutputData": true
},
{
"id": "c8a629c8-80d6-484f-ade6-e3a969c1a353",
"name": "ドキュメント埋め込み生成",
"type": "@n8n/n8n-nodes-langchain.embeddingsOllama",
"position": [
560,
-80
],
"parameters": {
"model": "={{ $env.OLLAMA_EMBED_MODEL || \"nomic-embed-text:latest\" }}"
},
"credentials": {
"ollamaApi": {
"id": "FLDXCk6C8NH00TJu",
"name": "Ollama account"
}
},
"typeVersion": 1
},
{
"id": "0e2b9829-03bf-4dfb-b557-94d79f13c5d7",
"name": "Qdrantへのベクトル挿入",
"type": "@n8n/n8n-nodes-langchain.vectorStoreQdrant",
"position": [
656,
-272
],
"parameters": {
"mode": "insert",
"options": {},
"qdrantCollection": {
"__rl": true,
"mode": "list",
"value": "={{ $env.QDRANT_COLLECTION || \"audit-docs\" }}",
"cachedResultName": "audit-docs"
}
},
"credentials": {
"qdrantApi": {
"id": "efX2OG1ibQmRYvUA",
"name": "QdrantApi account"
}
},
"typeVersion": 1.3
},
{
"id": "250e006a-d815-475e-a0f6-daa88c0b2a71",
"name": "ドキュメントメタデータ読み込み",
"type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
"position": [
768,
-96
],
"parameters": {
"options": {
"metadata": {
"metadataValues": [
{
"name": "documentId",
"value": "={{ $('Delete Old Document Vectors').item.json.body.spDocumentId }}"
},
{
"name": "documentName",
"value": "={{ $('Delete Old Document Vectors').item.json.body.fileName }}"
}
]
}
},
"textSplittingMode": "custom"
},
"typeVersion": 1.1
},
{
"id": "53151c0a-7fbe-4a35-a9a9-9d082842f05f",
"name": "テキストチャンク分割",
"type": "@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter",
"position": [
880,
48
],
"parameters": {
"options": {},
"chunkOverlap": 10
},
"typeVersion": 1
},
{
"id": "1970eb10-01aa-4108-b686-47e6fa955cf8",
"name": "手続きペイロードフォーマット",
"type": "n8n-nodes-base.code",
"position": [
-224,
288
],
"parameters": {
"jsCode": "const {procedures, spDocumentId, description} = $input.first().json.body;\nconst result = procedures.map(procedure => ({ json: { spDocumentId, procedure, description } }));\nreturn result;"
},
"typeVersion": 2
},
{
"id": "a9d11ff6-6cf0-4efa-a120-b7d86ecb48fa",
"name": "AIコンプライアンス検証器",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
112,
288
],
"parameters": {
"text": "=# Role\nYou are an expert internal auditor with extensive experience in compliance analysis, document review, and gap identification. Your analytical skills, attention to detail, and ability to extract relevant information from complex documents are unmatched in the industry.\n\n# Inputs\n\n**Procedure**\n{{ $json.procedure }}\n \n**spDocumentId**\n{{ $json.spDocumentId }}\n \n**description**\n{{ $json.description }}\n\n# Task\nAnalyze the provided procedure and related documents by following these steps:\n\n1. Carefully review the procedure and description text to understand all requirements and compliance standards.\n2. With the spDocumentId passed in, generate effective search queries based on key requirements in the procedure.\n3. Use these queries to retrieve relevant text from the Qdrant datastore that relates to compliance requirements.\n4. Systematically analyze the retrieved documents to:\n - Identify sections that meet the procedure's requirements\n - Identify gaps where requirements are not met\n - Document specific citations for both compliant and non-compliant findings\n5. Organize your findings into a structured JSON response with clear summaries and supporting evidence.\n6. Assign an appropriate confidence level to your analysis based on the quality and relevance of the evidence found.\n\n# Specifics\n- This compliance analysis is critically important to our organization's regulatory standing, and your thorough evaluation will directly impact our business operations.\n- When generating search queries, focus on specific requirements, standards, and action items mentioned in the procedure.\n- For each compliance or non-compliance finding, provide specific text citations including page numbers or section references.\n- Your expertise in identifying subtle compliance gaps is greatly valued and will help protect our organization from potential regulatory issues.\n- If certain requirements have no corresponding evidence in the documents, clearly indicate this as a gap in the non-compliance summary.\n- Ensure your confidence level accurately reflects the strength of evidence found in the documents.\n\n# Context\nYou are conducting an internal audit for a regulated organization that must demonstrate compliance with specific procedures. The Qdrant vector datastore contains the full text of all relevant documents that need to be evaluated against the procedure requirements. Your analysis will be used by compliance officers and management to address any gaps and prepare for potential external audits. The procedure document contains the standards against which all other documents must be measured, and your task is to determine whether these standards are being met based on the evidence in the documents.\n\n# Examples\n## Example 1\nQ:\n{\n \"output\": {\n \"procedure\": \"Analyze financial and operational highlights, identify key issues, and develop strategic recommendations.\",\n \"spDocumentId\": \"SP123456\",\n \"confidenceLevel\": 40,\n \"summaryOfCompliance\": \"The meeting transcript provided detailed insights into Apollo's financial performance and operational strategies. The summary of compliance includes a thorough analysis of sales trends, pricing adjustments, R&D projects, cost-saving measures, marketing efforts, and legal considerations.\",\n \"summaryOfNonCompliance\": \"There are no specific non-compliances noted in the provided transcript; however, potential risks such as market research gaps, cost-cutting strategies impacting innovation, and pending litigation pose challenges that need to be addressed.\",\n \"supportingTextCitations\": \"Based on the meeting transcript, key financial highlights include decreased sales of premium shoes, increased product prices by approximately 10%, cessation of the Phoneshoe project, labor reallocation, reduced postage and phone expenses, Superbowl commercial costs increase, and pending litigation.\"\n }\n}\n\n## Example 2\nQ:\n[\n {\n \"output\": {\n \"procedure\": \"Implement all recommendations from Charter for Corporate Responsibility in Environmental Protection (CREP) related to cement plants.\",\n \"spDocumentId\": \"SP-DOC-00123\",\n \"confidenceLevel\": 40,\n \"summaryOfCompliance\": \"All commitments made during the Public Hearing on July 18, 2012, will be satisfactorily implemented. A separate budget has been allocated for this purpose and progress reports will be submitted to the Ministry's Regional Office in Bangalore.\",\n \"summaryOfNonCompliance\": \"None were found.\",\n \"supportingTextCitations\": \"citation on page 3\"\n }\n }\n]\n\n# Notes\n- Return only a structured JSON response matching the required schema.\n- If any fields would be empty, provide \"No Additional Feedback\" as the value.\n- Place special emphasis on the accuracy of citations to ensure traceability of your findings.\n- Ensure your confidence level (0-100) accurately reflects the quality and completeness of evidence found.\n- Remember that both compliance and non-compliance findings are equally important for a comprehensive audit.",
"options": {},
"promptType": "define",
"hasOutputParser": true
},
"executeOnce": false,
"typeVersion": 2.1
},
{
"id": "d2cef8a0-0e15-4e06-9c5c-3eae0aa2fc93",
"name": "言語モデル (AIエージェント)",
"type": "@n8n/n8n-nodes-langchain.lmChatOllama",
"position": [
16,
496
],
"parameters": {
"model": "={{ $env.OLLAMA_CHAT_MODEL || \"qwen2.5:7b\" }}",
"options": {
"numCtx": 2048
}
},
"credentials": {
"ollamaApi": {
"id": "FLDXCk6C8NH00TJu",
"name": "Ollama account"
}
},
"typeVersion": 1
},
{
"id": "26ff7b08-8fd3-4ea6-baee-ca215382cffb",
"name": "関連ドキュメントチャンク取得",
"type": "@n8n/n8n-nodes-langchain.vectorStoreQdrant",
"position": [
192,
496
],
"parameters": {
"mode": "retrieve-as-tool",
"topK": 8,
"options": {
"searchFilterJson": "={\n \"should\": [\n {\n \"key\": \"metadata.documentId\",\n \"match\": { \"value\": \"{{ $('Format Procedure Payload').first().json.spDocumentId }}\" }\n }\n ]\n}"
},
"toolDescription": "Query document text from uploaded documents.",
"qdrantCollection": {
"__rl": true,
"mode": "list",
"value": "={{ $env.QDRANT_COLLECTION || \"audit-docs\" }}",
"cachedResultName": "audit-docs"
}
},
"credentials": {
"qdrantApi": {
"id": "efX2OG1ibQmRYvUA",
"name": "QdrantApi account"
}
},
"typeVersion": 1.3
},
{
"id": "b5f941e6-699f-4146-9ac5-98881a6e350c",
"name": "クエリ埋め込み生成",
"type": "@n8n/n8n-nodes-langchain.embeddingsOllama",
"position": [
256,
640
],
"parameters": {
"model": "={{ $env.OLLAMA_EMBED_MODEL || \"nomic-embed-text:latest\" }}"
},
"credentials": {
"ollamaApi": {
"id": "FLDXCk6C8NH00TJu",
"name": "Ollama account"
}
},
"typeVersion": 1
},
{
"id": "0f05420f-46ff-4388-9ac4-1873769b27fa",
"name": "言語モデル (構造化出力)",
"type": "@n8n/n8n-nodes-langchain.lmChatOllama",
"position": [
560,
640
],
"parameters": {
"model": "={{ $env.OLLAMA_CHAT_MODEL || \"qwen2.5:7b\" }}",
"options": {}
},
"credentials": {
"ollamaApi": {
"id": "FLDXCk6C8NH00TJu",
"name": "Ollama account"
}
},
"typeVersion": 1
},
{
"id": "cc4d8ab4-4fb6-43e1-bac2-608d7cde44b9",
"name": "AI応答解析",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
496,
496
],
"parameters": {
"autoFix": true,
"schemaType": "manual",
"inputSchema": "{\n \"type\": \"object\",\n \"required\": [\"confidenceLevel\",\"summaryOfCompliance\",\"summaryOfNonCompliance\",\"supportingTextCitations\"],\n \"properties\": {\n \"procedure\": {\"type\": \"string\"},\n \"spDocumentId\": {\"type\": \"string\"},\n \"confidenceLevel\": {\"type\": \"integer\"},\n \"summaryOfCompliance\": {\"type\": \"string\"},\n \"summaryOfNonCompliance\": {\"type\": \"string\"},\n \"supportingTextCitations\": {\"type\": \"string\"}\n }\n}"
},
"typeVersion": 1.3
},
{
"id": "d67b5769-ef38-4e94-b0eb-9052c43dd113",
"name": "コンプライアンスレポート返却",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
608,
288
],
"parameters": {
"options": {},
"respondWith": "allIncomingItems"
},
"typeVersion": 1.4
},
{
"id": "a07e2a08-6304-4abf-81b0-d2ab0ae90c5d",
"name": "付箋ノート",
"type": "n8n-nodes-base.stickyNote",
"position": [
-464,
-480
],
"parameters": {
"content": "### 1. Start: Upload Document\n* Via Webhook: Audit Document Upload\n* Accepts PDF/DOCX file\n* Optionally fetches from Microsoft Graph"
},
"typeVersion": 1
},
{
"id": "5bfb1299-0b6b-4c45-abce-f2c725c22581",
"name": "付箋ノート1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-16,
-480
],
"parameters": {
"content": "### 2. Document Preprocessing\n* Clear Old Vectors (remove previous embeddings for same file)\n* Extract PDF Text\n* Split into chunks for embedding\n* Generate embeddings → Insert into Qdrant"
},
"typeVersion": 1
},
{
"id": "3b49fd17-f85d-4ad4-9ad3-e8274faf9fef",
"name": "付箋ノート2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-464,
80
],
"parameters": {
"content": "### 3. Procedure Submission\n* Webhook: Procedure Submission\n* Accepts JSON payload (procedure, description, spDocumentId)\n* Payload formatted → passed to AI"
},
"typeVersion": 1
},
{
"id": "cb5b5349-47d3-4c01-ac2a-ea7a9b596503",
"name": "付箋ノート3",
"type": "n8n-nodes-base.stickyNote",
"position": [
96,
80
],
"parameters": {
"content": "### 4. AI Compliance Validation\n* Retrieve Relevant Document Chunks from Qdrant\n* AI Compliance Validator uses LLM + embeddings\n* Output parsed & structured into JSON"
},
"typeVersion": 1
},
{
"id": "d6b8d7c6-d14d-4625-97de-ac6fdd792156",
"name": "付箋ノート4",
"type": "n8n-nodes-base.stickyNote",
"position": [
576,
80
],
"parameters": {
"content": "### 5. Return Results\n* Structured compliance report returned to webhook caller"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"a0be08c7-54b0-41ad-9b8a-326601c0e6b8": {
"main": [
[
{
"node": "0e2b9829-03bf-4dfb-b557-94d79f13c5d7",
"type": "main",
"index": 0
}
]
]
},
"cc4d8ab4-4fb6-43e1-bac2-608d7cde44b9": {
"ai_outputParser": [
[
{
"node": "a9d11ff6-6cf0-4efa-a120-b7d86ecb48fa",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"bf8f5941-db69-4db3-b344-183e23b010ca": {
"main": [
[
{
"node": "1970eb10-01aa-4108-b686-47e6fa955cf8",
"type": "main",
"index": 0
}
]
]
},
"22c5f212-aeca-46d1-a684-41147efc6547": {
"main": [
[
{
"node": "35b34dc7-27f0-446d-b052-1bf7eb990ce2",
"type": "main",
"index": 0
}
]
]
},
"250e006a-d815-475e-a0f6-daa88c0b2a71": {
"ai_document": [
[
{
"node": "0e2b9829-03bf-4dfb-b557-94d79f13c5d7",
"type": "ai_document",
"index": 0
}
]
]
},
"53151c0a-7fbe-4a35-a9a9-9d082842f05f": {
"ai_textSplitter": [
[
{
"node": "250e006a-d815-475e-a0f6-daa88c0b2a71",
"type": "ai_textSplitter",
"index": 0
}
]
]
},
"a9d11ff6-6cf0-4efa-a120-b7d86ecb48fa": {
"main": [
[
{
"node": "d67b5769-ef38-4e94-b0eb-9052c43dd113",
"type": "main",
"index": 0
}
]
]
},
"1970eb10-01aa-4108-b686-47e6fa955cf8": {
"main": [
[
{
"node": "a9d11ff6-6cf0-4efa-a120-b7d86ecb48fa",
"type": "main",
"index": 0
}
]
]
},
"b5f941e6-699f-4146-9ac5-98881a6e350c": {
"ai_embedding": [
[
{
"node": "26ff7b08-8fd3-4ea6-baee-ca215382cffb",
"type": "ai_embedding",
"index": 0
}
]
]
},
"d2cef8a0-0e15-4e06-9c5c-3eae0aa2fc93": {
"ai_languageModel": [
[
{
"node": "a9d11ff6-6cf0-4efa-a120-b7d86ecb48fa",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"a9520145-7f98-4f22-a477-cb24caa599b2": {
"main": [
[
{
"node": "a0be08c7-54b0-41ad-9b8a-326601c0e6b8",
"type": "main",
"index": 0
}
]
]
},
"c8a629c8-80d6-484f-ade6-e3a969c1a353": {
"ai_embedding": [
[
{
"node": "0e2b9829-03bf-4dfb-b557-94d79f13c5d7",
"type": "ai_embedding",
"index": 0
}
]
]
},
"35b34dc7-27f0-446d-b052-1bf7eb990ce2": {
"main": [
[
{
"node": "a9520145-7f98-4f22-a477-cb24caa599b2",
"type": "main",
"index": 0
}
]
]
},
"26ff7b08-8fd3-4ea6-baee-ca215382cffb": {
"ai_tool": [
[
{
"node": "a9d11ff6-6cf0-4efa-a120-b7d86ecb48fa",
"type": "ai_tool",
"index": 0
}
]
]
},
"0f05420f-46ff-4388-9ac4-1873769b27fa": {
"ai_languageModel": [
[
{
"node": "cc4d8ab4-4fb6-43e1-bac2-608d7cde44b9",
"type": "ai_languageModel",
"index": 0
}
]
]
}
}
}よくある質問
このワークフローの使い方は?
上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。
このワークフローはどんな場面に適していますか?
上級 - AI RAG検索拡張, マルチモーダルAI
有料ですか?
このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。
関連ワークフロー
Gmail、GPT-4、ベクター知識ベースを使用した顧客サポートシステムの自動化
自動顧客サポートシステム(Gmail、GPT-4、ベクター知識ベース)
If
Set
Code
+
If
Set
Code
32 ノードKhair Ahammed
AI RAG検索拡張
コンテキスト・ハイブリッドRAG AIコピー
RAGアプリケーション向けのGoogle DriveからSupabaseコンテキストベクトルデータベースへの同期
If
Set
Code
+
If
Set
Code
76 ノードMichael Taleb
AI RAG検索拡張
dian-memo_03のエクスポート
AI音声とテキストノート - LINEメッセージ、Supabaseベクトルデータベース、Gmailの統合
If
Set
Code
+
If
Set
Code
30 ノードkote2
AI RAG検索拡張
[テンプレート] AIペットショップ v8
AIペットショップアシスタント - GPT-4o、Googleカレンダー、WhatsApp/Instagram/Facebookを統合
If
N8n
Set
+
If
N8n
Set
244 ノードAmanda Benks
営業
AI エージェント レストラン [テンプレート]
🤖 WhatsApp、Instagram、MessengerのAIレストランアシスタント
If
N8n
Set
+
If
N8n
Set
239 ノードAmanda Benks
その他
GPT-4、Claude、Apify を使用したコンテンツ分析や洞察を目のとしたウェブ調査の自動化
GPT-4、Claude、Apify を使ったウェブ調査の自動化でコンテンツ分析とインサイトを行う
If
Set
Code
+
If
Set
Code
42 ノードPeter Zendzian
市場調査