Schemi da output a input
Estragga dati strutturati dal passaggio 1 per inserirli nel passaggio 2
Schemi da output a input è una lezione AI Prompt Engineering gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Prompt Engineering, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Prompt Engineering include 4 lezioni in totale.
La sfida principale: estrazione e inserimento
In una prompt chain, il Passaggio 1 produce testo. Il Passaggio 2 ha bisogno di un elemento specifico di quel testo come input. La difficoltà consiste nell'estrarre in modo affidabile esattamente il campo corretto dall'output del Passaggio 1 e inserirlo in modo pulito nel prompt del Passaggio 2.
Se il Passaggio 1 restituisce prosa non strutturata, l'estrazione è fragile. La soluzione consiste nel progettare i prompt del Passaggio 1 in modo che restituiscano output strutturato, in genere JSON, che possa essere analizzato e inserito programmaticamente.
Progettare il Passaggio 1 per l'elaborazione automatica
Un prompt destinato ad alimentare una catena deve restituire sempre dati strutturati. Specifichi lo schema JSON esatto nel 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)Analizzare l'output del Passaggio 1
Quando il Passaggio 1 restituisce JSON, lo analizzi in Python ed estragga i campi necessari al Passaggio 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'])Inserire i campi estratti nel Passaggio 2
Dopo l'analisi, inserisca campi specifici nel modello di prompt del Passaggio 2. Utilizzi f-string di Python o variabili di modello:
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))Catena completa in due passaggi
Combinazione dell'analisi e dell'inserimento in una pipeline completa a due passaggi:
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.'))Gestire l'inserimento di JSON annidato
Quando il Passaggio 1 restituisce oggetti annidati, estragga solo ciò che serve al Passaggio 2 per mantenere conciso il prompt inserito:
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)Evitare inserimenti eccessivi
Un errore comune consiste nell'inserire l'intero output del Passaggio 1 nel Passaggio 2. Questo rende il prompt del Passaggio 2 più voluminoso e può confondere il modello con campi irrilevanti.
- Errato:
f'Here is the analysis: {str(all_of_step1_output)}' - Corretto: estragga solo i campi specifici necessari al Passaggio 2 e li inserisca con etichette chiare
Il Passaggio 2 deve ricevere esattamente le informazioni necessarie, né più né meno.
Diramazione condizionale in base all'output
L'output analizzato del Passaggio 1 può determinare quale prompt del Passaggio 2 eseguire, trasformando una catena lineare in una pipeline ramificata:
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.'))Accumulo dello stato tra i passaggi
Per le catene più lunghe, mantenga un dizionario di stato che accumuli gli output di ogni passaggio:
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'])Utilità per l'estrazione del JSON
Costruisca un'utilità di estrazione riutilizzabile per l'infrastruttura della catena:
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"}'))Testare i modelli da output a input
Le pipeline da output a input richiedono due livelli di test:
- Test unitario di ogni passaggio: il Passaggio 1 restituisce in modo affidabile JSON analizzabile? Il Passaggio 2 produce l'output corretto per un determinato input estratto?
- Test di integrazione della catena: la pipeline end-to-end produce risultati corretti per input rappresentativi?
Mantenga deterministici i prompt dei passaggi utilizzando temperature=0 per i passaggi di classificazione ed estrazione in cui la coerenza è 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')Verifica rapida
Qual è il formato di output consigliato per il Passaggio 1 di una catena di prompt quando il risultato deve essere estratto programmaticamente e inserito nel Passaggio 2?
Da output a input — Punti chiave
I modelli affidabili da output a input sono ciò che rende le catene di prompt pronte per la produzione:
- Progetti i prompt del Passaggio 1 affinché restituiscano JSON con uno schema esplicito, non testo in prosa
- Analizzi l'output del Passaggio 1 prima di inserirlo: rimuova i delimitatori Markdown e gestisca JSONDecodeError
- Inserisca solo i campi specifici necessari al Passaggio 2, evitando inserimenti eccessivi
- Utilizzi dizionari di stato per accumulare e trasferire dati tra i passaggi delle catene più lunghe
- L'output analizzato può guidare una diramazione condizionale per indirizzare l'elaborazione verso prompt specializzati del Passaggio 2
- Costruisca utilità riutilizzabili per l'estrazione del JSON, in grado di gestire le incoerenze dell'output del modello
- Testi ogni passaggio in modo indipendente, quindi esegua test di integrazione sull'intera pipeline
Domande Frequenti
La lezione «Schemi da output a input» è gratuita?
Sì — il testo completo di «Schemi da output a input» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Prompt Engineering, passa a CoddyKit PRO. Il corso AI Prompt Engineering include 4 lezioni in totale.
Cosa imparerò in «Schemi da output a input»?
Estragga dati strutturati dal passaggio 1 per inserirli nel passaggio 2 Eserciti AI Prompt Engineering con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare AI Prompt Engineering?
Non è richiesta alcuna esperienza precedente. AI Prompt Engineering su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Schemi da output a input»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione AI Prompt Engineering?
Sì. Ogni lezione AI Prompt Engineering include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Che cos'è il prompt chaining?
- Schemi da output a input
- Catene di trasformazione sequenziali
- Gestione degli errori nelle catene di prompt