LangChain Strukturierte Ausgabe

Meistens brauchen Sie keinen freien Text, sondern strukturierte Daten – wie etwa ein JSON-Objekt.

Mit LangChain Structured Output kann der Agent Ergebnisse in dem von Ihnen angegebenen Format zurückgeben, sodass Programme sie einfach direkt verwenden können.


Warum benötigen Sie strukturierte Ausgabe?

Angenommen, Sie müssen einen Namen, ein Alter und einen Beruf aus einer Benutzerbeschreibung extrahieren:

MethodeAusgabeformatNachfolgende Verarbeitung
Normale AntwortZhang San ist 28 Jahre alt und ist Ingenieur.Erfordert Regex oder einen erneuten Aufruf des Modells zum Parsen
Strukturierte Ausgabe{name: "Zhang San", age: 28, job: "Engineer"}Direkt als Python-Objekt verwendet

Strukturierte Ausgabe erspart den Schritt des "Parsens von Daten aus Text" und ermöglicht, dass die KI-Ausgabe direkt von Programmen verwendet werden kann.


Die einfachste Verwendung — Übergeben eines Pydantic-Modells

Übergeben Sie einfach das Pydantic-Modell an den Parameter response_format:

Beispiel

from dotenv import load_dotenv
load_dotenv()

from pydantic import BaseModel, Field
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage


# Definiere die erwartete Ausgabestruktur
class CourseInfo(BaseModel):
    """Beispiel für das Extraktionsergebnis eines Tutorial-Kurses"""
    course_name: str = Field(description=Kursname)
    difficulty: str = Field(description=Schwierigkeit: Anfänger/Mittelstufe/Fortgeschritten)
    estimated_hours: int = Field(description=Geschätzte Lerndauer (Stunden))
    is_free: bool = Field(description=Ob es kostenlos ist)


model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
agent = create_agent(
    model=model,
    response_format=CourseInfo,  # Übergeben Sie das Pydantic-Modell
    system_prompt=Sie sind der Kursassistent bei Example Tutorial. Extrahieren Sie Kursinformationen aus Benutzerbeschreibungen.,
)

# Der Benutzer gibt eine unstrukturierte Beschreibung ein
result = agent.invoke({
    "messages": [HumanMessage(
        content=Ich habe kürzlich das Python3 Basics Tutorial studiert, es ist auf Anfängerniveau,
                Es dauert etwa 20 Stunden zum Lernen, und es ist völlig kostenlos.
    )]
})

# Das strukturierte Ergebnis aus structured_response abrufen
if "structured_response" in result:
    course = result["structured_response"]
    print(fKursname: {course.course_name})
    print(fSchwierigkeit: {course.difficulty})
    print(fGeschätzte Dauer: {course.estimated_hours} Stunden)
    print(fKostenlos: {'Ja' if course.is_free else 'Nein'})
    print(fObjekttyp: {type(course)})

Run result:

Course name: Python3 基础教程
Difficulty: 入门
Duration: 20 小时
Free: 是
Object type: <class '__main__.CourseInfo'>

Die zurückgegebene structured_response ist eine Pydantic-Modellinstanz, kein einfaches Dictionary. Das bedeutet, dass Sie auf Attribute wie .course_name zugreifen können, und die IDE kann Autovervollständigung bieten.


Strukturierte Ausgabe zusammen mit Tools

response_format und tools können zusammen verwendet werden—der Agent ruft bei Bedarf tools auf und gibt schließlich strukturierte Daten 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
from langchain.tools import tool


@tool
def search_course(keyword: str) -> str:
    """Kursinformationen auf Example Tutorial suchen"""
    courses = {
        "python": Python3-Grundlagen-Tutorial | Anfänger | Kostenlos | 30 Kapitel | Etwa 20 Stunden,
        "java": Java-Grundlagen-Tutorial | Anfänger | Kostenlos | 35 Kapitel | Etwa 25 Stunden,
        Datenanalyse: Python-Datenanalyse | Mittelstufe | Mitglied | 25 Kapitel | Etwa 30 Stunden,
    }
    return courses.get(keyword.lower(), fKein Kurs gefunden für '{keyword}')


class CourseRecommendation(BaseModel):
    """Ergebnis der Kursempfehlung"""
    course_name: str = Field(description=Empfohlener Kursname)
    reason: str = Field(description=Empfehlungsgrund)
    difficulty: str = Field(description=Schwierigkeit: Anfänger/Mittelstufe/Fortgeschritten)


model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
agent = create_agent(
    model=model,
    tools=[search_course],
    response_format=CourseRecommendation,
    system_prompt=Du bist der Kursberater bei Example Tutorial. Suche zuerst nach Kursen und gib dann Empfehlungen.,
)

result = agent.invoke({
    "messages": [HumanMessage(content=Ich möchte Python lernen. Was empfiehlst du?)]
})

rec = result["structured_response"]
print(fEmpfohlener Kurs: {rec.course_name})
print(fEmpfehlungsgrund: {rec.reason})
print(fSchwierigkeitsgrad: {rec.difficulty})

# Den vollständigen Prozess anzeigen
print("\n"=== Ausführungsprozess ===")
for msg in result["messages"]:
    if msg.type == "tool":
        print(f" Aufruf {msg.name}: {msg.content}")

Run result:

Recommended course: Python3 基础教程
Reason: 该课程免费且适合Python初学者,学习时长约20小时
Difficulty: 入门

=== 执行过程 ===
  调用 search_course: Python3 基础教程 | 入门 | 免费 | 30章 | 约20小时

Komplexe verschachtelte Strukturen

Pydantic unterstützt komplexe Strukturen wie Verschachtelung, Listen, Enums usw.:

Beispiel

from pydantic import BaseModel, Field
from typing import Literal
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage


class Topic(BaseModel):
    """Thema"""
    name: str = Field(description=Themenname)
    order: int = Field(description=Lernreihenfolge, beginnend bei 1)
    minutes: int = Field(description=Empfohlene Lernminuten)


class LearningPlan(BaseModel):
    """Lernplan"""
    goal: str = Field(description=Überblick über das Lernziel)
    level: Literal[Beginner, Intermediate, Advanced] = Field(description=Schwierigkeitsgrad)
    total_hours: float = Field(description=Gesamtdauer (Stunden))
    topics: list[Topic] = Field(description=Themenliste)


model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
agent = create_agent(
    model=model,
    response_format=LearningPlan,
    system_prompt=Du bist der Studienplaner bei Example Tutorial.,
)

result = agent.invoke({
    "messages": [HumanMessage(
        content=Hilf mir, einen Studienplan für Python-Anfänger zu erstellen, wobei die Gesamtzeit 10 hours nicht überschreiten sollte
    )]
})

plan = result["structured_response"]
print(fZiel: {plan.goal})
print(fSchwierigkeit: {plan.level})
print(fGesamtdauer: {plan.total_hours} hours)
print(f"\n"Themenliste ({len(plan.topics)} Elemente):")
for topic in plan.topics:
    print(f" {topic.order}. {topic.name} ({topic.minutes} minutes)")

Run result:

目标: 掌握 Python 基础语法,能够独立编写简单的 Python 程序
Difficulty: 入门
总时长: 9.5 小时

知识点列表 (6 个):
  1. 环境搭建与基础语法 (60分钟)
  2. 数据类型与变量 (90分钟)
  3. 条件判断与循环 (120分钟)
  4. 函数与模块 (120分钟)
  5. 列表与字典 (90分钟)
  6. 综合练习 (90分钟)

Strukturierte Ausgabe aus Nachrichten abrufen

Wenn du die Tool-Aufruf-Fähigkeit des Agenten nicht benötigst und nur strukturierte Informationen aus Text extrahieren möchtest, kannst du das Modell direkt verwenden:

Beispiel

from pydantic import BaseModel, Field
from langchain.chat_models import init_chat_model


class SentimentResult(BaseModel):
    """Ergebnis der Sentimentanalyse"""
    sentiment: str = Field(description=Positiv/Negativ/Neutral)
    score: float = Field(description=Sentiment-Intensität 0~1)
    keywords: list[str] = Field(description=Wichtige Sentiment-Wörter)


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

# with_structured_output() direkt auf dem Modell verwenden
# Kein Agent erforderlich
structured_model = model.with_structured_output(SentimentResult)

texts = [
    Das Beispiel-Tutorial ist wirklich großartig zu verwenden. Sehr empfehlenswert!,
    Dieses Tutorial hat zu wenig Inhalt. Es lohnt sich nicht.,
    Das Wetter ist heute schön.,
]

for text in texts:
    result = structured_model.invoke(text)
    print(fText: {text[:30]}...)
    print(f" Stimmung: {result.sentiment}, Intensität: {result.score}, Schlüsselwörter: {result.keywords}")

Run result:

Text: Example 真的太好用了,强烈推荐!...
  Sentiment: 积极, 强度: 0.95, 关键词: ['好用', '推荐']
Text: 这个教程内容太少了,不太值。...
  Sentiment: 消极, 强度: 0.7, 关键词: ['内容太少', '不太值']
Text: 今天天气不错。...
  Sentiment: 中性, 强度: 0.1, 关键词: ['不错']

with_structured_output() ist eine Methode des Modells und kann ohne einen Agenten verwendet werden. Wenn es in Ihrem Szenario um 'Informationsextraktion' statt um 'mehrstufiges Reasoning' geht, ist die direkte Verwendung von with_structured_output() einfacher und effizienter.

Andere Erweiterungen