Avant de commencer
Ce tutoriel suppose que vous avez lu et suivi les instructions de :
- Créer un agent LangGraph : pour créer
agenten tant qu'instance deLanggraphAgent. - Authentification de l'utilisateur pour vous authentifier en tant qu'utilisateur afin d'interroger l'agent.
- Importer et initialiser le SDK pour initialiser le client afin d'obtenir une instance déployée (si nécessaire).
Obtenir une instance d'un agent
Pour interroger un LanggraphAgent, vous devez d'abord
créer une instance ou
en obtenir une existante.
Pour obtenir le LanggraphAgent qui correspond à un ID de ressource spécifique :
SDK Agent Platform
Exécutez le code suivant :
import vertexai
client = vertexai.Client( # For service interactions via client.agent_engines
project="PROJECT_ID",
location="LOCATION",
)
agent = client.agent_engines.get(name="projects/PROJECT_ID/locations/LOCATION/reasoningEngines/RESOURCE_ID")
print(agent)
Où :
PROJECT_IDest l' Google Cloud ID du projet sous lequel vous créez et déployez des agents.LOCATIONest l'une des régions compatibles.RESOURCE_IDest l'ID de l'agent déployé en tant quereasoningEngineressource.
Bibliothèque de requêtes Python
Exécutez le code suivant :
from google import auth as google_auth
from google.auth.transport import requests as google_requests
import requests
def get_identity_token():
credentials, _ = google_auth.default()
auth_request = google_requests.Request()
credentials.refresh(auth_request)
return credentials.token
response = requests.get(
f"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/reasoningEngines/RESOURCE_ID",
headers={
"Content-Type": "application/json; charset=utf-8",
"Authorization": f"Bearer {get_identity_token()}",
},
)
API REST
curl \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/reasoningEngines/RESOURCE_IDLorsque vous utilisez le SDK Agent Platform, l'objet agent correspond à une
AgentEngine classe qui contient les éléments suivants :
agent.api_resourceavec des informations sur l'agent déployé. Vous pouvez également appeleragent.operation_schemas()pour renvoyer la liste des opérations compatibles avec l'agent. Pour en savoir plus, consultez Opérations prises en charge.agent.api_clientqui permet les interactions de service synchronesagent.async_api_clientqui permet les interactions de service asynchrones
Le reste de cette section suppose que vous disposez d'une instance AgentEngine, nommée agent.
Opérations prises en charge
Les opérations suivantes sont compatibles avec LanggraphAgent :
query: pour obtenir une réponse à une requête de manière synchrone.stream_query: pour diffuser une réponse à une requête.get_state: pour obtenir un point de contrôle spécifique.get_state_history: pour lister les points de contrôle d'un thread.update_state: pour créer des branches correspondant à différents scénarios.
Diffuser une réponse à une requête
Pour diffuser une réponse, utilisez la LanggraphAgent.stream_query méthode.
LangGraph est compatible avec plusieurs modes de diffusion. Les principaux sont les suivants :
values: ce mode diffuse l'état complet du graphique après chaque appel de nœud.updates: ce mode diffuse les mises à jour de l'état du graphique après chaque appel de nœud.
Pour diffuser à nouveau des values (correspondant à l'état complet du graphique) :
for state_values in agent.stream_query(
input=inputs,
stream_mode="values",
config={"configurable": {"thread_id": "streaming-thread-values"}},
):
print(state_values)
Pour diffuser à nouveau des updates (correspondant aux mises à jour de l'état du graphique) :
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 (avec intervention humaine)
Dans LangGraph, un aspect courant de l'intervention humaine consiste à ajouter des points d'arrêt pour interrompre la séquence d'actions de l'agent et à faire reprendre le flux par un humain ultérieurement.
Récapitulatif
Vous pouvez définir des points d'arrêt à l'aide des interrupt_before= ou interrupt_after=
arguments lorsque vous appelez .query ou .stream_query :
from langchain.load import load as langchain_load
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()
Le résultat ressemblera à ce qui suit :
================================== 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
Approbation
Pour approuver l'appel d'outil généré et reprendre le reste de l'exécution, transmettez None à l'entrée et spécifiez le thread ou le point de contrôle dans la config :
from langchain.load import load as langchain_load
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()
Le résultat ressemblera à ce qui suit :
================================= Tool Message =================================
Name: get_exchange_rate
{"amount": 1.0, "base": "USD", "date": "2024-11-14", "rates": {"SEK": 11.0159}}
Historique
Pour lister tous les points de contrôle d'un thread donné, utilisez la LanggraphAgent.get_state_history méthode :
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")
La réponse sera semblable à la séquence de sorties suivante :
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?
Obtenir la configuration d'une étape
Pour obtenir un point de contrôle antérieur, spécifiez le checkpoint_id (et le checkpoint_ns). Tout d'abord, revenez à l'étape 1, lorsque l'appel d'outil a été généré :
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)
Le résultat ressemblera à ce qui suit :
{'configurable': {'thread_id': 'human-in-the-loop-deepdive',
'checkpoint_ns': '',
'checkpoint_id': '1efa2e95-cc7f-6d68-8001-1f6b5e57c456'}}
Fonctionnalité temporelle
Pour obtenir un point de contrôle, utilisez la LanggraphAgent.get_state méthode :
# 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()
Par défaut, elle obtient le dernier point de contrôle (par horodatage). Le résultat ressemblera à ce qui suit :
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.
Obtenir le point de contrôle d'une configuration
Pour une configuration donnée (par exemple, snapshot_config à partir de la configuration d'une étape),
vous pouvez obtenir le point de contrôle correspondant :
state = agent.get_state(config=snapshot_config)
print(f'step {state["metadata"]["step"]}: {state["config"]}')
state["values"]["messages"][-1].pretty_print()
Le résultat ressemblera à ce qui suit :
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
Revoir
Pour revoir à partir d'un état donné, transmettez la configuration de l'état (c'est-à-dire state["config"])
à l'agent. La configuration de l'état est un dictionnaire qui se présente comme suit :
{'configurable': {'thread_id': 'human-in-the-loop-deepdive',
'checkpoint_ns': '',
'checkpoint_id': '1efa2e95-cc7f-6d68-8001-1f6b5e57c456'}}
Pour revoir à partir de state["config"] (où un appel d'outil a été généré), spécifiez
None dans l'entrée :
from langchain.load import load as langchain_load
for state_values in agent.stream_query(
input=None, # resume
stream_mode="values",
config=state["config"],
):
langchain_load(state_values["messages"][-1]).pretty_print()
Cela entraînera une séquence de sorties semblable à la suivante :
================================== 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.
Ramification
Vous pouvez créer des branches à partir de points de contrôle précédents pour essayer d'autres scénarios à l'aide de la
LanggraphAgent.update_state méthode :
branch_config = agent.update_state(
config=state["config"],
values={"messages": [last_message]}, # the update we want to make
)
print(branch_config)
Le résultat ressemblera à ce qui suit :
{'configurable': {'thread_id': 'human-in-the-loop-deepdive',
'checkpoint_ns': '',
'checkpoint_id': '1efa2e96-0560-62ce-8002-d1bb48a337bc'}}
Nous pouvons interroger l'agent avec branch_config pour reprendre à partir du point de contrôle avec l'état mis à jour :
from langchain.load import load as langchain_load
for state_values in agent.stream_query(
input=None, # resume
stream_mode="values",
config=branch_config,
):
langchain_load(state_values["messages"][-1]).pretty_print()
Cela entraînera une séquence de sorties semblable à la suivante :
================================== 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.