⚡ Sprachagenten als Graphen erstellen ⚡
Notiz
Suchen Sie nach der JS-Version? Klicken Sie hier (JS-Dokumente).
LangGraph ist eine Bibliothek zum Erstellen zustandsbehafteter Multi-Akteur-Anwendungen mit LLMs, die zum Erstellen von Agenten- und Multi-Agenten-Workflows verwendet wird. Im Vergleich zu anderen LLM-Frameworks bietet es die folgenden Kernvorteile: Zyklen, Kontrollierbarkeit und Beständigkeit. Mit LangGraph können Sie Abläufe definieren, die Zyklen beinhalten, was für die meisten Agentenarchitekturen unerlässlich ist, und unterscheidet es von DAG-basierten Lösungen. Als Framework auf sehr niedriger Ebene bietet es eine detaillierte Kontrolle über den Ablauf und den Status Ihrer Anwendung, was für die Erstellung zuverlässiger Agenten von entscheidender Bedeutung ist. Darüber hinaus verfügt LangGraph über eine integrierte Persistenz, die erweiterte Human-in-the-Loop- und Speicherfunktionen ermöglicht.
LangGraph ist von Pregel und Apache Beam inspiriert. Die öffentliche Schnittstelle ist von NetworkX inspiriert. LangGraph wurde von LangChain Inc, den Erfindern von LangChain, entwickelt, kann aber auch ohne LangChain verwendet werden.
Die LangGraph-Plattform ist eine Infrastruktur für die Bereitstellung von LangGraph-Agenten. Es handelt sich um eine kommerzielle Lösung für die Bereitstellung von Agentenanwendungen in der Produktion, die auf dem Open-Source-Framework LangGraph basiert. Die LangGraph-Plattform besteht aus mehreren Komponenten, die zusammenarbeiten, um die Entwicklung, Bereitstellung, Fehlerbehebung und Überwachung von LangGraph-Anwendungen zu unterstützen: LangGraph-Server (APIs), LangGraph-SDKs (Clients für die APIs), LangGraph-CLI (Befehlszeilentool zum Erstellen des Servers). ), LangGraph Studio (UI/Debugger),
Um mehr über LangGraph zu erfahren, schauen Sie sich unseren ersten LangChain Academy-Kurs „Einführung in LangGraph“ an, der hier kostenlos verfügbar ist.
Die LangGraph-Plattform ist eine kommerzielle Lösung für die Bereitstellung von Agentenanwendungen in der Produktion, die auf dem Open-Source-Framework LangGraph basiert. Hier sind einige häufige Probleme, die bei komplexen Bereitstellungen auftreten und die von der LangGraph-Plattform behoben werden:
pip install -U langgraph
Eines der zentralen Konzepte von LangGraph ist der Zustand. Bei jeder Diagrammausführung wird ein Status erstellt, der zwischen den Knoten im Diagramm während der Ausführung weitergegeben wird, und jeder Knoten aktualisiert diesen internen Status nach der Ausführung mit seinem Rückgabewert. Die Art und Weise, wie das Diagramm seinen internen Status aktualisiert, wird entweder durch den ausgewählten Diagrammtyp oder eine benutzerdefinierte Funktion definiert.
Schauen wir uns ein einfaches Beispiel eines Agenten an, der ein Suchtool verwenden kann.
pip install langchain-anthropic
export ANTHROPIC_API_KEY=sk-...
Optional können wir LangSmith für erstklassige Beobachtbarkeit einrichten.
export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY=lsv2_sk_...
from typing import Annotated , Literal , TypedDict
from langchain_core . messages import HumanMessage
from langchain_anthropic import ChatAnthropic
from langchain_core . tools import tool
from langgraph . checkpoint . memory import MemorySaver
from langgraph . graph import END , START , StateGraph , MessagesState
from langgraph . prebuilt import ToolNode
# Define the tools for the agent to use
@ tool
def search ( query : str ):
"""Call to surf the web."""
# This is a placeholder, but don't tell the LLM that...
if "sf" in query . lower () or "san francisco" in query . lower ():
return "It's 60 degrees and foggy."
return "It's 90 degrees and sunny."
tools = [ search ]
tool_node = ToolNode ( tools )
model = ChatAnthropic ( model = "claude-3-5-sonnet-20240620" , temperature = 0 ). bind_tools ( tools )
# Define the function that determines whether to continue or not
def should_continue ( state : MessagesState ) -> Literal [ "tools" , END ]:
messages = state [ 'messages' ]
last_message = messages [ - 1 ]
# If the LLM makes a tool call, then we route to the "tools" node
if last_message . tool_calls :
return "tools"
# Otherwise, we stop (reply to the user)
return END
# Define the function that calls the model
def call_model ( state : MessagesState ):
messages = state [ 'messages' ]
response = model . invoke ( messages )
# We return a list, because this will get added to the existing list
return { "messages" : [ response ]}
# Define a new graph
workflow = StateGraph ( MessagesState )
# Define the two nodes we will cycle between
workflow . add_node ( "agent" , call_model )
workflow . add_node ( "tools" , tool_node )
# Set the entrypoint as `agent`
# This means that this node is the first one called
workflow . add_edge ( START , "agent" )
# We now add a conditional edge
workflow . add_conditional_edges (
# First, we define the start node. We use `agent`.
# This means these are the edges taken after the `agent` node is called.
"agent" ,
# Next, we pass in the function that will determine which node is called next.
should_continue ,
)
# We now add a normal edge from `tools` to `agent`.
# This means that after `tools` is called, `agent` node is called next.
workflow . add_edge ( "tools" , 'agent' )
# Initialize memory to persist state between graph runs
checkpointer = MemorySaver ()
# Finally, we compile it!
# This compiles it into a LangChain Runnable,
# meaning you can use it as you would any other runnable.
# Note that we're (optionally) passing the memory when compiling the graph
app = workflow . compile ( checkpointer = checkpointer )
# Use the Runnable
final_state = app . invoke (
{ "messages" : [ HumanMessage ( content = "what is the weather in sf" )]},
config = { "configurable" : { "thread_id" : 42 }}
)
final_state [ "messages" ][ - 1 ]. content
"Based on the search results, I can tell you that the current weather in San Francisco is:nnTemperature: 60 degrees FahrenheitnConditions: FoggynnSan Francisco is known for its microclimates and frequent fog, especially during the summer months. The temperature of 60°F (about 15.5°C) is quite typical for the city, which tends to have mild temperatures year-round. The fog, often referred to as "Karl the Fog" by locals, is a characteristic feature of San Francisco's weather, particularly in the mornings and evenings.nnIs there anything else you'd like to know about the weather in San Francisco or any other location?"
Wenn wir nun dieselbe "thread_id"
übergeben, bleibt der Konversationskontext über den gespeicherten Status (d. h. die gespeicherte Liste der Nachrichten) erhalten.
final_state = app . invoke (
{ "messages" : [ HumanMessage ( content = "what about ny" )]},
config = { "configurable" : { "thread_id" : 42 }}
)
final_state [ "messages" ][ - 1 ]. content
"Based on the search results, I can tell you that the current weather in New York City is:nnTemperature: 90 degrees Fahrenheit (approximately 32.2 degrees Celsius)nConditions: SunnynnThis weather is quite different from what we just saw in San Francisco. New York is experiencing much warmer temperatures right now. Here are a few points to note:nn1. The temperature of 90°F is quite hot, typical of summer weather in New York City.n2. The sunny conditions suggest clear skies, which is great for outdoor activities but also means it might feel even hotter due to direct sunlight.n3. This kind of weather in New York often comes with high humidity, which can make it feel even warmer than the actual temperature suggests.nnIt's interesting to see the stark contrast between San Francisco's mild, foggy weather and New York's hot, sunny conditions. This difference illustrates how varied weather can be across different parts of the United States, even on the same day.nnIs there anything else you'd like to know about the weather in New York or any other location?"
ChatAnthropic
als unser LLM. HINWEIS: Wir müssen sicherstellen, dass das Modell weiß, dass diese Tools zum Aufrufen verfügbar sind. Wir können dies tun, indem wir die LangChain-Tools mithilfe der Methode .bind_tools()
in das Format für den Aufruf von OpenAI-Tools konvertieren.StateGraph
), indem wir das Statusschema übergeben (in unserem Fall MessagesState
).MessagesState
ist ein vorgefertigtes Statusschema mit einem Attribut – einer Liste von LangChain- Message
Objekten sowie einer Logik zum Zusammenführen der Aktualisierungen von jedem Knoten in den StatusWir benötigen zwei Hauptknoten:
agent
: Verantwortlich für die Entscheidung, welche Maßnahmen (falls vorhanden) ergriffen werden sollen.tools
Knoten, der Tools aufruft: Wenn der Agent beschließt, eine Aktion auszuführen, führt dieser Knoten diese Aktion aus. Zuerst müssen wir den Einstiegspunkt für die Diagrammausführung festlegen – agent
.
Dann definieren wir eine normale und eine bedingte Kante. Bedingte Kante bedeutet, dass das Ziel vom Inhalt des Diagrammstatus ( MessageState
) abhängt. In unserem Fall ist das Ziel erst bekannt, wenn der Agent (LLM) entscheidet.
.invoke()
, .stream()
und .batch()
mit Ihren Eingaben ermöglichtMemorySaver
– einen einfachen In-Memory-Checkpointer LangGraph fügt die Eingabenachricht zum internen Status hinzu und übergibt den Status dann an den Einstiegspunktknoten "agent"
.
Der Knoten "agent"
wird ausgeführt und ruft das Chat-Modell auf.
Das Chat-Modell gibt eine AIMessage
zurück. LangGraph fügt dies dem Status hinzu.
Graph durchläuft die folgenden Schritte, bis keine weiteren tool_calls
auf AIMessage
vorhanden sind:
AIMessage
über tool_calls
verfügt, wird der Knoten "tools"
ausgeführt"agent"
-Knoten wird erneut ausgeführt und gibt AIMessage
zurück Die Ausführung schreitet zum speziellen END
Wert fort und gibt den Endzustand aus. Und als Ergebnis erhalten wir als Ausgabe eine Liste aller unserer Chat-Nachrichten.
Weitere Informationen zur Mitwirkung finden Sie hier.