Patrones de salida a entrada
Extraiga datos estructurados del paso 1 para introducirlos en el paso 2.
Patrones de salida a entrada es una lección gratuita de AI Prompt Engineering en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Prompt Engineering, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Prompt Engineering incluye 4 lecciones en total.
El desafío central: extraer e inyectar
En una cadena de prompts, el paso 1 produce texto. El paso 2 necesita una parte específica de ese texto como entrada. El desafío consiste en extraer de forma fiable exactamente el campo correcto de la salida del paso 1 e inyectarlo limpiamente en el prompt del paso 2.
Si el paso 1 devuelve prosa sin estructura, la extracción es frágil. La solución consiste en diseñar los prompts del paso 1 para que devuelvan una salida estructurada, normalmente JSON, que se pueda analizar e inyectar mediante programación.
Diseño del paso 1 para su procesamiento automático
Un prompt destinado a alimentar una cadena debe devolver siempre datos estructurados. Especifique el esquema JSON exacto en el prompt:
import anthropic
import json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
step1_prompt = '''
<task>
Analyze the customer review below.
</task>
<review>
The onboarding was confusing and took 3 hours. The core feature works great though.
</review>
<output_format>
Return ONLY a JSON object. No other text.
{
"sentiment": "positive|negative|mixed",
"issues": ["string"],
"positives": ["string"],
"priority": "high|medium|low"
}
</output_format>
'''
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=300,
messages=[{'role': 'user', 'content': step1_prompt}]
)
print(response.content[0].text)Análisis de la salida del paso 1
Cuando el paso 1 devuelva JSON, analícelo en Python y extraiga los campos necesarios para el paso 2:
import json
def parse_step1_output(raw_text):
# Models sometimes wrap JSON in extra text -- strip it
text = raw_text.strip()
# Find the first { and last } to extract JSON object
start = text.find("{")
end = text.rfind("}")
if start != -1 and end != -1 and end > start:
text = text[start:end+1]
try:
return json.loads(text)
except json.JSONDecodeError as e:
raise ValueError("Step 1 output is not valid JSON: " + str(e))
# Example usage
raw = '{"sentiment": "mixed", "issues": ["confusing onboarding"], "positives": ["core feature"], "priority": "high"}'
parsed = parse_step1_output(raw)
print(parsed['issues'])
print(parsed['priority'])Inyección de campos extraídos en el paso 2
Tras analizarlo, inyecte campos específicos en la plantilla del prompt del paso 2. Use f-strings de Python o variables de plantilla:
def build_step2_prompt(parsed_step1):
issues = '\n'.join(f'- {issue}' for issue in parsed_step1['issues'])
priority = parsed_step1['priority']
sentiment = parsed_step1['sentiment']
return f'''
<context>
A customer review was analyzed. Overall sentiment: {sentiment}. Priority: {priority}.
</context>
<task>
Write a customer support response addressing these specific issues:
{issues}
Acknowledge the positives before addressing the issues.
</task>
<output_format>
Plain text response, 3 sentences maximum, professional tone.
</output_format>
'''
parsed = {'sentiment': 'mixed', 'issues': ['confusing onboarding'], 'priority': 'high', 'positives': ['core feature']}
print(build_step2_prompt(parsed))Cadena completa de dos pasos
Combinación del análisis y la inyección en un pipeline completo de dos pasos:
import anthropic, json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
def call(prompt, max_tokens=500):
r = client.messages.create(
model='claude-opus-4-5', max_tokens=max_tokens,
messages=[{'role': 'user', 'content': prompt}]
)
return r.content[0].text
def review_response_chain(review_text):
# Step 1: Analyze
step1 = call(f'Analyze this review. Return JSON: {{"sentiment": str, "issues": [str], "priority": str}}\n\nReview: {review_text}')
parsed = json.loads(step1.strip())
# Inject into Step 2
issues_str = ', '.join(parsed['issues'])
step2_prompt = f'Write a 2-sentence support reply. Issues to address: {issues_str}. Priority: {parsed["priority"]}.'
# Step 2: Draft response
reply = call(step2_prompt)
return reply
print(review_response_chain('Login is broken. App crashes on startup.'))Inyección de JSON anidado
Cuando el paso 1 devuelva objetos anidados, extraiga únicamente lo que el paso 2 necesite para mantener conciso el prompt inyectado:
step1_output = {
'document': {
'title': 'Q3 Report',
'sections': [
{'name': 'Revenue', 'value': '$4.2M', 'change': '+12%'},
{'name': 'Users', 'value': '85,000', 'change': '+5%'},
{'name': 'Churn', 'value': '3.2%', 'change': '-0.8%'}
]
},
'summary': 'Strong revenue quarter with moderate user growth.'
}
# Extract only what Step 2 needs — not the full nested object
def extract_for_step2(data):
sections = data['document']['sections']
metrics = '\n'.join(f"{s['name']}: {s['value']} ({s['change']})" for s in sections)
return {
'metrics': metrics,
'summary': data['summary']
}
step2_input = extract_for_step2(step1_output)
print(step2_input)Cómo evitar la inyección excesiva
Un error común consiste en inyectar toda la salida del paso 1 en el paso 2. Esto hace que el prompt del paso 2 sea demasiado grande y puede confundir al modelo con campos irrelevantes.
- Incorrecto:
f'Here is the analysis: {str(all_of_step1_output)}' - Correcto: Extraiga únicamente los campos específicos que necesite el paso 2 e inyéctelos con etiquetas claras
El paso 2 debe recibir exactamente la información que necesita, ni más ni menos.
Ramificación condicional basada en la salida
La salida analizada del paso 1 puede controlar qué prompt del paso 2 se ejecuta, convirtiendo una cadena lineal en un pipeline con ramificaciones:
def route_chain(user_message):
# Step 1: Classify intent
classification = json.loads(call(
f'Classify this message as billing, technical, or general. Return JSON: {{"intent": str}}\n\nMessage: {user_message}'
))
intent = classification['intent']
# Route to specialized Step 2 prompt
if intent == 'billing':
prompt = f'You are a billing specialist. Address: {user_message}'
elif intent == 'technical':
prompt = f'You are a senior engineer. Provide technical guidance for: {user_message}'
else:
prompt = f'You are a general support agent. Respond to: {user_message}'
return call(prompt)
print(route_chain('My invoice shows a wrong amount.'))Acumulación del estado entre pasos
Para cadenas más largas, mantenga un diccionario de estado que acumule las salidas de cada paso:
def run_pipeline(initial_input):
state = {'input': initial_input}
# Step 1
state['entities'] = json.loads(call(
f'Extract entities as JSON: {{"people": [], "companies": []}}\n\n{state["input"]}'
))
# Step 2 uses entities from Step 1
companies_str = ', '.join(state['entities'].get('companies', []))
state['company_types'] = call(
f'Classify these companies as startup/enterprise: {companies_str}'
)
# Step 3 uses output from Steps 1 and 2
state['summary'] = call(
f'Write a 2-sentence summary.\nEntities: {state["entities"]}\nClassifications: {state["company_types"]}'
)
return state
result = run_pipeline('Apple and OpenAI announced a partnership with Elon Musk.')
print(result['summary'])Utilidades de extracción de JSON
Construya una utilidad de extracción reutilizable para la infraestructura de su cadena:
import re, json
def extract_json(text):
"Extract JSON from model output, handling extra text around the object."
# Try direct parse first
try:
return json.loads(text.strip())
except json.JSONDecodeError:
pass
# Try finding JSON object by bracket matching
start = text.find("{")
end = text.rfind("}")
if start != -1 and end != -1 and end > start:
try:
return json.loads(text[start:end+1])
except json.JSONDecodeError:
pass
# Try finding JSON array
start = text.find("[")
end = text.rfind("]")
if start != -1 and end != -1 and end > start:
try:
return json.loads(text[start:end+1])
except json.JSONDecodeError:
pass
raise ValueError("Could not extract JSON from: " + text[:200])
print(extract_json('{"key": "value"}'))Pruebas de patrones de salida a entrada
Los pipelines de salida a entrada necesitan dos niveles de pruebas:
- Pruebe cada paso de forma unitaria: ¿El paso 1 devuelve de forma fiable JSON que se pueda analizar? ¿El paso 2 genera la salida correcta para una entrada extraída determinada?
- Pruebe la cadena mediante pruebas de integración: ¿El pipeline completo produce resultados correctos para entradas representativas?
Mantenga deterministas los prompts de cada paso usando temperature=0 en los pasos de clasificación y extracción donde la coherencia sea importante.
def test_step1(review_text, expected_sentiment):
raw = call(f'Analyze review. Return JSON: {{"sentiment": str}}\n\n{review_text}')
parsed = extract_json(raw)
assert parsed['sentiment'] == expected_sentiment, f'Expected {expected_sentiment}, got {parsed["sentiment"]}'
print(f'PASS: sentiment={parsed["sentiment"]}')
# Run unit test for Step 1
test_step1('The product is excellent!', 'positive')
test_step1('This is terrible.', 'negative')Comprobación rápida
¿Cuál es el formato de salida recomendado para el paso 1 de una cadena de prompts cuando el resultado se extraerá mediante programación y se inyectará en el paso 2?
Salida a entrada: ideas clave
Los patrones fiables de salida a entrada son lo que hace que las cadenas de prompts estén listas para producción:
- Diseñe los prompts del paso 1 para que devuelvan JSON con un esquema explícito, no prosa
- Analice la salida del paso 1 antes de inyectarla: elimine los delimitadores Markdown y gestione JSONDecodeError
- Inyecte únicamente los campos específicos que necesite el paso 2; evite la inyección excesiva
- Use diccionarios de estado para acumular y transferir datos en cadenas más largas
- La salida analizada puede impulsar una ramificación condicional para dirigir el flujo a prompts especializados del paso 2
- Construya utilidades reutilizables de extracción de JSON que gestionen las inconsistencias de la salida del modelo
- Pruebe cada paso de forma unitaria e independiente y después pruebe mediante integración el pipeline completo
Aprende AI Prompt Engineering con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 53
- Lecciones
- 199
Preguntas frecuentes
¿La lección «Patrones de salida a entrada» es gratis?
Sí — el texto completo de «Patrones de salida a entrada» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Prompt Engineering, actualiza a CoddyKit PRO. El curso de AI Prompt Engineering incluye 4 lecciones en total.
¿Qué aprenderé en «Patrones de salida a entrada»?
Extraiga datos estructurados del paso 1 para introducirlos en el paso 2. Practicas AI Prompt Engineering con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar AI Prompt Engineering?
No se requiere experiencia previa. AI Prompt Engineering en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Patrones de salida a entrada»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de AI Prompt Engineering?
Sí. Cada lección de AI Prompt Engineering incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- ¿Qué es el encadenamiento de prompts?
- Patrones de salida a entrada
- Cadenas de transformación secuencial
- Gestión de errores en cadenas de prompts