Supervise un agente de IA de búsqueda del estado de la técnica con human-in-the-loop utilizando LangGraph y watsonx.ai

Autor

Anna Gutowska

AI Engineer, Developer Advocate

IBM

En este tutorial, implementará human-in-the-loop como mecanismo de feedback para su sistema agente construido con LangGraph y watsonx.ai. Su agente se especializará en la búsqueda del estado de la técnica, un caso de uso que, de lo contrario, puede resultar un esfuerzo manual y tedioso. Su agente utilizará la API de patentes de Google a través de SerpAPI para examinar patentes y proporcionar comentarios sobre sugerencias de patentes. El modelo de lenguaje de gran tamaño (LLM) de elección será código abierto IBM® Granite.

La aparición de la IA agéntica ha inspirado a los desarrolladores a cambiar su enfoque y sus esfuerzos de los chatbots básicos de LLM a la automatización. La palabra "automatización" suele implicar la eliminación de la intervención humana en la ejecución de tareas1. ¿Confiaría en un agente de IA para tomar decisiones críticas relacionadas con sus finanzas personales, por ejemplo? Muchos de nosotros no lo haríamos. ¿Y si una cierta cantidad de ambigüedad pudiera proporcionar al usuario final esta confianza perdida? Esta capa de matices puede tomar la forma de intervención humana, conocida como human-in-the-loop.

Human-in-the-loop

Human-in-the-loop (HITL) es un patrón arquitectónico en el que se requiere el feedback humano para guiar la toma de decisiones de una aplicación y proporcionar supervisión. En el ámbito de la inteligencia artificial, HITL significa la presencia de intervención humana en alguna etapa del flujo de trabajo de la IA. Este método garantiza precisión, seguridad y responsabilidad.

Los humanos pueden revisar y actualizar de forma asíncrona los estados de los gráficos en LangGraph debido al estado de ejecución persistente. Al utilizar los puntos de control de estado después de cada paso, se puede conservar el contexto del estado y pausar el flujo de trabajo hasta que se reciban comentarios humanos.

En este tutorial, experimentaremos con los dos enfoques HITL en LangGraph.

  1. Interrupciones estáticas: editar el estado del gráfico directamente en puntos predeterminados antes o después de que se ejecute un nodo específico. Este enfoque requiere que los parámetros interrupt_before o interrupt_after se establezcan en una lista de nombres de nodos al compilar el gráfico de estado.

  2. Interrupciones dinámicas: interrumpir un gráfico y esperar la entrada del usuario desde dentro de un nodo en función del estado actual del gráfico. Este enfoque requiere el uso de la función de interrupción de LangGraph.

Requisitos previos

1. Necesita una cuenta de IBM® Cloud para crear un proyecto watsonx.ai.

2. Hay varias versiones de Python que pueden funcionar para este tutorial. En el momento de la publicación, recomendamos descargar Python 3.13, la última versión.

Pasos

Paso 1. Configurar su entorno.

Aunque puede elegir entre varias herramientas, este tutorial le muestra cómo configurar una cuenta de IBM para utilizar un Jupyter Notebook.

  1. Inicie sesión en watsonx.ai utilizando su cuenta de IBM Cloud.

  2. Cree un proyecto watsonx.ai.

    Puede obtener el ID de su proyecto desde su proyecto. Haga clic en la pestaña Administrar. A continuación, copie el ID del proyecto de la sección Detalles de la página General. Necesita este ID para este tutorial.

  3. Cree un Jupyter Notebook.

    Este paso abre un entorno de Jupyter Notebook donde puede copiar el código de este tutorial. También puede descargar este cuaderno en su sistema local y cargarlo en su proyecto watsonx.ai como activo. Este tutorial también está disponible en GitHub.

Paso 2. Configurar una instancia de watsonx.ai Runtime y una clave de API.

  1. Cree una instancia de servicio de watsonx.ai Runtime (seleccione la región adecuada y elija el plan Lite, que es una instancia sin coste).

  2. Genere una clave API.

  3. Asocie la instancia del servicio watsonx.ai Runtime al proyecto que ha creado en watsonx.ai.

Paso 3. Instalar e importar las bibliotecas relevantes y configurar sus credenciales.

Necesitamos unas pocas bibliotecas y módulos para este tutorial. Asegúrese de importar los siguientes y, si no están instalados, una instalación rápida de pip resuelve el problema.

%pip install --quiet -U langgraph langchain-ibm langgraph_sdk langgraph-prebuilt google-search-results

Reinicie el kernel e importe los siguientes paquetes.

import getpass
import uuid

from ibm_watsonx_ai import APIClient, Credentials
from ibm_watsonx_ai.foundation_models.moderations import Guardian
from IPython.display import Image, display
from langchain_core.messages import AnyMessage, SystemMessage, HumanMessage, AIMessage
from langchain_ibm import ChatWatsonx
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import START, END, StateGraph
from langgraph.graph.message import add_messages
from langgraph.prebuilt import tools_condition, ToolNode
from langgraph.types import interrupt, Command
from serpapi.google_search import GoogleSearch
from typing_extensions import TypedDict
from typing import Annotated

Para establecer nuestras credenciales, necesitamos la WATSONX_APIKEY  y WATSONX_PROJECT_ID  que generó en el paso 1. También estableceremos la WATSONX_URL  para servir como endpoint de la API.

Para acceder a la API de patentes de Google, también necesitamos una SERPAPI_API_KEY . Puede generar una clave gratuita iniciando sesión en su cuenta SerpApi o registrándose para obtener una.

WATSONX_APIKEY = getpass.getpass(“Please enter your watsonx.ai Runtime API key (hit enter): “)
WATSONX_PROJECT_ID = getpass.getpass(“Please enter your project ID (hit enter): “)
WATSONX_URL = getpass.getpass(“Please enter your watsonx.ai API endpoint (hit enter): “)
SERPAPI_API_KEY = getpass.getpass(“Please enter your SerpAPI API key (hit enter): “)

Antes de que podamos iniciar nuestro LLM, podemos usar la Credentials  para encapsular nuestras credenciales de API pasadas.

credentials = Credentials(url=WATSONX_URL, api_key=WATSONX_APIKEY)

Paso 4. Ejemplificar el modelo de chat

Para poder interactuar con todos los recursos disponibles en watsonx.ai Runtime, debe configurar una APIClient . Aquí, pasamos nuestras credenciales y WATSONX_PROJECT_ID .

client = APIClient(credentials=credentials, project_id=WATSONX_PROJECT_ID)

Para este tutorial, utilizaremos el contenedor ChatWatsonx para configurar nuestro modelo de chat. Este contenedor simplifica la integración de la llamada y el encadenamiento de herramientas. Le animamos a utilizar las referencias de la API en losChatWatsonx  documentos oficiales para más información. Podemos pasar nuestro model_id  para Granite LLM y nuestro cliente como parámetros.

Tenga en cuenta que si utiliza un proveedor de API diferente, deberá cambiar el contenedor en consecuencia.

model_id = “ibm/granite-3-3-8b-instruct”
llm = ChatWatsonx(model_id=model_id, watsonx_client=client)

Paso 5. Definir la herramienta de raspado de patentes

Los agentes de IA utilizan herramientas para llenar los vacíos de información y devolver información relevante. Estas herramientas pueden incluir búsqueda web, RAG, varias API, cálculos matemáticos, etc. Con el uso de la API de patentes de Google a través de SerpAPI, podemos definir una herramienta para extraer patentes. Esta herramienta es una función que toma el término de búsqueda como argumento y devuelve los resultados de búsqueda orgánicos para patentes relacionadas. El GoogleSearch  contenedor requiere parámetros como el motor de búsqueda, que en nuestro caso es google_patents , el término de búsqueda y, por último, la SERPAPI_API_KEY .

def scrape_patents(search_term: str):
    “””Search for patents about the topic.

    Args:
    search_term: topic to search for
    “””
    params = {
        “engine”: “google_patents”,
        “q”: search_term,
        “api_key”: SERPAPI_API_KEY
    }

    search = GoogleSearch(params)
    results = search.get_dict()
    return results[‘organic_results’]

A continuación, vinculemos el LLM al scrape_patents  utilizando el bind_tools  método.

tools = [scrape_patents]
llm_with_tools = llm.bind_tools(tools)

Paso 6. Primer enfoque HITL: interrupciones estáticas

Los gráficos de agente LangGraph se componen de nodos y aristas. Los nodos son funciones que transmiten, actualizan y devuelven información. ¿Cómo hacemos un seguimiento de esta información entre nodos? Bueno, los gráficos de agentes requieren un estado, que contenga toda la información relevante que un agente necesita para tomar decisiones. Los nodos están conectados por aristas, que son funciones que seleccionan el siguiente nodo para ejecutar en función del estado actual. Las aristas pueden ser condicionales o fijos.

Empecemos por crear una clase AgentState   para almacenar el contexto de los mensajes del usuario, las herramientas y el propio agente. La clase Python TypedDict  se utiliza aquí para ayudar a garantizar que los mensajes estén en el formato de diccionario adecuado. También podemos utilizar de LangGraphadd_messages  la función reductora para añadir cualquier mensaje nuevo a la lista de mensajes existente.

class AgentState(TypedDict):
    messages: Annotated[list[AnyMessage], add_messages]

A continuación, defina la función call_llm  que conforma el assistant  nodo. Este nodo simplemente invocará el LLM con el mensaje actual del estado, así como el mensaje del sistema.

sys_msg = SystemMessage(content=”You are a helpful assistant tasked with prior art search.”)

def call_llm(state: AgentState):
    return {“messages”: [llm_with_tools.invoke([sys_msg] + state[“messages”])]

A continuación, podemos definir la guardian_moderation  que conforma el guardian  nodo. Este nodo está diseñado para moderar los mensajes mediante el uso de un sistema guardián, para detectar y bloquear contenido no deseado o sensible. En primer lugar, se recupera el último mensaje. A continuación, un diccionario llamado detectors  que contiene las configuraciones del detector y sus valores umbral. Estos detectores identifican tipos específicos de contenido en los mensajes, como información de identificación personal (PII), así como discurso de odio, lenguaje abusivo y blasfemias (HAP). A continuación, se crea una instancia de la clase Guardian, pasando un api_client  objeto llamado client  y el detectors  diccionario. Se llama al detect  método de la instancia de Guardian, pasando el contenido del último mensaje y el detectors  diccionario. A continuación, el método devuelve un diccionario en el que moderation_verdict  la clave almacena un valor de "safe" o "inappropriate", dependiendo del resultado del modelo de Granite Guardian.

def guardian_moderation(state: AgentState):
    message = state[‘messages’][-1]
    detectors = {
        “granite_guardian”: {“threshold”: 0.4},
        “hap”: {“threshold”: 0.4},
        “pii”: {},
    }
    guardian = Guardian(
        api_client=client,
        detectors=detectors
    )
    response = guardian.detect(
        text=message.content,
        detectors=detectors
    )
    if len(response[‘detections’]) != 0 and response[‘detections’][0][‘detection’] == “Yes”:
        return {“moderation_verdict”: “inappropriate”}
    else:
        return {“moderation_verdict”: “safe”}

Ahora, definamos la block_message  para servir como mecanismo de notificación, que informa al usuario de que su consulta de entrada contiene contenido inapropiado y ha sido bloqueada.

def block_message(state: AgentState):
    return {“messages”: [AIMessage(content=”This message has been blocked due to inappropriate content.”)]

Ahora podemos juntar todas estas funciones añadiendo los nodos correspondientes y conectándolos con aristas que definen el flujo del gráfico.

El gráfico comienza en el nodo guardian   que llama al guardian_moderation  para detectar contenido dañino antes de que llegue al LLM y a la API. La arista condicional entre el guardian  y assistant  nodos enrutan el estado del gráfico al assistant  nodo o el final. Esta posición está determinada por la salida de la función guardian_moderation  . Los mensajes seguros se pasan al nodo assistant   que ejecuta el método call_llm  . También añadimos una arista condicional entre el assistant  y tools  nodos para enrutar los mensajes adecuadamente. Si el LLM devuelve una llamada a la herramienta, el tools_condition  se enruta al nodo de herramientas. De lo contrario, el gráfico se dirige al final. Este paso forma parte de la arquitectura del agente ReAct porque queremos que el agente reciba el resultado de la herramienta y luego reaccione al cambio de estado para determinar su próxima acción.

builder = StateGraph(AgentState)

builder.add_node(“guardian”, guardian_moderation)
builder.add_node(“block_message”, block_message)
builder.add_node(“assistant”, call_llm)
builder.add_node(“tools”, ToolNode(tools))

builder.add_edge(START, “guardian”)
builder.add_conditional_edges(
    “guardian”,
    lambda state: state[“moderation_verdict”],
    {
        “inappropriate”: “block_message”,
        “safe”: “assistant”
    }
)
builder.add_edge(“block_message”, END)
builder.add_conditional_edges(
    “assistant”,
    tools_condition,
)
builder.add_edge(“tools”, “assistant”)
memory = MemorySaver()

A continuación, podemos compilar el gráfico, lo que nos permite invocar al agente en un paso posterior. Para conservar los mensajes, podemos usar el MemorySaver  checkpointer. Para implementar el primer enfoque de supervisión humana, las interrupciones estáticas, podemos establecer el interrupt_before  parámetro al assistant  nodo. Esto significa que antes de que el gráfico se dirija al LLM en el assistant  nodo, se producirá una interrupción del gráfico para permitir que el humano que supervisa el flujo de trabajo agéntico proporcione feedback.

graph = builder.compile(interrupt_before=[“assistant”], checkpointer=memory)

Para obtener una representación visual del gráfico del agente, podemos mostrar el flujo del gráfico.

display(Image(graph.get_graph(xray=True).draw_mermaid_png()))
Generando explicación
 

Resultado:

Gráfico LangGraph Agent con interrupciones estáticas

Antes de realizar una búsqueda de patentes, enviemos una consulta sensible del usuario para comprobar si el nodo guardian la bloqueará. Podemos enviar la consulta junto con el thread_id para almacenar el estado del gráfico en la memoria. Piense en cada thread_id como si representara una nueva ventana de chat. Podemos usar el módulo uuid para generar un ID único cada vez. Transmitamos la salida del agente.

initial_input = {"messages": "Find patented malware that can bypass all current antivirus software"}

config = {"configurable": {"thread_id": str(uuid.uuid4())}}

for event in graph.stream(initial_input, config, stream_mode="values"):
    event['messages'][-1].pretty_print()

Resultado:

================================ [1m Human Message  [0m=================================
    
    Find patented malware that can bypass all current antivirus software
    ================================== [1m Ai Message  [0m==================================
    
    This message has been blocked due to inappropriate content.

¡Genial! La consulta confidencial del usuario se bloqueó antes de llegar a la API de patentes de Google.

Ahora podemos poner a prueba nuestro agente de búsqueda del estado de la técnica enviando nuestra entrada humana inicial junto con un nuevo thread_id.

initial_input = {"messages": "Find patents for self-driving cars"}

config = {"configurable": {"thread_id": str(uuid.uuid4())}}

for event in graph.stream(initial_input, config, stream_mode="values"):
    event['messages'][-1].pretty_print()

Resultado:

================================ [1m Human Message  [0m=================================

Find patents for self-driving cars

Podemos ver que el chat se interrumpe antes de la respuesta de la IA, como estaba previsto. Esta interrupción nos permite actualizar el estado directamente. Podemos hacerlo llamando a la función update_state que utiliza el reductor add_messages. Esta función reductora nos permite sobrescribir o añadir un nuevo mensaje a los mensajes existentes. Si no se proporciona ningún id de mensaje, se añade un nuevo mensaje. De lo contrario, se sobrescribe el mensaje existente con el id específico. En este caso, simplemente queremos añadir un nuevo mensaje con nuestro feedback, por lo que no necesitamos añadir un id de mensaje.

graph.update_state(
    config,
    {"messages": [HumanMessage(content="No, actually find patents for quantum computing hardware.")], 
     "moderation_verdict": "safe"},
)

updated_state = graph.get_state(config).values

for m in updated_state['messages']:
    m.pretty_print()

Resultado:

================================ [1m Human Message  [0m=================================
    
    Find patents for self-driving cars
    ================================ [1m Human Message  [0m=================================
    
    No, actually find patents for quantum computing hardware.

Podemos ver que el mensaje humano se ha añadido correctamente. Ahora, transmitamos las respuestas de los agentes una vez más.

Nota: el resultado de la herramienta se ha editado para mayor brevedad.

for event in graph.stream(None, config, stream_mode="values"):
    event['messages'][-1].pretty_print()

Resultado:

================================ [1m Human Message  [0m=================================

No, actually find patents for quantum computing hardware.
================================== [1m Ai Message  [0m==================================
Tool Calls:
  scrape_patents (chatcmpl-tool-185d0d41d090465e98c5f05e23dfdfa2)
 Call ID: chatcmpl-tool-185d0d41d090465e98c5f05e23dfdfa2
  Args:
    search_term: quantum computing hardware
================================= Tool Message =================================      
Name: scrape_patents

[{"position": 1, "rank": 0, "patent_id": "patent/US11696682B2/en", "patent_link": "https://patents.google.com/patent/US11696682B2/en", "serpapi_link": "https://serpapi.com/search.json?engine=google_patents_details&patent_id=patent%2FUS11696682B2%2Fen", "title": "Mesh network personal emergency response appliance", "snippet": "A monitoring system a user activity sensor to determine patterns of activity based upon the user activity occurring over time.", "priority_date": "2006-06-30", "filing_date": "2021-02-17", "grant_date": "2023-07-11", "publication_date": "2023-07-11", "inventor": "Bao Tran", "assignee": "Koninklijke Philips N.V.", "publication_number": "US11696682B2", "language": "en"

...

[REDACTED]

Dado el bucle entre el LLM y la herramienta de búsqueda de patentes, hemos vuelto al nodo assistant que activa el punto de interrupción una vez más. Como queremos continuar, simplemente enviamos None.

for event in graph.stream(None, config, stream_mode="values"):
    event['messages'][-1].pretty_print()

Resultado:

================================= Tool Message =================================      
Name: scrape_patents

[{"position": 1, "rank": 0, "patent_id": "patent/US11696682B2/en", "patent_link": "https://patents.google.com/patent/US11696682B2/en", "serpapi_link": "https://serpapi.com/search.json?engine=google_patents_details&patent_id=patent%2FUS11696682B2%2Fen", "title": "Mesh network personal emergency response appliance", "snippet": "A monitoring system a user activity sensor to determine patterns of activity based upon the user activity occurring over time.", "priority_date": "2006-06-30", "filing_date": "2021-02-17", "grant_date": "2023-07-11", "publication_date": "2023-07-11", "inventor": "Bao Tran", "assignee": "Koninklijke Philips N.V.", "publication_number": "US11696682B2", "language": "en"

...

[REDACTED]
================================== [1m Ai Message  [0m==================================

Here are patents related to quantum computing hardware:

1. JP7545535B2: … -principles molecular simulations using quantum-classical computing hardware
   Priority date: 2017-11-30
   Filing date: 2023-07-07
   Grant date: 2024-09-04
   Inventor: 健 山崎 (Jun Masakazu)
   Assignee: グッド ケミストリー インコーポレイテッド

2. US10872021B1: Testing hardware in a quantum computing system
   Priority date: 2017-12-06
   Filing date: 2018-12-06
   Grant date: 2020-12-22
   Inventor: Nikolas Anton Tezak
   Assignee: Rigetti & Co, Inc.

3. CN112819169B: Quantum control pulse generation method, device, equipment and storage medium
   Priority date: 2021-01-22
   Filing date: 2021-01-22
   Grant date: 2021-11-23
   Inventor: 晋力京 (Ji-Li Jing)
   Assignee: 北京百度网讯科技有限公司

4. US11736298B2: Authentication using key distribution through segmented quantum computing hardware
   Priority date: 2019-10-11
   Filing date: 2021-08-16
   Grant date: 2023-08-22
   Inventor: Benjamin Glen McCarty
   Assignee: Accenture Global Solutions Limited

5. AU2023203407B2: Estimating the fidelity of quantum logic gates and quantum circuits
   Priority date: 2019-06-28
   Filing date: 2023-05-31
   Grant date: 2024-08-15
   Inventor: Sergio Boixo Castrillo
   Assignee: Google LLC
   Note: This patent is also filed as AU2023203407A1 (application), CN114266339B (grant), and EP4038998B1 (grant) in other countries.

6. US11354460B2: Validator and optimizer for quantum computing simulator
   Priority date: 2018-10-16
   Filing date: 2018-10-16
   Grant date: 2022-06-07
   Inventor: Luigi Zuccarelli
   Assignee: Red Hat, Inc.

7. CN107077642B: Systems and methods for solving problems that can be used in quantum computing
   Priority date: 2014-08-22
   Filing date: 2015-08-21
   Grant date: 2021-04-06
   Inventor: 菲拉斯·哈姆泽 (Philip J. Haussler)
   Assignee: D-波系统公司

8. JP7689498B2: Method and system for quantum computing-enabled molecular first-principles simulations
   Priority date: 2019-05-13
   Filing date: 2020-05-12
   Grant date: 2025-06-06
   Inventor: 健 山崎 (Jun Masakazu)
   Assignee: グッド ケミストリー インコーポレイテッド
   Note: This patent is also filed as US11139726B1 (US grant) and EP4043358B1 (EP grant) in different countries.

9. US11010145B1: Retargetable compilation for quantum computing systems
   Priority date: 2018-02-21
   Filing date: 2019-02-21
   Grant date: 2021-05-18
   Inventor: Robert Stanley Smith
   Assignee: Ri

¡Genial! Nuestro agente ha implementado con éxito nuestros comentarios y ha devuelto las patentes relevantes.

Paso 7. Segundo enfoque de HITL: interrupciones dinámicas

Como alternativa al uso de puntos de interrupción estáticos, podemos incorporar feedback humano pausando el gráfico desde dentro de un nodo utilizando la función interrupt de LangGraph. Podemos crear un nodo human_in_the_loop que nos permita actualizar directamente el estado del gráfico como parte del flujo en lugar de hacer una pausa en puntos predeterminados.

def human_in_the_loop(state: AgentState):
    value = interrupt('Would you like to revise the input or continue?')
    return {"messages": value}

Podemos crear una instancia de un nuevo gráfico y ajustar el flujo para incluir este nodo entre los nodos guardian y assistant.

new_builder = StateGraph(AgentState)

new_builder.add_node("guardian", guardian_moderation)
new_builder.add_node("block_message", block_message)
new_builder.add_node("human_in_the_loop", human_in_the_loop)
new_builder.add_node("assistant", call_llm)
new_builder.add_node("tools", ToolNode(tools))

new_builder.add_edge(START, "guardian")
new_builder.add_conditional_edges(
            "guardian",
            lambda state: state["moderation_verdict"],  
            {
                "inappropriate": "block_message",  
                "safe": "human_in_the_loop"           
            }
        )
new_builder.add_edge("block_message", END)
new_builder.add_edge("human_in_the_loop", "assistant")
new_builder.add_conditional_edges(
    "assistant",
    tools_condition,
)
new_builder.add_edge("tools", "assistant")

memory = MemorySaver()

new_graph = new_builder.compile(checkpointer=memory)
display(Image(new_graph.get_graph().draw_mermaid_png()))

Resultado:

Gráfico LangGraph Agent con interrupciones dinámicas

¡Genial! Pasemos a nuestra entrada inicial para iniciar el flujo de trabajo del agente.

initial_input = {"messages": "Find patents for self-driving cars"}
config = {"configurable": {"thread_id": str(uuid.uuid4())}}
new_graph.invoke(initial_input, config=config) 

Resultado:

{'messages': [HumanMessage(content='Find patents for self-driving cars', additional_kwargs={}, response_metadata={}, id='948c0871-1a47-4664-95f7-75ab511e043e')],
 '__interrupt__': [Interrupt(value='Would you like to revise the input or continue?', id='8d6cf9e82f9e3de28d1f6dd3ef9d90aa')]}

Como puede ver, el gráfico se interrumpe y se nos da una instrucción para revisar la entrada o continuar. Revisemos la entrada y reanudemos el flujo de trabajo del agente utilizando la clase Command de LangGraph. Esta acción actualiza el estado como si procediera del nodo human_feedback.

for event in new_graph.stream(Command(resume="Forget that. Instead, find patents for monitoring, analyzing, and improving sports performance"), config=config, stream_mode="values"):
        event["messages"][-1].pretty_print()

Resultado:

================================[1m Human Message [0m=================================

Find patents for self-driving cars
================================[1m Human Message [0m=================================

Forget that. Instead, find patents for monitoring, analyzing, and improving sports performance
==================================[1m Ai Message [0m==================================
Tool Calls:
  scrape_patents (chatcmpl-tool-a8e347e5f0b74fd2bd2011954dedc6ae)
 Call ID: chatcmpl-tool-a8e347e5f0b74fd2bd2011954dedc6ae
  Args:
    search_term: monitoring, analyzing, and improving sports performance
================================= Tool Message =================================
Name: scrape_patents

[{"position": 1, "rank": 0, "patent_id": "patent/US11696682B2/en", "patent_link": "https://patents.google.com/patent/US11696682B2/en", "serpapi_link": "https://serpapi.com/search.json?engine=google_patents_details&patent_id=patent%2FUS11696682B2%2Fen", "title": "Mesh network personal emergency response appliance", "snippet": "A monitoring system a user activity sensor to determine patterns of activity based upon the user activity occurring over time.", "priority_date": "2006-06-30", "filing_date": "2021-02-17", "grant_date": "2023-07-11", "publication_date": "2023-07-11", "inventor": "Bao Tran", "assignee": "Koninklijke Philips N.V.", "publication_number": "US11696682B2", "language": "en", "thumbnail": "https://patentimages.storage.googleapis.com/dd/39/a4/021064cf6a4880/US11696682-20230711-D00000.png", "pdf": "https://patentimages.storage.googleapis.com/b3/ce/2a/b85df572cd035c/US11696682.pdf", "figures": [{"thumbnail": "https://patentimages.storage.googleapis.com/21/15/19/5061262f67d7fe/US11696682-20230711-D00000.png", "full": "https://patentimages.storage.googleapis.com/08/62/a3/037cf62a2bebd0/US11696682-20230711-D00000.png"}
... 
[REDACTED]
==================================[1m Ai Message [0m==================================

Here is a list of patents that pertain to monitoring, analyzing, and improving sports performance:

1. **Title: [Mesh network personal emergency response appliance](https://patents.google.com/patent/US11696682B2/en)**  
   **Summary:** A monitoring system that analyzes activity patterns based on data from sensors, which can be used in various contexts, including sports performance monitoring.
   **Country status:** US - Active

2. **Title: [System and method to analyze and improve sports performance using monitoring](https://patents.google.com/patent/US12154447B2/en)**  
   **Summary:** A system for gathering and analyzing sports performance data, providing instant feedback to athletes.
   **Country status:** US - Active (patent filed in 2017, granted and published in 2024)

3. **Title: [Multi-sensor monitoring of athletic performance](https://patents.google.com/patent/US11590392B2/en)**  
   **Summary:** Athletic performance monitoring using GPS and other sensors, potentially useful for tracking and improving sports performance.
   **Country status:** US - Active

4. **Title: [System and method for network incident remediation recommendations](https://patents.google.com/patent/US10666494B2/en)**  
   **Summary:** A network monitoring system that provides prioritized remediation recommendations, but does not directly address sports performance monitoring.
   **Country status:** US - Active

5. **Title: [Physiological monitoring methods](https://patents.google.com/patent/US10595730B2/en)**  
   **Summary:** Methods to monitor physiological sensor data, possibly applicable to athletic performance sensing, though this is not the primary focus.
   **Country status:** US - Active

6. **Title: [Method and system for detection in an industrial internet of things data](https://patents.google.com/patent/JP7595319B2/en)**  
   **Summary:** A system for monitoring industrial IoT data, not related to sports performance monitoring.
   **Country status:** JP - Active

7. **Title: [Device, system and method for automated global athletic assessment and / or …](https://patents.google.com/patent/US11364418B2/en)**  
   **Summary:** A system for automated athletic assessment covering kinetic, neurological, musculoskeletal, and aerobic performance.
   **Country status:** US - Active

8. **Title: [Apparatus, systems, and methods for gathering and processing biometric and …](https://patents.google.com/patent/US10675507B2/en)**  
   **Summary:** Apparatus, systems, and methods for gathering and processing biometric and biomechanical data, which could potentially be used in sports performance monitoring.
   **Country status:** US - Active

9. **Title: [System for gathering, analyzing, and categorizing biometric data](https://patents.google.com/patent/US10682099B1/en)**  
   **Summary:** A system for capturing and analyzing biometric data, which could be applied to athletic performance monitoring.
   **Country status:** US - Active

10. **Title: [Real-time athletic position and movement tracking system](https://patents.google.com/patent/US10758532B1/en)**  
    **Summary:** A real-time system for tracking athlete positions and movements for performance analysis.
    **Country status:** US - Active

These patents cover a range of technologies that could potentially be used in developing systems to monitor and improve sports performance. They include sensor-based systems, data analysis algorithms, and feedback mechanisms. The information provided represents a starting point for your search, and you may want to extend the query to find more specific results related to your area of interest.

Como era de esperar, el estado del gráfico se actualizó correctamente con nuestro feedback y los siguientes mensajes de AI y herramientas produjeron el resultado adecuado. En lugar de devolver las patentes de los coches autónomos, el agente utilizó el feedback para devolver las patentes relacionadas con la monitorización, el análisis y la mejora del rendimiento.

Resumen

Al seguir este tutorial, creó con éxito un agente de IA especializado en la búsqueda del estado de la técnica con LangGraph e implementó varios flujos de trabajo humanos en el bucle. Como siguiente paso, intente crear otro agente de IA que pueda utilizarse en un sistema multiagente junto con el agente de búsqueda del estado de la técnica. Quizás este agente secundario pueda sintetizar la información recuperada del agente de búsqueda del estado de la técnica para luego formular un informe que compare su propuesta de patente con las existentes. ¡Hágalo a su gusto!

Soluciones relacionadas
Agentes de IA para empresas

Cree, implemente y gestione potentes asistentes y agentes de IA que automaticen flujos de trabajo y procesos con IA generativa.

    Explore watsonx Orchestrate
    Soluciones de agente de IA de IBM

    Construya el futuro de su empresa con soluciones de IA en las que puede confiar.

    Explore las soluciones de los agentes de IA
    Servicios de IA de IBM Consulting

    Los servicios de IA de IBM Consulting ayudan a reinventar la forma de trabajar de las empresas usando IA para la transformación.

    Explore los servicios de inteligencia artificial
    Dé el siguiente paso

    Tanto si opta por personalizar las aplicaciones y habilidades prediseñadas como si prefiere crear e implementar servicios agentivos personalizados mediante un estudio de IA, la plataforma IBM watsonx le ofrece todo lo que necesita.

    Explore watsonx Orchestrate Explore watsonx.ai
    Notas a pie de página

    Wang, Ge. “Humans in the Loop: The Design of Interactive AI Systems”. Stanford Institute for Human-Centered Artificial Intelligence. 21 de octubre de 2019. hai.stanford.edu/news/humans-loop-design-interactive-ai-systems.