76 lines
3.0 KiB
Python
76 lines
3.0 KiB
Python
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 ?") |