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

StrategiePrinzipModellunterstützungReaktionsgeschwindigkeit
ToolStrategyTarnt das Schema als Tool; das Modell "ruft" dieses Tool auf, um strukturierte Daten auszugebenAlle Modelle, die Funktionsaufrufe unterstützenLangsamer (ein zusätzlicher Tool-Aufruf)
ProviderStrategyVerwendet die native strukturierte Ausgabefähigkeit des Modells (z. B. OpenAIs response_format)Einige (GPT-4+, Claude 3+, usw.)Schneller (direkte Ausgabe)
AutoStrategyErkennt automatisch die Modellfähigkeiten und wählt die beste Strategie ausAutomatische AnpassungWä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 pydantic import BaseModel, Field
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

from langchain.agents.structured_output import ToolStrategy

# 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 pydantic import BaseModel, Field
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 pydantic import BaseModel, Field
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

SzenarioEmpfohlene StrategieGrund
Nicht sicher, ob das Modell native Ausgabe unterstütztAutoStrategy (Pydantic direkt übergeben)Wählt automatisch die beste Strategie aus
Muss mit verschiedenen Modellen kompatibel seinToolStrategyFunktioniert mit allen Modellen, die Function Calling unterstützen
Strebt maximale Leistung anProviderStrategyÜberspringt den Tool-Calling-Schritt, schneller
Fehlerwiederholung erforderlichToolStrategy(handle_errors=True)Nur ToolStrategy unterstützt handle_errors

In 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.

Andere Erweiterungen