💸The answer is the expensive part: controlling output tokens

💸The answer is the expensive part: controlling output tokens (English version)

💸La respuesta es lo que más cuesta: controla el token de salida

ModeloEntrada ($/1M tokens)Salida ($/1M tokens)Ratio
GPT-5.5$5,00$30,006× más cara la salida
GPT-5.4$2,50$15,006× más cara la salida
GPT-5.4 mini$0,75$4,506× más cara la salida

Cada token que el modelo escribe nos cuesta unas 6 veces lo que cada token que mandamos. Si en la entrada el ahorro venía de quitar peso muerto, aquí el multiplicador juega mucho más fuerte.

Y hay una parte que se paga aunque no se ve: los reasoning tokens. Los modelos con razonamiento avanzado no van directo a la respuesta, antes generan un monólogo interno donde planifican, se autocorrigen y descartan caminos. Ese razonamiento no aparece en pantalla, pero se factura igual que la salida visible. Así puede quedar una petición que «parece»corta:

Lo que ves en pantalla: 500 tokens ← lo visible
Razonamiento interno: 2.500 tokens ← invisible, pero facturado como salida
──────────────────────────────────────────
Total facturado como salida: 3.000 tokens

Con esa idea en la cabeza, en este post te muestro dónde se esconde el gasto de salida en el día a día y qué hago yo para tenerlo a raya.

(Hábito) Copilot reescribiendo objetos enteros. Pasa a menudo: pides «añade validación a este procedure» y el Agente reescribe el codeunit completo en vez de tocar solo lo necesario. Lo que hago: ser quirúrgico en el prompt. «Modifica solo el procedure PostSalesLine: comprueba que Customer.»No.» no esté vacío antes del exit» genera cuatro líneas, no cientos.

AcciónTokens de salida aprox.
Fichero de 200 líneas reescrito completo~1.500 tokens
Solo las 10 líneas que cambian~80 tokens
Pasos del agenteCoste relativo aproximado
1 paso
3 pasos~3,5×
6 pasos~9×
10 pasos~20×

(Hábito) Explicaciones que no pediste. El modelo tiende a contarte qué hizo, por qué, y qué alternativas valoró. Si ya sabías lo que pediste, eso es salida pura sin valor para ti. Unas pocas palabras en el prompt te ahorran cientos de tokens de vuelta:

En lugar de…Escribe…
«Refactoriza esta función»«Refactoriza esta función. Solo el código, sin explicaciones.»
«Corrige el bug»«Corrige el bug. Dame solo el bloque corregido.»
«Genera los tests»«Genera los tests. Sin comentarios inline.»

(Hábito) El esfuerzo de razonamiento mal calibrado. Esfuerzo alto en una tarea simple genera reasoning tokens que no necesitas (invisibles, pero facturados). Esfuerzo bajo en una difícil te da una respuesta floja y acabas pagando varias iteraciones. La idea es emparejarlo con la tarea:

Tipo de tareaEsfuerzo recomendado
Explicar un bloque de códigoBajo
Buscar un bug concreto y conocidoBajo–Medio
Diseño de arquitectura o comparar opcionesMedio–Alto
Bug difícil, algoritmo complejoAlto

(Instrucción) Fija el formato y el tope de la salida. «Solo el diff», «máximo 15 líneas», «una tabla, sin prosa», «solo el bloque corregido». Acotar la forma de la respuesta pone un techo directo a lo más caro, y de paso el modelo no se va por las ramas. Es la diferencia entre dejar la salida abierta y decirle exactamente cuánto y cómo quieres que escriba.

(Instrucción) Indicar qué dejar fuera. Por defecto, el modelo rellena: explica lo que hizo, ofrece alternativas que nadie pidió, resume al final y lo más caro: reimprime código que no ha cambiado. Una frase corta apaga esos automatismos: «no expliques, sin alternativas, no reimprimas lo que no toques». Es un truco que ahorra salida, porque ataca los hábitos por defecto del modelo.

(Instrucción) Una petición, un objetivo. Encadenar «haz A, arregla B y de paso documenta C» en un mismo turno multiplica la salida, genera las tres cosas y arrastra el contexto de cada paso al siguiente. Pide una, la revisas, sigues. Por ejemplo, en vez de «crea el endpoint de login, añade sus tests, documéntalo en el README y revisa si el de registro tiene el mismo bug» (cuatro entregables largos), y si uno falla rehaces el bloque entero, mejor ve por pasos: «crea solo el endpoint de login», lo revisas, y luego «ahora los tests de ese endpoint». Cada respuesta es corta, la controlas, y no pagas por lo que aún no has validado.

(Instrucción) Dar el molde, no dejar que lo invente. Si lo que quieres se parece a algo que ya existe, dilo: «igual que el procedure InsertCustomer que ya tienes», «mismo formato que esta página». Así el modelo replica un patrón en vez de inventar uno desde cero. Ahorra salida y, sobre todo, evita el re-ask por divergencia: el coste que no ves venir.

(Instrucción) Pedir que pregunte antes de generar. Una línea «si te falta contexto, pregúntame antes de escribir código» y te ahorras el patrón más caro de todos: que suelte una respuesta larga y equivocada que acabas descartando. Eso es pagar dos rondas. Mejor una pregunta de entrada (barata) que una generación entera de salida (cara) que no sirve.

(Instrucción · una sola vez) Pon una instrucción permanente de concisión. Puesto una sola vez, cada turno arranca ya pidiendo poco, preguntando cuando duda en lugar de inventar, y frenando antes de un cambio masivo.

## Verbosity
- Respuestas cortas y directas por defecto; amplía solo si lo pido.
## Comunicación
- No adivines ni inventes: si dudas, pregunta. Una pregunta de más
es mejor que una respuesta segura y equivocada.
## Seguridad
- Antes de tocar 10 ficheros o más, pide confirmación.

Así que la regla no es «minimiza la salida». Es: «empareja la verbosidad con el valor de la tarea». Una respuesta corta en una tarea simple es ahorro real. Una respuesta corta en una tarea difícil es economía falsa, porque la pagas dos veces.

Si recortas…El riesgo es…Síntoma de que recortaste de más
Longitud de respuestaRespuesta incompleta → re-ask → pagas dos rondasTienes que pedir «continúa» o «¿y qué pasa con X?»
Diffs en vez de fichero completoEl modelo aplica el diff mal → depuras → sale más caroMás tiempo arreglando que si lo hubiera reescrito
Esfuerzo de razonamientoRespuesta superficial → retrabajoNo funciona al primer intento
ExplicacionesEntiendes menos → consultas extra más adelante«¿Por qué lo hiciste así?» al turno siguiente

Si juntamos todo, los trucos del token de salida caen en dos grupos: las de hábito (lo que dejamos de hacer) y las de instrucción (lo que añadimos antes de enviar). Estas últimas son las que de verdad están en nuestras mano en cada prompt:

TrucoTipoAhorro potencialCuándo aplicaRiesgo si abusas
Pide el cambio concreto, no el ficheroHábitoAlto (~19×)Cambios puntuales en código existenteDiff mal aplicado → retrabajo
Elige el modo más barato que resuelva (Ask → Plan → Agent)HábitoMuy altoSiempreSubir de modo tarde te cuesta una ronda
Corta el agente si da vueltasHábitoVariableAgent con objetivo vago
Fija el formato, el tope y qué omitir (solo el diff, sin prosa, sin alternativas)InstrucciónMedio–AltoCuando sabes qué quieresPerder contexto útil
Una petición, un objetivoInstrucciónMedioTareas que tiendes a encadenar.Separar lo muy acoplado → idas y vueltas.
Dar el molde, no dejar que lo inventeInstrucciónMedio–AltoCuando ya existe un patrón parecido.El ejemplo ocupa entrada (barata) — buen trato.
Pide que pregunte antes de generar si le falta contextoInstrucciónAltoTareas ambiguas o con supuestos.Un pequeño ida y vuelta extra.
Instrucción permanente de concisión (se pone una vez)InstrucciónAlto y recurrenteSiempre — aplica en cada turno.Demasiado seca para cuando sí quieres razonamiento.
Calibra el esfuerzo de razonamientoConfiguraciónMedioModelos con razonamiento activado.Respuesta superficial en tareas difíciles.

Hay algunos trucos más finos para apurar, varias apuntando justo a lo que no se ve: el razonamiento.

Lo que le pidesQué ahorraQué puedes perder (el riesgo)
«No uses librerías externas, mantén el estilo del fichero» — acotar el terrenoRazonamiento gastado en caminos que el modelo iba a descartar igual, y salida que no encajaba.Casi nada, salvo que te pases y bloquees una solución mejor.
«Soy senior, salta lo básico» — decir tu nivelPárrafos de contexto que el lector ya domina.Casi nada, salvo sobreestimarse y perder una pieza que no se conocía.
«Con que compile o pase este test, basta» — marcar cuándo está hechoEl razonamiento de explorar casos límite y la salida de cubrirlos.Cobertura: algún caso raro que queda fuera de ese «hecho»
«Asume valores razonables y dímelos en una línea» — asumir y seguirUna ronda entera de ida y vuelta.Si el supuesto era erróneo, toca rehacer, mejor solo en tareas de bajo riesgo.
«Elige la mejor opción y aplícala, sin darme un menú» — decidir por tiLa salida de enumerar alternativas y el razonamiento de compararlas.Visibilidad: pierdes ver opciones que quizá habrías vetado.

Controlar la entrada te da margen; controlar la salida te da el grueso del ahorro. Mira cómo tienes el Agent, cómo pides los cambios y cuánto razonamiento le exiges a cada tarea.


💸The answer is the expensive part: controlling output tokens

ModelInput ($/1M tokens)Output ($/1M tokens)Ratio
GPT-5.5$5.00$30.006× more expensive output
GPT-5.4$2.50$15.006× more expensive output
GPT-5.4 mini$0.75$4.506× more expensive output

Each token the model writes costs us about 6× what each token we send does. If on the input side the saving came from removing dead weight, here the multiplier plays much harder.

And there’s a part you pay for even though you don’t see it: the reasoning tokens. Models with advanced reasoning don’t go straight to the answer; first they generate an internal monologue where they plan, self-correct and discard paths. That reasoning doesn’t show up on screen, but it’s billed just like the visible output. So a request that «looks» short can end up like this:

What you see on screen: 500 tokens ← the visible part
Internal reasoning: 2,500 tokens ← invisible, but billed as output
──────────────────────────────────────────
Total billed as output: 3,000 tokens

With that idea in mind, in this post I’ll show you where the output spend hides day to day and what I do to keep it in check.

(Habit) Copilot rewriting whole objects. It happens often: you ask «add validation to this procedure» and the Agent rewrites the entire codeunit instead of touching only what’s needed. What I do: be surgical in the prompt. «Modify only the PostSalesLine procedure: check that Customer."No." isn’t empty before the exit» generates four lines, not hundreds.

ActionApprox. output tokens
200-line file rewritten in full~1,500 tokens
Only the 10 lines that change~80 tokens
Agent stepsApprox. relative cost
1 step
3 steps~3.5×
6 steps~9×
10 steps~20×

(Habit) Explanations you didn’t ask for. The model tends to tell you what it did, why, and what alternatives it weighed. If you already knew what you asked for, that’s pure output with no value to you. A few words in the prompt save you hundreds of tokens in return:

Instead of…Write…
«Refactor this function»«Refactor this function. Code only, no explanations.»
«Fix the bug»«Fix the bug. Just give me the corrected block.»
«Generate the tests»«Generate the tests. No inline comments.»

(Habit) Miscalibrated reasoning effort. High effort on a simple task generates reasoning tokens you don’t need (invisible, but billed). Low effort on a hard one gives you a weak answer and you end up paying for several iterations. The idea is to match it to the task:

Task typeRecommended effort
Explain a block of codeLow
Find a specific, known bugLow–Medium
Architecture design or comparing optionsMedium–High
Tough bug, complex algorithmHigh

(Instruction) Set the format and the cap of the output. «Diff only», «max 15 lines», «a table, no prose», «just the corrected block». Bounding the shape of the answer puts a direct ceiling on the most expensive part, and along the way the model doesn’t wander off. It’s the difference between leaving the output open and telling it exactly how much and how you want it to write.

(Instruction) State what to leave out. By default, the model pads: it explains what it did, offers alternatives nobody asked for, sums up at the end and, the most expensive part, reprints code that hasn’t changed. A short sentence shuts off those reflexes: «no explanations, no alternatives, don’t reprint what you don’t touch». It’s a trick that saves output, because it targets the model’s default habits.

(Instruction) One request, one objective. Chaining «do A, fix B and document C while you’re at it» in a single turn multiplies the output, generates all three and drags each step’s context into the next. Ask for one, review it, move on. For example, instead of «create the login endpoint, add its tests, document it in the README and check whether the registration one has the same bug» (four long deliverables, and if one goes wrong you redo the whole block), better go step by step: «create only the login endpoint», review it, then «now the tests for that endpoint». Each answer is short, you stay in control, and you don’t pay for what you haven’t validated yet.

(Instruction) Give it the mold, don’t let it invent one. If what you want resembles something that already exists, say so: «same as the InsertCustomer procedure you already have», «same format as this page». That way the model replicates a pattern instead of inventing one from scratch. It saves output and, above all, avoids the re-ask from divergence: the cost you don’t see coming.

(Instruction) Ask it to ask before generating. One line, «if you’re missing context, ask me before writing code», and you spare yourself the most expensive pattern of all: it pours out a long, wrong answer that you end up discarding. That’s paying for two rounds. Better one cheap input question than a whole expensive output generation that doesn’t serve you.

(Instruction · once and for all) Set a permanent conciseness instruction. Set once, every turn starts off already asking for little, asking when in doubt instead of inventing, and stopping before a massive change.

## Verbosity
- Keep responses short and direct by default.
- Expand only when explicitly asked or when the topic genuinely requires it.
## Communication Style
- Never guess, infer, or hallucinate. If unsure, ask — one extra
question is always better than a confidently wrong answer.
## Safety
- Before changes affecting 10+ files, ask for confirmation first.

So the rule isn’t «minimize output». It’s: «match the verbosity to the value of the task». A short answer on a simple task is real savings. A short answer on a hard task is false economy, because you pay for it twice.

If you cut…The risk is…Sign you’ve cut too much
Response lengthIncomplete answer → re-ask → you pay two roundsYou have to type «continue» or «what about X?»
Diffs instead of the full fileThe model applies the diff wrong → you debug → it gets pricierMore time fixing than if it had rewritten it
Reasoning effortShallow answer → reworkIt doesn’t work on the first try
ExplanationsYou understand less → extra questions later«Why did you do it this way?» the next turn

Putting it all together, the output-token tricks fall into two groups: the habit ones (what we stop doing) and the instruction ones (what we add before sending). The latter are the ones truly in our hands on every prompt:

TrickTypePotential savingWhen it appliesRisk if you overdo it
Ask for the specific change, not the fileHabitHigh (~19×)Pinpoint changes in existing codeDiff applied wrong → rework
Pick the cheapest mode that works (Ask → Plan → Agent)HabitVery highAlwaysMoving up too late costs you a round
Cut the agent off if it wandersHabitVariableAgent with a vague goal
Set the format, the cap and what to omit (diff only, no prose, no alternatives)InstructionMedium–HighWhen you know what you wantLosing useful context
One request, one objectiveInstructionMediumTasks you tend to chainSplitting tightly-coupled work → back-and-forth
Give it a mold, don’t let it invent oneInstructionMedium–HighWhen a similar pattern already existsThe example uses input (cheap) — a good trade
Ask it to ask before generating if it’s missing contextInstructionHighAmbiguous tasks or ones with assumptionsA small extra back-and-forth
Permanent conciseness instruction (set once)InstructionHigh and recurringAlways — applies every turnToo terse for when you do want reasoning
Calibrate reasoning effortConfigurationMediumModels with reasoning onShallow answer on hard tasks

There are some finer tricks to push a bit further, several aimed right at what you can’t see: the reasoning.

What you ask forWhat it savesWhat you might lose (the risk)
«No external libraries, keep the file’s style» — bound the fieldReasoning spent on paths the model was going to discard anyway, and output that didn’t fitAlmost nothing, unless you over-constrain and block a better solution
«I’m senior, skip the basics» — state your levelParagraphs of context the reader already knowsAlmost nothing, unless you overestimate yourself and miss a piece you didn’t know
«As long as it compiles or passes this test, that’s enough» — mark when it’s doneThe reasoning of exploring edge cases and the output of covering themCoverage: some rare case that falls outside that «done»
«Assume reasonable values and tell me in one line» — assume and goA whole round of back-and-forthIf the assumption was wrong, you redo it — best only for low-risk tasks
«Pick the best option and apply it, don’t give me a menu» — decide for meThe output of listing alternatives and the reasoning of comparing themVisibility: you lose sight of options you might have vetoed

Controlling input gives you margin; controlling output gives you the bulk of the savings. Look at how you’ve got the Agent set up, how you ask for changes, and how much reasoning you demand of each task.


Más información / More information:

Deja un comentario