Reversing chain-of-thought (RCoT): a complete guide
Chain-of-thought makes a model reason out loud, but it doesn't make the model honest about the problem. It quietly drops a condition, invents one, or misreads the question — and the wrong answer still arrives wrapped in confident steps. RCoT flips the chain backward: it asks the model to reconstruct the problem from its own solution, then compares that reconstruction to the original to catch what slipped. With this fine-grained feedback, ChatGPT reaches 94.6% accuracy on GSM8K (Xue et al., 2023).
See it work
Take a word problem with a small twist buried in it.
Problem: A store starts the day with 48 apples. It sells 30 in the
morning and receives a delivery of 25 more in the afternoon — but 5 of
the delivered apples are rotten and thrown out. How many good apples
does the store have at the end of the day?
Plain chain-of-thought reasons confidently and gets it wrong.
CoT: Start with 48. Sell 30, so 48 - 30 = 18. A delivery of 25 arrives,
so 18 + 25 = 43.
Answer: 43 apples.
It silently dropped the rotten-apples condition. RCoT catches that by reconstructing the problem the solution actually solved.
Reconstructed problem (Q'): A store has 48 apples, sells 30, and
receives 25 more. How many apples does it have?
Comparison: The original says 5 delivered apples were rotten and thrown
out. The reconstruction omits this condition. -> Condition overlooked.
Feedback: You ignored that 5 apples were discarded. Revise.
Revised: 48 - 30 = 18, 18 + 25 = 43, 43 - 5 = 38.
Answer: 38 good apples.
Same model, same prompt budget — but by reading its own work backward, it found the gap and fixed it.
The mental model
Think of how a translator checks their work with back-translation: translate the sentence into the target language, then translate it back and see if you land where you started. If the round trip drifts, something was lost. RCoT does this with reasoning instead of language — it round-trips the problem through the solution.
If your solution is correct, you should be able to rebuild the question from it. Whatever the rebuild leaves out or adds is exactly where your reasoning went wrong.
How it works
- Solve. Generate a normal chain-of-thought answer to the problem.
- Reconstruct. Ask the model to write the problem that its solution would solve — call it Q prime. Crucially, it works only from the solution, not the original.
- Decompose and compare. Break both the original problem Q and the reconstruction Q prime into a list of atomic conditions, then compare them condition by condition.
- Classify the gaps. Each mismatch is one of three error types — a condition the model overlooked, a condition it hallucinated, or a misread of what the question asked.
- Feed back and revise. Turn the detected gaps into targeted feedback ("you ignored that 5 apples were discarded") and ask the model to revise. Loop if needed.
Why it works
| Factor | Why it matters |
|---|---|
| Reconstruction surfaces silent assumptions | Re-deriving the question forces the model to reveal which conditions it actually used, exposing the ones it dropped or invented. |
| Fine-grained beats coarse feedback | "Wrong answer, try again" gives the model nothing to act on. "You overlooked condition X" points straight at the fix. |
| Verification is easier than generation | Spotting that two condition lists differ is a simpler task than solving the problem correctly on the first pass. |
| Decomposition localizes the error | Condition-by-condition comparison turns a vague "something's off" into a specific, addressable defect. |
Where it shines
RCoT pays off on multi-step reasoning where the problem carries several explicit conditions and a missed one quietly breaks the answer. That covers arithmetic and math word problems, multi-hop and date/temporal reasoning, and constraint-heavy logic puzzles.
Across seven arithmetic reasoning datasets, RCoT improves on standard CoT, self-consistency, and self-refine (Xue et al., 2023). In the zero-shot setting the automatic method adds roughly 4.1% on AQuA (diverse, complex problems), 5.0% on the Date understanding task (multi-hop temporal reasoning), and 2.8% on SVAMP (simple single-step problems) — the harder the task, the larger the gain. And when the feedback is hand-written rather than auto-generated, ChatGPT reaches 94.6% on GSM8K, which marks the ceiling the automatic pipeline is chasing.
When to use it (and when not)
Reach for RCoT when:
- The problem states several conditions and the model tends to overlook or invent one.
- Wrong answers are fluent and confident, so coarse "is it right?" checks don't help.
- Correctness matters enough to justify extra model calls.
Skip it when:
- The task is single-step or has no real conditions to compare.
- Errors are arithmetic or computational — reconstruction won't catch a bad multiplication.
- Latency or cost is tight and approximate answers are acceptable.
RCoT is not free. Each pass adds at least a reconstruction call, a comparison call, and a revision call on top of the original solve. Budget for several times the tokens and latency of a single CoT answer, and cap the number of revision loops.
Model fit. RCoT needs a model strong enough to both reconstruct a problem faithfully and compare conditions reliably. It was demonstrated on ChatGPT-class models; very small models often produce sloppy reconstructions that add noise instead of signal.
Escalation. If RCoT still misses errors — especially hallucinated conditions, which it detects least reliably — escalate to self-consistency over multiple RCoT runs, or hand computation off to a tool-using approach.
| Technique | Core idea | Choose it when |
|---|---|---|
| RCoT | Reconstruct the problem from the solution, compare conditions | Errors come from misread or dropped problem conditions |
| Self-Refine | Model critiques and revises its own output freely | You want general self-improvement without a structured check |
| Chain-of-Verification | Model drafts verification questions and answers them | Factual claims in open-ended answers need checking |
| Self-Consistency | Sample many chains, take the majority answer | Errors are random across runs, not systematic misreads |
| Plan-and-Solve | Plan the steps before executing them | The failure is poor planning, not condition tracking |
Structure and components
A working RCoT prompt has three building blocks, each its own model turn:
- Reconstruction prompt — feeds only the draft solution and asks for the problem it solves.
- Comparison prompt — feeds the original problem and the reconstruction, asks for a condition-level diff, and labels each mismatch.
- Revision prompt — feeds the original problem, draft solution, and the detected feedback, and asks for a corrected solution.
[Reconstruction]
Here is a solution. Write the math word problem it answers, listing every
condition it relies on.
Solution: {draft_solution}
[Comparison]
Original problem: {problem}
Reconstructed problem: {reconstruction}
List the conditions in each. For every difference, label it as
OVERLOOKED, HALLUCINATED, or MISINTERPRETED.
[Revision]
Problem: {problem}
Your earlier solution: {draft_solution}
Issues found: {feedback}
Write a corrected, step-by-step solution and final answer.
The core mechanism
The pipeline is a short loop: solve once, then reconstruct-compare-revise until the conditions line up or you hit a cap.
def rcot(problem, model, max_rounds=2):
solution = model.solve_cot(problem)
for _ in range(max_rounds):
reconstruction = model.reconstruct(solution) # Q'
feedback = model.compare_conditions(problem, # diff Q vs Q'
reconstruction)
if feedback.is_consistent: # no mismatches
break
solution = model.revise(problem, solution, feedback)
return solution
The whole technique lives in compare_conditions: decompose both problems into atomic conditions and emit a labeled list of overlooked, hallucinated, and misinterpreted items. Everything else is plumbing.
Configuration
| Setting | Suggested value | Why |
|---|---|---|
| Temperature (solve) | 0.7 | Some diversity in the first attempt is fine. |
| Temperature (reconstruct, compare, revise) | 0 to 0.2 | Verification should be deterministic and literal. |
| Max revision rounds | 1 to 2 | Most gains land in the first loop; more rounds rarely pay off. |
| Output format for comparison | Structured list with labels | Forces explicit, parseable condition diffs. |
Implementation workflow
- Get a baseline CoT solution and confirm your task actually shows condition-tracking errors (not just arithmetic ones).
- Write the reconstruction prompt; check that reconstructions are faithful to the solution, not the original problem.
- Add the comparison prompt with the three error labels and a structured output.
- Add the revision prompt and wire the loop with a round cap.
- Evaluate against plain CoT on a held-out set; keep RCoT only where it wins.
Do and don't
- Do keep reconstruction blind to the original problem — that blindness is what exposes dropped conditions.
- Do force condition-level, labeled output in the comparison step so feedback is specific.
- Don't use RCoT to catch arithmetic mistakes; pair it with a calculator or program-aided approach instead.
- Don't loop forever — cap revisions, since later rounds add cost without much accuracy.
Debugging
- Reconstruction just paraphrases the original. The model is peeking at Q. Pass only the solution and re-emphasize that.
- No mismatches ever found. The comparison is too lenient — demand an explicit per-condition table and force the three labels.
- Accuracy drops after revision. Feedback is noisy or wrong; lower temperature on the verification steps and cap rounds at one.
- Hallucinated conditions slip through. Known weak spot — add self-consistency over several RCoT runs.
Testing
Prove RCoT earns its cost by comparing it head-to-head with the baseline on the same items.
def evaluate(dataset, model):
cot = sum(model.solve_cot(x.q).answer == x.gold for x in dataset)
rc = sum(rcot(x.q, model).answer == x.gold for x in dataset)
return cot / len(dataset), rc / len(dataset)
Track accuracy on condition-heavy items specifically, and log how often the comparison step fires — if it almost never finds a mismatch, RCoT is adding latency for nothing on that task.
Limitations
- Blind to computation. RCoT checks whether the right conditions were used, not whether the arithmetic on them was correct.
- Weak on hallucinations. It detects overlooked conditions most reliably and struggles to flag conditions the model invented.
- Feedback gap. Auto-generated feedback still trails hand-written feedback — the 94.6% GSM8K figure comes from manual feedback, not the fully automatic loop.
- Cost and latency. Several extra calls per problem make it a poor fit for high-throughput or latency-sensitive systems.
Advanced and ecosystem
RCoT composes well with its siblings. Run it inside self-consistency — multiple RCoT solutions, majority vote — to raise recall on errors a single pass misses. It also slots into a broader self-correction family alongside self-refine, chain-of-verification, and self-verification; RCoT's niche is its problem-reconstruction check, which targets condition fidelity specifically rather than free-form critique. For computational steps, hand off to program-aided language models so each technique covers the other's blind spot.
The headline result. With fine-grained feedback in the RCoT style, ChatGPT reached 94.6% on GSM8K — and across seven arithmetic datasets the automatic method beat CoT, self-consistency, and self-refine (Xue et al., 2023). The lesson: telling a model exactly which condition it dropped beats telling it only that it was wrong.
Summary
- RCoT verifies reasoning by reconstructing the problem from the solution, then comparing the two condition by condition.
- It targets three error types: overlooked conditions, hallucinated conditions, and question misinterpretation.
- Fine-grained, condition-level feedback drives the gains — ChatGPT hits 94.6% on GSM8K with it, and the automatic loop adds about 4.1% (AQuA), 5.0% (Date), and 2.8% (SVAMP) over CoT.
- Reach for it on multi-step, condition-heavy problems where wrong answers look confident; skip it for single-step tasks or pure arithmetic errors.
- It costs several extra model calls, is blind to computation, and detects hallucinated conditions least reliably — so cap the loop and pair it with calculators or self-consistency when needed.
Read Next
Start reading to get personalized recommendations
Explore Unread
Great job! You've read all available articles