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 (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.
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.
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.
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.
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.
Inicie sesión en watsonx.ai mediante su cuenta de IBM Cloud.
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.
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.
Cree una instancia de servicio watsonx.ai Runtime (seleccione la región adecuada y elija el plan Lite, que es una instancia gratuita).
Genere una clave de API.
Asocie la instancia del servicio watsonx.ai Runtime al proyecto que creó en watsonx.ai.
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.
Reinicie el kernel e importe los siguientes paquetes.
Para establecer nuestras credenciales, necesitamos el
Para acceder a la API de Google Patents, también necesitamos un
Antes de que podamos inicializar nuestro LLM, podemos usar la
Para poder interactuar con todos los recursos disponibles en watsonx.ai Runtime, debe configurar un
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 los
Tenga en cuenta que, si utiliza un proveedor de API diferente, deberá cambiar el contenedor en consecuencia.
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
A continuación, vinculemos el LLM al
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
A continuación, defina la
A continuación, podemos definir el
Ahora, vamos a definir el
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
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
Para obtener una representación visual del gráfico del agente, podemos mostrar el flujo del gráfico.
Resultado:
Antes de intentar una búsqueda de patentes, pasemos una consulta sensible del usuario para comprobar si el nodo guardianthread_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()
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_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()
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 assistantNone
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.
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 interrupthuman_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 crear una instancia de un nuevo grafo y ajustar el flujo para incluir este nodo entre los nodos guardianassistant
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:
¡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 Commandhuman_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.
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!
Cree, implemente y gestione poderosos asistentes y agentes de IA que automaticen flujos de trabajo y procesos con IA generativa.
Construya el futuro de su empresa con soluciones de IA en las que pueda confiar.
Los servicios de IA de IBM Consulting ayudan a reinventar la forma en que las empresas trabajan con IA para la transformación.
1 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.