En este tutorial, implementará human-in-the-loop como mecanismo de feedback para su sistema agente construido con LangGraph y watsonx.ai. Su agente se especializará en la búsqueda del estado de la técnica, un caso de uso que, de lo contrario, puede resultar un esfuerzo manual y tedioso. Su agente utilizará la API de patentes de Google a través de SerpAPI para examinar patentes y proporcionar comentarios sobre sugerencias de patentes. El modelo de lenguaje de gran tamaño (LLM) de elección será código abierto IBM® Granite.
La aparición de la IA agéntica ha inspirado a los desarrolladores a cambiar su enfoque y sus esfuerzos de los chatbots básicos de LLM a la automatización. La palabra "automatización" suele implicar la eliminación de la intervención humana en la ejecución de tareas1. ¿Confiaría en un agente de IA para tomar decisiones críticas relacionadas con sus finanzas personales, por ejemplo? Muchos de nosotros no lo haríamos. ¿Y si una cierta cantidad de ambigüedad pudiera proporcionar al usuario final esta confianza perdida? Esta capa de matices puede tomar la forma de intervención humana, conocida como human-in-the-loop.
Human-in-the-loop (HITL) es un patrón arquitectónico en el que se requiere el feedback humano para guiar la toma de decisiones de una aplicación y proporcionar supervisión. En el ámbito de la inteligencia artificial, HITL significa la presencia de intervención humana en alguna etapa del flujo de trabajo de la IA. Este método garantiza precisión, seguridad y responsabilidad.
Los humanos pueden revisar y actualizar de forma asíncrona los estados de los gráficos en LangGraph debido al estado de ejecución persistente. Al utilizar los puntos de control de estado después de cada paso, se puede conservar el contexto del estado y pausar el flujo de trabajo hasta que se reciban comentarios humanos.
En este tutorial, experimentaremos con los dos enfoques HITL en LangGraph.
Interrupciones estáticas: editar el estado del gráfico directamente en puntos predeterminados antes o después de que se ejecute un nodo específico. Este enfoque requiere que los parámetros interrupt_before o interrupt_after se establezcan en una lista de nombres de nodos al compilar el gráfico de estado.
Interrupciones dinámicas: interrumpir un gráfico y esperar la entrada del usuario desde dentro de un nodo en función del estado actual del gráfico. Este enfoque requiere el uso de la función de interrupción de LangGraph.
1. Necesita una cuenta de IBM® Cloud para crear un proyecto watsonx.ai.
2. Hay varias versiones de Python que pueden funcionar para este tutorial. En el momento de la publicación, recomendamos descargar Python 3.13, la última versión.
Aunque puede elegir entre varias herramientas, este tutorial le muestra cómo configurar una cuenta de IBM para utilizar un Jupyter Notebook.
Inicie sesión en watsonx.ai utilizando su cuenta de IBM Cloud.
Cree un proyecto watsonx.ai.
Puede obtener el ID de su proyecto desde su proyecto. Haga clic en la pestaña Administrar. A continuación, copie el ID del proyecto de la sección Detalles de la página General. Necesita este ID para este tutorial.
Cree un Jupyter Notebook.
Este paso abre un entorno de Jupyter Notebook donde puede copiar el código de este tutorial. También puede descargar este cuaderno en su sistema local y cargarlo en su proyecto watsonx.ai como activo. Este tutorial también está disponible en GitHub.
Cree una instancia de servicio de watsonx.ai Runtime (seleccione la región adecuada y elija el plan Lite, que es una instancia sin coste).
Genere una clave API.
Asocie la instancia del servicio watsonx.ai Runtime al proyecto que ha creado en watsonx.ai.
Necesitamos unas pocas bibliotecas y módulos para este tutorial. Asegúrese de importar los siguientes y, si no están instalados, una instalación rápida de pip resuelve el problema.
Reinicie el kernel e importe los siguientes paquetes.
Para establecer nuestras credenciales, necesitamos la
Para acceder a la API de patentes de Google, también necesitamos una
Antes de que podamos iniciar nuestro LLM, podemos usar la
Para poder interactuar con todos los recursos disponibles en watsonx.ai Runtime, debe configurar una
Para este tutorial, utilizaremos el contenedor ChatWatsonx para configurar nuestro modelo de chat. Este contenedor simplifica la integración de la llamada y el encadenamiento de herramientas. Le animamos a utilizar las referencias de la API en 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 la API de patentes de Google a través de SerpAPI, podemos definir una herramienta para extraer patentes. Esta herramienta es una función que toma el término de búsqueda como argumento y devuelve los resultados de búsqueda orgánicos para patentes relacionadas. El
A continuación, vinculemos el LLM al
Los gráficos de agente LangGraph se componen de nodos y aristas. Los nodos son funciones que transmiten, actualizan y devuelven información. ¿Cómo hacemos un seguimiento de esta información entre nodos? Bueno, los gráficos de agentes requieren un estado, que contenga toda la información relevante que un agente necesita para tomar decisiones. Los nodos están conectados por aristas, que son funciones que seleccionan el siguiente nodo para ejecutar en función del estado actual. Las aristas pueden ser condicionales o fijos.
Empecemos por crear una clase
A continuación, defina la función
A continuación, podemos definir la
Ahora, definamos la
Ahora podemos juntar todas estas funciones añadiendo los nodos correspondientes y conectándolos con aristas que definen el flujo del gráfico.
El gráfico comienza en el nodo
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 realizar una búsqueda de patentes, enviemos 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.
¡Genial! La consulta confidencial del usuario se bloqueó antes de llegar a la API de patentes de Google.
Ahora podemos poner a prueba nuestro agente de búsqueda del estado de la técnica enviando nuestra entrada humana inicial junto con un nuevo thread_id.
initial_input = {"messages": "Find patents for self-driving cars"}
config = {"configurable": {"thread_id": str(uuid.uuid4())}}
for event in graph.stream(initial_input, config, stream_mode="values"):
event['messages'][-1].pretty_print()
Resultado:
================================ [1m Human Message [0m=================================
Find patents for self-driving cars
Podemos ver que el chat se interrumpe antes de la respuesta de la IA, como estaba previsto. Esta interrupción nos permite actualizar el estado directamente. Podemos hacerlo llamando a la función update_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 ha añadido correctamente. Ahora, transmitamos las respuestas de los agentes una vez más.
Nota: el resultado de la herramienta se ha editado para mayor brevedad.
for event in graph.stream(None, config, stream_mode="values"):
event['messages'][-1].pretty_print()
Resultado:
================================ [1m Human Message [0m=================================
No, actually find patents for quantum computing hardware.
================================== [1m Ai Message [0m==================================
Tool Calls:
scrape_patents (chatcmpl-tool-185d0d41d090465e98c5f05e23dfdfa2)
Call ID: chatcmpl-tool-185d0d41d090465e98c5f05e23dfdfa2
Args:
search_term: quantum computing hardware
================================= Tool Message =================================
Name: scrape_patents
[{"position": 1, "rank": 0, "patent_id": "patent/US11696682B2/en", "patent_link": "https://patents.google.com/patent/US11696682B2/en", "serpapi_link": "https://serpapi.com/search.json?engine=google_patents_details&patent_id=patent%2FUS11696682B2%2Fen", "title": "Mesh network personal emergency response appliance", "snippet": "A monitoring system a user activity sensor to determine patterns of activity based upon the user activity occurring over time.", "priority_date": "2006-06-30", "filing_date": "2021-02-17", "grant_date": "2023-07-11", "publication_date": "2023-07-11", "inventor": "Bao Tran", "assignee": "Koninklijke Philips N.V.", "publication_number": "US11696682B2", "language": "en"
...
[REDACTED]
Dado el bucle entre el LLM y la herramienta de búsqueda de patentes, hemos vuelto al nodo 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
¡Genial! Nuestro agente ha implementado con éxito nuestros comentarios y ha devuelto las patentes relevantes.
Como alternativa al uso de puntos de interrupción estáticos, podemos incorporar feedback humano pausando el gráfico desde dentro de un nodo utilizando la función 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 gráfico 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:
¡Genial! Pasemos a nuestra entrada inicial para iniciar el flujo de trabajo del agente.
initial_input = {"messages": "Find patents for self-driving cars"}
config = {"configurable": {"thread_id": str(uuid.uuid4())}}
new_graph.invoke(initial_input, config=config)
Resultado:
{'messages': [HumanMessage(content='Find patents for self-driving cars', additional_kwargs={}, response_metadata={}, id='948c0871-1a47-4664-95f7-75ab511e043e')],
'__interrupt__': [Interrupt(value='Would you like to revise the input or continue?', id='8d6cf9e82f9e3de28d1f6dd3ef9d90aa')]}
Como puede ver, el gráfico se interrumpe y se nos da una instrucción para revisar la entrada o continuar. Revisemos la entrada y reanudemos el flujo de trabajo del agente utilizando la clase 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)**
**Summary:** A monitoring system that analyzes activity patterns based on data from sensors, which can be used in various contexts, including sports performance monitoring.
**Country status:** US - Active
2. **Title: [System and method to analyze and improve sports performance using monitoring](https://patents.google.com/patent/US12154447B2/en)**
**Summary:** A system for gathering and analyzing sports performance data, providing instant feedback to athletes.
**Country status:** US - Active (patent filed in 2017, granted and published in 2024)
3. **Title: [Multi-sensor monitoring of athletic performance](https://patents.google.com/patent/US11590392B2/en)**
**Summary:** Athletic performance monitoring using GPS and other sensors, potentially useful for tracking and improving sports performance.
**Country status:** US - Active
4. **Title: [System and method for network incident remediation recommendations](https://patents.google.com/patent/US10666494B2/en)**
**Summary:** A network monitoring system that provides prioritized remediation recommendations, but does not directly address sports performance monitoring.
**Country status:** US - Active
5. **Title: [Physiological monitoring methods](https://patents.google.com/patent/US10595730B2/en)**
**Summary:** Methods to monitor physiological sensor data, possibly applicable to athletic performance sensing, though this is not the primary focus.
**Country status:** US - Active
6. **Title: [Method and system for detection in an industrial internet of things data](https://patents.google.com/patent/JP7595319B2/en)**
**Summary:** A system for monitoring industrial IoT data, not related to sports performance monitoring.
**Country status:** JP - Active
7. **Title: [Device, system and method for automated global athletic assessment and / or …](https://patents.google.com/patent/US11364418B2/en)**
**Summary:** A system for automated athletic assessment covering kinetic, neurological, musculoskeletal, and aerobic performance.
**Country status:** US - Active
8. **Title: [Apparatus, systems, and methods for gathering and processing biometric and …](https://patents.google.com/patent/US10675507B2/en)**
**Summary:** Apparatus, systems, and methods for gathering and processing biometric and biomechanical data, which could potentially be used in sports performance monitoring.
**Country status:** US - Active
9. **Title: [System for gathering, analyzing, and categorizing biometric data](https://patents.google.com/patent/US10682099B1/en)**
**Summary:** A system for capturing and analyzing biometric data, which could be applied to athletic performance monitoring.
**Country status:** US - Active
10. **Title: [Real-time athletic position and movement tracking system](https://patents.google.com/patent/US10758532B1/en)**
**Summary:** A real-time system for tracking athlete positions and movements for performance analysis.
**Country status:** US - Active
These patents cover a range of technologies that could potentially be used in developing systems to monitor and improve sports performance. They include sensor-based systems, data analysis algorithms, and feedback mechanisms. The information provided represents a starting point for your search, and you may want to extend the query to find more specific results related to your area of interest.
Como era de esperar, el estado del gráfico se actualizó correctamente con nuestro feedback y los siguientes mensajes de AI y herramientas produjeron el resultado adecuado. En lugar de devolver las patentes de los coches autónomos, el agente utilizó el feedback para devolver las patentes relacionadas con la monitorización, el análisis y la mejora del rendimiento.
Al seguir este tutorial, creó con éxito un agente de IA especializado en la búsqueda del estado de la técnica con LangGraph e implementó varios flujos de trabajo humanos en el bucle. Como siguiente paso, intente crear otro agente de IA que pueda utilizarse en un sistema multiagente junto con el agente de búsqueda del estado de la técnica. Quizás este agente secundario pueda sintetizar la información recuperada del agente de búsqueda del estado de la técnica para luego formular un informe que compare su propuesta de patente con las existentes. ¡Hágalo a su gusto!
Cree, implemente y gestione potentes 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 puede confiar.
Los servicios de IA de IBM Consulting ayudan a reinventar la forma de trabajar de las empresas usando IA para la transformación.
1 Wang, Ge. “Humans in the Loop: The Design of Interactive AI Systems”. Stanford Institute for Human-Centered Artificial Intelligence. 21 de octubre de 2019. hai.stanford.edu/news/humans-loop-design-interactive-ai-systems.