# Why does ChatGPT give different numbers each time I upload the same bill?

Canonical: https://senseible.earth/answers/why-ai-gives-different-numbers-for-same-bill

A general chat assistant samples its reply word by word with some randomness, and it has no fixed list of fields to fill or record of what it read last time. So the same bill can come back with different units, totals or line splits. For carbon figures you need fixed fields, stored results and a check on every number.

## Where the variation comes from

- Sampling: a language model picks each next word from a ranked list. In normal chat settings it does not always take the top choice, so two runs can word the answer, and the numbers in it, differently.
- No fixed schema: if the prompt does not say exactly which fields to return, the model decides each time whether a line is one item or three, and whether to report kWh, kVAh or rupees.
- No memory of the file: each upload is treated as new. Nothing ties today's answer to yesterday's.
- Guessing at blanks: when a value is faint or missing, a chat model may fill it in rather than leave it empty.

## Temperature 0 helps but is not enough

Setting temperature to 0 makes the model take its highest scoring word at every step, which removes sampling randomness. It does not promise identical text across model versions or hardware. Repeatability for an audit has to come from the system around the model: store the first accepted result and return it again for the same file.

## Why this matters for a carbon number

The GHG Protocol asks for consistency and accuracy: the same activity should give the same figure each time, and anyone checking should be able to trace it. If one electricity bill yields 42,000 kWh on Monday and 4,200 on Tuesday, neither figure can go in a report until a person reads the bill again.

Unit slips are the costly ones. Reading kVAh as kWh, or a diesel amount in rupees as litres, changes the result many times over.

## What to look for in any extraction tool

1. A fixed set of fields, with a missing value left empty instead of guessed.
2. The same file returns the same stored result, and a duplicate file is not counted twice.
3. Every number links back to the page it was read from.
4. Code, not the model, does the classification and the arithmetic, so a figure can be recomputed.
5. Lines with a missing unit or quantity are flagged for review, not passed through.

## Illustration: one bill, two readings

- Correct reading: 42,000 kWh x 0.710 kg CO2 per kWh = 29,820 kg CO2
- A reading that drops a zero: 4,200 kWh x 0.710 = 2,982 kg CO2
- Gap between the two: 26,838 kg CO2, about 26.8 tonnes, from one digit

Illustrative figures. The point is that a single unstable read moves the whole result.

## What Senseible does here

Senseible reads documents at temperature 0 against a fixed schema with absent fields left null, then classifies and calculates in deterministic code. A file it has already processed returns its stored result, and each file's SHA-256 fingerprint stops an identical copy being counted twice. It does not catch a rescanned or edited copy as the same file.

- [How Senseible reads documents](https://senseible.earth/white-paper)
- [Can AI calculate a footprint accurately?](https://senseible.earth/answers/can-ai-calculate-carbon-footprint-accurately)
- [Stop the same invoice counting twice](https://senseible.earth/answers/how-to-stop-same-invoice-counted-twice)

Sources: [GHG Protocol Corporate Standard, Chapter 1 accounting principles](https://ghgprotocol.org/corporate-standard)

Last reviewed 2026-10-15.
