Update agent_collaboratif_avid.py
Browse files- agent_collaboratif_avid.py +62 -4
agent_collaboratif_avid.py
CHANGED
|
@@ -43,9 +43,13 @@ import asyncio
|
|
| 43 |
|
| 44 |
# Configuration API
|
| 45 |
PINECONE_API_KEY = os.environ.get("PINECONE_API_KEY")
|
| 46 |
-
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
|
| 47 |
-
OPENAI_BASE_URL = os.environ.get("OPENAI_BASE_URL")
|
| 48 |
-
OPENAI_MODEL_NAME = os.environ.get("OPENAI_MODEL_NAME")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
|
| 50 |
HUGGINGFACE_MODEL = os.environ.get("HUGGINGFACE_MODEL", "sentence-transformers/all-mpnet-base-v2")
|
| 51 |
PINECONE_INDEX_NAME = "all-jdlp"
|
|
@@ -126,6 +130,7 @@ class AgentState(TypedDict):
|
|
| 126 |
iteration_count: int
|
| 127 |
errors: List[str]
|
| 128 |
additional_information: List[Dict[str, Any]] # Nouvelles infos similaires
|
|
|
|
| 129 |
|
| 130 |
# =============================================================================
|
| 131 |
# INITIALISATION DES RETRIEVERS PINECONE
|
|
@@ -653,7 +658,53 @@ def collect_similar_information_node(state: AgentState) -> AgentState:
|
|
| 653 |
print(f"✅ {len(similar_info)} information(s) similaire(s) trouvée(s)\n")
|
| 654 |
|
| 655 |
state["additional_information"] = similar_info
|
| 656 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 657 |
return state
|
| 658 |
|
| 659 |
# =============================================================================
|
|
@@ -997,6 +1048,13 @@ def display_results(result: Dict[str, Any]) -> None:
|
|
| 997 |
# FONCTION MAIN
|
| 998 |
# =============================================================================
|
| 999 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1000 |
async def main():
|
| 1001 |
"""Fonction principale de l'application."""
|
| 1002 |
|
|
|
|
| 43 |
|
| 44 |
# Configuration API
|
| 45 |
PINECONE_API_KEY = os.environ.get("PINECONE_API_KEY")
|
| 46 |
+
#OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
|
| 47 |
+
#OPENAI_BASE_URL = os.environ.get("OPENAI_BASE_URL")
|
| 48 |
+
#OPENAI_MODEL_NAME = os.environ.get("OPENAI_MODEL_NAME")
|
| 49 |
+
|
| 50 |
+
OPENAI_API_KEY="sk-b8b00f8614a2496aa013103aaa53e753"
|
| 51 |
+
OPENAI_MODEL_NAME="mistralai/Mistral-Small-3.1-24B-Instruct-2503"
|
| 52 |
+
OPENAI_BASE_URL="https://ragarenn.eskemm-numerique.fr/sso/ch@t/api"
|
| 53 |
|
| 54 |
HUGGINGFACE_MODEL = os.environ.get("HUGGINGFACE_MODEL", "sentence-transformers/all-mpnet-base-v2")
|
| 55 |
PINECONE_INDEX_NAME = "all-jdlp"
|
|
|
|
| 130 |
iteration_count: int
|
| 131 |
errors: List[str]
|
| 132 |
additional_information: List[Dict[str, Any]] # Nouvelles infos similaires
|
| 133 |
+
similar_info_response: str # Réponse LLM basée sur les informations similaires
|
| 134 |
|
| 135 |
# =============================================================================
|
| 136 |
# INITIALISATION DES RETRIEVERS PINECONE
|
|
|
|
| 658 |
print(f"✅ {len(similar_info)} information(s) similaire(s) trouvée(s)\n")
|
| 659 |
|
| 660 |
state["additional_information"] = similar_info
|
| 661 |
+
|
| 662 |
+
# Génération de la réponse LLM à partir des informations similaires
|
| 663 |
+
if similar_info:
|
| 664 |
+
print(f"🧠 Génération d'une synthèse LLM pour les informations similaires...")
|
| 665 |
+
llm = ChatOpenAI(
|
| 666 |
+
model=OPENAI_MODEL_NAME,
|
| 667 |
+
base_url=OPENAI_BASE_URL,
|
| 668 |
+
api_key=OPENAI_API_KEY,
|
| 669 |
+
temperature=0.7 # Température plus élevée pour une réponse créative/synthétisée
|
| 670 |
+
)
|
| 671 |
+
|
| 672 |
+
similar_info_prompt = ChatPromptTemplate.from_messages([
|
| 673 |
+
("system", """Tu es un assistant expert de l'Université Gustave Eiffel spécialisé en Ville Durable.
|
| 674 |
+
|
| 675 |
+
Les informations suivantes sont des documents similaires ou apparentés à la requête initiale, mais qui n'ont pas été utilisées pour générer la réponse principale. Ton rôle est de les synthétiser et de les présenter de manière concise et utile pour l'utilisateur, en expliquant en quoi elles pourraient être intéressantes ou complémentaires.
|
| 676 |
+
|
| 677 |
+
REÇUES:
|
| 678 |
+
{similar_information}
|
| 679 |
+
|
| 680 |
+
Réponds de manière professionnelle, sans inventer d'informations. Mets en avant la diversité des sources et la pertinence potentielle pour l'utilisateur."""),
|
| 681 |
+
("human", """Requête originale: {user_query}
|
| 682 |
+
|
| 683 |
+
Voici les informations similaires que j'ai trouvées. Peux-tu en faire une synthèse qui met en lumière leur intérêt potentiel pour ma requête originale, même si elles n'ont pas été utilisées directement dans la réponse principale ?""")
|
| 684 |
+
])
|
| 685 |
+
|
| 686 |
+
similar_info_chain = similar_info_prompt | llm
|
| 687 |
+
|
| 688 |
+
try:
|
| 689 |
+
similar_info_text = json.dumps(
|
| 690 |
+
similar_info,
|
| 691 |
+
ensure_ascii=False,
|
| 692 |
+
indent=2
|
| 693 |
+
)
|
| 694 |
+
llm_response = similar_info_chain.invoke({
|
| 695 |
+
"user_query": state["user_query"],
|
| 696 |
+
"similar_information": similar_info_text
|
| 697 |
+
})
|
| 698 |
+
state["similar_info_response"] = llm_response.content
|
| 699 |
+
print(f"✅ Synthèse LLM des informations similaires générée.\n")
|
| 700 |
+
except Exception as e:
|
| 701 |
+
error_msg = f"Erreur lors de la génération de la synthèse des informations similaires: {str(e)}"
|
| 702 |
+
print(f"❌ {error_msg}")
|
| 703 |
+
state["errors"].append(error_msg)
|
| 704 |
+
state["similar_info_response"] = f"Erreur: {error_msg}"
|
| 705 |
+
else:
|
| 706 |
+
state["similar_info_response"] = "Aucune information similaire pertinente n'a été trouvée."
|
| 707 |
+
|
| 708 |
return state
|
| 709 |
|
| 710 |
# =============================================================================
|
|
|
|
| 1048 |
# FONCTION MAIN
|
| 1049 |
# =============================================================================
|
| 1050 |
|
| 1051 |
+
if result.get('similar_info_response'):
|
| 1052 |
+
print(f"\n{'='*80}")
|
| 1053 |
+
print(f"🧠 SYNTHÈSE LLM DES INFORMATIONS SIMILAIRES")
|
| 1054 |
+
print(f"{'='*80}")
|
| 1055 |
+
print(result['similar_info_response'])
|
| 1056 |
+
print()
|
| 1057 |
+
|
| 1058 |
async def main():
|
| 1059 |
"""Fonction principale de l'application."""
|
| 1060 |
|