Supervisione um agente de IA de pesquisa de técnica anterior com human-in-the-loop usando o LangGraph e o watsonx.ai

Autora

Anna Gutowska

AI Engineer, Developer Advocate

IBM

Neste tutorial, você implementará o sistema human-in-the-loop como mecanismo de feedback para seu sistema agêntico desenvolvido com o LangGraph e o watsonx.ai. Seu agente se especializará em pesquisa de técnica anterior, um caso de uso do mundo real que pode ser um esforço manual tedioso. Seu agente usará a API do Google Patents por meio do SerpAPI para examinar patentes e fornecer feedback sobre sugestões de patentes. O grande modelo de linguagem (LLM) escolhido será o IBM® Granite de código aberto.

O surgimento da IA agêntica inspirou os desenvolvedores a mudar seu foco e esforços de chatbots de LLMs básicos para automação. A palavra "automação" normalmente implica a remoção do envolvimento humano da execução da tarefa.1 Você confiaria em um agente de IA para tomar decisões críticas da vida relacionadas a suas finanças pessoais, por exemplo? Muitos de nós não. E se uma certa quantidade de ambiguidade pudesse fornecer ao usuário final essa confiança que falta? Essa camada de nuances pode assumir a forma de intervenção humana, conhecida como "human-in-the-loop".

Human-in-the-loop

Human-in-the-loop (HITL) é um padrão arquitetônico no qual o feedback humano é necessário para orientar a tomada de decisão de uma aplicação de LLM e fornecer supervisão. No âmbito da inteligência artificial, HITL significa a presença de intervenção humana em algum estágio do fluxo de trabalho de IA. Esse método garante precisão, segurança e responsabilidade.

Os seres humanos conseguem revisar e atualizar os estados dos gráficos de forma assíncrona no LangGraph devido ao estado de execução persistente. Ao usar os pontos de verificação de estado após cada etapa, o contexto do estado pode persistir e o fluxo de trabalho pode ser pausado até que o feedback humano seja recebido.

Neste tutorial, vamos experimentar as duas abordagens de HITL no LangGraph.

  1. Interrupções estáticas: edição do estado do gráfico diretamente em pontos predeterminados antes ou depois de um nó específico ser executado. Essa abordagem exige que os parâmetros interrupt_before ou interrupt_after sejam definidos como uma lista de nomes de nós ao compilar o gráfico de estado.

  2. Interrupções dinâmicas: interrupção de um gráfico e espera pela entrada do usuário de dentro de um nó com base no estado atual do gráfico. Essa abordagem exige o uso da função interrupt do LangGraph.

Pré-requisitos

1. Você precisa de uma conta do IBM® Cloud para criar um projeto do watsonx.ai.

2. Várias versões do Python podem funcionar para este tutorial. No momento da publicação, recomendamos baixar o Python 3.13, a versão mais recente.

Etapas

Etapa 1. Configure seu ambiente.

Embora você possa escolher entre várias ferramentas, este tutorial explica como configurar uma conta da IBM para usar um Jupyter Notebook.

  1. Faça login no watsonx.ai usando sua conta do IBM Cloud.

  2. Crie um projeto do watsonx.ai.

    Você pode obter a ID do projeto a partir de seu projeto. Clique na guia Gerenciar. Em seguida, copie a ID do projeto da seção Detalhes da página Geral. Você precisa dessa ID para este tutorial.

  3. Crie um Jupyter Notebook.

    Essa etapa abre um ambiente do Notebook onde você poderá copiar o código deste tutorial. Ou então, você pode baixar esse Notebook em seu sistema local e carregá-lo como um ativo em seu projeto do watsonx.ai. Este tutorial também está disponível no Github.

Etapa 2. Configure uma instância do watsonx.ai Runtime e uma chave de API.

  1. Crie uma instância do serviço do watsonx.ai Runtime (selecione a região apropriada e escolha o plano Lite, que é uma instância gratuita).

  2. Gere uma chave de API.

  3. Associe a instância do serviço do watsonx.ai Runtime ao projeto que você criou no watsonx.ai.

Etapa 3. Instale e importe bibliotecas relevantes e configure suas credenciais.

Precisamos de algumas bibliotecas e módulos para este tutorial. Certifique-se de importar os seguintes e, se não estiverem instalados, uma instalação rápida de pip resolve o problema.

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

Reinicie o kernel e importe os seguintes pacotes.

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 definir nossas credenciais, precisamos dos WATSONX_APIKEY  e WATSONX_PROJECT_ID  que você gerou na Etapa 1. Também definiremos os WATSONX_URL  para servir como endpoint da API.

Para acessar a API do Google Patents, também precisamos de um SERPAPI_API_KEY . Você pode gerar uma chave gratuita fazendo registro na sua conta SerpApi ou registrando-se para uma.

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 podermos inicializar nosso LLM, podemos usar a Credentials  classe para encapsular nossas credenciais de API passadas.

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

Etapa 4. Instancie o modelo de chat

Para poder interagir com todos os recursos disponíveis no watsonx.ai Runtime, você precisa configurar uma APIClient . Aqui, passamos nossas credenciais e WATSONX_PROJECT_ID .

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

Para este tutorial, utilizaremos o wrapper ChatWatsonx para definir nosso modelo de chat. Esse wrapper simplifica a integração da chamada e do encadeamento de ferramentas. Nós incentivamos você a usar as referências de API nosChatWatsonx  documentos oficiais para mais informações. Podemos passar em nosso model_id  para o LLM Granite e nosso cliente como parâmetros.

Observe que, se você usar um provedor de API diferente, precisará alterar o wrapper devidamente.

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

Etapa 5. Defina a ferramenta de raspagem de patentes

Os agentes de IA usam ferramentas para preencher lacunas de informações e devolver informações relevantes. Essas ferramentas podem incluir pesquisa na web, RAG, várias APIs, cálculos matemáticos e assim por diante. Com o uso da API Google Patents por meio da SerpAPI, podemos definir uma ferramenta para coleta de patentes. Essa ferramenta é uma função que toma o termo de pesquisa como argumento e retorna os resultados de pesquisa orgânica para patentes relacionadas. O GoogleSearch  o wrapper exige parâmetros como o mecanismo de pesquisa, que no nosso caso são google_patents , o termo de pesquisa e, por fim, o 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’]

Em seguida, vamos vincular o LLM ao scrape_patents  ferramenta usando o bind_tools  método.

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

Etapa 6. Primeira abordagem de HITL: interrupções estáticas

Os gráficos de agentes dp LangGraph são compostos de nós e edges. Os nós são funções que retransmitem, atualizam e retornam informações. Como rastreamos essas informações entre os nós? Bem, os gráficos de agentes exigem um estado, que contém todas as informações relevantes de que um agente precisa para tomar decisões. Os nós são conectados por edges, que são funções que selecionam o próximo nó a ser executado com base no estado atual. As edges podem ser condicionais ou fixas.

Vamos começar criando uma classe de  AgentState  para armazenar o contexto das mensagens do usuário, das ferramentas e do próprio agente. A classe  TypedDict   de Python é usada aqui para ajudar a garantir que as mensagens estejam no formato de dicionário apropriado. Também podemos usar o   do LangGraphadd_messages  reducer do LangGraph para acrescentar qualquer nova mensagem à lista existente de mensagens.

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

Em seguida, defina a call_llm  função que compõe o assistant  nó. Esse nó simplesmente chamará o LLM com a mensagem atual do estado, bem como a mensagem do 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”])]

Em seguida, podemos definir o guardian_moderation  função que compõe o guardian  nó. Esse nó foi projetado para moderar mensagens usando um sistema de guardião, para detectar e bloquear conteúdo indesejado ou confidencial. Primeiro, a última mensagem é recuperada. Em seguida, um dicionário chamado detectors  é definido como contendo as configurações do detector e seus valores-limite. Esses detectores identificam tipos específicos de conteúdo nas mensagens, como informação de identificação pessoal (PII), bem como discurso de ódio, linguagem abusiva e palavrões (HAP). Em seguida, uma instância da classe Guardian é criada, passando em um api_client  objeto chamado client  e o detectors  dicionário. O detect  método da instância do Guardian é chamado, passando o conteúdo da última mensagem e o detectors  dicionário. O método, então, retorna um dicionário no qual a moderation_verdict a chave   armazena um valor de "seguro" ou "inadequado", dependendo da saída do 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”}

Agora, vamos definir o block_message  função para servir como um mecanismo de notificação, informando ao usuário que a consulta de entrada tem conteúdo inadequado e foi bloqueada.

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

Agora, podemos reunir todas essas funções adicionando os nós correspondentes e conectando-os com edges que definem o fluxo do gráfico.

O gráfico começa no guardian  nó, que chama o guardian_moderation  método para detectar conteúdo prejudicial antes de chegar ao LLM e à API. A edge condicional entre os guardian  e assistant  nós encaminham o estado do gráfico para o assistant  nó ou a extremidade. Essa posição é determinada pela saída da guardian_moderation  função. Mensagens seguras são passadas para o assistant  nó , que executa o call_llm  método. Também adicionamos uma edge condicional entre os assistant  e tools  nós para rotear as mensagens adequadamente. Se o LLM retornar uma chamada da ferramenta, o tools_condition  método roteia para o nó das ferramentas . Caso contrário, o gráfico será encaminhado para o fim. Essa etapa faz parte da arquitetura do agente do ReAct porque queremos que o agente receba a saída da ferramenta e reaja à mudança de estado para determinar sua próxima ação.

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()

Em seguida, podemos compilar o gráfico, o que nos permite invocar o agente em uma etapa posterior. Para manter mensagens, podemos usar o MemorySaver  checkpointer. Para implementar a primeira abordagem de supervisão humana, as interrupções estáticas, podemos definir o interrupt_before  parâmetro para o assistant  nó. Isso significa que, antes do gráfico encaminhar para o LLM no assistant  nó, ocorrerá uma interrupção no gráfico para permitir que o ser humano que supervisiona o fluxo de trabalho agêntico possa fornecer feedback.

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

Para obter uma representação visual do gráfico do agente, podemos exibir o fluxo do gráfico.

display(Image(graph.get_graph(xray=True).draw_mermaid_png()))
Geração de explicações
 

Saídas:

Gráfico do agente do LangGraph com interrupções estáticas

Antes de tentarmos uma busca de patentes, vamos passar por uma consulta de confidencialidade do usuário para testar se o nó guardião irá bloqueá-la. Podemos transmitir a consulta com o thread_id para armazenar o estado do gráfico na memória. Pense em cada thread_id como representando uma nova janela de bate-papo. Podemos usar o módulo uuid para gerar um ID exclusivo a cada vez. Vamos transmitir o output do 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()

Saída:

================================ [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.

Ótimo! A consulta confidencial do usuário foi bloqueada antes de chegar à API do Google Patents.

Agora podemos colocar nosso agente de pesquisa anterior à prova passando nosso input humano inicial junto com um novo 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()

Saída:

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

Find patents for self-driving cars

Podemos ver que o chat é interrompido antes da resposta da IA, como pretendido. Essa interrupção nos permite atualizar o estado diretamente. Podemos fazer isso chamando a função update_state que usa o redutor add_messages. Essa função redutora nos permite substituir ou anexar uma nova mensagem às mensagens existentes. Se nenhuma ID de mensagem for fornecida, uma nova mensagem será anexada. Caso contrário, a mensagem existente com a ID específica será substituída. Neste caso, queremos simplesmente acrescentar uma nova mensagem com nosso feedback; portanto, não precisamos acrescentar uma ID de mensagem.

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()

Saída:

================================ [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 a mensagem humana foi acrescentada corretamente. Agora, vamos transmitir as respostas dos agentes mais uma vez.

Observação: o output da ferramenta foi omitido por questões de brevidade.

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

Saída:

================================ [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 o loop entre o LLM e a ferramenta de pesquisa de patentes, retornamos ao nó do assistente que aciona o ponto de interrupção mais uma vez. Como queremos prosseguir, simplesmente passamos None.

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

Saída:

================================= 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

Ótimo! Nosso agente implementou com sucesso nosso feedback e retornou patentes relevantes.

Etapa 7. Segunda abordagem de HITL: interrupções dinâmicas

Como alternativa ao uso de pontos de interrupção estáticos, podemos incorporar o feedback humano pausando o gráfico dentro de um nó usando a função de interrupção do LangGraph. Podemos criar um nó human_in_the_loop que nos permite atualizar diretamente o estado do gráfico como parte do fluxo, em vez de fazer uma pausa em pontos predeterminados.

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

Podemos instanciar um novo gráfico e ajustar o fluxo para incluir esse nó entre os nós guardião e assistente.

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()))

Saída:

Gráficos do agente do LangGraph com interrupções dinâmicas

Ótimo! Vamos transmitir nossa entrada inicial para iniciar o fluxo de trabalho do agente.

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

Saída:

{'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 você pode ver, o gráfico é interrompido e somos solicitados a revisar o input ou a continuar. Vamos revisar o input e retomar o fluxo de trabalho do agente usando a classe Command do LangGraph. Essa ação atualiza o estado como se viesse do nó human_feedback.

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

Saída:

================================[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. As informações fornecidas representam um ponto de partida para sua pesquisa, e você pode querer estender a consulta para encontrar resultados mais específicos relacionados à sua área de interesse.

Conforme esperado, o estado do gráfico foi atualizado com sucesso com feedback, e as seguintes mensagens de IA e ferramentas produziram a saída apropriada. Em vez de devolver patentes de carros autônomos, o agente usou o feedback humano para devolver patentes relacionadas ao monitoramento, análise e melhoria do desempenho esportivo.

Resumo

Seguindo este tutorial, você criou com sucesso um agente de IA especializado em pesquisa de técnica anterior com o LangGraph e implementou vários fluxos de trabalho human-in-the-loop. Como próxima etapa, tente construir outro agente de IA que possa ser usado em um sistema multiagentes, juntamente com o agente de pesquisa de técnica anterior. Talvez esse agente secundário possa sintetizar as informações recuperadas do agente de pesquisa de técnica anterior para, em seguida, formular um relatório que compara sua proposta de patente com as existentes. Personalize!

Soluções relacionadas
Agentes de IA para empresas

Crie, implemente e gerencie assistentes e agentes de IA potentes que automatizam fluxos de trabalho e processos com a IA generativa.

    Explore o watsonx Orchestrate
    Soluções de agentes de IA da IBM

    Construa o futuro do seu negócio com soluções de IA em que você pode confiar.

    Explore soluções de agentes de IA
    Serviços de IA do IBM® Consulting

    Os serviços de IA da IBM Consulting ajudam a reinventar a forma como as empresas trabalham com IA para gerar transformação.

    Explore os serviços de inteligência artificial
    Dê o próximo passo

    Se você optar por personalizar aplicativos e habilidades criados previamente ou criar e implementar serviços agênticos personalizados usando um estúdio de IA, a plataforma IBM watsonx tem aquilo de que você precisa.

    Explore o watsonx Orchestrate Explore o watsonx.ai
    Notas de rodapé

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