This prompt is designed for multi-turn RAG assistants and copilots that must maintain a running ledger of questions the system could not answer earlier. The core job-to-be-done is transforming 'I don't know yet' into 'I can answer that now' without requiring the user to repeat themselves. When a user asks a question and the retrieved context lacks sufficient evidence, the system records it as unresolved. On subsequent turns, when new documents are retrieved or the user provides additional information, the system re-evaluates pending questions and attempts to answer them. This is essential for customer-facing Q&A systems, research assistants, support copilots, and any multi-turn RAG application where answer continuity across turns is a product requirement.
Prompt
Unresolved Question Carry-Forward Prompt

When to Use This Prompt
Defines the job-to-be-done, ideal user, required context, and boundaries for the Unresolved Question Carry-Forward Prompt.
The ideal user is an AI engineer or product developer building a conversational RAG system where users expect the assistant to remember what it couldn't answer and proactively close those gaps. Required context includes: a persistent session store that can hold the unresolved question ledger across turns, a retrieval system that may return different or expanded evidence on subsequent turns, and a clear policy for when a question should be marked as permanently unresolvable versus temporarily pending. The prompt expects [CURRENT_QUESTION], [RETRIEVED_CONTEXT], [UNRESOLVED_QUESTIONS_LEDGER], and [CONVERSATION_HISTORY] as inputs, and produces a structured output containing both a resolution attempt for each pending question where new evidence is now available and an updated ledger reflecting any remaining gaps.
Do not use this prompt when the assistant operates in a single-turn mode with no memory, when the retrieval corpus is static and will never yield new evidence on subsequent turns, or when the product requirement is to simply apologize and move on rather than track unresolved questions. This prompt is also inappropriate for systems where users expect immediate answers or escalation to a human rather than deferred resolution. If your RAG pipeline cannot guarantee that subsequent retrieval calls will return different or expanded context, the carry-forward mechanism will produce repeated 'still cannot answer' outputs that frustrate users rather than build trust. Before implementing this prompt, ensure your retrieval system supports re-querying with expanded or reformulated queries when initial evidence is insufficient, and that your session management layer can reliably persist and update the unresolved question ledger across turns.
Use Case Fit
Where the Unresolved Question Carry-Forward Prompt works and where it introduces risk. Use these cards to decide if this pattern fits your product before integrating it into a multi-turn RAG pipeline.
Strong Fit: Research Copilots
Use when: Users explore a topic across multiple turns and the system must remember what it couldn't answer earlier. Guardrail: Persist unresolved questions with the original query timestamp and re-attempt only when new evidence chunks are retrieved, not on every turn.
Strong Fit: Customer Support Triage
Use when: A support assistant needs to track questions that require escalation or later follow-up. Guardrail: Attach a maximum carry-forward limit (e.g., 5 turns) and auto-escalate to a human if a question remains unresolved beyond the threshold.
Poor Fit: Stateless Single-Turn Q&A
Avoid when: The system resets context after every query and has no session memory. Guardrail: Do not add carry-forward logic to stateless endpoints. Instead, use a session-bound agent architecture that explicitly manages question state across turns.
Required Inputs
What you need: A structured session log containing prior user questions, prior system answers, and explicit 'unanswered' flags with the reason for abstention. Guardrail: Validate that the session log schema includes question_id, timestamp, status, and abstention_reason before passing it into the prompt.
Operational Risk: Question Hallucination
Risk: The model fabricates a prior question that was never asked, then 'resolves' it with a confident but irrelevant answer. Guardrail: Require the prompt to cite the exact prior turn ID and original user text when claiming a question was unresolved. Validate this citation in eval before surfacing the answer.
Operational Risk: Infinite Persistence
Risk: Unresolved questions accumulate across long sessions, consuming context window budget and causing the model to re-attempt answering irrelevant stale questions. Guardrail: Implement a TTL (time-to-live) on unresolved questions. Drop questions older than N turns or flag them for explicit user re-confirmation before re-attempting.
Copy-Ready Prompt Template
A reusable prompt template for tracking and re-attempting unresolved questions when new context becomes available in a multi-turn RAG session.
This prompt is designed to be wired into your RAG pipeline after retrieval but before answer generation. It instructs the model to maintain a running list of questions the system could not answer in prior turns, compare them against newly retrieved evidence, and either resolve them with grounded answers or carry them forward with updated status. The template uses square-bracket placeholders that your application must populate at runtime from conversation state, retrieval results, and session metadata.
textYou are an assistant that tracks unresolved questions across conversation turns. ## PRIOR UNRESOLVED QUESTIONS [UNRESOLVED_QUESTIONS] ## CURRENT USER QUESTION [CURRENT_QUESTION] ## RETRIEVED CONTEXT [RETRIEVED_CONTEXT] ## INSTRUCTIONS 1. Review the PRIOR UNRESOLVED QUESTIONS list. For each question, check whether the RETRIEVED CONTEXT now contains sufficient evidence to answer it. 2. For any previously unresolved question that can now be answered: - Provide a grounded answer with inline citations to the RETRIEVED CONTEXT. - Mark the question as RESOLVED. 3. For any previously unresolved question that still cannot be answered: - Keep it in the UNRESOLVED list. - Update its status with a brief note on what evidence is still missing. 4. Answer the CURRENT USER QUESTION using only the RETRIEVED CONTEXT. - If the context is insufficient, add the question to the UNRESOLVED list with a clear description of what information is needed. - If the context is sufficient, provide a grounded answer with citations. 5. Do not fabricate answers. If evidence is missing, say so explicitly. ## OUTPUT FORMAT Return a JSON object with this exact structure: { "current_answer": { "text": "string (the answer to CURRENT_QUESTION, or null if unanswered)", "citations": ["source_id_1", "source_id_2"], "status": "ANSWERED | UNANSWERED" }, "resolved_questions": [ { "question": "string", "answer": "string", "citations": ["source_id"] } ], "updated_unresolved_questions": [ { "question": "string", "missing_evidence": "string (what information is still needed)", "first_asked_turn": number, "attempts": number } ] } ## CONSTRAINTS - Never invent sources or citations. - If the RETRIEVED_CONTEXT is empty, mark all questions as UNANSWERED. - Do not repeat resolved questions in the unresolved list. - Preserve the original question text when carrying forward.
Adapt this template by adjusting the output schema to match your application's data model. The [UNRESOLVED_QUESTIONS] placeholder should be populated from your session state store, not from model memory. The [RETRIEVED_CONTEXT] placeholder expects pre-ranked passages with source identifiers. If your retrieval system does not return source IDs, add a preprocessing step to assign them before populating this prompt. For high-stakes domains, route outputs with status: UNANSWERED to a human review queue rather than surfacing them directly to users.
Prompt Variables
Required and optional inputs for the Unresolved Question Carry-Forward Prompt. Each placeholder must be populated before the prompt is assembled and sent to the model.
| Placeholder | Purpose | Example | Validation Notes |
|---|---|---|---|
[CURRENT_QUESTION] | The user's latest question or message that may resolve a previously unanswered question | What about the Q3 revenue breakdown by region? | Required. Must be non-empty string. Check for null or whitespace-only input before prompt assembly. |
[UNRESOLVED_QUESTIONS_LIST] | A structured list of questions the system could not answer in prior turns, each with a unique ID, the original question text, and the turn when it was first asked | [{"id":"q1","question":"What was the churn rate in EMEA?","asked_at_turn":3}] | Required if any unresolved questions exist. Must be valid JSON array. If empty array, skip carry-forward logic. Validate schema: id (string), question (string), asked_at_turn (integer). |
[CONVERSATION_HISTORY] | The full or summarized dialogue history up to the current turn, used to detect if the new question addresses a prior unresolved item | User: What drove the revenue dip? Assistant: The dip was primarily in APAC due to supply chain delays. User: And what about EMEA? | Required. Must include at least the last N turns where N is configurable. Validate that history contains user and assistant turns with timestamps or turn indices. |
[RETRIEVED_CONTEXT] | New evidence retrieved for the current turn that may contain information relevant to previously unresolved questions | Document chunk: 'EMEA churn increased 2.3% YoY driven by competitor pricing pressure in DACH region.' | Required. Must be non-empty string or array of passages. Validate that each passage has a source identifier for citation. If retrieval returns zero results, set to empty string and trigger abstention path. |
[RESOLUTION_CONFIDENCE_THRESHOLD] | The minimum confidence score required to mark a previously unresolved question as resolved | 0.85 | Optional. Defaults to 0.80 if not provided. Must be float between 0.0 and 1.0. Validate range. Lower values risk premature resolution; higher values may leave questions unresolved when evidence is sufficient. |
[MAX_UNRESOLVED_QUESTIONS] | The maximum number of unresolved questions to track before the system forces a summary or escalation | 5 | Optional. Defaults to 10 if not provided. Must be positive integer. Validate that the unresolved list length does not exceed this value before adding new items. If exceeded, trigger truncation or escalation logic. |
[OUTPUT_SCHEMA] | The expected JSON structure for the response, defining how resolved questions, still-unresolved questions, and the current answer are formatted | {"resolved":[],"still_unresolved":[],"current_answer":"","carryforward_notes":""} | Required. Must be valid JSON Schema or example object. Validate that the model output conforms to this schema before passing downstream. Fields: resolved (array of question IDs), still_unresolved (array of question objects), current_answer (string), carryforward_notes (string). |
Implementation Harness Notes
How to wire the Unresolved Question Carry-Forward Prompt into a multi-turn RAG application with state management, validation, and retry logic.
The Unresolved Question Carry-Forward Prompt is not a standalone call; it is a stateful component that must be integrated into a conversation loop. The application layer is responsible for maintaining a persistent list of unresolved questions across turns, injecting that list into the prompt's [UNRESOLVED_QUESTIONS] placeholder, and updating the list based on the model's structured output. This means your harness must parse the model's response, extract the resolved and new_unresolved fields, and merge them into the canonical question list before the next turn begins. Do not rely on the model to remember unresolved questions implicitly through conversation history alone—explicit state management prevents questions from being silently dropped when context windows shift or when conversation history compression occurs.
The prompt expects a JSON output with a strict schema: an array of resolved question objects (each with question_id, question_text, and answer_summary), an array of new_unresolved question objects (with question_id, question_text, and reason_unresolved), and a current_answer string. Your implementation harness must validate this schema after every model call. Use a JSON schema validator to check required fields, types, and non-null constraints. If validation fails, implement a retry loop with a maximum of two correction attempts, feeding the validation error message back to the model in a repair prompt. If the output still fails validation after retries, log the failure, preserve the existing unresolved question list unchanged, and surface a fallback answer to the user indicating a processing error. For model choice, prefer models with strong JSON mode or structured output support (such as GPT-4o with response_format set to json_schema or Claude with tool-use-based structured output). Avoid models with inconsistent JSON adherence for this workflow unless you add a robust repair layer.
Logging and observability are critical for debugging question carry-forward failures. At minimum, log the following on every turn: the incoming unresolved question count, the model's raw output, the parsed resolved and new_unresolved counts, any validation errors, and the updated question list after merging. This trace data lets you detect regressions such as questions that persist across too many turns without resolution, questions that are incorrectly marked as resolved, or new questions that duplicate existing entries. Implement a deduplication check in the application layer: before adding a new_unresolved question to the canonical list, compare its text against existing unresolved questions using a simple embedding similarity threshold or exact-match check. This prevents the list from bloating with near-duplicate entries when the model rephrases the same unresolved concern across turns. For high-stakes deployments, add a human-review queue trigger when the unresolved question count exceeds a configurable threshold (e.g., five open questions) or when a single question remains unresolved for more than three turns—this prevents the system from silently accumulating debt it cannot resolve.
Expected Output Contract
Defines the structured payload the model must return for unresolved question tracking. Use this contract to validate outputs before persisting to session state or triggering re-retrieval.
| Field or Element | Type or Format | Required | Validation Rule |
|---|---|---|---|
pending_questions | Array of objects | Must be a JSON array. Empty array allowed if no unresolved questions exist. | |
pending_questions[].question_id | String (UUID v4) | Must match UUID v4 regex. Must be unique within the array and stable across turns for the same question. | |
pending_questions[].question_text | String | Must be the user's exact original question or a minimally clarified restatement. Length must be between 10 and 500 characters. | |
pending_questions[].original_turn | Integer | Must be a positive integer representing the conversation turn index when the question was first asked. Must not exceed the current turn index. | |
pending_questions[].unresolved_reason | Enum string | Must be one of: 'insufficient_context', 'conflicting_sources', 'ambiguous_question', 'out_of_scope', 'awaiting_clarification'. No other values permitted. | |
pending_questions[].clarification_asked | String or null | If a clarification question was posed to the user, this must contain that exact question text. Otherwise must be null. | |
pending_questions[].re_attempted | Boolean | Must be true if the current turn attempted to answer this question using new context, false otherwise. Defaults to false for newly added questions. | |
pending_questions[].resolution_status | Enum string | Must be one of: 'pending', 'resolved', 'escalated'. 'resolved' requires an answer to be present in the current turn's output. 'escalated' requires a human handoff note. |
Common Failure Modes
What breaks first when tracking unresolved questions across conversation turns and how to guard against it.
Question Forgotten Across Turns
What to watch: The model drops an unresolved question after a single turn, especially when new user input or retrieved evidence shifts attention. The carry-forward list silently loses items. Guardrail: Require the prompt to output a structured pending_questions array at the end of every turn. Validate that the array length never decreases unless a question is explicitly resolved or the user dismisses it.
False Resolution from Partial Evidence
What to watch: The model marks a question as resolved when new context provides only tangentially related information, not a direct answer. This creates a false sense of completion. Guardrail: Add a resolution gate in the prompt that requires the model to cite specific evidence chunks that directly address the question. If no chunk meets the threshold, the question must remain pending with a resolution_confidence score below a defined cutoff.
Question Drift and Semantic Decay
What to watch: Over multiple turns, the wording of a pending question morphs slightly each time it's carried forward, eventually changing its meaning. The system ends up answering a different question than the user originally asked. Guardrail: Store the original user question verbatim in a canonical_question field. Always carry forward the canonical form alongside any rephrased version. Run a semantic similarity check between the original and the carried-forward version each turn.
Context Window Starvation
What to watch: As pending questions accumulate over a long session, the carry-forward list consumes more and more of the context window, crowding out new evidence and conversation history. Answer quality degrades across the board. Guardrail: Implement a hard cap on the number of pending questions carried forward. When the cap is hit, force the model to either resolve, escalate, or explicitly ask the user which questions to prioritize. Log dropped questions for human review.
Hallucinated Resolution Status
What to watch: The model fabricates a resolution for a pending question, claiming it was answered when no such answer exists in the conversation or evidence. This is especially common when the model is pressured to appear helpful. Guardrail: Require the model to output a resolution_evidence object containing the exact turn number and source passage where the answer was found. If the model cannot produce this, the question must remain unresolved. Validate this field against the actual conversation log.
Implicit Resolution Without User Confirmation
What to watch: The model assumes a question is resolved because it provided an answer, but the user never acknowledged or confirmed the answer was satisfactory. The system closes the loop prematurely. Guardrail: Distinguish between answered and resolved states. A question moves to answered when the model provides a response, but only moves to resolved when the user explicitly confirms or the next user turn implicitly builds on the answer without objection. Require user-facing confirmation language for high-stakes questions.
Evaluation Rubric
Use this rubric to test whether the Unresolved Question Carry-Forward Prompt correctly tracks, persists, and re-attempts previously unanswered questions. Each criterion targets a specific failure mode observed in production RAG assistants.
| Criterion | Pass Standard | Failure Signal | Test Method |
|---|---|---|---|
Unresolved Question Extraction | All questions from prior turns that received an abstention or low-confidence answer appear in the [PENDING_QUESTIONS] list | A previously unanswered question is missing from the carry-forward list | Run against a golden conversation history containing exactly 3 abstained answers; assert list length equals 3 and question text matches |
Resolved Question Exclusion | Questions that received a grounded, high-confidence answer in prior turns are excluded from [PENDING_QUESTIONS] | A question that was already answered with citations appears in the carry-forward list | Feed a history with 2 resolved and 2 unresolved questions; assert only unresolved questions appear in output |
Question Text Preservation | Carried-forward questions retain the user's original intent without paraphrasing that changes meaning | A carried-forward question introduces constraints or entities not present in the original user query | Compare original user question strings against carried-forward entries using semantic similarity threshold above 0.95; flag additions |
Re-Attempt Triggering with New Context | When new [RETRIEVED_CONTEXT] is provided, the system re-attempts answering each pending question and updates [RESOLUTION_STATUS] to 'resolved' or 'still_unresolved' | A pending question remains untouched or status stays 'pending' after new relevant context is supplied | Provide context that definitively answers a previously unresolved question; assert status transitions to 'resolved' and answer contains citations |
Persistent Unresolved Status | Questions that remain unanswerable after re-attempt are marked 'still_unresolved' with a reason in [UNRESOLVED_REASON] | The system fabricates an answer or marks a question 'resolved' without supporting evidence | Provide context irrelevant to the pending question; assert status remains 'still_unresolved' and reason field is non-empty |
Cross-Turn Citation Consistency | Re-attempted answers use the same citation format and source identifiers as prior turns in the conversation | Citation format changes between turns or source document IDs shift without explanation | Validate output citation format against a predefined [CITATION_SCHEMA] using regex or schema validator; flag mismatches |
Carry-Forward List Deduplication | Semantically identical pending questions from different turns are merged into a single entry with a reference to both original turn IDs | Duplicate questions appear as separate entries bloating the pending list | Feed history where the user asks the same unresolved question in turn 2 and turn 4; assert only one entry exists with both turn references |
Empty State Handling | When no unresolved questions exist, the system returns an empty [PENDING_QUESTIONS] list and does not fabricate questions | The system hallucinates pending questions or returns a non-empty list when all prior questions were resolved | Feed a conversation where every question was answered with high confidence; assert [PENDING_QUESTIONS] is an empty array |
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 simple in-memory list for [UNRESOLVED_QUESTIONS]. Use the model's native context window to carry forward the list as a formatted block at the end of each turn. No persistence layer needed.
code[UNRESOLVED_QUESTIONS] - Q1: What is the SLA for premium support? - Q2: Is there a data residency option for EU customers?
Watch for
- Questions dropping off when the list grows beyond context limits
- No deduplication across turns, leading to repeated unresolved items
- Model inventing resolutions without evidence when the list feels stale

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