Chapitre 1 : LangChain pour RAG
Aperçu de LangChain
LangChain fournit des blocs de construction pour les pipelines RAG :
- Chargeurs et diviseurs de documents
- Embeddings et magasins de vecteurs
- Récupérateurs et chaînes
- LCEL pour la composabilité
Chaîne RAG de base
from langchain.chat_models import ChatOpenAI
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
# Configuration
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(documents, embeddings)
llm = ChatOpenAI(model="gpt-4")
# Créer une chaîne
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
# Requête
response = qa_chain.invoke("What is RAG?")
print(response["result"])
LCEL (LangChain Expression Language)
Approche moderne et composable :
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# Définir le prompt
prompt = ChatPromptTemplate.from_template("""
Answer the question based on the context:
Context: {context}
Question: {question}
Answer:""")
# Construire une chaîne avec LCEL
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# Utiliser
response = chain.invoke("What is RAG?")
Types de chaînes
| Type | Description | Cas d'utilisation |
|---|---|---|
| stuff | Mettre tous les documents dans le prompt | Petits contextes |
| map_reduce | Traiter les documents séparément, combiner | Grandes bases de données |
| refine | Affiner la réponse de manière itérative | Requêtes complexes |
| map_rerank | Noter et sélectionner le meilleur | Réponses multiples |
Ajouter de la mémoire
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=retriever,
memory=memory
)
# Maintient le contexte de la conversation
chain.invoke({"question": "What is RAG?"})
chain.invoke({"question": "What are its benefits?"}) # Se souvient du contexte
Prochaines étapes
Continuez vers Chapitre 2 : LlamaIndex.