Kurs
LangChain ist ein Open-Source-Framework, mit dem sich ganz einfach Anwendungen auf Basis von Sprachmodellen wie GPT, LLaMA, Mistral usw. entwickeln lassen.
Eines der stärksten Features von LangChain ist die Unterstützung für fortgeschrittenes Prompt Engineering. Prompt Engineering bezeichnet das Gestalten und Optimieren von Prompts, um möglichst präzise und relevante Antworten von einem Sprachmodell zu erhalten.
In diesem Beitrag behandeln wir die Grundlagen von Prompts, wie LangChain mit Prompts arbeitet, Promptvorlagen, Memory, Agents und Chains. Zu jedem dieser Kernkonzepte gibt es mehrere Codebeispiele in Python, sodass du am Ende dieses Tutorials eigene Anwendungen mit dem LangChain-Framework in Python bauen kannst.
Neugierig, wie sich mit LangChain und GPT ein einfacher KI-Agent bauen lässt? Schau dir unser Prompt Engineering mit GPT & LangChain AI Code-Along an:

Was ist Prompt Engineering?

Bild: Autor
Wir haben einen ausführlichen Leitfaden zu Prompt Engineering. Kurz gesagt geht es darum, Texteingaben zu verfassen, die generative KI-Modelle effektiv ansteuern. Diese Prompts, in natürlicher Sprache geschrieben, beschreiben die Aufgabe, die die KI ausführen soll.
Sie können sehr unterschiedlich aussehen – von einfachen Fragen, etwa der Erklärung eines mathematischen Satzes, bis hin zu kreativen Anfragen wie einem Gedicht zu einem bestimmten Thema.
Im Prompt Engineering zählt nicht nur, was du fragst, sondern auch, wie du fragst. Dazu gehören die passende Wortwahl, ein bestimmter Ton oder Stil, der nötige Kontext oder sogar eine Rollenvergabe für die KI – zum Beispiel, dass sie wie eine Muttersprachlerin einer bestimmten Sprache antworten soll.
In manchen Fällen enthalten Prompts auch Beispiele, um die KI zu leiten. Diese Technik, bekannt als Few-Shot Learning, ist besonders bei komplexen Aufgaben wirksam.
Bei Modellen, die Bilder oder Audio generieren, beschreiben Prompts in der Regel das gewünschte Ergebnis detailliert – vom Motiv und Stil über die Komposition bis zur Stimmung des finalen Produkts. Die Kunst des Prompt Engineerings liegt darin, diese Elemente so zu justieren, dass die KI zum gewünschten Ergebnis geführt wird.
Die Grundlagen von Prompts

Bild: Autor
Prompts sind die Eingaben für Large Language Models (LLMs), um eine gewünschte Antwort zu erhalten. Gut gestaltete Prompts sind entscheidend, um nützliche Ausgaben von LLMs zu bekommen. Ziel des Prompt Engineerings ist es, Prompts so aufzubauen, dass die Antworten des LLM präzise, relevant und hilfreich sind.
Ein guter Prompt enthält typischerweise vier Bausteine:
- Anweisungen – Was das Modell tun soll, wie es die bereitgestellten Informationen nutzt, wie es mit der Anfrage umgeht und wie das Ergebnis aufgebaut sein soll.
- Beispielfeingabe – Beispiel-Eingaben, die dem Modell zeigen, was erwartet wird.
- Beispielausgabe – Die dazugehörigen Beispiel-Ausgaben.
- Query – Die eigentliche Eingabe, die das Modell verarbeiten soll.
Bis auf die Query ist alles optional, kann aber die Antwortqualität deutlich beeinflussen – insbesondere die Anweisungen, die das LLM zur Aufgabe und zur erwarteten Antwort leiten.
Beispiele zeigen das gewünschte Output-Format für eine bestimmte Beispielfeingabe.
Die Query ist die Frage oder Anforderung an das LLM.
Wirksame Prompts entstehen, indem du diese Elemente je nach Problemstellung geschickt kombinierst.
LangChain Prompts
LangChain bietet verschiedene Klassen und Funktionen, die beim Erstellen und Arbeiten mit Prompts helfen und so komplexe Aufgaben mit Sprachmodellen leichter beherrschbar machen.
LangChain unterstützt Prompt Engineering erstklassig über das Objekt `PromptTemplate`.
Promptvorlagen dienen als strukturierte Leitfäden, um Anfragen an Sprachmodelle zu formulieren.
Diese Vorlagen bestehen typischerweise aus Anweisungen, einer Auswahl an Beispiel-Eingaben (Few-Shot-Beispiele) sowie zugeschnittenen Fragen und Kontexten für spezifische Aufgaben.
Ziel von LangChain ist es, Vorlagen so zu gestalten, dass sie mit verschiedenen Sprachmodellen kompatibel sind – so lassen sich Templates leichter zwischen Modellen austauschen.
Kurz gesagt: Mit der Klasse PromptTemplate kannst du eine Vorlage für einen String-Prompt erstellen.
from langchain.prompts import PromptTemplate
prompt_template = PromptTemplate.from_template(
"Tell me a {adjective} joke about {content}."
)
prompt_template.format(adjective="sad", content="data scientists")
Ausgabe:
>>> 'Tell me a sad joke about data scientists.'
Es ist nicht zwingend notwendig, Variablen zu verwenden. Du kannst mit dieser Klasse auch einen Prompt erstellen, wenn du keine Variablen hast.
from langchain.prompts import PromptTemplate
prompt_template = PromptTemplate.from_template("Tell me a joke")
prompt_template.format()
Ausgabe:
>>> 'Tell me a joke'
Was, wenn du eine Chat-Anwendung baust, in der du den Nachrichtenverlauf bei jeder neuen Nachricht an das LLM übergeben musst? Das manuell zu erledigen, ist zeitaufwendig.
Für unterstützte Chat-Modelle kannst du stattdessen ChatPromptTemplate verwenden:
from langchain.prompts import ChatPromptTemplate
chat_template = ChatPromptTemplate.from_messages(
[
("system", "You are a helpful AI bot. Your name is {name}."),
("human", "Hello, how are you doing?"),
("ai", "I'm doing well, thanks!"),
("human", "{user_input}"),
]
)
messages = chat_template.format_messages(name="Bob", user_input="What is your name?")
print(messages)
Ausgabe:
>>> [SystemMessage(content='You are a helpful AI bot. Your name is Bob.'),
>>> HumanMessage(content='Hello, how are you doing?'),
>>> AIMessage(content="I'm doing well, thanks!"),
>>> HumanMessage(content='What is your name?')]
Du fragst dich vielleicht, warum wir PromptTemplates brauchen. Warum den String-Prompt nicht direkt an das LLM übergeben? Hier sind gute Gründe für LangChains PromptTemplate:
- Promptvorlagen sind wiederverwendbar. Du erstellst einen Prompt einmal und nutzt ihn in vielen Situationen, z. B. um verschiedene Artikel zu zusammenfassen, ohne den Prompt jedes Mal neu zu schreiben.
- Sie trennen die Formatierung der Prompts vom eigentlichen Modellaufruf. Das macht den Code modularer und erlaubt, Vorlage und Modell unabhängig voneinander zu ändern.
- Templates erhöhen die Lesbarkeit deines Codes, da sie komplexe Logik in ein einfacheres Format mit klar benannten Variablen kapseln.
- Die Wartung wird einfacher, weil Änderungen an der Promptlogik nur an einer zentralen Stelle nötig sind – nicht in jedem einzelnen Prompt.
LangChain Memory
In Chat-Anwendungen mit Sprachmodellen ist es wichtig, dass sich das System frühere Gespräche merkt.
Wie in einem normalen Chat sollte das System auf bereits Gesagtes zurückgreifen können.
Im einfachsten Fall kann das System einige vorherige Nachrichten sehen. Fortgeschrittener ist, wenn es sich zusätzliche Details merkt – etwa Fakten zu Themen und deren Zusammenhänge.
Diese Fähigkeit, frühere Chats zu behalten, heißt „Memory“. LangChain hilft, solche Memory-Funktionen in Chats zu integrieren.
Ein Memory in LangChain erfüllt zwei Hauptaufgaben:
- Bevor die Query an das LLM gesendet wird, liest das System aus dem Memory und reichert den ursprünglichen Prompt des Nutzers an.
- Nachdem die Antwort vom LLM zurückkommt, schreibt es diese für künftige Interaktionen ins Memory, bevor die finale Ausgabe an den Nutzer geht.

Memory in LangChain (Bildquelle)
Um die Memory-Funktion in LangChain zu nutzen, kannst du die Klasse ConversationBufferMemory verwenden.
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(return_messages=True)
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("what's up?")
memory.chat_memory.add_user_message("how are you doing?")
memory.chat_memory.add_ai_message("I am fine, thank you and you?")
# to check the variables history
memory.load_memory_variables({})
Ausgabe:
>>> {'history': [HumanMessage(content='hi!'),
>>> AIMessage(content="what's up?"),
>>> HumanMessage(content='how are you doing?'),
>>> AIMessage(content='I am fine, thank you and you?')]}
Zurückgegeben wird ein Dictionary, dessen Schlüssel standardmäßig history ist. Unter diesem Schlüssel liegt eine Liste mit Nachrichten – entweder von Menschen (HumanMessage) oder vom LLM (AIMessage).
LangChain Chains
Für einfache Aufgaben reicht oft ein einzelnes LLM (Large Language Model). Für komplexere Aufgaben braucht es in der Regel eine Abfolge mehrerer Schritte und/oder Modelle.
Die Legacy-Variante, Chains in LangChain zu nutzen, läuft über das Chain-Interface.
Die neuere und empfohlene Methode ist die LangChain Expression Language (LCEL). Auch wenn LCEL für neue Projekte vorzuziehen ist, ist die Chain-Methode weiterhin nützlich und unterstützt.
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema import StrOutputParser
model = ChatOpenAI(openai_api_key = “...”)
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"You're a expert data scientist and machine learning engineer who offer its expertise and responds to the point and accurately.",
),
("human", "{question}"),
]
)
runnable = prompt | model | StrOutputParser()
for chunk in runnable.stream({"question": "How is machine learning different than deep learning?"}):
print(chunk, end="", flush=True)
Ausgabe:
>>> Machine learning and deep learning are subfields of artificial intelligence (AI) that involve training models to make predictions or decisions based on data. While there is an overlap between the two, they ……..
Die Art, wie runnable erstellt wird, ist in Python nicht ganz üblich: Das | ist der Pipe-Operator. Prompt | model | StrOutputParser() bedeutet, dass der Prompt durch das model läuft und dessen Ausgabe anschließend durch StrOutputParser() geht. Jedes Glied in der Kette transformiert die Daten auf seine Weise.
Möchtest du mehr über spannende Use Cases und Anwendungen erfahren, die sich mit LangChain bauen lassen? Sieh dir unser Tutorial zu Engineering- und Data-Application-Use-Cases an.
LangChain Agents
Das Grundprinzip von Agents besteht darin, ein Sprachmodell zur Auswahl einer Abfolge von Aktionen zu nutzen.
Im Gegensatz zu Chains, bei denen die Abfolge fest im Code vorgegeben ist, verwenden Agents ein Sprachmodell als Entscheidungsinstanz, um die passenden Aktionen und deren Reihenfolge zu bestimmen.
In LangChains Agents gibt es drei Schlüsselkonstrukte:
- Tools: Beschreibungen der dem LLM verfügbaren Werkzeuge
- User Input: Das übergeordnete Ziel der Aufgabe
- Intermediate Steps: Zuvor ausgeführte Paare aus Aktion und Tool-Ausgabe, um den User Input zu erreichen
Tools stehen für Funktionen, die ein Agent aufrufen kann. Zwei zentrale Aspekte beim Tool-Design sind:
- Dem Agent Zugang zu den passenden Tools zu geben.
- Die Tools so zu definieren, dass sie für den Agent maximal nützlich sind.
Für viele Routineaufgaben braucht ein Agent eine Sammlung verzahnter Tools. Dafür führt LangChain das Konzept der Toolkits ein. LangChain bietet eine breite Palette an Toolkits für den Einstieg.
Mehr zu Agents findest du im offiziellen LangChain-Guide.
Credit: Einige Beispiele in diesem Blog basieren auf der offiziellen LangChain-Dokumentation.
Fazit
Mit einem strukturierten Ansatz für die Gestaltung von Prompts vereinfacht LangChain nicht nur die Arbeit mit verschiedenen Sprachmodellen, sondern steigert auch Effizienz und Relevanz der Ergebnisse. Features wie PromptTemplate und Memory zeigen, wie Flexibilität und Präzision im Prompt Engineering zusammenfinden – von einfachen Abfragen bis zu komplexen dialogischen Kontexten.
Die erweiterten Funktionen in LangChains Chains und Agents vergrößern das Potenzial für Anwendungen, die sich mit wenigen Codezeilen und mit beliebigen LLMs darunter umsetzen lassen – und davon gibt es viele.
Ob für einfache Aufgaben oder komplexe Anwendungen – LangChains Ansatz für Prompt Engineering ist einfach, klar und schnell übernommen.
Du willst mehr lernen? Sieh dir Teil 1 von How to Build LLM Applications with LangChain auf DataCamp an.
