Antes de começar
Este tutorial pressupõe que leu e seguiu as instruções em:
- Desenvolva um agente LangGraph: para desenvolver
agentcomo uma instância deLanggraphAgent. - Autenticação do utilizador para autenticar como utilizador para consultar o agente.
- Importe e inicialize o SDK para inicializar o cliente para obter uma instância implementada (se necessário).
Obtenha uma instância de um agente
Para consultar um LanggraphAgent, primeiro tem de
criar uma nova instância ou
obter uma instância existente.
Para obter o LanggraphAgent correspondente a um ID do recurso específico:
SDK Vertex AI para Python
Execute o seguinte código:
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)
onde
PROJECT_IDé o Google Cloud ID do projeto no qual desenvolve e implementa agentes, eLOCATIONé uma das regiões suportadas.RESOURCE_IDé o ID do agente implementado como um recursoreasoningEngine.
Biblioteca de pedidos Python
Execute o seguinte código:
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_IDQuando usa o SDK Vertex AI para Python, o objeto agent corresponde a uma classe AgentEngine que contém o seguinte:
- Um
agent.api_resourcecom informações sobre o agente implementado. Também pode chamaragent.operation_schemas()para devolver a lista de operações que o agente suporta. Consulte o artigo Operações suportadas para ver detalhes. - Um
agent.api_clientque permite interações de serviço síncronas - Um
agent.async_api_clientque permite interações de serviço assíncronas
O resto desta secção pressupõe que tem uma instância do AgentEngine, denominada agent.
Operações compatíveis
As seguintes operações são suportadas para LanggraphAgent:
query: para receber uma resposta a uma consulta de forma síncrona.stream_query: para fazer streaming de uma resposta a uma consulta.get_state: para obter um ponto de restauro específico.get_state_history: para listar os pontos de verificação de uma discussão.update_state: para criar ramificações correspondentes a diferentes cenários.
Transmitir uma resposta a uma consulta
O LangGraph suporta vários modos de streaming. As principais são:
values: este modo transmite o estado completo do gráfico após cada nó ser chamado.updates: este modo transmite atualizações para o estado do gráfico após cada nó ser chamado.
Para transmitir novamente values (correspondente ao estado completo do gráfico):
for state_values in agent.stream_query(
input=inputs,
stream_mode="values",
config={"configurable": {"thread_id": "streaming-thread-values"}},
):
print(state_values)
Para transmitir updates (correspondente a atualizações ao estado do gráfico):
for state_updates in agent.stream_query(
input=inputs,
stream_mode="updates",
config={"configurable": {"thread_id": "streaming-thread-updates"}},
):
print(state_updates)
Humano no circuito
No LangGraph, um aspeto comum da interação humana é adicionar pontos de interrupção para interromper a sequência de ações do agente e fazer com que um humano retome o fluxo num momento posterior.
Rever
Pode definir pontos de interrupção através dos argumentos interrupt_before= ou interrupt_after= quando chamar .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()
O resultado tem um aspeto semelhante ao seguinte:
================================== 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
Aprovação
Para aprovar a chamada de ferramenta gerada e retomar a execução,
transmite None à entrada e especifica o segmento ou o ponto de verificação no interior
de 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()
O resultado tem um aspeto semelhante ao seguinte:
================================= Tool Message =================================
Name: get_exchange_rate
{"amount": 1.0, "base": "USD", "date": "2024-11-14", "rates": {"SEK": 11.0159}}
Histórico
Para listar todos os pontos de verificação de uma determinada discussão, use o método .get_state_history:
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")
A resposta será semelhante à seguinte sequência de resultados:
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?
Obtenha a configuração de um passo
Para obter um ponto de verificação anterior, especifique o checkpoint_id (e o checkpoint_ns). Primeiro, recue para o passo 1, quando a chamada de ferramenta foi gerada:
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)
O resultado tem um aspeto semelhante ao seguinte:
{'configurable': {'thread_id': 'human-in-the-loop-deepdive',
'checkpoint_ns': '',
'checkpoint_id': '1efa2e95-cc7f-6d68-8001-1f6b5e57c456'}}
Viagem no tempo
Para obter um ponto de verificação, pode usar o método .get_state:
# 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()
Por predefinição, recebe o ponto de verificação mais recente (por data/hora). O resultado vai ter um aspeto semelhante ao seguinte:
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.
Obtenha o ponto de restauro de uma configuração
Para uma determinada configuração (por exemplo, snapshot_config a partir da configuração de um passo),
pode obter o ponto de verificação correspondente:
state = agent.get_state(config=snapshot_config)
print(f'step {state["metadata"]["step"]}: {state["config"]}')
state["values"]["messages"][-1].pretty_print()
O resultado vai ter um aspeto semelhante ao seguinte:
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
Repetir
Para repetir a partir de um determinado estado, transmita a configuração do estado (ou seja, state["config"]) ao agente. A configuração do estado é um dicionário com o seguinte aspeto:
{'configurable': {'thread_id': 'human-in-the-loop-deepdive',
'checkpoint_ns': '',
'checkpoint_id': '1efa2e95-cc7f-6d68-8001-1f6b5e57c456'}}
Para repetir a partir de state["config"] (onde foi gerada uma chamada de ferramenta), especifique
None na entrada:
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()
Resulta em algo semelhante à seguinte sequência de resultados:
================================== 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.
Criação de ramos
Pode criar ramificações a partir de pontos de verificação anteriores para experimentar cenários alternativos através do método .update_state:
branch_config = agent.update_state(
config=state["config"],
values={"messages": [last_message]}, # the update we want to make
)
print(branch_config)
O resultado vai ter um aspeto semelhante ao seguinte:
{'configurable': {'thread_id': 'human-in-the-loop-deepdive',
'checkpoint_ns': '',
'checkpoint_id': '1efa2e96-0560-62ce-8002-d1bb48a337bc'}}
Podemos consultar o agente com branch_config para retomar a partir do ponto de verificação com o estado atualizado:
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()
Resulta em algo semelhante à seguinte sequência de resultados:
================================== 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.