Output-parsers en callbacks
Leer LLM-uitvoer effectief te structureren met parsers en callbacks te gebruiken om uw LangChain-applicaties te monitoren en debuggen.
Output-parsers en callbacks is een gratis LangChain / RAG / vectordatabases-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject LangChain / RAG / vectordatabases. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus LangChain / RAG / vectordatabases bevat in totaal 4 lessen.
Ongestructureerde uitvoer van LLM's
Large Language Models (LLM's) zijn indrukwekkend, maar hun onbewerkte tekstuitvoer kan vaak rommelig en inconsistent zijn. Stel dat je een LLM om een lijst met items vraagt: soms krijg je een tekenreeks met komma's, soms een lijst met opsommingstekens en soms zelfs een volledige alinea!
Door dit gebrek aan structuur is het lastig voor je toepassingen om de informatie betrouwbaar te verwerken en te gebruiken. Hoe kunnen we LLM's voorspelbare gegevens laten leveren?
Wat zijn uitvoerparsers?
Uitvoerparsers zijn hulpmiddelen in LangChain die zijn ontworpen om de ongestructureerde, vrije tekstreacties van LLM's om te zetten in een gestructureerde, bruikbare indeling.
Ze vormen een brug door onbewerkte tekst om te zetten in Python-objecten zoals lijsten, woordenboeken of Pydantic-modellen. Zo ontvangt je toepassing altijd gegevens in de verwachte vorm, waardoor je code robuuster en eenvoudiger te beheren wordt.
Lijsten parseren: CommaSeparatedListOutputParser
Een van de eenvoudigste uitvoerparsers is de CommaSeparatedListOutputParser. Deze is ideaal wanneer je verwacht dat de LLM een lijst met door komma's gescheiden items retourneert.
LangChain voegt automatisch instructies aan je prompt toe om de LLM te helpen uitvoer in de juiste indeling te produceren. Probeer dit voorbeeld uit te voeren:
from langchain.prompts import PromptTemplate
from langchain_core.output_parsers import CommaSeparatedListOutputParser
# Mock LLM for demonstration without actual API calls
class MockLLM:
def invoke(self, prompt, config=None):
if "list 3 programming languages" in prompt:
return "Python, Java, C++"
return "Default response"
def main():
parser = CommaSeparatedListOutputParser()
prompt = PromptTemplate(
template="List 3 programming languages.\n{format_instructions}",
input_variables=[],
partial_variables={
"format_instructions": parser.get_format_instructions()
},
)
llm = MockLLM() # In a real app, replace with ChatOpenAI, etc.
chain = prompt | llm | parser
result = chain.invoke({})
print(f"Parsed result: {result}")
print(f"Type: {type(result)}")
if __name__ == "__main__":
main()Gestructureerde uitvoer met Pydantic
Voor complexere gegevens, zoals het ophalen van iemands naam, leeftijd en woonplaats, werkt LangChain uitstekend samen met Pydantic. Met Pydantic kun je gegevensschema's definiëren met Python-klassen die typeaanduidingen bevatten.
De PydanticOutputParser gebruikt je Pydantic-model om gedetailleerde instructies voor de LLM te genereren en deze te laten sturen naar een JSON-tekenreeks die precies overeenkomt met de gewenste structuur.
PydanticOutputParser in actie
Hier definiëren we een Pydantic-model Person. De parser zorgt er vervolgens voor dat de uitvoer van de LLM rechtstreeks kan worden omgezet in een instantie van deze klasse, zodat je sterk getypeerde, gestructureerde gegevens krijgt.
Let erop hoe parser.get_format_instructions() de LLM begeleidt.
from langchain.prompts import PromptTemplate
from langchain_core.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
# Mock LLM for demonstration
class MockLLM:
def invoke(self, prompt, config=None):
if "extract information about a person" in prompt:
# LLM would output JSON matching Pydantic schema
return '{"name": "Alice", "age": 30, "city": "New York"}'
return "Default response"
class Person(BaseModel):
name: str = Field(description="The person's name")
age: int = Field(description="The person's age")
city: str = Field(description="The city the person lives in")
def main():
parser = PydanticOutputParser(pydantic_object=Person)
prompt = PromptTemplate(
template="Extract information about a person from the text 'Alice is 30 years old and lives in New York'.\n{format_instructions}",
input_variables=[],
partial_variables={
"format_instructions": parser.get_format_instructions()
},
)
llm = MockLLM() # In a real app, replace with ChatOpenAI, etc.
chain = prompt | llm | parser
result = chain.invoke({})
print(f"Parsed result: {result}")
print(f"Type: {type(result)}")
print(f"Name: {result.name}, Age: {result.age}")
if __name__ == "__main__":
main()Bewaken met callbacks
Naast het verkrijgen van gestructureerde uitvoer wil je vaak begrijpen wat er *binnen* je LangChain-toepassing gebeurt. Daar komen callbacks van pas.
Met callbacks kun je inhaken op verschillende gebeurtenissen tijdens de uitvoering van een keten, bijvoorbeeld wanneer een aanroep naar een LLM begint of eindigt, wanneer een hulpmiddel wordt gebruikt of wanneer een keten is voltooid.
- Logboekregistratie: Bekijk gedetailleerde stappen.
- Foutopsporing: Lokaliseer problemen snel.
- Bewaking: Houd prestaties en gebruik bij.
- Streamen: Toon tussenliggende gedachten van de LLM.
Eenvoudige bewaking: StdOutCallbackHandler
LangChain biedt verschillende ingebouwde callback-handlers. De StdOutCallbackHandler is een goed startpunt, omdat deze alle belangrijke gebeurtenissen rechtstreeks naar je console afdrukt.
Zo krijg je in realtime inzicht in het uitvoeringsverloop van de keten, inclusief invoer, uitvoer en eventuele fouten van de LLM. Voeg de handler toe aan de configuratie van je keten:
from langchain.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain.callbacks import StdOutCallbackHandler
from langchain_core.runnables import RunnablePassthrough
from langchain_core.messages import AIMessage, HumanMessage
# Mock Chat Model for demonstration purposes
class MockChatModel:
def invoke(self, messages, config=None):
callbacks = config.get("callbacks", []) if config else []
# Extract input text from messages
input_text = ""
if isinstance(messages, list) and messages:
input_text = messages[0].content if isinstance(messages[0], HumanMessage) else str(messages[0])
else:
input_text = str(messages)
# Simulate on_llm_start event
for handler in callbacks:
if hasattr(handler, 'on_llm_start'):
handler.on_llm_start({"name": "MockChatModel"}, [input_text])
# Simulate LLM processing and response
response_content = f"Mock response for: '{input_text[:50]}...'"
# Simulate on_llm_end event
for handler in callbacks:
if hasattr(handler, 'on_llm_end'):
handler.on_llm_end(response_content)
return AIMessage(content=response_content)
def main():
handler = StdOutCallbackHandler()
llm = MockChatModel() # Replace with actual LLM like ChatOpenAI
prompt = PromptTemplate.from_template("Tell me a short fact about {topic}.")
chain = (
{"topic": RunnablePassthrough()} # Input for the prompt
| prompt
| llm
| StrOutputParser()
)
print("--- Running chain with StdOutCallbackHandler ---")
# Pass the handler to the chain's invoke method via config
result = chain.invoke("Python programming language", config={"callbacks": [handler]})
print(f"\nFinal Result: {result}")
if __name__ == "__main__":
main()Callbacks aanpassen
Voor geavanceerde scenario's kun je je eigen aangepaste callback-handlers maken. Door over te erven van BaseCallbackHandler kun je specifieke methoden overschrijven, zodat je precies naar wens op gebeurtenissen reageert.
Hiermee kun je zeer gerichte logboekregistratie toepassen, integreren met externe bewakingssystemen of interactieve UI-elementen bouwen die in realtime worden bijgewerkt. Belangrijke methoden om te overschrijven zijn:
on_llm_start: Voordat een LLM-aanroep begint.on_chain_end: Nadat een keten is voltooid.on_tool_start: Voordat een agent een hulpmiddel gebruikt.on_agent_action: Wanneer een agent een actie kiest.
Controle over uitvoerparsers en callbacks
Uitvoerparsers en callbacks zijn fundamenteel voor het bouwen van robuuste, inzichtelijke en betrouwbare LangChain-toepassingen. Laten we testen of je het begrijpt.
Samenvatting van de les
Goed gedaan! Vandaag heb je twee essentiële LangChain-concepten beheerst:
- Uitvoerparsers: Deze hulpmiddelen brengen orde in reacties van LLM's door ongestructureerde tekst om te zetten in voorspelbare Python-objecten, zoals lijsten of Pydantic-modellen. Ze zijn cruciaal om je LLM-toepassingen betrouwbaar te maken.
- Callbacks: Je hebt geleerd hoe callbacks diepgaand inzicht geven in de uitvoering van je keten. Ze zijn onmisbaar voor logboekregistratie, foutopsporing, bewaking en zelfs het streamen van realtime-updates vanuit je LangChain-toepassingen.
Deze bouwstenen zijn essentieel voor het maken van geavanceerde oplossingen die door LLM's worden aangedreven en inzichtelijk zijn!
Leer LangChain / RAG / vectordatabases met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 12
- Lessen
- 48
Veelgestelde vragen
Is de les “Output-parsers en callbacks” gratis?
Ja — de volledige tekst van “Output-parsers en callbacks” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus LangChain / RAG / vectordatabases wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus LangChain / RAG / vectordatabases bevat in totaal 4 lessen.
Wat leer ik in “Output-parsers en callbacks”?
Leer LLM-uitvoer effectief te structureren met parsers en callbacks te gebruiken om uw LangChain-applicaties te monitoren en debuggen. Je oefent met LangChain / RAG / vectordatabases door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met LangChain / RAG / vectordatabases te beginnen?
Ervaring vooraf is niet nodig. LangChain / RAG / vectordatabases op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Output-parsers en callbacks”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over LangChain / RAG / vectordatabases?
Ja. Elke les over LangChain / RAG / vectordatabases bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Uw LangChain-omgeving instellen
- Prompts, LLM's en basisketens
- Output-parsers en callbacks
- Geheugen en conversatiecontext in LangChain