Aidahaouas commited on
Commit
1d6fcbc
·
verified ·
1 Parent(s): 27f8c90

Update graph_agentB.py

Browse files
Files changed (1) hide show
  1. graph_agentB.py +66 -57
graph_agentB.py CHANGED
@@ -1,57 +1,66 @@
1
- from typing import TypedDict, Annotated, Literal, Sequence
2
- from langchain_core.messages import BaseMessage
3
- from langgraph.graph import StateGraph, END
4
- from langgraph.graph.message import add_messages
5
- from config import llm, client, langsmith_project
6
- from pinecone_utilsB import *
7
-
8
- # Graph state definition
9
- class GraphState(TypedDict):
10
- messages: Annotated[Sequence[BaseMessage], add_messages]
11
- query: str
12
- combined_docs: list
13
- response: str
14
-
15
- def retrieve_combined(state: GraphState) -> dict:
16
- """Récupération hybride : Pinecone (sémantique) + BM25 (mots-clés)."""
17
- combined_docs = retrieve_documents(state["query"])
18
- return {"combined_docs": combined_docs}
19
-
20
- def generate_response(state: GraphState) -> dict:
21
- """Génération de réponse en combinant informations sémantiques et mots-clés."""
22
- context = "\n\n".join(state["combined_docs"])
23
- prompt = f"""
24
- Vous êtes un expert en analyse de texte.
25
- Votre réponse doit prendre en compte les éléments suivants :
26
-
27
- - Recherche sémantique (contextes proches)
28
- - Recherche par mots-clés (documents contenant les termes exacts)
29
-
30
- **Informations pertinentes trouvées** :
31
- {context}
32
-
33
- **Question de l'utilisateur** :
34
- {state["query"]}
35
-
36
- **Réponse :**
37
- """
38
- response = llm.invoke(prompt)
39
- return {"response": response.content}
40
-
41
- def post_process_response(state: GraphState) -> dict:
42
- """Nettoyage de la réponse avant affichage."""
43
- response = state["response"].strip() if isinstance(state["response"], str) else state["response"]
44
- return {"response": response}
45
-
46
- # Construction du graphe
47
- graph_builder = StateGraph(GraphState)
48
- graph_builder.add_node("retrieve", retrieve_combined)
49
- graph_builder.add_node("generate", generate_response)
50
- graph_builder.add_node("post_process", post_process_response)
51
-
52
- graph_builder.set_entry_point("retrieve")
53
- graph_builder.add_edge("retrieve", "generate")
54
- graph_builder.add_edge("generate", "post_process")
55
- graph_builder.add_edge("post_process", END)
56
-
57
- agent = graph_builder.compile()
 
 
 
 
 
 
 
 
 
 
1
+ from typing import TypedDict, Annotated, Sequence
2
+ from langchain_core.messages import BaseMessage
3
+ from langgraph.graph import StateGraph, END
4
+ from langgraph.graph.message import add_messages
5
+ from config import llm, client, langsmith_project
6
+ from pinecone_utilsB import *
7
+
8
+ search_engine = HybridSearchEngine()
9
+
10
+
11
+ class GraphState(TypedDict):
12
+ messages: Annotated[Sequence[BaseMessage], add_messages]
13
+ query: str
14
+ relevant_docs: list
15
+ response: str
16
+
17
+
18
+ def retrieve_combined(state: GraphState) -> dict:
19
+ """Récupération hybride : Pinecone (sémantique) + BM25 (mots-clés)."""
20
+ relevant_docs = search_engine.hybrid_search(state["query"])
21
+ return {"relevant_docs": relevant_docs}
22
+
23
+ def generate_response(state: GraphState) -> dict:
24
+ """Génération de réponse en combinant informations sémantiques et mots-clés."""
25
+ context = "\n\n".join(state["relevant_docs"])
26
+ prompt = f"""
27
+ Vous êtes un expert en analyse de texte.
28
+ Votre réponse doit prendre en compte les éléments suivants :
29
+
30
+ - Recherche sémantique (contextes proches)
31
+ - Recherche par mots-clés (documents contenant les termes exacts)
32
+
33
+ **Informations pertinentes trouvées** :
34
+ {context}
35
+
36
+ **Question de l'utilisateur** :
37
+ {state["query"]}
38
+
39
+ **Réponse :**
40
+ """
41
+ response = llm.invoke(prompt)
42
+ return {"response": response.content}
43
+
44
+
45
+ def post_process_response(state: GraphState) -> dict:
46
+ """Nettoie et valide la réponse."""
47
+ response = state["response"].strip()
48
+
49
+ # Vérifier si la réponse est pertinente
50
+ if not response or response.lower() in ["je ne sais pas", "i don't know"]:
51
+ response = "Désolé, je n'ai pas trouvé d'informations pertinentes pour votre question."
52
+
53
+ return {"response": response}
54
+
55
+ # Construction du graphe
56
+ graph_builder = StateGraph(GraphState)
57
+ graph_builder.add_node("retrieve", retrieve_combined)
58
+ graph_builder.add_node("generate", generate_response)
59
+ graph_builder.add_node("post_process", post_process_response)
60
+
61
+ graph_builder.set_entry_point("retrieve")
62
+ graph_builder.add_edge("retrieve", "generate")
63
+ graph_builder.add_edge("generate", "post_process")
64
+ graph_builder.add_edge("post_process", END)
65
+
66
+ agent = graph_builder.compile()