Tutorial: Integrar OpenAI API en Python paso a paso
Desde tu primera llamada a GPT hasta un sistema completo con streaming, function calling y manejo de errores. Código production-ready.
Construye un sistema de Retrieval Augmented Generation que responde preguntas sobre tus propios documentos. Usa LangChain, ChromaDB y OpenAI.
RAG (Retrieval Augmented Generation) permite que un LLM responda preguntas basándose en tus documentos, no solo en su entrenamiento. Este tutorial construye un sistema RAG completo paso a paso.
pip install langchain langchain-openai langchain-community chromadb tiktoken
from langchain_community.document_loaders import (
DirectoryLoader, TextLoader, PyPDFLoader
)
# Cargar todos los .txt de una carpeta
loader = DirectoryLoader(
'./docs/',
glob="**/*.txt",
loader_cls=TextLoader,
show_progress=True,
)
documents = loader.load()
print(f"Documentos cargados: {len(documents)}")
# O cargar un PDF
pdf_docs = PyPDFLoader("manual.pdf").load()
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # Caracteres por chunk
chunk_overlap=200, # Overlap entre chunks para no perder contexto
separators=["
", "
", ". ", " ", ""],
)
chunks = splitter.split_documents(documents)
print(f"Chunks generados: {len(chunks)}")
# Cada chunk tiene .page_content y .metadata
for chunk in chunks[:3]:
print(f" [{chunk.metadata['source']}] {chunk.page_content[:80]}...")
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# Crear base de datos vectorial (persiste en disco)
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db",
collection_name="mis_documentos",
)
print(f"Vectores almacenados: {vectorstore._collection.count()}")
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
template = """Usa el siguiente contexto para responder la pregunta.
Si no encuentras la respuesta en el contexto, di "No tengo información sobre eso."
Contexto:
{context}
Pregunta: {question}
Respuesta útil:"""
prompt = PromptTemplate(
template=template,
input_variables=["context", "question"],
)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(
search_type="mmr", # Diversidad en resultados
search_kwargs={"k": 5}, # Top 5 chunks más relevantes
),
chain_type_kwargs={"prompt": prompt},
return_source_documents=True,
)
# Hacer una pregunta
result = qa_chain.invoke({"query": "¿Cómo configuro las credenciales?"})
print(result["result"])
for doc in result["source_documents"]:
print(f" Fuente: {doc.metadata['source']}")
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# Cargar vectorstore existente al iniciar
vectorstore = Chroma(
persist_directory="./chroma_db",
embedding_function=OpenAIEmbeddings(model="text-embedding-3-small"),
collection_name="mis_documentos",
)
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4o-mini", temperature=0),
retriever=vectorstore.as_retriever(search_kwargs={"k": 5}),
return_source_documents=True,
)
class Question(BaseModel):
query: str
@app.post("/ask")
async def ask(q: Question):
result = qa_chain.invoke({"query": q.query})
return {
"answer": result["result"],
"sources": [d.metadata["source"] for d in result["source_documents"]],
}
text-embedding-3-small es 5x más barato que ada-002 y mejor calidadEste recurso incluye un enlace externo. Regístrate para acceder.
Regístrate gratis para descargar archivos, guardar recursos en favoritos, ganar XP y acceder a cursos y el foro de la comunidad.
¿Ya tienes cuenta? Inicia sesión
Autor
Erik Taveras
Creado por
Erik Taveras
Desde tu primera llamada a GPT hasta un sistema completo con streaming, function calling y manejo de errores. Código production-ready.
Implementación paso a paso de Stripe Checkout para cobros únicos y suscripciones en Django. Incluye webhooks, portal del cliente y manejo de estados.
Comparativa práctica entre REST y GraphQL con ejemplos en Python. Ventajas, desventajas y criterios de decisión para tu próximo proyecto.