Modèles sortie-entrée
Extrayez des données structurées de l’étape 1 pour les injecter dans l’étape 2.
Modèles sortie-entrée est une leçon AI Prompt Engineering gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Prompt Engineering, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Prompt Engineering comprend 4 leçons au total.
Le défi central : extraire et injecter
Dans une chaîne d’invites, l’étape 1 produit du texte. L’étape 2 a besoin d’un élément précis de ce texte comme entrée. Le défi consiste à extraire de manière fiable exactement le bon champ de la sortie de l’étape 1 et à l’injecter proprement dans l’invite de l’étape 2.
Si l’étape 1 renvoie un texte non structuré, l’extraction est fragile. La solution consiste à concevoir les invites de l’étape 1 pour qu’elles renvoient une sortie structurée — généralement au format JSON — qui peut être analysée et injectée par programmation.
Concevoir l’étape 1 pour un traitement automatique
Une invite destinée à alimenter une chaîne doit toujours produire des données structurées. Indiquez le schéma JSON exact dans l’invite :
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)Analyser la sortie de l’étape 1
Une fois que l’étape 1 a renvoyé du JSON, analysez-le en Python et extrayez les champs nécessaires à l’étape 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'])Insérer les champs extraits dans l’étape 2
Après l’analyse, insérez certains champs dans le modèle d’invite de l’étape 2. Utilisez des chaînes f Python ou des variables de modèle :
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))Chaîne complète en deux étapes
Combinaison de l’analyse et de l’insertion dans une chaîne complète en deux étapes :
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.'))Gérer l’insertion de JSON imbriqué
Lorsque l’étape 1 renvoie des objets imbriqués, extrayez uniquement ce dont l’étape 2 a besoin afin de garder l’invite enrichie concise :
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)Éviter l’insertion excessive
Une erreur courante consiste à insérer toute la sortie de l’étape 1 dans l’étape 2. Cela alourdit l’invite de l’étape 2 et peut désorienter le modèle avec des champs sans rapport.
- Mauvais :
f'Here is the analysis: {str(all_of_step1_output)}' - Bon : Extrayez uniquement les champs précis dont l’étape 2 a besoin et insérez-les avec des libellés explicites
L’étape 2 doit recevoir exactement les informations dont elle a besoin — ni plus ni moins.
Branchement conditionnel selon la sortie
La sortie analysée de l’étape 1 peut déterminer quelle invite de l’étape 2 est exécutée, transformant ainsi une chaîne linéaire en chaîne de traitement à embranchements :
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.'))Accumuler l’état entre les étapes
Pour les chaînes plus longues, gérez un dictionnaire d’état qui accumule les sorties de chaque étape :
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'])Utilitaires d’extraction JSON
Créez un utilitaire d’extraction réutilisable pour l’infrastructure de votre chaîne :
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"}'))Mettre à l’essai les schémas sortie-entrée
Les chaînes sortie-entrée nécessitent deux niveaux de mise à l’essai :
- Mettre chaque étape à l’essai séparément : l’étape 1 renvoie-t-elle de manière fiable un JSON analysable ? L’étape 2 produit-elle la bonne sortie pour une entrée extraite donnée ?
- Mettre la chaîne à l’essai dans son ensemble : la chaîne de traitement de bout en bout produit-elle des résultats corrects pour des entrées représentatives ?
Rendez les invites des étapes déterministes en utilisant une température égale à 0 pour les étapes de classification et d’extraction où la cohérence est 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')Vérification rapide
Quel est le format de sortie recommandé pour l’étape 1 d’une chaîne d’invites lorsque le résultat sera extrait par programme, puis inséré dans l’étape 2 ?
Sortie vers entrée — Points essentiels
Des schémas sortie-entrée fiables sont indispensables pour rendre les chaînes d’invites prêtes pour la production :
- Concevez les invites de l’étape 1 pour qu’elles renvoient du JSON avec un schéma explicite — pas du texte courant
- Analysez la sortie de l’étape 1 avant l’insertion : supprimez les délimiteurs Markdown et gérez les erreurs de décodage JSON
- Insérez uniquement les champs précis dont l’étape 2 a besoin — évitez l’insertion excessive
- Utilisez des dictionnaires d’état pour accumuler et transmettre les données dans les chaînes plus longues
- La sortie analysée peut piloter un branchement conditionnel afin d’orienter l’exécution vers des invites spécialisées de l’étape 2
- Créez des utilitaires d’extraction JSON réutilisables qui gèrent les incohérences des sorties du modèle
- Mettez chaque étape à l’essai séparément, puis mettez toute la chaîne de traitement à l’essai dans son ensemble
Apprends AI Prompt Engineering avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 53
- Leçons
- 199
Questions Fréquemment Posées
La leçon « Modèles sortie-entrée » est-elle gratuite ?
Oui — le texte complet de « Modèles sortie-entrée » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Prompt Engineering, passe à CoddyKit PRO. Le cours AI Prompt Engineering comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Modèles sortie-entrée » ?
Extrayez des données structurées de l’étape 1 pour les injecter dans l’étape 2. Tu pratiques AI Prompt Engineering avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer AI Prompt Engineering ?
Aucune expérience préalable n'est requise. AI Prompt Engineering sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Modèles sortie-entrée » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon AI Prompt Engineering ?
Oui. Chaque leçon AI Prompt Engineering inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Qu’est-ce que l’enchaînement d’invites ?
- Modèles sortie-entrée
- Chaînes de transformations séquentielles
- Gestion des erreurs dans les chaînes d’invites