AI Prompt Engineering · Leçon

Modèles sortie-entrée

Extrayez des données structurées de l’étape 1 pour les injecter dans l’étape 2.

Leçon 2 sur 413 étapes

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
Gratuit pour commencer

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

  1. Qu’est-ce que l’enchaînement d’invites ?
  2. Modèles sortie-entrée
  3. Chaînes de transformations séquentielles
  4. Gestion des erreurs dans les chaînes d’invites
← Retour à AI Prompt Engineering