Prompts LangChain -- Prompt système et Prompt dynamique

Le prompt système est le moyen essentiel de contrôler le comportement de l'Agent.

Cette section présente l'utilisation des prompts statiques et des prompts dynamiques.


Paramètre system_prompt

Le paramètre system_prompt de create_agent() accepte deux formes :

Exemple

from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.messages import SystemMessage

model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)

# Méthode 1 : String (la plus simple)
agent = create_agent(
    model=model,
    system_prompt="Vous êtes le conseiller pédagogique pour Example. Gardez vos réponses concises et professionnelles.",
)

# Méthode 2 : objet SystemMessage (réutilisable)
system_msg = SystemMessage(
    content="Vous êtes le conseiller pédagogique pour Example. Gardez vos réponses concises et professionnelles."
)
agent = create_agent(model=model, system_prompt=system_msg)

Concevoir des prompts système efficaces

Un bon system_prompt doit inclure les éléments suivants :

Exemple

from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage
from langchain.tools import tool


@tool
def search_course(keyword: str) -> str:
    """Rechercher des cours sur Example"""
    courses = {
        "python": "Tutoriel de base Python3 (gratuit)",
        "html": "Tutoriel de base HTML (gratuit)",
    }
    return courses.get(keyword.lower(), "Aucun cours associé trouvé")


# Un system_prompt bien conçu
GOOD_PROMPT = """Vous êtes le consultant en apprentissage pour Example.

## Vos responsabilités
- Aidez les utilisateurs à trouver des cours de programmation adaptés
- Répondez aux questions liées à l'apprentissage de la programmation
- Recommandez des parcours d'apprentissage en fonction du niveau de l'utilisateur

## Code de conduite
- Gardez les réponses concises, pas plus de 3 phrases à chaque fois
- Préférez utiliser l'outil search_course pour interroger les informations sur les cours
- Si l'utilisateur est un parfait débutant, recommandez en priorité des cours d'introduction
- N’utilisez pas d’emoji
- Si vous ne savez pas, dites-le ; n'inventez pas"""


model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
agent = create_agent(
    model=model,
    tools=[search_course],
    system_prompt=GOOD_PROMPT,
)

result = agent.invoke({
    "messages": [HumanMessage(content="Je suis un parfait débutant et je veux apprendre à programmer. Que me recommandez-vous ?")]
})
print(result["messages"][-1].content)

Sortie :

建议从 Python3 基础教程开始学习。Python 语法简洁,适合零基础入门。
该课程在Example 上免费提供,内容系统全面。

@dynamic_prompt — Génération dynamique de prompts

Un system_prompt statique traite tous les utilisateurs de la même manière. Dans les applications réelles, cependant, vous devrez peut-être ajuster dynamiquement le prompt en fonction des informations sur l'utilisateur, du contexte de la conversation, du moment, etc.

@dynamic_promptLe décorateur vous permet de générer dynamiquement le system_prompt avant chaque appel au modèle.

Exemple

from langchain.agents import create_agent
from langchain.agents.middleware import dynamic_prompt
from langchain.agents.middleware.types import ModelRequest
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage
from langchain.tools import tool


@tool
def search_course(keyword: str) -> str:
    """Rechercher des cours sur Example"""
    courses = {
        "python": "Tutoriel de base Python3 (Gratuit, 20 heures)",
        "html": "Tutoriel de base HTML (Gratuit, 15 heures)",
        "java": "Tutoriel Java de base (Gratuit, 25 heures)",
    }
    return courses.get(keyword.lower(), "Aucun cours associé trouvé")


# décorateur @dynamic_prompt : reçoit ModelRequest, renvoie un nouveau system_prompt
@dynamic_prompt
def personalized_prompt(request: ModelRequest) -> str:
    """Générer dynamiquement un prompt personnalisé en fonction du contexte de la conversation"""
    messages = request.state.get("messages", [])
    message_count = len(messages)

    # Vous pouvez ajuster dynamiquement le prompt en fonction de différentes conditions
    base_prompt = "Vous êtes le conseiller en apprentissage pour Example."

    if message_count <= 2:
        # La conversation vient de commencer ; guidez avec patience
        return base_prompt + (
            "L'utilisateur vient de commencer la conversation ; saluez-le chaleureusement d'abord,"
            "puis demandez-lui ses objectifs d'apprentissage et son niveau actuel."
        )
    elif message_count > 10:
        # Longue conversation ; rappeler de rester concis
        return base_prompt + (
            "La conversation est déjà assez longue ; gardez les réponses aussi concises que possible,"
            "pas plus de 2 phrases à chaque fois."
        )
    else:
        # Phase de conversation normale
        return base_prompt + (
            "Recommandez des cours adaptés en fonction des questions précédentes de l'utilisateur,"
            "utilisez l'outil search_course pour interroger les informations sur les cours."
        )


model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
agent = create_agent(
    model=model,
    tools=[search_course],
    middleware=[personalized_prompt],  # Injecté via middleware
)

# Première conversation (message_count <= 2, mode de guidage)
result = agent.invoke({
    "messages": [HumanMessage(content="Hello")]
})
print(f"Réponse du premier tour : {result['messages'][-1].content}")

Sortie :

First reply: 你好!欢迎来到Example。请问您想学习什么内容?
目前的编程水平如何?我可以根据您的情况推荐合适的课程。

@dynamic_prompt Avancé — Combinaison du contexte d'exécution

Le paramètre request de @dynamic_prompt fournit de riches informations :

Exemple

from datetime import datetime
from langchain.agents.middleware import dynamic_prompt
from langchain.agents.middleware.types import ModelRequest


@dynamic_prompt
def context_aware_prompt(request: ModelRequest) -> str:
    """Générer dynamiquement des prompts en fonction des informations de l'utilisateur, du moment et de l'étape de la conversation"""
    # Obtenir les informations de l'utilisateur à partir de runtime.context
    context = request.runtime.context
    user_name = context.get("user_name", "Étudiant") if context else "Étudiant"
    user_level = context.get("user_level", "Débutant") if context else "Débutant"

    # Obtenir l'heure actuelle
    now = datetime.now()
    greeting = "Bonjour" if now.hour < 12 else "Bon après-midi" if now.hour < 18 else "Bonsoir"

    # Obtenir le nombre actuel de messages
    messages = request.state.get("messages", [])

    prompt = f"""Vous êtes le conseiller pédagogique pour Example.

Heure actuelle : {now.strftime('%Y-%m-%d %H:%M')}
Informations utilisateur : {user_name}, niveau {user_level}

## Code de conduite
- Adressez-vous à l'utilisateur en l'appelant "{user_name}"
- Recommandez des cours de difficulté appropriée en fonction du niveau de l'utilisateur ({user_level})
- Soyez aimable mais pas trop verbeux"""


    # Ajouter un prompt de simplification pour les longues conversations
    if len(messages) > 20:
        prompt += "\n- La conversation est très longue ; gardez les réponses aussi concises que possible"

    return prompt

@dynamic_prompt s'exécute avant chaque appel au modèle, donc le prompt peut changer au fur et à mesure que la conversation progresse. Cependant, évitez d'effectuer des calculs lourds à l'intérieur, car cela affecterait la vitesse de réponse.


Contrôle manuel de la priorité du prompt système

Si le system_prompt de create_agent() et le middleware @dynamic_prompt sont tous deux définis, le middleware a la priorité la plus élevée—il remplacera le prompt statique.

Exemple

from langchain.agents import create_agent
from langchain.agents.middleware import dynamic_prompt
from langchain.agents.middleware.types import ModelRequest
from langchain.chat_models import init_chat_model


@dynamic_prompt
def override_prompt(request: ModelRequest) -> str:
    """Le system_prompt de ce middleware remplacera le paramètre dans create_agent"""
    return "Tu es un chat ; chaque réponse doit se terminer par 'meow'."


model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0.7)
agent = create_agent(
    model=model,
    system_prompt="Vous êtes un consultant professionnel en formation pour Example.",  # Remplacé
    middleware=[override_prompt],  # Priorité supérieure
)

result = agent.invoke({
    "messages": [{"role": "user", "content": "Présentez-vous"}]
})
print(result["messages"][-1].content)

Sortie :

I am a cute cat assistant, meow~ Here specifically to help everyone answer all kinds of questions, meow!

Si vous souhaitez que le prompt du middleware fusionne avec le prompt statique plutôt que de le remplacer, vous pouvez les concaténer manuellement dans @dynamic_prompt. Le system_prompt d'origine n'est pas directement exposé dans request, donc si vous devez préserver le contenu d'origine, il est recommandé de référencer le prompt statique comme variable dans la fonction.


Liste de contrôle pour la conception de prompt système

ÉlémentDescriptionExemple
Définition du rôleClarifier l'identité et les responsabilités de l'IAVous êtes le consultant en formation pour Example
Code de conduiteContraindre le style et les limites des réponsesGarder des réponses concises, pas plus de 3 phrases à chaque fois
Directives d'utilisation des outilsIndiquer au modèle quand utiliser quel outilPrivilégier l'outil search_course lors de la recherche de cours
Contraintes de limitesPréciser ce qui ne peut pas être faitSi vous ne savez pas, dites-le ; n'inventez rien
Exigences de formatPréciser le format des réponses (facultatif)Les réponses utilisent le format Markdown

Nous maîtrisons désormais l'utilisation des prompts statiques et dynamiques. Le prochain article abordera la sortie en streaming, qui permet aux réponses de l'Agent d'apparaître caractère par caractère, comme lors d'une saisie au clavier.

Autres extensions