Files

76 lines
3.0 KiB
Python
Raw Permalink Normal View History

2026-04-10 10:15:37 +00:00
import os
from dotenv import load_dotenv
from langchain_google_genai import ChatGoogleGenerativeAI, GoogleGenerativeAIEmbeddings
from langchain_qdrant import QdrantVectorStore
from qdrant_client import QdrantClient
from langchain_classic.chains import create_retrieval_chain
from langchain_classic.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
# 1. Chargement de la clé API
load_dotenv()
api_key = os.getenv("GOOGLE_API_KEY")
def interroger_mon_rag(question):
# --- A. CONFIGURATION DES MODÈLES ---
# Le modèle qui va générer la réponse
llm = ChatGoogleGenerativeAI(model="gemini-2.5-flash", google_api_key=api_key, temperature=0)
# Le modèle qui transforme le texte en vecteurs (doit être le même que celui utilisé pour remplir la base)
embeddings = GoogleGenerativeAIEmbeddings(model="models/gemini-embedding-001")
# --- B. CONNEXION À QDRANT ---
# Remplacez l'URL par l'adresse de votre VM (ex: http://localhost:6333)
# Et mettez le vrai nom de votre collection Qdrant
qdrant_url = "http://qdrant:6333"
nom_collection = "rag-1"
client = QdrantClient(url=qdrant_url)
# On connecte LangChain à Qdrant
vector_store = QdrantVectorStore(
client=client,
collection_name=nom_collection,
embedding=embeddings
)
# On transforme la base en "Retriever" (un outil qui va chercher les 3 meilleurs documents)
retriever = vector_store.as_retriever(search_kwargs={"k": 3})
# --- C. CRÉATION DU PROMPT RAG ---
# Le mot {context} sera automatiquement remplacé par les documents trouvés dans Qdrant
system_prompt = (
"Tu es un assistant utile. Utilise UNIQUEMENT les morceaux de contexte "
"fournis ci-dessous pour répondre à la question. Si tu ne connais pas la réponse "
"à partir du contexte, dis simplement que tu ne sais pas."
"\n\n"
"Contexte :\n{context}"
)
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt),
("human", "{input}"),
])
# --- D. ASSEMBLAGE DE LA CHAÎNE ---
# 1. Chaîne qui combine les documents récupérés et le prompt
question_answer_chain = create_stuff_documents_chain(llm, prompt)
# 2. Chaîne globale qui fait la recherche PUIS appelle la chaîne précédente
rag_chain = create_retrieval_chain(retriever, question_answer_chain)
# --- E. EXÉCUTION ---
print(f"Recherche de la réponse pour : '{question}'...\n")
reponse = rag_chain.invoke({"input": question})
print("🤖 Réponse de Gemini :")
print(reponse["answer"])
print("\n📄 Documents sources utilisés :")
for doc in reponse["context"]:
# Affiche un extrait du document source et ses métadonnées
print(f"- {doc.page_content[:100]}... (Source: {doc.metadata})")
# Test du script
if __name__ == "__main__":
interroger_mon_rag("Quelles sont les passions de vincent poupet ?")