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

Autor

Anna Gutowska

AI Engineer, Developer Advocate

IBM

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

La aparición de la IA agéntica ha inspirado a los desarrolladores a cambiar su enfoque y esfuerzos de los chatbots básicos de LLM a la automatización. La palabra "automatización" suele implicar la eliminación de la participación humana en la ejecución de tareas.1 ¿Confiaría en un agente de IA para decidir elecciones de vida críticas relacionadas con sus finanzas personales, por ejemplo? Muchos de nosotros no. ¿Qué pasaría si una cierta cantidad de ambigüedad pudiera proporcionar al usuario final esta confianza faltante? 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 feedback humano para guiar la toma de decisiones de una aplicación de LLM y proporcionar supervisión. Dentro del á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 asincrónica 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, el contexto del estado se puede conservar y el flujo de trabajo se puede pausar hasta que se reciba el feedback humano.

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

  1. Interrupciones estáticas: edición del 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: interrupción de un gráfico y espera 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. Varias versiones de Python pueden funcionar para este tutorial. En el momento de la publicación, recomendamos descargar Python 3.13, la última versión.

Pasos

Paso 1. Configure su entorno.

Si bien puede elegir entre varias herramientas, este tutorial lo guiará a través de cómo configurar una cuenta de IBM para usar un Jupyter Notebook.

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

  2. Cree un proyecto watsonx.ai.

    Puede obtener su ID de proyecto desde dentro de su proyecto. Haga clic en la pestaña Manage. Luego, copie el ID del proyecto de la sección Details 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 Notebook en su sistema local y cargarlo en su proyecto watsonx.ai como activo. Este tutorial también está disponible en Github.

Paso 2. Configure una instancia de tiempo de ejecución de watsonx.ai y una clave de API

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

  2. Genere una clave de API.

  3. Asocie la instancia del servicio watsonx.ai Runtime al proyecto que creó en watsonx.ai.

Paso 3. Instale e importe bibliotecas relevantes y configure sus credenciales.

Necesitamos algunas 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 el WATSONX_APIKEY  y WATSONX_PROJECT_ID  que generó en el paso 1. También estableceremos el WATSONX_URL  para servir como endpoint de la API.

Para acceder a la API de Google Patents, también necesitamos un SERPAPI_API_KEY Puede generar una clave gratuita mediante el registro en su cuenta de 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 inicializar nuestro LLM, podemos usar la Credentials  clase para encapsular nuestras credenciales de API pasadas.

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

Paso 4. Crear una instancia del modelo de chat

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

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

Para este tutorial, usaremos el contenedor ChatWatsonx para configurar nuestro modelo de chat. Este contenedor simplifica la integración de la llamada y el encadenamiento de herramientas. Le recomendamos que utilice las referencias de API en losChatWatsonx  Documentos oficiales para más información. Podemos pasar en nuestro model_id  para el LLM Granite 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 extracción 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 Google Patents Api 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, el 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  herramienta con 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 agentes de LangGraph se componen de nodos y bordes. Los nodos son funciones que transmiten, actualizan y devuelven información. ¿Cómo hacemos un seguimiento de esta información entre nodos? 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 bordes, que son funciones que seleccionan el siguiente nodo para ejecutarse en función del estado actual. Los bordes pueden ser condicionales o fijos.

Comencemos con la creación de un AgentState  class para almacenar el contexto de los mensajes del usuario, las herramientas y el propio agente. Python TypedDict  class se utiliza aquí para ayudar a garantizar que los mensajes estén en el formato de diccionario adecuado. También podemos usar LangGraph add_messages  para agregar cualquier mensaje nuevo a la lista existente de mensajes.

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

A continuación, defina lacall_llm  función 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 el guardian_moderation  función que conforma el guardian  nodo. Este nodo está diseñado para moderar los mensajes mediante el uso de un sistema guardian, para detectar y bloquear contenido no deseado o confidencial. Primero, se recupera el último mensaje. A continuación, un diccionario llamado detectors  que contiene las configuraciones del detector y sus valores de 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). Luego, 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. Luego, el método devuelve un diccionario en el que la moderation_verdict  key almacena un valor de “seguro” o “inapropiado”, dependiendo de la salida del modelo 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, vamos a definir el block_message  función para servir como mecanismo de notificación, informando al usuario que su consulta de entrada tiene 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 agregando los nodos correspondientes y conectándolos con bordes que definen el flujo del gráfico.

El gráfico comienza en el guardian  nodo, que llama al guardian_moderation  método para detectar contenido dañino antes de que llegue al LLM y a la API. El borde condicional entre los guardian  y assistant  nodos enruta el estado del gráfico al assistant  nodo o el final. Esta posición está determinada por la salida de la guardian_moderation  función. Los mensajes seguros se pasan al assistant  nodo, que ejecuta el call_llm  método. También agregamos un borde condicional entre los assistant  y tools  nodos para enrutar los mensajes adecuadamente. Si el LLM devuelve una llamada a la herramienta, el tools_condition  método enruta al nodo de herramientas. De lo contrario, el gráfico se enruta hasta el final. Este paso es parte de la arquitectura del agente ReAct porque queremos que el agente reciba la salida 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  punto de control. Para implementar el primer enfoque de supervisión humana, 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()))
Generar explicación
 

Resultado:

LangGraph Agent Graph con interrupciones estáticas

Antes de intentar una búsqueda de patentes, pasemos una consulta sensible del usuario para comprobar si el nodo guardian la bloqueará. Podemos pasar la consulta junto con el thread_id para almacenar el estado del grafo en la memoria. Pensemos en cada thread_id como una nueva ventana de chat. Podemos usar el módulo uuid para generar una identificación única 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.

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

Ahora podemos poner a prueba nuestro agente de búsqueda de arte previo pasando 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 IA, como se pretendía. 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 sobreescribir o agregar un nuevo mensaje a los mensajes existentes. Si no se proporciona ningún id de mensaje, se agrega un nuevo mensaje. De lo contrario, se sobrescribirá el mensaje existente con el id específico. En este caso, simplemente queremos agregar un mensaje nuevo con nuestro feedback, así que no necesitamos agregar un mensaje id.

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 adjuntó 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 regresado al nodo assistant que vuelve a activar el punto de ruptura. Como queremos continuar, simplemente pasamos 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

¡Excelente! Nuestro agente implementó con éxito nuestro feedback y devolvió las patentes relevantes.

Paso 7. Segundo enfoque HITL: interrupciones dinámicas

Como alternativa al uso de puntos de ruptura estáticos, podemos incorporar feedback humano pausando el grafo desde dentro de un nodo mediante el uso de la función interrupt de LangGraph. Podemos crear un nodo human_in_the_loop que nos permita actualizar directamente el estado del grafo como parte del flujo, en lugar de hacer pausas 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 grafo 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:

LangGraph Agent Graphs con interrupciones dinámicas

¡Excelente! Pasemos 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 podemos ver, el grafo se interrumpe y se nos indica que revisemos la entrada o continuemos. Vamos a revisar la entrada y reanudar el flujo de trabajo del agente mediante la clase Command de LangGraph. Esta acción actualiza el estado como si viniera 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)**  
   **Resumen:** Un sistema de monitoreo que analiza patrones de actividad basados en datos de sensores, que se pueden utilizar en diversos contextos, incluido el monitoreo del rendimiento deportivo.
   **Estado del país:** EE. UU. - Activo

2. **Título: [Sistema y método para analizar y mejorar el rendimiento deportivo mediante el monitoreo](https://patents.google.com/patent/US12154447B2/en)**  
   **Resumen:** Un sistema para recopilar y analizar datos de rendimiento deportivo, proporcionando feedback instantáneo a los atletas.
   **Estado del país:** EE. UU. - Activo (patente presentada en 2017, concedida y publicada en 2024)

3. **Título: [Monitoreo multisensor del rendimiento deportivo](https://patents.google.com/patent/ US11590392B2/en)**  
   **Resumen:** Monitoreo del rendimiento deportivo mediante GPS y otros sensores, potencialmente útil para rastrear y mejorar el rendimiento deportivo.
   **Estado del país:** EE. UU. - Activo

4. **Título: [Sistema y método para las recomendaciones de corrección de incidentes de red](https://patents.google.com/patent/US10666494B2/en)**  
   **Resumen:** Un sistema de monitoreo de red que proporciona recomendaciones de corrección priorizadas, pero no aborda directamente el monitoreo del rendimiento deportivo.
   **Estado del país:** EE. UU. - Activo

5. **Título: [Métodos de monitoreo fisiológico](https://patents.google.com/patent/US10595730B2/en)**  
   **Resumen:** Métodos para monitorear los datos fisiológicos de los sensores, posiblemente aplicables a la detección del rendimiento deportivo, aunque este no es el enfoque principal.
   **Estado del país:** EE. UU. - Activo

6. **Título: [Método y sistema para la detección en datos de un Internet industrial de las cosas](https://patents.google.com/patent/JP7595319B2/en)**  
   **Resumen:** Un sistema para monitorear datos de IoT industrial, no relacionados con el monitoreo del rendimiento deportivo.
   **Estado del país:** JP - Activo

7. **Título: [Dispositivo, sistema y método para la evaluación atlética global automatizada y/o...](https://patents.google.com/patent/US11364418B2/en)* *  
   **Resumen:** Un sistema para la evaluación atlética automatizada que abarca el rendimiento cinético, neurológico, musculoesquelético y aeróbico.
   **Estado del país:** EE. UU. - Activo

8. **Título: [Aparatos, sistemas y métodos para recopilar y procesar datos biométricos y...](https://patents.google.com/patent/US10675507B2/en)**  
   **Resumen:** Aparatos, sistemas y métodos para recopilar y procesar datos biométricos y biomecánicos, que podrían utilizarse en el monitoreo del rendimiento deportivo.
   **Estado del país:** EE. UU. - Activo

9. **Título: [Sistema para recopilar, analizar y categorizar datos biométricos](https://patents.google.com/patent/US10682099B1/en)**  
   **Resumen:** Un sistema para capturar y analizar datos biométricos, que podría aplicarse al monitoreo del rendimiento deportivo.
   **Estado del país:** EE. UU. - Activo

10. **Título: [Sistema de seguimiento de movimiento y posición deportivos en tiempo real](https://patents.google.com/patent/US10758532B1/en)**  
    **Resumen:** Un sistema en tiempo real para rastrear las posiciones y movimientos de los atletas para el análisis del rendimiento.
    **Estado del país:** EE. UU. - Activo

Estas patentes cubren una gama de tecnologías que podrían utilizarse en el desarrollo de sistemas para monitorear y mejorar el rendimiento deportivo. Incluyen sistemas basados en sensores, algoritmos de análisis de datos y mecanismos de feedback. La información proporcionada representa un punto de partida para la búsqueda, y es posible que deseemos ampliar la consulta para encontrar resultados más específicos relacionados con el área de interés.

Como era de esperar, el estado del gráfico se actualizó correctamente con nuestro feedback y los siguientes mensajes de IA y herramientas produjeron los resultados adecuados. En lugar de devolver patentes para automóviles autónomos, el agente utilizó feedback humano para devolver patentes relacionadas con el monitoreo, análisis y mejora del rendimiento deportivo.

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 human-in-the-loop. 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 suyo!

Soluciones relacionadas
Agentes de IA para empresas

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

    Explore watsonx Orchestrate
    Soluciones de agentes de IA de IBM

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

    Explorar las soluciones de agentes de IA
    Servicios de IA de IBM Consulting

    Los servicios de IA de IBM Consulting ayudan a reinventar la forma en que las empresas trabajan con IA para la transformación.

    Explorar los servicios de inteligencia artificial
    Dé el siguiente paso

    Ya sea que elija personalizar aplicaciones y habilidades predefinidas o crear y desplegar servicios agénticos personalizados utilizando un estudio de IA, la plataforma IBM watsonx responde a sus necesidades.

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

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