This prompt is for verification engineers and RAG pipeline builders who need to map discrete factual claims to their exact source locations within a document. Unlike broader evidence matching prompts that return relevant passages, this playbook produces fine-grained location mappings including paragraph numbers, line ranges, and section identifiers. Use it when downstream systems require clickable citations, audit trails, or when a claim is supported by multiple non-contiguous passages that must be linked together. The core job-to-be-done is provenance resolution, not retrieval, claim extraction, or veracity judgment.
Prompt
Claim-to-Paragraph Citation Linking Prompt

When to Use This Prompt
Defines the precise job-to-be-done for the Claim-to-Paragraph Citation Linking Prompt, its ideal user, required inputs, and the boundaries where it should not be applied.
The ideal user has already completed claim extraction and has the full source document available as input. The prompt expects two concrete inputs: a list of pre-extracted claims and the complete text of a single source document. It does not perform retrieval across a corpus, nor does it judge whether a claim is true or false. It only answers the question: 'Where in this document does this claim appear, if at all?' The output is a structured mapping that can be consumed by a citation formatter, a UI component for highlighting text, or an audit logging system. Do not use this prompt when you need to search across multiple documents, when claims have not yet been extracted, or when you need a truthfulness assessment. For those tasks, pair this with a retrieval step, a claim extraction prompt, or an evidence sufficiency scorer from the broader Evidence Matching and Source Attribution group.
A critical constraint is handling claims supported by multiple non-contiguous passages. A single claim like 'The company increased revenue by 20% and expanded into three new markets' might have its revenue evidence in paragraph 2 and its market expansion evidence in paragraph 7. This prompt must link both locations to the single claim without forcing a false choice. Similarly, it must explicitly flag when a claim has no supporting location in the document, rather than hallucinating a paragraph reference. Before deploying this prompt, define your evaluation criteria: exact paragraph number accuracy, recall of all supporting locations for multi-part claims, and the false-positive rate for claims incorrectly linked to a location. Wire these into your test harness before shipping.
Next, proceed to the Prompt Template section to copy the ready-to-use template with placeholders for your claims, document, and output schema. Then review the Implementation Harness section to understand how to validate outputs, handle retries, and integrate this into a production RAG pipeline with proper logging and human review gates for high-stakes use cases.
Use Case Fit
Where the Claim-to-Paragraph Citation Linking Prompt delivers value and where it introduces risk. Match the workflow to the prompt's strengths.
Strong Fit: Document Intelligence Pipelines
Use when: You need fine-grained provenance linking specific claims to exact paragraph numbers, line ranges, or section identifiers within a source document. Guardrail: The prompt excels at structured extraction from a single, well-formatted document. Ensure the input document has a clear, parseable structure before invoking the prompt.
Poor Fit: Real-Time, Open-Domain Chat
Avoid when: A user expects a conversational answer without a specific source document in the prompt context. Guardrail: This prompt requires a pre-retrieved document as input. Using it in a chat-first system without a document will result in hallucinated citations or refusal. Route to a standard RAG prompt instead.
Required Inputs: Claim Set and Source Document
Risk: The prompt fails silently if it receives only a document without a pre-extracted list of claims, or vice-versa. Guardrail: The harness must validate that both [CLAIMS] (a structured list) and [SOURCE_DOCUMENT] (with clear paragraph markers) are non-empty before making the LLM call. A pre-processing step should number paragraphs.
Operational Risk: Multi-Passage Support
Risk: A single claim is supported by multiple, non-contiguous paragraphs. A naive prompt might only return the first match. Guardrail: The prompt instructions and output schema must explicitly require an array of locations for each claim. Post-process the output to verify that the number of cited locations matches the prompt's justification.
Operational Risk: Hallucinated Locations
Risk: The model cites a paragraph number that doesn't exist or misattributes a quote to the wrong section. Guardrail: Implement a strict post-generation validator. For each citation, programmatically check that the cited paragraph ID exists in the source document and that the quoted text is a substring match (or high-similarity fuzzy match) within that paragraph.
Poor Fit: Ambiguous or Implicit Claims
Risk: The input claim is a high-level summary or an interpretation, not a verifiable factual statement. The model will struggle to find a direct textual match. Guardrail: This prompt should be downstream of a 'Claim Extraction and Decomposition' step. Ensure the input claims are atomic, factual, and directly verifiable against the source text before attempting citation linking.
Copy-Ready Prompt Template
A reusable prompt that maps extracted claims to precise paragraph-level citations with support/contradict/insufficient verdicts.
This template is designed for document intelligence and verification pipelines that require fine-grained provenance. It takes a list of pre-extracted claims and a source document with numbered paragraphs, then produces a structured mapping showing exactly which paragraph(s) support, contradict, or fail to address each claim. The prompt handles claims supported across multiple non-contiguous passages and explicitly flags claims with insufficient evidence rather than silently treating them as unverified.
textYou are a precise claim-to-evidence citation linker. Your task is to map each provided claim to the specific paragraph(s) in the source document that support, contradict, or fail to address it. ## INPUT ### Claims to Verify [CLAIMS_LIST] ### Source Document with Numbered Paragraphs [SOURCE_DOCUMENT] ## OUTPUT SCHEMA Return a JSON object with a "mappings" array. Each element must have: - "claim_id": string matching the input claim identifier - "claim_text": the original claim text - "verdict": one of "supported", "contradicted", "partially_supported", "insufficient_evidence" - "paragraph_ids": array of paragraph numbers that provide evidence (empty array if insufficient_evidence) - "relevant_spans": array of objects with "paragraph_id", "quoted_text" (exact short quote from source), and "relationship" ("supports" or "contradicts") - "explanation": one-sentence explanation of the mapping logic - "confidence": "high", "medium", or "low" based on evidence clarity ## CONSTRAINTS 1. Only cite paragraph numbers that exist in the source document. Never invent paragraph numbers. 2. If a claim is supported by multiple non-contiguous paragraphs, list all of them. 3. If evidence partially supports a claim but leaves some aspects unaddressed, use "partially_supported" and explain which parts are unverified. 4. If no paragraph provides sufficient evidence, use "insufficient_evidence" with an empty paragraph_ids array. 5. Quote exact text from the source for each relevant_span. Do not paraphrase. 6. If two paragraphs contradict each other on the same claim, flag both and note the contradiction. 7. Do not infer support from absence of contradiction. Absence of evidence is not evidence of absence. ## EXAMPLES ### Example 1: Clear Support Input Claim: "The company reported $4.2B in Q3 revenue." Source Paragraph 12: "Third-quarter revenue reached $4.2 billion, up 8% year-over-year." Output: { "claim_id": "C1", "claim_text": "The company reported $4.2B in Q3 revenue.", "verdict": "supported", "paragraph_ids": [12], "relevant_spans": [{"paragraph_id": 12, "quoted_text": "Third-quarter revenue reached $4.2 billion", "relationship": "supports"}], "explanation": "Paragraph 12 directly states Q3 revenue of $4.2 billion, matching the claim exactly.", "confidence": "high" } ### Example 2: Multi-Paragraph Support Input Claim: "The acquisition was announced in March and closed in June." Source Paragraph 5: "On March 15, the company announced its intent to acquire StartupCo for $800M." Source Paragraph 18: "The acquisition closed on June 3, following regulatory approval." Output: { "claim_id": "C2", "claim_text": "The acquisition was announced in March and closed in June.", "verdict": "supported", "paragraph_ids": [5, 18], "relevant_spans": [ {"paragraph_id": 5, "quoted_text": "On March 15, the company announced its intent to acquire StartupCo", "relationship": "supports"}, {"paragraph_id": 18, "quoted_text": "The acquisition closed on June 3", "relationship": "supports"} ], "explanation": "Paragraph 5 supports the March announcement; paragraph 18 supports the June closing. Both components are verified.", "confidence": "high" } ### Example 3: Insufficient Evidence Input Claim: "The CEO plans to step down next year." Source: No paragraph mentions CEO departure plans. Output: { "claim_id": "C3", "claim_text": "The CEO plans to step down next year.", "verdict": "insufficient_evidence", "paragraph_ids": [], "relevant_spans": [], "explanation": "No paragraph in the source document mentions CEO departure plans or succession.", "confidence": "high" } ## RISK LEVEL [RISK_LEVEL] ## INSTRUCTIONS Process all claims in [CLAIMS_LIST] against [SOURCE_DOCUMENT]. Return only valid JSON matching the output schema. Do not include commentary outside the JSON.
To adapt this template, replace [CLAIMS_LIST] with your extracted claims in a structured format that includes unique claim IDs. Replace [SOURCE_DOCUMENT] with your document text where each paragraph is prefixed with a stable numeric identifier. The [RISK_LEVEL] placeholder should be set to high for regulated domains (legal, medical, financial) to trigger stricter confidence thresholds and more conservative verdicts, or standard for general document intelligence workflows. For production use, add a post-processing validator that checks every paragraph_id against the actual document paragraph range and rejects any output referencing non-existent paragraphs before it reaches downstream systems.
Prompt Variables
Required inputs for the Claim-to-Paragraph Citation Linking Prompt. Each placeholder must be populated before the prompt is assembled and sent. Validation notes describe checks to apply in the application harness before calling the model.
| Placeholder | Purpose | Example | Validation Notes |
|---|---|---|---|
[CLAIMS_LIST] | Array of atomic, verifiable claims extracted from source content. Each claim must be a single factual assertion. | ["The company reported $4.2B in Q3 revenue.", "Customer churn decreased by 12% year-over-year."] | Validate array length >= 1. Reject claims containing multiple assertions joined by 'and' or 'but'. Parse check: must be valid JSON array of strings. |
[SOURCE_DOCUMENT] | Full text of the document to search for supporting evidence. Must include paragraph breaks or section markers for citation granularity. | Full text of a 10-K filing with paragraph breaks preserved. | Validate string length > 0. Reject if document has no paragraph breaks when paragraph-level citation is required. Null not allowed. |
[PARAGRAPH_DELIMITER] | Character or token sequence used to split the source document into citable paragraphs. Must match the actual document structure. | "\n\n" for double-newline separated paragraphs. | Validate delimiter is a non-empty string. Test split on a sample document to confirm it produces the expected number of paragraphs. If split produces 1 segment, the delimiter is likely wrong. |
[CITATION_FORMAT] | Specification for how citations should be structured in the output. Defines whether to use paragraph numbers, line ranges, or section identifiers. | "paragraph_index" or "line_range" or "section_id" | Validate against allowed enum: ["paragraph_index", "line_range", "section_id", "paragraph_index_and_text"]. Reject unknown values. Schema check before prompt assembly. |
[SUPPORT_THRESHOLD] | Minimum confidence or evidence strength required to label a claim as 'supported'. Claims below this threshold should be marked 'insufficient_evidence'. | 0.7 on a 0.0-1.0 scale. | Validate value is a float between 0.0 and 1.0 inclusive. Null not allowed. Default to 0.5 if not explicitly set. Document threshold in output metadata for auditability. |
[MULTI_PASSAGE_STRATEGY] | Instruction for how to handle claims supported by evidence spread across multiple non-contiguous paragraphs. Controls whether to list all passages or select the strongest. | "list_all" or "select_best" or "list_all_with_ranking" | Validate against allowed enum: ["list_all", "select_best", "list_all_with_ranking"]. Reject unknown values. This variable directly affects output schema shape; ensure downstream parsing handles the chosen strategy. |
[OUTPUT_SCHEMA] | Expected JSON structure for the claim-to-paragraph mapping output. Defines required fields, types, and nesting. | {"claim": "string", "citations": [{"paragraph_index": "integer", "support_type": "enum", "evidence_text": "string"}], "status": "enum"} | Validate schema is valid JSON Schema or a parseable type definition. Reject if schema does not include required fields: claim, citations, status. Schema check before prompt assembly. Mismatch between schema and CITATION_FORMAT is a blocking error. |
[MAX_CITATIONS_PER_CLAIM] | Upper bound on how many paragraph citations to return per claim. Prevents unbounded output when a claim is diffusely supported. | 5 | Validate value is a positive integer >= 1. Null not allowed. Default to 3 if not set. Enforce in post-processing: truncate and flag if model exceeds limit. |
Implementation Harness Notes
How to wire the claim-to-paragraph citation prompt into a production application with validation, retries, and human review gates.
This prompt is designed to be a single step in a larger document intelligence pipeline. The application layer is responsible for providing the pre-extracted claims and the full source document text with paragraph-level identifiers. Do not send raw PDFs or scanned images directly to this prompt; pre-process documents into a structured format where each paragraph has a stable, unique ID (e.g., doc-01-para-03). The prompt expects [CLAIMS] as a JSON array of objects, each with an id and text field, and [DOCUMENT] as a JSON array of objects with paragraph_id, text, and optional section fields. The application should construct these inputs programmatically to avoid token waste and formatting errors.
After receiving the model's response, the first and most critical validation step is to verify that every paragraph_id in the output exists in the input document's index. A hallucinated paragraph ID is a hard failure that should trigger a retry or escalation. Next, validate that the citation_text substring actually appears in the referenced paragraph; a simple string containment check catches many fabrications. For high-stakes workflows, implement a secondary LLM call or a deterministic check that compares the claim against the cited paragraph to confirm the support_type classification (SUPPORTS, CONTRADICTS, PARTIAL). Log every mismatch for eval dataset construction. The output schema should be strictly enforced: if the model returns malformed JSON, use a repair prompt or a schema-constrained generation mode (e.g., Structured Outputs, JSON mode with a provided schema) rather than attempting regex-based fixes.
Model choice matters here. This task requires strong instruction-following and long-context handling, as documents can easily exceed 10k tokens. Claude 3.5 Sonnet, GPT-4o, and Gemini 1.5 Pro are suitable starting points. For production, implement a retry strategy with exponential backoff on validation failures, but cap retries at 2-3 attempts. If the model consistently fails to link a claim, route that claim to a human review queue with the claim text, the full document, and the model's best-effort output attached. Never silently drop unlinked claims—they represent a hallucination risk downstream. Finally, store the complete prompt, response, and validation results in an audit log. This traceability is essential for debugging citation drift and for demonstrating provenance to users or auditors.
Expected Output Contract
Defines the structured JSON output schema for the claim-to-paragraph citation linking prompt. Use this contract to validate model responses before ingestion into downstream verification pipelines.
| Field or Element | Type or Format | Required | Validation Rule |
|---|---|---|---|
claim_id | string | Must match the claim_id from the input [CLAIMS] array. Non-empty. Regex: ^[a-zA-Z0-9_-]+$ | |
claim_text | string | Must exactly reproduce the claim text from the input [CLAIMS] array. String equality check required. | |
citations | array of objects | Array must contain at least 1 object if evidence found. May be empty array only if no supporting evidence exists in [SOURCE_DOCUMENT]. | |
citations[].paragraph_number | integer | Must be a positive integer referencing a paragraph in [SOURCE_DOCUMENT]. Must be within the valid paragraph range of the provided document. Null not allowed. | |
citations[].line_range | string | Format: 'L{start}-L{end}' (e.g., 'L12-L15'). Start must be less than or equal to end. Null allowed if line numbers unavailable. | |
citations[].section_id | string | Must match a section identifier from [SOURCE_DOCUMENT] if provided. Null allowed for documents without section markers. | |
citations[].match_type | enum | Must be one of: 'direct_support', 'partial_support', 'contradiction', 'context_only'. No other values accepted. | |
citations[].evidence_quote | string | Must be a verbatim substring of the cited paragraph in [SOURCE_DOCUMENT]. Substring check required. Maximum 300 characters. Must not be empty. | |
citations[].relevance_score | float | Range 0.0 to 1.0 inclusive. Null allowed when match_type is 'context_only'. Must be a number, not a string. | |
multi_passage_flag | boolean | Set to true if claim support spans non-contiguous paragraphs. False if all citations are from a single contiguous block. | |
no_evidence_found | boolean | Set to true only when no paragraph in [SOURCE_DOCUMENT] supports or contradicts the claim. Must be false if citations array is non-empty. | |
confidence | float | Range 0.0 to 1.0 inclusive. Model's self-assessed confidence in the citation mapping. Values below 0.5 should trigger human review in production pipelines. |
Common Failure Modes
Claim-to-paragraph citation linking fails in predictable ways. These are the most common production failure modes and how to guard against them before they reach users.
Hallucinated Paragraph Numbers
What to watch: The model invents paragraph numbers, line ranges, or section identifiers that don't exist in the source document. This is the most dangerous failure because fabricated citations look authoritative and mislead users into trusting unsupported claims. Guardrail: Require the model to quote the exact text span alongside every citation. Validate that quoted spans appear verbatim in the source using string-matching or embedding similarity before accepting any citation. Reject citations where the quoted text cannot be located.
Overly Broad Paragraph Attribution
What to watch: The model assigns a claim to an entire paragraph or section when only a fragment supports it, or worse, when the paragraph merely mentions the topic without substantiating the specific claim. This creates false confidence in unsupported assertions. Guardrail: Require granular location evidence such as sentence-level or line-range specificity. Add a validation step that checks whether the cited span actually contains the claim's key entities and predicates, not just related vocabulary. Flag broad citations for human review.
Multi-Passage Claim Fragmentation
What to watch: A single claim is supported by evidence scattered across multiple non-contiguous paragraphs, but the model cites only one location or concatenates unrelated passages as if they form a single argument. This misrepresents how the evidence actually works. Guardrail: Explicitly instruct the model to enumerate all supporting passages separately with their distinct locations. Add a post-processing check that detects when a claim's evidence spans are non-adjacent and verifies that each span independently contributes support rather than being arbitrarily grouped.
Citation Drift Under Paraphrase
What to watch: When the model paraphrases a claim before linking it to evidence, the paraphrased version drifts semantically from the source text, and the citation no longer accurately represents what the source says. The link becomes misleading even though a paragraph number is present. Guardrail: Require the model to preserve the source's original phrasing in the claim text or to provide a direct quote alongside any paraphrased claim. Validate semantic similarity between the claim and the cited passage using embedding distance thresholds. Flag claims where paraphrase drift exceeds acceptable bounds.
Silent Evidence Gaps
What to watch: The model fails to find supporting evidence for a claim but produces a citation anyway, often by linking to a tangentially related paragraph or by fabricating a location. This is worse than returning 'no evidence found' because it hides the gap from downstream systems and users. Guardrail: Require an explicit evidence sufficiency field in the output schema. When no supporting passage exists, the model must output null or an explicit 'no evidence' marker for the citation field. Validate that every non-null citation maps to a real, relevant passage before the output leaves the pipeline.
Position Bias in Multi-Passage Ranking
What to watch: When multiple passages could support a claim, the model disproportionately selects the first or last passage in the context window rather than the most relevant one. This produces citations that are technically correct but suboptimal, undermining trust when users inspect the evidence. Guardrail: Shuffle passage order before prompting and run multiple passes to detect position-sensitive selections. Add an explicit relevance-ranking instruction that requires the model to justify why the selected passage is the best match, not just the first match. Compare citation choices across shuffled runs to identify position bias.
Evaluation Rubric
Use this rubric to test the Claim-to-Paragraph Citation Linking Prompt before shipping. Each criterion targets a known failure mode in production citation systems.
| Criterion | Pass Standard | Failure Signal | Test Method |
|---|---|---|---|
Citation Existence | Every claim in [CLAIMS] has at least one citation to [DOCUMENT] | Output contains a claim with no citation or a null citation | Parse output JSON; assert citations array is non-empty for every claim object |
Citation Format Validity | All citations match the [CITATION_FORMAT] schema exactly | Citation uses wrong field name, missing paragraph_id, or unstructured text instead of structured object | Validate output against [CITATION_FORMAT] JSON Schema; reject any citation that fails schema validation |
Paragraph ID Grounding | Every paragraph_id in citations exists in the provided [DOCUMENT] paragraph index | Hallucinated paragraph_id that does not appear in the source document metadata | Extract all paragraph_id values; assert each is present in the [DOCUMENT] paragraph index mapping |
Support Type Accuracy | support_type field correctly labels each citation as 'direct_support', 'partial_support', or 'contradicts' | Mismatch between quoted evidence text and support_type label | For each citation, compare quoted text against claim; spot-check 20% of outputs with human review for label accuracy |
Multi-Passage Linking | Claims supported by multiple non-contiguous passages list all relevant paragraph_ids | Only one paragraph cited when claim requires evidence from multiple sections | Identify claims with multi-part assertions; assert citations array length matches expected passage count from ground-truth test set |
Quote Fidelity | Quoted evidence text in citation matches [DOCUMENT] paragraph content verbatim | Paraphrased or hallucinated quote that does not appear in source paragraph | Extract all quote strings; perform exact substring search against corresponding paragraph text in [DOCUMENT] |
Null Evidence Handling | Claims with no supporting evidence produce empty citations array and 'no_evidence' status | Silently omits unverifiable claims or fabricates weak citations | Include at least one unverifiable claim in test set; assert output contains claim with citations: [] and status: 'no_evidence' |
Confidence Calibration | Confidence scores for 'direct_support' citations are >= 0.8; 'partial_support' between 0.4-0.7; 'no_evidence' <= 0.3 | High confidence score on hallucinated citation or low confidence on exact quote match | Run 50-claim test set with known ground truth; assert confidence score distributions fall within expected ranges per support type |
Enabling Efficiency, Speed & Accuracy
Intelligent Analysis, Decision & Execution
We build AI systems for teams that need search across company data, workflow automation across tools, or AI features inside products and internal software.
Talk to Us
Search across company data
Give teams answers from docs, tickets, runbooks, and product data with sources and permissions.
Useful when people spend too long searching or get different answers from different systems.

Automate internal workflows
Use AI to route work, draft outputs, trigger actions, and keep approvals and logs in place.
Useful when repetitive work moves across multiple tools and teams.

Add AI to products and internal tools
Build assistants, guided actions, or decision support into the software your team or customers already use.
Useful when AI needs to be part of the product, not a separate tool.
Adapt This Prompt
How to adapt
Start with the base prompt and a small set of test claims. Use a single document as the source. Accept the model's native output format (JSON or plain text) without strict schema enforcement. Focus on whether the model correctly identifies paragraph numbers and line ranges for clear, unambiguous claims.
Simplify the output schema to only claim_id, paragraph_number, and line_range. Skip multi-passage linking and confidence scoring initially.
Prompt snippet
codeFor each claim in [CLAIMS_LIST], identify the paragraph number and approximate line range in [DOCUMENT_TEXT] that supports or contradicts it. Return JSON.
Watch for
- Model inventing paragraph numbers when evidence is absent
- Inconsistent line-range counting (0-indexed vs 1-indexed)
- Claims supported across multiple passages being assigned to only one

About the author
Prasad Kumkar
CEO & MD, Inference Systems
Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.
His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.
Partnered with leading AI, data, and software stack.
How We Work
Custom AI workflows for your Business
One-fit-all AI don't work for modern businesses. At Inferensys, we aim to understand your business & custom requirements; which we use to define most efficient agentic workflows, the data, and the tools for your business.
01
Review the use case
We understand the task, the users, and where AI can actually help.
Read more02
Pick the right approach
We define what needs search, automation, or product integration.
Read more03
Build the first useful version
We implement the part that proves the value first.
Read more04
Improve from there
We add the checks and visibility needed to keep it useful.
Read moreThe first call is a practical review of your use case and the right next step.
Talk to Us