LangChain Ausgabestrategien
LangChain bietet drei Strategien für strukturierte Ausgaben. Ein Verständnis ihrer Unterschiede und ihrer Funktionsweise kann Ihnen helfen, in verschiedenen Szenarien die beste Wahl zu treffen.
Überblick über die drei Strategien
| Strategie | Prinzip | Modellunterstützung | Reaktionsgeschwindigkeit |
|---|---|---|---|
| ToolStrategy | Tarnt das Schema als Tool; das Modell "ruft" dieses Tool auf, um strukturierte Daten auszugeben | Alle Modelle, die Funktionsaufrufe unterstützen | Langsamer (ein zusätzlicher Tool-Aufruf) |
| ProviderStrategy | Verwendet die native strukturierte Ausgabefähigkeit des Modells (z. B. OpenAIs response_format) | Einige (GPT-4+, Claude 3+, usw.) | Schneller (direkte Ausgabe) |
| AutoStrategy | Erkennt automatisch die Modellfähigkeiten und wählt die beste Strategie aus | Automatische Anpassung | Wählt automatisch das Optimale aus |
ToolStrategy — Tool-Calling-Modus
ToolStrategy ist der kompatibelste Ansatz. Es wandelt dein Schema in ein "fake tool" um, und das Modell gibt strukturierte Daten aus, indem es dieses Tool aufruft.
Beispiel
from langchain.agents import create_agent
from langchain.agents.structured_output import ToolStrategy
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage
class WeatherReport(BaseModel):
"""Wetterbericht"""
city: str = Field(description="Stadtname")
temperature: float = Field(description="Temperatur (Celsius)")
condition: str = Field(description="Wetterzustand")
humidity: int = Field(description="Luftfeuchtigkeit in Prozent")
model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
# ToolStrategy explizit angeben
agent = create_agent(
model=model,
response_format=ToolStrategy(schema=WeatherReport),
system_prompt="Du bist ein Wetterassistent. Erstelle einen strukturierten Wetterbericht basierend auf der Beschreibung des Benutzers.",
)
result = agent.invoke({
"messages": [HumanMessage(content="Hangzhou ist heute sonnig, 25 Grad, Luftfeuchtigkeit 60%")]
})
report = result["structured_response"]
print(f"Stadt: {report.city}")
print(f"Temperatur: {report.temperature}°C")
print(f"Zustand: {report.condition}")
print(f"Luftfeuchtigkeit: {report.humidity}%")
# Ausführungsprozess anzeigen — Sie können eine zusätzliche Tool-Aufrufnachricht sehen
print(f"\n"Nachrichten insgesamt: {len(result['messages'])}")
for msg in result["messages"]:
print(f" [{msg.type}]", end="")
if hasattr(msg, 'tool_calls') and msg.tool_calls:
print(f" Aufrufe: {[tc['name'] for tc in msg.tool_calls]}")
elif msg.type == "tool":
print(f" {msg.content[:60]}")
else:
print(f" {str(msg.content)[:60]}")
Ausgabe:
City: 杭州 Temperature: 25.0°C Condition: 晴天 Humidity: 60% Total messages: 4 [human] 杭州今天晴天,温度25度,湿度60% [ai] 调用: ['WeatherReport'] [tool] Returning structured response: ... [ai]
Sie können sehen, dass ToolStrategy einen zusätzlichen Tool-Aufruf-Schritt hinzufügt (Aufruf eines „Fake-Tools“ namens WeatherReport), bevor die strukturierte Ausgabe erzeugt wird.
handle_errors — Fehlerwiederholung
ToolStrategy unterstützt Wiederholung, wenn die strukturierte Ausgabe fehlschlägt.
Beispiel
# handle_errors=True: Wenn das Ausgabeformat falsch ist, die Fehlermeldung zum erneuten Versuch an das Modell zurückgeben
strategy_with_retry = ToolStrategy(
schema=WeatherReport,
handle_errors=True, # Standard ist False
)
# handle_errors kann auch eine benutzerdefinierte Fehlermeldungsvorlage sein
strategy_custom_error = ToolStrategy(
schema=WeatherReport,
handle_errors="Das Format ist falsch. Bitte korrigieren Sie es gemäß {error} und geben Sie es erneut aus.",
)
ProviderStrategy — Native strukturierte Ausgabe
ProviderStrategy nutzt die nativen Fähigkeiten des Modellanbieters (wie den response_format-Parameter von OpenAI). Nicht alle Modelle unterstützen dies.
Beispiel
from langchain.agents import create_agent
from langchain.agents.structured_output import ProviderStrategy
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage
class CourseInfo(BaseModel):
"""Kursinformationen"""
name: str = Field(description="Kursname")
level: str = Field(description="Schwierigkeit: Anfänger/Mittelstufe/Fortgeschritten")
price: str = Field(description="Preisinformationen")
model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
# ProviderStrategy explizit angeben
agent = create_agent(
model=model,
response_format=ProviderStrategy(schema=CourseInfo),
system_prompt="Du bist der Kursassistent für EXAMPLE.",
)
result = agent.invoke({
"messages": [HumanMessage(content="Das Python-3-Grundlagen-Tutorial ist ein kostenloser Anfängerkurs")]
})
course = result["structured_response"]
print(f"Kurs: {course.name}")
print(f"Schwierigkeit: {course.level}")
print(f"Preis: {course.price}")
print(f"\n"Anzahl der Nachrichten: {len(result['messages'])}") # Weniger als ToolStrategy
Ausgabe:
Course: Python3 基础教程 Difficulty: 入门 Price: 免费 Message count: 2
Im Vergleich zu ToolStrategy hat ProviderStrategy weniger Nachrichten (2 vs 4), da es keinen zusätzlichen Tool-Aufrufschritt erfordert.
ProviderStrategy wird derzeit hauptsächlich von OpenAIs GPT-4o und höher sowie Claude 3 und höher unterstützt. Wenn das Modell dies nicht unterstützt, fällt LangChain automatisch auf ToolStrategy zurück. Du kannst über model.profile prüfen, ob das Modell dies unterstützt.
AutoStrategy — Automatische Auswahl
Dies ist der am meisten empfohlene Ansatz. Übergeben Sie ein Pydantic-Modell (anstelle eines Strategieobjekts), und LangChain wählt automatisch die beste Strategie aus:
Beispiel
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage
class Analysis(BaseModel):
"""Analyseergebnis"""
summary: str = Field(description="Ein-Satz-Zusammenfassung")
score: int = Field(description="Bewertung 1~10")
pros: list[str] = Field(description="Liste der Vorteile")
cons: list[str] = Field(description="Liste der Nachteile")
# Übergeben Sie direkt ein Pydantic-Modell — LangChain wählt automatisch die Strategie aus
model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
agent = create_agent(
model=model,
response_format=Analysis, # Übergeben Sie das Modell direkt; die Strategie wird automatisch ausgewählt
system_prompt="Sie sind ein Experte für Kursbewertung. Bewerten Sie den vom Benutzer beschriebenen Kurs.",
)
result = agent.invoke({
"messages": [HumanMessage(
content="EXAMPLEs Python-Kurs: umfassende und systematische Inhalte,"
"reich an Beispielen und völlig kostenlos. Allerdings sind Video-Tutorials begrenzt,"
"und die Abdeckung fortgeschrittener Inhalte ist unzureichend."
)]
})
analysis = result["structured_response"]
print(f"Zusammenfassung: {analysis.summary}")
print(f"Punktzahl: {analysis.score}/10")
print(f"Vorteile: {', '.join(analysis.pros)}")
print(f"Nachteile: {', '.join(analysis.cons)}")
Ausgabe:
Summary: Example Python 课程内容系统且免费,但缺乏视频教学和高级内容 Rating: 7/10 Pros: 内容系统全面, 实例丰富, 完全免费 Cons: 视频教程较少, 高级内容覆盖不够
Leitfaden zur Auswahl unter drei Strategien
| Szenario | Empfohlene Strategie | Grund |
|---|---|---|
| Nicht sicher, ob das Modell native Ausgabe unterstützt | AutoStrategy (Pydantic direkt übergeben) | Wählt automatisch die beste Strategie aus |
| Muss mit verschiedenen Modellen kompatibel sein | ToolStrategy | Funktioniert mit allen Modellen, die Function Calling unterstützen |
| Strebt maximale Leistung an | ProviderStrategy | Überspringt den Tool-Calling-Schritt, schneller |
| Fehlerwiederholung erforderlich | ToolStrategy(handle_errors=True) | Nur ToolStrategy unterstützt handle_errors |
Andere ErweiterungenIn den meisten Fällen reicht es aus, direkt ein Pydantic-Modell zu übergeben (d. h. AutoStrategy zu verwenden). Nur wenn Sie Fehlerwiederholung oder explizite Kontrolle über das Strategieverhalten benötigen, müssen Sie ToolStrategy oder ProviderStrategy explizit angeben.