Zusätzlich zu den allgemeinen Anleitungen zur Verwendung eines Kundenservicemitarbeiters werden auf dieser Seite Funktionen beschrieben, die speziell für LanggraphAgent
gelten.
Hinweise
In dieser Anleitung wird davon ausgegangen, dass Sie die folgenden Anleitungen gelesen und befolgt haben:
- LangGraph-Agent entwickeln:
agent
als Instanz vonLanggraphAgent
entwickeln. - Nutzerauthentifizierung, um sich als Nutzer zu authentifizieren und den Kundenservicemitarbeiter zu fragen.
Unterstützte Vorgänge
Die folgenden Vorgänge werden für LanggraphAgent
unterstützt:
query
: Damit wird eine Antwort auf eine Abfrage synchron abgerufen.stream_query
: zum Streamen einer Antwort auf eine Abfrage.get_state
: zum Abrufen eines bestimmten Checkpoints.get_state_history
: zum Auflisten der Checkpoints eines Threads.update_state
: zum Erstellen von Verzweigungen für verschiedene Szenarien.
Antwort auf eine Abfrage streamen
LangGraph unterstützt mehrere Streamingmodi. Die wichtigsten sind:
values
: In diesem Modus wird der vollständige Status des Graphen gestreamt, nachdem jeder Knoten aufgerufen wurde.updates
: In diesem Modus werden Aktualisierungen des Graphenstatus nach jedem Knotenaufruf gestreamt.
So streamen Sie values
zurück (entspricht dem vollständigen Status des Diagramms):
for state_values in agent.stream_query(
input=inputs,
stream_mode="values",
config={"configurable": {"thread_id": "streaming-thread-values"}},
):
print(state_values)
So streamst du updates
zurück (entspricht Aktualisierungen des Diagrammstatus):
for state_updates in agent.stream_query(
input=inputs,
stream_mode="updates",
config={"configurable": {"thread_id": "streaming-thread-updates"}},
):
print(state_updates)
Human in the Loop
In LangGraph ist ein gängiger Aspekt des Human-in-the-Loop-Konzepts das Hinzufügen von Haltepunkten, um die Abfolge der Aktionen des Kundenservicemitarbeiters zu unterbrechen und den Ablauf zu einem späteren Zeitpunkt von einem Menschen fortzusetzen.
Überprüfen
Sie können beim Aufrufen von .query
oder .stream_query
mit den Argumenten interrupt_before=
oder interrupt_after=
Haltestellen setzen:
response = agent.query(
input=inputs,
interrupt_before=["tools"], # after generating the function call, before invoking the function
interrupt_after=["tools"], # after getting a function response, before moving on
config={"configurable": {"thread_id": "human-in-the-loop-deepdive"}},
)
langchain_load(response['messages'][-1]).pretty_print()
Die Ausgabe sollte in etwa so aussehen:
================================== Ai Message ==================================
Tool Calls:
get_exchange_rate (12610c50-4465-4296-b1f3-d751ec959fd5)
Call ID: 12610c50-4465-4296-b1f3-d751ec959fd5
Args:
currency_from: USD
currency_to: SEK
Genehmigung
Wenn Sie den generierten Toolaufruf genehmigen und mit der restlichen Ausführung fortfahren möchten, geben Sie None
in die Eingabe ein und geben Sie den Thread oder Checkpoint in config
an:
response = agent.query(
input=None, # Continue with the function call
interrupt_before=["tools"], # after generating the function call, before invoking the function
interrupt_after=["tools"], # after getting a function response, before moving on
config={"configurable": {"thread_id": "human-in-the-loop-deepdive"}},
)
langchain_load(response['messages'][-1]).pretty_print()
Die Ausgabe sollte in etwa so aussehen:
================================= Tool Message =================================
Name: get_exchange_rate
{"amount": 1.0, "base": "USD", "date": "2024-11-14", "rates": {"SEK": 11.0159}}
Verlauf
Verwenden Sie die Methode .get_state_history
, um alle Checkpoints eines bestimmten Threads aufzulisten:
for state_snapshot in agent.get_state_history(
config={"configurable": {"thread_id": "human-in-the-loop-deepdive"}},
):
if state_snapshot["metadata"]["step"] >= 0:
print(f'step {state_snapshot["metadata"]["step"]}: {state_snapshot["config"]}')
state_snapshot["values"]["messages"][-1].pretty_print()
print("\n")
Die Antwort sollte in etwa so aussehen:
step 3: {'configurable': {'thread_id': 'human-in-the-loop-deepdive', 'checkpoint_ns': '', 'checkpoint_id': '1efa2e95-ded5-67e0-8003-2d34e04507f5'}}
================================== Ai Message ==================================
The exchange rate from US dollars to Swedish krona is 1 USD to 11.0159 SEK.
step 2: {'configurable': {'thread_id': 'human-in-the-loop-deepdive', 'checkpoint_ns': '', 'checkpoint_id': '1efa2e95-d189-6a77-8002-5dbe79e2ce58'}}
================================= Tool Message =================================
Name: get_exchange_rate
{"amount": 1.0, "base": "USD", "date": "2024-11-14", "rates": {"SEK": 11.0159}}
step 1: {'configurable': {'thread_id': 'human-in-the-loop-deepdive', 'checkpoint_ns': '', 'checkpoint_id': '1efa2e95-cc7f-6d68-8001-1f6b5e57c456'}}
================================== Ai Message ==================================
Tool Calls:
get_exchange_rate (12610c50-4465-4296-b1f3-d751ec959fd5)
Call ID: 12610c50-4465-4296-b1f3-d751ec959fd5
Args:
currency_from: USD
currency_to: SEK
step 0: {'configurable': {'thread_id': 'human-in-the-loop-deepdive', 'checkpoint_ns': '', 'checkpoint_id': '1efa2e95-c2e4-6f3c-8000-477fd654cb53'}}
================================ Human Message =================================
What is the exchange rate from US dollars to Swedish currency?
Konfiguration eines Schritts abrufen
Wenn Sie einen früheren Checkpoint abrufen möchten, geben Sie checkpoint_id
(und checkpoint_ns
) an. Gehen Sie zuerst zu Schritt 1 zurück, als der Toolaufruf generiert wurde:
snapshot_config = {}
for state_snapshot in agent.get_state_history(
config={"configurable": {"thread_id": "human-in-the-loop-deepdive"}},
):
if state_snapshot["metadata"]["step"] == 1:
snapshot_config = state_snapshot["config"]
break
print(snapshot_config)
Die Ausgabe sollte in etwa so aussehen:
{'configurable': {'thread_id': 'human-in-the-loop-deepdive',
'checkpoint_ns': '',
'checkpoint_id': '1efa2e95-cc7f-6d68-8001-1f6b5e57c456'}}
Zeitreise
Zum Abrufen eines Checkpoints kann die Methode .get_state
verwendet werden:
# By default, it gets the latest state [unless (checkpoint_ns, checkpoint_id) is specified]
state = agent.get_state(config={"configurable": {
"thread_id": "human-in-the-loop-deepdive",
}})
print(f'step {state["metadata"]["step"]}: {state["config"]}')
state["values"]["messages"][-1].pretty_print()
Standardmäßig wird der aktuelle Prüfpunkt (nach Zeitstempel) abgerufen. Die Ausgabe sollte in etwa so aussehen:
step 3: {'configurable': {'thread_id': 'human-in-the-loop-deepdive', 'checkpoint_ns': '', 'checkpoint_id': '1efa2e95-ded5-67e0-8003-2d34e04507f5'}}
================================== Ai Message ==================================
The exchange rate from US dollars to Swedish krona is 1 USD to 11.0159 SEK.
Prüfpunkt einer Konfiguration abrufen
Für eine bestimmte Konfiguration (z.B. snapshot_config
aus der Konfiguration eines Schritts) können Sie den entsprechenden Checkpoint abrufen:
state = agent.get_state(config=snapshot_config)
print(f'step {state["metadata"]["step"]}: {state["config"]}')
state["values"]["messages"][-1].pretty_print()
Die Ausgabe sollte in etwa so aussehen:
step 1: {'configurable': {'thread_id': 'human-in-the-loop-deepdive', 'checkpoint_ns': '', 'checkpoint_id': '1efa2e95-cc7f-6d68-8001-1f6b5e57c456'}}
================================== Ai Message ==================================
Tool Calls:
get_exchange_rate (12610c50-4465-4296-b1f3-d751ec959fd5)
Call ID: 12610c50-4465-4296-b1f3-d751ec959fd5
Args:
currency_from: USD
currency_to: SEK
Wiederholen
Wenn Sie einen bestimmten Status wiedergeben möchten, übergeben Sie die Statuskonfiguration (d.h. state["config"]
) an den Agenten. Die Zustandskonfiguration ist ein Dictionary, das in etwa so aussieht:
{'configurable': {'thread_id': 'human-in-the-loop-deepdive',
'checkpoint_ns': '',
'checkpoint_id': '1efa2e95-cc7f-6d68-8001-1f6b5e57c456'}}
Wenn Sie von state["config"]
(wo ein Toolaufruf generiert wurde) wiedergeben möchten, geben Sie None
in die Eingabe ein:
for state_values in agent.stream_query(
input=None, # resume
stream_mode="values",
config=state["config"],
):
langchain_load(state_values["messages"][-1]).pretty_print()
Die Ausgabe sieht in etwa so aus:
================================== Ai Message ==================================
Tool Calls:
get_exchange_rate (12610c50-4465-4296-b1f3-d751ec959fd5)
Call ID: 12610c50-4465-4296-b1f3-d751ec959fd5
Args:
currency_from: USD
currency_to: SEK
================================= Tool Message =================================
Name: get_exchange_rate
{"amount": 1.0, "base": "USD", "date": "2024-11-14", "rates": {"SEK": 11.0159}}
================================== Ai Message ==================================
The exchange rate from US dollars to Swedish krona is 1 USD to 11.0159 SEK.
Verzweigung
Mit der Methode .update_state
können Sie von vorherigen Prüfpunkten abzweigen, um alternative Szenarien zu testen:
branch_config = agent.update_state(
config=state["config"],
values={"messages": [last_message]}, # the update we want to make
)
print(branch_config)
Die Ausgabe sollte in etwa so aussehen:
{'configurable': {'thread_id': 'human-in-the-loop-deepdive',
'checkpoint_ns': '',
'checkpoint_id': '1efa2e96-0560-62ce-8002-d1bb48a337bc'}}
Wir können den Agenten mit branch_config
abfragen, um die Ausführung ab dem Checkpoint mit dem aktualisierten Status fortzusetzen:
for state_values in agent.stream_query(
input=None, # resume
stream_mode="values",
config=branch_config,
):
langchain_load(state_values["messages"][-1]).pretty_print()
Die Ausgabe sieht in etwa so aus:
================================== Ai Message ==================================
Tool Calls:
get_exchange_rate (12610c50-4465-4296-b1f3-d751ec959fd5)
Call ID: 12610c50-4465-4296-b1f3-d751ec959fd5
Args:
currency_date: 2024-09-01
currency_from: USD
currency_to: SEK
================================= Tool Message =================================
Name: get_exchange_rate
{"amount": 1.0, "base": "USD", "date": "2024-08-30", "rates": {"SEK": 10.2241}}
================================== Ai Message ==================================
The exchange rate from US dollars to Swedish krona on 2024-08-30 was 1 USD to 10.2241 SEK.