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 (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.
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.
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.
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.
Embora você possa escolher entre várias ferramentas, este tutorial explica como configurar uma conta da IBM para usar um Jupyter Notebook.
Faça login no watsonx.ai usando sua conta do IBM Cloud.
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.
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.
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).
Gere uma chave de API.
Associe a instância do serviço do watsonx.ai Runtime ao projeto que você criou no watsonx.ai.
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.
Reinicie o kernel e importe os seguintes pacotes.
Para definir nossas credenciais, precisamos dos
Para acessar a API do Google Patents, também precisamos de um
Antes de podermos inicializar nosso LLM, podemos usar a
Para poder interagir com todos os recursos disponíveis no watsonx.ai Runtime, você precisa configurar uma
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 nos
Observe que, se você usar um provedor de API diferente, precisará alterar o wrapper devidamente.
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
Em seguida, vamos vincular o LLM ao
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
Em seguida, defina a
Em seguida, podemos definir o
Agora, vamos definir o
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
Em seguida, podemos compilar o gráfico, o que nos permite invocar o agente em uma etapa posterior. Para manter mensagens, podemos usar o
Para obter uma representação visual do gráfico do agente, podemos exibir o fluxo do gráfico.
Saídas:
Antes de tentarmos uma busca de patentes, vamos passar por uma consulta de confidencialidade do usuário para testar se o nó guardiãothread_idthread_iduuid
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_stateadd_messagesIDIDID
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 assistenteNone
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.
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çãohuman_in_the_loop
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ãoassistente
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:
Ó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 Commandhuman_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.
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!
Crie, implemente e gerencie assistentes e agentes de IA potentes que automatizam fluxos de trabalho e processos com a IA generativa.
Construa o futuro do seu negócio com soluções de IA em que você pode confiar.
Os serviços de IA da IBM Consulting ajudam a reinventar a forma como as empresas trabalham com IA para gerar transformação.
1 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.