LangChain Prompts -- System-Prompt und dynamischer Prompt
Der System-Prompt ist das zentrale Mittel zur Steuerung des Agentenverhaltens.
Dieser Abschnitt führt in die Verwendung von statischen Prompts und dynamischen Prompts ein.
system_prompt-Parameter
Der system_prompt-Parameter von create_agent() akzeptiert zwei Formen:
Beispiel
from langchain.chat_models import init_chat_model
from langchain.messages import SystemMessage
model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
# Methode 1: String (am einfachsten)
agent = create_agent(
model=model,
system_prompt="Sie sind der Lernberater für Example. Halten Sie Ihre Antworten prägnant und professionell.",
)
# Methode 2: SystemMessage-Objekt (wiederverwendbar)
system_msg = SystemMessage(
content="Sie sind der Lernberater für Example. Halten Sie Ihre Antworten prägnant und professionell."
)
agent = create_agent(model=model, system_prompt=system_msg)
Effektive System-Prompts entwerfen
Ein guter system_prompt sollte die folgenden Elemente enthalten:
Beispiel
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:
"""Suche nach Kursen auf Example"""
courses = {
"python": "Python3 Grundlagen-Tutorial (Kostenlos)",
"html": "HTML Grundlagen-Tutorial (Kostenlos)",
}
return courses.get(keyword.lower(), "Keine verwandten Kurse gefunden")
# Ein gut gestalteter system_prompt
GOOD_PROMPT = """Du bist der Lernberater für Example.
## Deine Aufgaben
- Hilf Nutzern, geeignete Programmierkurse zu finden
- Beantworte Fragen zum Programmierlernen
- Empfehle Lernpfade basierend auf dem Niveau des Nutzers
## Verhaltenskodex
- Halte die Antworten knapp, jeweils nicht mehr als 3 Sätze
- Bevorzuge die Verwendung des Tools search_course, um Kursinformationen abzufragen
- Wenn der Benutzer ein absoluter Anfänger ist, priorisiere die Empfehlung von Einführungskursen
- Verwende keine Emojis
- Wenn du etwas nicht weißt, sag es; erfinde nichts"""
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="Ich bin ein absoluter Anfänger und möchte Programmieren lernen. Was empfiehlst du?")]
})
print(result["messages"][-1].content)
Ausgabe:
建议从 Python3 基础教程开始学习。Python 语法简洁,适合零基础入门。 该课程在Example 上免费提供,内容系统全面。
@dynamic_prompt — Dynamisches Generieren von Prompts
Ein statischer system_prompt behandelt alle Benutzer gleich. In realen Anwendungen kann es jedoch erforderlich sein, den Prompt dynamisch anzupassen – basierend auf Benutzerinformationen, Gesprächskontext, Zeit und so weiter.
@dynamic_promptDer Decorator ermöglicht es dir, den system_prompt vor jedem Modellaufruf dynamisch zu generieren.
Beispiel
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:
"""Suche nach Kursen auf Example"""
courses = {
"python": "Python3 Basis-Tutorial (kostenlos, 20 Stunden)",
"html": "HTML Basis-Tutorial (kostenlos, 15 Stunden)",
"java": "Java-Grundlagen-Tutorial (kostenlos, 25 Stunden)",
}
return courses.get(keyword.lower(), "Keine verwandten Kurse gefunden")
# @dynamic_prompt Dekorator: empfängt ModelRequest, gibt einen neuen system_prompt zurück
@dynamic_prompt
def personalized_prompt(request: ModelRequest) -> str:
"""Erzeuge dynamisch einen personalisierten Prompt basierend auf dem Gesprächskontext"""
messages = request.state.get("messages", [])
message_count = len(messages)
# Du kannst den Prompt dynamisch an unterschiedliche Bedingungen anpassen
base_prompt = "Du bist der Lernberater für Example."
if message_count <= 2:
# Das Gespräch hat gerade begonnen; leite geduldig an
return base_prompt + (
"Der Benutzer hat gerade erst das Gespräch begonnen; begrüße ihn zuerst herzlich,"
"frage dann nach seinen Lernzielen und seinem aktuellen Niveau."
)
elif message_count > 10:
# Lange Konversation; daran erinnern, prägnant zu bleiben
return base_prompt + (
"Die Unterhaltung ist bereits ziemlich lang; halte die Antworten so prägnant wie möglich,"
"jedes Mal nicht mehr als 2 Sätze."
)
else:
# Normale Gesprächsphase
return base_prompt + (
"Empfehle geeignete Kurse basierend auf den vorherigen Fragen des Benutzers,"
"Verwende das Tool search_course, um Kursinformationen abzufragen."
)
model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
agent = create_agent(
model=model,
tools=[search_course],
middleware=[personalized_prompt], # Über Middleware injiziert
)
# Erstes Gespräch (message_count <= 2, Anleitungsmodus)
result = agent.invoke({
"messages": [HumanMessage(content="Hello")]
})
print(f"Antwort der ersten Runde: {result['messages'][-1].content}")
Ausgabe:
First reply: 你好!欢迎来到Example。请问您想学习什么内容? 目前的编程水平如何?我可以根据您的情况推荐合适的课程。
@dynamic_prompt Fortgeschritten — Laufzeitkontext kombinieren
Der Parameter request von @dynamic_prompt bietet umfangreiche Informationen:
Beispiel
from langchain.agents.middleware import dynamic_prompt
from langchain.agents.middleware.types import ModelRequest
@dynamic_prompt
def context_aware_prompt(request: ModelRequest) -> str:
"""Dynamisch Prompts basierend auf Benutzerinformationen, Zeit und Gesprächsphase generieren"""
# Benutzerinformationen aus runtime.context abrufen
context = request.runtime.context
user_name = context.get("user_name", "Student") if context else "Student"
user_level = context.get("user_level", "Anfänger") if context else "Anfänger"
# Aktuelle Zeit abrufen
now = datetime.now()
greeting = "Guten Morgen" if now.hour < 12 else "Guten Tag" if now.hour < 18 else "Guten Abend"
# Aktuelle Nachrichtenanzahl abrufen
messages = request.state.get("messages", [])
prompt = f"""Du bist der Lernberater für Example.
Aktuelle Zeit: {now.strftime('%Y-%m-%d %H:%M')}
Benutzerinfo: {user_name}, {user_level} Level
## Verhaltenskodex
- Sprich den Benutzer mit "{user_name}" an
- Empfehle Kurse mit angemessener Schwierigkeit basierend auf dem Level des Benutzers ({user_level})
- Sei freundlich, aber nicht wortreich"""
# Einen Vereinfachungs-Prompt für lange Gespräche anhängen
if len(messages) > 20:
prompt += "\n- Die Konversation ist sehr lang; halte Antworten so knapp wie möglich"
return prompt
@dynamic_prompt wird vor jedem Modellaufruf ausgeführt, sodass sich der Prompt ändern kann, während das Gespräch fortschreitet. Vermeide jedoch aufwendige Berechnungen darin, da dies die Antwortgeschwindigkeit beeinflusst.
Manuelles Steuern der System-Prompt-Priorität
Wenn sowohl der system_prompt von create_agent() als auch die @dynamic_prompt-Middleware gesetzt sind, hat die Middleware höhere Priorität – sie überschreibt den statischen Prompt.
Beispiel
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:
"""Der system_prompt dieser Middleware überschreibt die Einstellung in create_agent"""
return "Du bist eine Katze; jede Antwort muss mit 'meow' enden."
model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0.7)
agent = create_agent(
model=model,
system_prompt="Du bist ein professioneller Lernberater für Example.", # Überschrieben
middleware=[override_prompt], # Höhere Priorität
)
result = agent.invoke({
"messages": [{"role": "user", "content": "Stell dich vor"}]
})
print(result["messages"][-1].content)
Ausgabe:
I am a cute cat assistant, meow~ Here specifically to help everyone answer all kinds of questions, meow!
Wenn du möchtest, dass der Middleware-Prompt mit dem statischen Prompt zusammengeführt wird, anstatt ihn zu überschreiben, kannst du sie in @dynamic_prompt manuell verketten. Der ursprüngliche system_prompt wird in request nicht direkt bereitgestellt, wenn du also den ursprünglichen Inhalt bewahren möchtest, wird empfohlen, den statischen Prompt als Variable in der Funktion zu referenzieren.
Checkliste zur Gestaltung des System-Prompts
| Element | Beschreibung | Beispiel |
|---|---|---|
| Rollendefinition | Identität und Verantwortlichkeiten der KI klären | Du bist der Lernberater für Example |
| Verhaltenskodex | Stil und Grenzen der Antworten einschränken | Antworten prägnant halten, jeweils nicht mehr als 3 Sätze |
| Richtlinien zur Tool-Nutzung | Dem Modell sagen, wann welche Tools verwendet werden sollen | Bevorzuge das Tool search_course beim Abfragen von Kursen |
| Grenzbeschränkungen | Angeben, was nicht getan werden darf | Wenn du etwas nicht weißt, sag es; erfinde nichts |
| Formatanforderungen | Das Format der Antworten angeben (optional) | Antworten verwenden das Markdown-Format |
Jetzt haben wir die Verwendung von statischen und dynamischen Prompts gemeistert. Der nächste Artikel behandelt die Streaming-Ausgabe, mit der die Antworten des Agenten Zeichen für Zeichen wie beim Tippen erscheinen können.
Andere Erweiterungen