PDF Vector AIで文書から法律引用を抽出・検証
中級
これはDocument Extraction, AI Summarization分野の自動化ワークフローで、8個のノードを含みます。主にIf, Code, GoogleDrive, ManualTrigger, PdfVectorなどのノードを使用。 PDF Vector AIでドキュメントから法引用を抽出し、検証する
前提条件
- •Google Drive API認証情報
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
"meta": {
"instanceId": "placeholder"
},
"nodes": [
{
"id": "manual-trigger",
"name": "手動トリガー",
"type": "n8n-nodes-base.manualTrigger",
"notes": "Start citation extraction",
"position": [
250,
300
],
"parameters": {},
"typeVersion": 1
},
{
"id": "google-drive",
"name": "Google ドライブ - Get Legal Document",
"type": "n8n-nodes-base.googleDrive",
"notes": "Retrieve document from Drive",
"position": [
450,
300
],
"parameters": {
"fileId": "={{ $json.fileId }}",
"operation": "download"
},
"typeVersion": 3
},
{
"id": "pdfvector-extract",
"name": "PDF Vector - Extract Citations",
"type": "n8n-nodes-pdfvector.pdfVector",
"notes": "Extract all citations",
"position": [
650,
300
],
"parameters": {
"prompt": "Extract all legal citations from this document or image. Include case citations (with reporter and year), statute citations (with title and section), regulatory citations, and academic citations (with author, title, journal, and year). For each citation, include the surrounding context (1-2 sentences) and page number where it appears. Use OCR if this is a scanned legal document or image.",
"schema": "{\"type\":\"object\",\"properties\":{\"documentInfo\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\"},\"documentType\":{\"type\":\"string\"},\"court\":{\"type\":\"string\"},\"date\":{\"type\":\"string\"},\"docketNumber\":{\"type\":\"string\"}}},\"caseCitations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"caseName\":{\"type\":\"string\"},\"reporter\":{\"type\":\"string\"},\"volume\":{\"type\":\"string\"},\"page\":{\"type\":\"string\"},\"year\":{\"type\":\"string\"},\"court\":{\"type\":\"string\"},\"context\":{\"type\":\"string\"},\"pageNumber\":{\"type\":\"number\"},\"pinCite\":{\"type\":\"string\"}}}},\"statuteCitations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\"},\"code\":{\"type\":\"string\"},\"section\":{\"type\":\"string\"},\"subsection\":{\"type\":\"string\"},\"year\":{\"type\":\"string\"},\"context\":{\"type\":\"string\"},\"pageNumber\":{\"type\":\"number\"}}}},\"regulatoryCitations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"title\":{\"type\":\"string\"},\"agency\":{\"type\":\"string\"},\"section\":{\"type\":\"string\"},\"context\":{\"type\":\"string\"},\"pageNumber\":{\"type\":\"number\"}}}},\"academicCitations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"authors\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"journal\":{\"type\":\"string\"},\"volume\":{\"type\":\"string\"},\"page\":{\"type\":\"string\"},\"year\":{\"type\":\"string\"},\"doi\":{\"type\":\"string\"},\"context\":{\"type\":\"string\"},\"pageNumber\":{\"type\":\"number\"}}}},\"otherCitations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"text\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"context\":{\"type\":\"string\"},\"pageNumber\":{\"type\":\"number\"}}}}},\"required\":[\"documentInfo\"],\"additionalProperties\":false}",
"resource": "document",
"inputType": "file",
"operation": "extract",
"binaryPropertyName": "data"
},
"typeVersion": 1
},
{
"id": "analyze-citations",
"name": "Analyze & Validate Citations",
"type": "n8n-nodes-base.code",
"notes": "Process citation data",
"position": [
850,
300
],
"parameters": {
"jsCode": "// Process and validate citations\nconst citations = $input.first().json.data;\nconst citationAnalysis = {\n summary: {\n totalCitations: 0,\n caseLaw: citations.caseCitations?.length || 0,\n statutes: citations.statuteCitations?.length || 0,\n regulations: citations.regulatoryCitations?.length || 0,\n academic: citations.academicCitations?.length || 0,\n other: citations.otherCitations?.length || 0\n },\n validation: {\n invalidCitations: [],\n warnings: []\n },\n academicDOIs: [],\n citationNetwork: {}\n};\n\n// Calculate total\ncitationAnalysis.summary.totalCitations = \n citationAnalysis.summary.caseLaw + \n citationAnalysis.summary.statutes + \n citationAnalysis.summary.regulations + \n citationAnalysis.summary.academic + \n citationAnalysis.summary.other;\n\n// Validate case citations\nif (citations.caseCitations) {\n citations.caseCitations.forEach((cite, index) => {\n // Check for required fields\n if (!cite.reporter || !cite.volume || !cite.page) {\n citationAnalysis.validation.invalidCitations.push({\n type: 'case',\n index,\n citation: cite.caseName,\n issue: 'Missing reporter, volume, or page'\n });\n }\n \n // Build citation network (track which cases cite which)\n if (!citationAnalysis.citationNetwork[cite.caseName]) {\n citationAnalysis.citationNetwork[cite.caseName] = {\n citedIn: [citations.documentInfo.title],\n pageNumbers: [cite.pageNumber]\n };\n }\n });\n}\n\n// Validate statute citations\nif (citations.statuteCitations) {\n citations.statuteCitations.forEach((cite, index) => {\n if (!cite.title || !cite.section) {\n citationAnalysis.validation.invalidCitations.push({\n type: 'statute',\n index,\n citation: `${cite.title} ${cite.code}`,\n issue: 'Missing title or section'\n });\n }\n });\n}\n\n// Extract DOIs for academic fetching\nif (citations.academicCitations) {\n citations.academicCitations.forEach(cite => {\n if (cite.doi) {\n citationAnalysis.academicDOIs.push(cite.doi);\n } else {\n // Try to construct search query for papers without DOI\n citationAnalysis.validation.warnings.push({\n type: 'academic',\n citation: cite.title,\n warning: 'No DOI found - manual search may be needed'\n });\n }\n });\n}\n\n// Analyze citation patterns\nconst citationPatterns = {\n mostCitedCases: [],\n primaryAuthorities: [],\n secondaryAuthorities: []\n};\n\n// Identify primary authorities (statutes and binding cases)\ncitationPatterns.primaryAuthorities = [\n ...citations.statuteCitations?.map(c => `${c.title} ${c.code} § ${c.section}`) || [],\n ...citations.caseCitations?.filter(c => c.court?.includes('Supreme'))?.map(c => c.caseName) || []\n];\n\n// Identify secondary authorities\ncitationPatterns.secondaryAuthorities = \n citations.academicCitations?.map(c => `${c.authors}, ${c.title}`) || [];\n\nreturn [{\n json: {\n originalData: citations,\n analysis: citationAnalysis,\n patterns: citationPatterns,\n doisToFetch: citationAnalysis.academicDOIs.join(','),\n processedAt: new Date().toISOString()\n }\n}];"
},
"typeVersion": 1
},
{
"id": "has-dois",
"name": "Has Academic DOIs?",
"type": "n8n-nodes-base.if",
"position": [
1050,
300
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json.doisToFetch }}",
"operation": "isNotEmpty"
}
]
}
},
"typeVersion": 1
},
{
"id": "pdfvector-fetch",
"name": "PDF Vector - Fetch Papers",
"type": "n8n-nodes-pdfvector.pdfVector",
"notes": "Retrieve academic papers",
"position": [
1250,
250
],
"parameters": {
"ids": "={{ $json.doisToFetch }}",
"fields": [
"title",
"abstract",
"authors",
"year",
"doi",
"pdfURL",
"totalCitations"
],
"resource": "academic",
"operation": "fetch"
},
"typeVersion": 1
},
{
"id": "generate-report",
"name": "Generate Citation Report",
"type": "n8n-nodes-base.code",
"notes": "Create final report",
"position": [
1450,
300
],
"parameters": {
"jsCode": "// Generate comprehensive citation report\nconst citationData = $node['Has Academic DOIs?'].json;\nconst academicPapers = $json.publications || [];\n\n// Create citation report\nlet report = `# Legal Citation Analysis Report\\n\\n`;\nreport += `**Document:** ${citationData.originalData.documentInfo.title}\\n`;\nreport += `**Type:** ${citationData.originalData.documentInfo.documentType}\\n`;\nreport += `**Date:** ${citationData.originalData.documentInfo.date}\\n\\n`;\n\nreport += `## Citation Summary\\n\\n`;\nreport += `- **Total Citations:** ${citationData.analysis.summary.totalCitations}\\n`;\nreport += `- **Case Law:** ${citationData.analysis.summary.caseLaw}\\n`;\nreport += `- **Statutes:** ${citationData.analysis.summary.statutes}\\n`;\nreport += `- **Regulations:** ${citationData.analysis.summary.regulations}\\n`;\nreport += `- **Academic:** ${citationData.analysis.summary.academic}\\n`;\nreport += `- **Other:** ${citationData.analysis.summary.other}\\n\\n`;\n\n// Add validation issues\nif (citationData.analysis.validation.invalidCitations.length > 0) {\n report += `## Citation Issues\\n\\n`;\n citationData.analysis.validation.invalidCitations.forEach(issue => {\n report += `- **${issue.type}:** ${issue.citation} - ${issue.issue}\\n`;\n });\n report += `\\n`;\n}\n\n// Add case law section\nif (citationData.originalData.caseCitations?.length > 0) {\n report += `## Case Law Citations\\n\\n`;\n citationData.originalData.caseCitations.forEach(cite => {\n report += `### ${cite.caseName}\\n`;\n report += `- **Citation:** ${cite.volume} ${cite.reporter} ${cite.page} (${cite.year})\\n`;\n report += `- **Court:** ${cite.court || 'Not specified'}\\n`;\n report += `- **Context:** ${cite.context}\\n`;\n report += `- **Page:** ${cite.pageNumber}\\n\\n`;\n });\n}\n\n// Add statute section\nif (citationData.originalData.statuteCitations?.length > 0) {\n report += `## Statutory Citations\\n\\n`;\n citationData.originalData.statuteCitations.forEach(cite => {\n report += `- **${cite.title} ${cite.code} § ${cite.section}**${cite.subsection ? ` (${cite.subsection})` : ''}\\n`;\n report += ` - Context: ${cite.context}\\n`;\n report += ` - Page: ${cite.pageNumber}\\n\\n`;\n });\n}\n\n// Add academic section with fetched data\nif (citationData.originalData.academicCitations?.length > 0) {\n report += `## Academic Citations\\n\\n`;\n citationData.originalData.academicCitations.forEach(cite => {\n report += `### ${cite.title}\\n`;\n report += `- **Authors:** ${cite.authors}\\n`;\n report += `- **Journal:** ${cite.journal}, Vol. ${cite.volume}, p. ${cite.page} (${cite.year})\\n`;\n \n // Add fetched paper data if available\n const fetchedPaper = academicPapers.find(p => p.doi === cite.doi);\n if (fetchedPaper) {\n report += `- **Citations:** ${fetchedPaper.totalCitations || 0}\\n`;\n report += `- **Abstract Available:** Yes\\n`;\n if (fetchedPaper.pdfURL) {\n report += `- **Full Text:** [Available](${fetchedPaper.pdfURL})\\n`;\n }\n }\n \n report += `- **Context:** ${cite.context}\\n`;\n report += `- **Page:** ${cite.pageNumber}\\n\\n`;\n });\n}\n\n// Add citation patterns\nreport += `## Citation Analysis\\n\\n`;\nreport += `### Primary Authorities\\n`;\ncitationData.patterns.primaryAuthorities.forEach(auth => {\n report += `- ${auth}\\n`;\n});\nreport += `\\n### Secondary Authorities\\n`;\ncitationData.patterns.secondaryAuthorities.forEach(auth => {\n report += `- ${auth}\\n`;\n});\n\nreturn [{\n json: {\n report,\n citationData,\n academicPapers,\n exportFormat: 'markdown',\n generatedAt: new Date().toISOString()\n }\n}];"
},
"typeVersion": 1
},
{
"id": "save-report",
"name": "Save Citation Report",
"type": "n8n-nodes-base.writeBinaryFile",
"notes": "Export report",
"position": [
1650,
300
],
"parameters": {
"fileName": "citation_report_{{ $now.format('yyyy-MM-dd_HH-mm') }}.md",
"fileContent": "={{ $json.report }}"
},
"typeVersion": 1
}
],
"connections": {
"Manual Trigger": {
"main": [
[
{
"node": "Google Drive - Get Legal Document",
"type": "main",
"index": 0
}
]
]
},
"has-dois": {
"main": [
[
{
"node": "pdfvector-fetch",
"type": "main",
"index": 0
}
],
[
{
"node": "generate-report",
"type": "main",
"index": 0
}
]
]
},
"generate-report": {
"main": [
[
{
"node": "save-report",
"type": "main",
"index": 0
}
]
]
},
"pdfvector-fetch": {
"main": [
[
{
"node": "generate-report",
"type": "main",
"index": 0
}
]
]
},
"analyze-citations": {
"main": [
[
{
"node": "has-dois",
"type": "main",
"index": 0
}
]
]
},
"pdfvector-extract": {
"main": [
[
{
"node": "analyze-citations",
"type": "main",
"index": 0
}
]
]
},
"Google Drive - Get Legal Document": {
"main": [
[
{
"node": "pdfvector-extract",
"type": "main",
"index": 0
}
]
]
}
}
}よくある質問
このワークフローの使い方は?
上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。
このワークフローはどんな場面に適していますか?
中級 - 文書抽出, AI要約
有料ですか?
このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。
関連ワークフロー
PDF VectorとHIPAA準拠で医療文書から臨床データを抽出
PDF Vector と HIPAA 準拠を使用して医療文書から臨床データを抽出
If
Code
Postgres
+
If
Code
Postgres
9 ノードPDF Vector
文書抽出
エンタープライズ契約ライフサイクル管理とAIによるリスク分析
エンタープライズ契約ライフサイクル管理とAIリスク解析
If
Code
Merge
+
If
Code
Merge
20 ノードPDF Vector
文書抽出
PDF Vector と Google Drive を使用した自動領収書処理と税務分類
PDF Vector と Google Drive を使った自動化領収書処理と税区分
Code
Google Drive
Google Sheets
+
Code
Google Drive
Google Sheets
9 ノードPDF Vector
請求書処理
PDFベクトル、Google Drive、データベースを使用した領秤データの抽出と保存
PDFベクトル、Google Drive、データベースを使って領収書データを抽出・保存する
If
Code
Slack
+
If
Code
Slack
26 ノードPDF Vector
請求書処理
GPT-4と複数のデータベース検索を使った学術文献综述の自動化
GPT-4と複数のデータベース検索を使った学術文献レビューの自動化
If
Set
Code
+
If
Set
Code
13 ノードPDF Vector
文書抽出
GPT-4、PDFVector、PostgreSQLエクスポートを使用して文書からデータを抽出
ドキュメントからデータをGPT-4、PDFVector、PostgreSQLで出力する
Code
Open Ai
Switch
+
Code
Open Ai
Switch
9 ノードPDF Vector
文書抽出
ワークフロー情報
難易度
中級
ノード数8
カテゴリー2
ノードタイプ6
作成者
PDF Vector
@pdfvectorA fully featured PDF APIs for developers - Parse any PDF or Word document, extract structured data, and access millions of academic papers - all through simple APIs.
外部リンク
n8n.ioで表示 →
このワークフローを共有