Capítulo 1: LangChain para RAG
Descripción general de LangChain
LangChain proporciona bloques de construcción para pipelines de RAG:
- Cargadores y divisores de documentos
- Embeddings y almacenes vectoriales
- Retrievers y chains
- LCEL para composabilidad
Cadena RAG básica
from langchain.chat_models import ChatOpenAI
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
# Setup
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(documents, embeddings)
llm = ChatOpenAI(model="gpt-4")
# Create chain
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
# Query
response = qa_chain.invoke("What is RAG?")
print(response["result"])
LCEL (Lenguaje de Expresión de LangChain)
Enfoque moderno y componible:
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# Define prompt
prompt = ChatPromptTemplate.from_template("""
Answer the question based on the context:
Context: {context}
Question: {question}
Answer:""")
# Build chain with LCEL
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# Use
response = chain.invoke("What is RAG?")
Tipos de cadenas
| Tipo | Descripción | Caso de uso |
|---|---|---|
| stuff | Pone todos los documentos en el prompt | Contextos pequeños |
| map_reduce | Procesa documentos por separado, luego combina | Conjuntos de datos grandes |
| refine | Refina la respuesta de manera iterativa | Consultas complejas |
| map_rerank | Puntúa y selecciona la mejor | Múltiples respuestas |
Añadiendo memoria
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
)
# Mantiene el contexto de la conversación
chain.invoke({"question": "What is RAG?"})
chain.invoke({"question": "What are its benefits?"}) # Recuerda el contexto
Próximos pasos
Continúe a Capítulo 2: LlamaIndex.