Noeud de préparation des documents
Pas encore totalement fonctionnel, mais déjà de bons résultats là dessus
This commit is contained in:
@@ -5,7 +5,7 @@ from langgraph.types import Command
|
||||
from .InterruptPayload import InterruptPayload
|
||||
|
||||
# Une fonction pour stream et gérer proprement le graphe
|
||||
def streamGraph(initial_input:Dict, config:Dict, graphe:CompiledStateGraph):
|
||||
def streamGraph(initial_input:Dict, config:Dict, graphe:CompiledStateGraph, lastMsgIndex=0):
|
||||
# https://docs.langchain.com/oss/python/langgraph/interrupts#stream-with-human-in-the-loop-hitl-interrupts
|
||||
for mode, state in graphe.stream(
|
||||
initial_input,
|
||||
@@ -15,8 +15,11 @@ def streamGraph(initial_input:Dict, config:Dict, graphe:CompiledStateGraph):
|
||||
):
|
||||
if mode == "values":
|
||||
# Handle streaming message content
|
||||
msg = state['messages'][-1]
|
||||
msg.pretty_print()
|
||||
i=0
|
||||
for msg in state['messages'][lastMsgIndex:]: # Permet de gérer plusieurs nouveaux messages d'un coup
|
||||
msg.pretty_print()
|
||||
i+=1
|
||||
lastMsgIndex+=i
|
||||
|
||||
elif mode == "updates":
|
||||
# Check for interrupts
|
||||
@@ -25,7 +28,7 @@ def streamGraph(initial_input:Dict, config:Dict, graphe:CompiledStateGraph):
|
||||
|
||||
payload = InterruptPayload.fromJSON(payload) # Chargement de la requête depuis sa version JSON
|
||||
payload.humanDisplay() # L'utilisateur peut accepter/modifier/refuser ici
|
||||
streamGraph(Command(resume=payload.toJSON()), config, graphe) # Je renvois la chaîne JSON, qui sera reconvertie en objet dans l'outil, et je relance le stream récursivement
|
||||
streamGraph(Command(resume=payload.toJSON()), config, graphe, lastMsgIndex) # Je renvois la chaîne JSON, qui sera reconvertie en objet dans l'outil, et je relance le stream récursivement
|
||||
return # Fin de cette fonction récursive
|
||||
|
||||
else:
|
||||
|
||||
@@ -3,8 +3,10 @@ from langgraph.graph import MessagesState
|
||||
from langgraph.prebuilt import ToolNode
|
||||
from langchain.chat_models import init_chat_model
|
||||
from langgraph.graph import START, END
|
||||
from langchain.messages import HumanMessage, AIMessage, SystemMessage
|
||||
|
||||
from .tools import getTools
|
||||
from .tools import getTools, getWeeklyReportTools
|
||||
from .state import CustomState
|
||||
|
||||
# LLM principal
|
||||
llm = ChatMistralAI( # LLM sans outils
|
||||
@@ -14,6 +16,22 @@ llm = ChatMistralAI( # LLM sans outils
|
||||
)
|
||||
|
||||
# NODES
|
||||
def preparation_docs(state: CustomState):
|
||||
"""Noeud en charge de préparer les résumés pour chaque semaine des rapports, et la liste des outils et méthodes utilisées"""
|
||||
model = llm.bind_tools(getWeeklyReportTools()) # LLM en charge de générer des rapports hebdomadaires sur le stage
|
||||
print(len(state['messages']))
|
||||
messages = [m for m in state['messages']] # Tous les messages du stage
|
||||
|
||||
if 'documentsGenerationStarted' not in state.keys():
|
||||
# Si ce noeud en est à son premier lancement, je lui donne la consigne de départ
|
||||
messages.append(HumanMessage("Ton but est de lire les fichiers présents dans la base de données en utilisant l'outil 'search_in_files',\
|
||||
afin de générer des rapports sur chaque semaine du stage qui y est décrit. Pour enregistrer chaque semaine du stage, utilise l'outil 'write_week_report'.\
|
||||
Une fois terminé, fais une liste de tous les outils, logiciels, méthodes, entreprises, techniques, ect.. utilisés,\
|
||||
et fais en une liste avec quelques descriptions que tu devras enregistrer avec l'outil 'write_library_tools_details_on_internship'."))
|
||||
|
||||
messages.append(model.invoke(messages)) # Invocation LLM
|
||||
return {'messages': messages, 'documentsGenerationStarted':True} # Je passe une liste de messages, ce qui ne devrait pas ajouter un message mais redéfinir toute la liste
|
||||
|
||||
def call_to_LLM(state: MessagesState):
|
||||
"""Noeud qui s'occupe de gérer les appels au LLM"""
|
||||
# Initialisation du LLM
|
||||
@@ -53,6 +71,7 @@ def task_ended(state: MessagesState):
|
||||
return END
|
||||
return "continue"
|
||||
|
||||
weekly_report_tools = ToolNode(tools=getWeeklyReportTools())
|
||||
tool_node = ToolNode(tools=getTools())
|
||||
|
||||
|
||||
|
||||
@@ -10,6 +10,8 @@ class CustomState(MessagesState):
|
||||
ragQuery: str # Requête envoyée au RAG, pour le cross-encodeur
|
||||
ragDocuments: List[str] # Documents retrouvés par le RAG, pour le cross-encodeur
|
||||
|
||||
documentsGenerationStarted:bool# Permet d'indiquer que la consigne de génération des documents a été envoyée
|
||||
|
||||
# TODO: Ajouter la source des documents sélectionnés pour la fin du rapport ?
|
||||
|
||||
|
||||
|
||||
@@ -263,4 +263,4 @@ def getWeeklyReportTools()->List['Tools']:
|
||||
"""
|
||||
Récupérer la liste des tools, POUR LE LLM EN CHARGE DE FAIRE LES RAPPORTS DE CHAQUE SEMAINE
|
||||
"""
|
||||
return [write_week_report, write_library_tools_details_on_internship, internet_search]
|
||||
return [write_week_report, write_library_tools_details_on_internship, internet_search, search_in_files]
|
||||
Reference in New Issue
Block a user