Dans ce tutoriel, vous allez mettre en œuvre le mécanisme de feedback humain dans la boucle pour votre système agentique construit avec LangGraph et IBM® watsonx.ai. Votre agent sera spécialisé dans la recherche d’antériorités, un cas d’utilisation concret qui demanderait autrement un immense effort manuel. Votre agent utilisera l’API Google Brevets via SerpAPI pour examiner les brevets et fournir un feedback sur les suggestions en matière de brevets. Le grand modèle de langage (LLM) sera, de préférence, IBM® Granite (open source).
L’émergence de l’IA agentique a poussé les développeurs à déplacer leur attention et leurs efforts des chatbots LLM de base vers l’automatisation. Le terme « automatisation » implique la suppression de l’intervention humaine dans l’exécution des tâches.1 Laisseriez-vous un agent IA faire des choix importants à votre place, comme vos finances personnelles ? Beaucoup d’entre nous ne le feraient pas. Et si une certaine ambiguïté pouvait induire chez l’utilisateur final ce manque de confiance ? Cette nuance peut prendre la forme d’une intervention humaine, appelée « l’humain dans la boucle ».
L’humain dans la boucle (HITL) est un modèle d’architecture dans lequel le feedback humain est nécessaire pour guider la prise de décision d’une application LLM et assurer une supervision. Dans le domaine de l’intelligence artificielle, le HITL implique une intervention humaine à un moment donné du workflow d’IA. Cette méthode garantit la précision, la sécurité et la responsabilité.
Les humains peuvent examiner et mettre à jour de manière asynchrone l’état des graphes dans LangGraph grâce à l’état d’exécution persistant. En utilisant les points de contrôle de l’état après chaque étape, le contexte d’état peut être conservé et le workflow peut être interrompu jusqu’à réception du feedback humain.
Dans ce tutoriel, nous allons expérimenter les deux approches HITL dans LangGraph.
Interruptions statiques : modification de l’état du graphe directement à des points prédéterminés avant ou après l’exécution d’un nœud donné. Cette approche exige que les paramètres interrupt_before ou interrupt_after soient définis sur une liste de noms de nœuds lors de la compilation du graphe d’état.
Interruptions dynamiques : interrompre un graphe et attendre l’entrée de l’utilisateur à partir d’un nœud en fonction de l’état actuel du graphe. Cette approche exige l’utilisation de la fonction interrupt de LangGraph.
1. Vous devez disposer d’un compte IBM® Cloud pour créer un projet watsonx.ai.
2. Plusieurs versions de Python peuvent être utilisées pour ce tutoriel. Nous vous recommandons de télécharger Python 3.13, la version la plus récente au moment où le présent document a été publié.
Bien que vous puissiez faire votre choix parmi plusieurs outils, ce tutoriel vous guide pas à pas pour configurer un compte IBM à l’aide d’un Jupyter Notebook.
Connectez-vous à watsonx.ai à l’aide de votre compte IBM Cloud.
Créez un projet watsonx.ai.
Vous pouvez obtenir l’ID de votre projet à partir de ce dernier. Cliquez sur l’onglet Manage (Gérer). Ensuite, copiez l’ID du projet à partir de la section Details (Détails) de la page General (Général). Vous aurez besoin de cet ID pour ce tutoriel.
Créez un Jupyter Notebook.
Cette étape ouvrira un environnement Jupyter Notebook, où vous pourrez copier le code de ce tutoriel. Sinon, vous pouvez télécharger ce notebook localement dans votre système, et le charger dans votre projet watsonx.ai en tant qu’actif. Ce tutoriel est également disponible sur Github.
Créez une instance de service d’exécution watsonx.ai (sélectionnez votre région et choisissez le forfait Lite, qui est une instance gratuite).
Générez une clé d’API.
Associez l’instance de service watsonx.ai Runtime au projet que vous avez créé dans watsonx.ai.
Nous avons besoin de quelques bibliothèques et modules pour ce tutoriel. Veillez à importer les éléments suivants. S’ils ne sont pas installés, une installation pip résoudra rapidement le problème.
Redémarrez le noyau et importez les paquets suivants.
Pour définir nos identifiants, nous avons besoin de l’élément
Pour accéder à l’API Google Brevets, nous avons également besoin d’une
Avant d’initialiser notre LLM, nous pouvons utiliser la classe
Pour pouvoir interagir avec toutes les ressources disponibles dans watsonx.ai Runtime, vous devez configurer votre
Pour ce tutoriel, nous utiliserons l’encapsuleur ChatWatsonx pour définir notre modèle de chat. Cet encapsuleur simplifie l’intégration de l’appel et du chaînage des outils. Nous vous encourageons à utiliser les références API dans la documentation ChatWatsonx pour plus d’informations.
Notez que si vous utilisez un autre fournisseur d’API, vous devrez modifier le wrapper en conséquence.
Les agents IA utilisent des outils pour combler les lacunes d’information et renvoyer des informations pertinentes. Ces outils peuvent inclure la recherche Web, la RAG, diverses API, les calculs mathématiques, etc. En utilisant l’API Google Brevets via SerpAPI, nous pouvons définir un outil de scraping de brevets. Cet outil est une fonction qui prend le terme de recherche comme argument et renvoie les résultats de recherche organique pour les brevets connexes. Le
Ensuite, lions le LLM
Les graphes d’agent LangGraph sont composés de nœuds et d’arêtes. Les nœuds sont des fonctions qui transmettent, mettent à jour et renvoient les informations. Comment suivre ces informations entre les nœuds ? Les graphes d’agents exigent un état, qui contient toutes les informations dont un agent a besoin pour prendre des décisions. Les nœuds sont reliés par des arêtes (les fonctions qui sélectionnent le nœud suivant à exécuter en fonction de l’état actuel). Les arêtes peuvent être conditionnelles ou fixes.
Commençons par créer
Définissez ensuite votre
Nous pouvons ensuite définir notre
Maintenant, définissons
Nous pouvons maintenant rassembler toutes ces fonctions en ajoutant les nœuds correspondants et en les reliant par les arêtes qui définissent le flux du graphe.
Le graphe commence au
Ensuite, nous pouvons compiler le graphe, ce qui nous permet d’appeler l’agent lors d’une étape ultérieure. Pour conserver les messages, nous pouvons utiliser
Pour obtenir une représentation visuelle du graphe de l’agent, nous pouvons afficher le flux du graphe.
Output:
Avant de lancer la recherche de brevets, transmettons une requête utilisateur sensible pour s’assurer que le nœud « guardian » va la bloquer. Nous pouvons transmettre la requête avec l’élément « thread_id » pour stocker l’état du graphique en mémoire. Chaque « thread_id » représente une nouvelle fenêtre de chat. Nous pouvons utiliser le module « uuid » pour générer un identifiant unique à chaque fois. Diffusons en continu la sortie de l’agent.
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()
Sortie :
================================ [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.
Super ! La requête sensible de l’utilisateur a été bloquée avant d’atteindre l’API Google Patents.
Nous pouvons maintenant tester notre agent de recherche d’antériorités en transmettant notre entrée humaine initiale ainsi qu’un nouveau « 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()
Sortie :
================================ [1m Human Message [0m=================================
Find patents for self-driving cars
We can see that the chat is interrupted before the AI response, as intended. Cette interruption nous permet de mettre directement à jour l’état en appelant la fonction « update_state » qui utilise le réducteur « add_messages ». Cette fonction de réduction nous permet de remplacer ou d’ajouter un nouveau message aux messages existants. Si aucun « id » de message n’est fourni, un nouveau message est ajouté. Dans le cas contraire, le message existant avec l’« id » spécifique est remplacé. Dans ce cas, nous ajoutons simplement un nouveau message avec nos commentaires, nous n’avons donc pas besoin d’ajouter un « id » de message.
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()
Sortie :
================================ [1m Human Message [0m=================================
Find patents for self-driving cars
================================ [1m Human Message [0m=================================
No, actually find patents for quantum computing hardware.
Nous pouvons constater que le message humain a été correctement ajouté. Diffusons à nouveau les réponses des agents.
Remarque : la sortie de l’outil a été occultée pour plus de brièveté.*
for event in graph.stream(None, config, stream_mode="values"):
event['messages'][-1].pretty_print()
Sortie :
================================ [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]
Given the loop between the LLM and the patent search tool, we have returned to the assistantNone
for event in graph.stream(None, config, stream_mode="values"):
event['messages'][-1].pretty_print()
Output:
================================= 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
Great! Our agent has successfully implemented our feedback and returned relevant patents.
As an alternative to using static breakpoints, we can incorporate human feedback by pausing the graph from within a node by using LangGraph's 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}
We can instantiate a new graph and adjust the flow to include this node between the 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()))
Sortie :
Super ! Passons notre entrée initiale pour lancer le workflow de l’agent.
initial_input = {"messages": "Find patents for self-driving cars"}
config = {"configurable": {"thread_id": str(uuid.uuid4())}}
new_graph.invoke(initial_input, config=config)
Sortie :
{'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’)]}
Comme vous pouvez voir, le graphique est interrompu et nous sommes invités à passer l’entrée en revue ou à continuer. Révisons l’entrée et reprenons le workflow de l’agent en utilisant la classe « Command » de LangGraph. Cette action met à jour l’état comme s’il provenait du nœud « human_feedback ».
for event in new_graph.stream(Command(resume="Forget that. Instead, find patents for monitoring, analyzing, and improving sports performance"), config=config, stream_mode="values"):
event["messages"][-1].pretty_print()
Sortie :
================================[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.
Comme prévu, l’état du graphique a été mis à jour avec succès avec nos commentaires et les messages suivants de l’IA et de l’outil ont produit la sortie appropriée. Au lieu de renvoyer des brevets pour des voitures autonomes, l’agent a utilisé le commentaire humain pour renvoyer des brevets liés à la surveillance, à l’analyse et à l’amélioration des performances sportives.
En suivant ce tutoriel, vous avez construit avec succès un agent IA spécialisé dans la recherche d’antériorités avec LangGraph et mis en place plusieurs workflows de type humain dans la boucle. L’étape suivante consiste à créer un autre agent IA, qui pourra être utilisé dans un système multi-agents, parallèlement à l’agent de recherche d’antériorités. Cet agent secondaire pourra éventuellement synthétiser les informations récupérées auprès de l’agent de recherche d’antériorités et formuler un rapport qui compare votre proposition de brevet à celles existantes. Place à la personnalisation !
Créez, déployez et gérez de puissants assistants et agents IA qui automatisent les workflows et les processus grâce à l’IA générative.
Construisez l’avenir de votre entreprise avec des solutions d’IA en lesquelles vous pouvez avoir confiance.
IBM Consulting et ses services d'IA accompagnent les entreprises dans la redéfinition de leurs activités avec l'intelligence artificielle pour mener leur transformation.
1 Wang, Ge. « Humans in the Loop : The Design of Interactive AI Systems. » Stanford Institute for Human-Centered Artificial Intelligence, 21 octobre 2019, hai.stanford.edu/news/humans-loop-design-interactive-ai-systems.