ChromaDB como el cerebro vectorial para chatbots conscientes de documentos
Por qué RAG necesita un almacén de vectores, cómo funcionan las colecciones y los filtros de metadatos de Chroma, y cuándo prototiparlos allí antes de graduarse.
ChromaDB: el almacén de vectores detrás de “chat with my docs”
Algunos chatbots parecen tener un conocimiento extraño de tus archivos: PDFs de recursos humanos, catálogos de productos, un informe de cincuenta páginas de la semana pasada. Detrás de ese comportamiento se encuentra una b base de datos de vectores. Para muchos desarrolladores, ChromaDB es la opción por defecto cuando necesitan crear rápidamente esa capa.
El problema que resuelve Chroma
Los LLM son grandes generalistas, pero pobres empleados de tu empresa: no conocen el memorando de ingresos del último trimestre ni la política de vacaciones. El ajuste fino con documentos privados es lento y frágil. En cambio, la generación mejorada por recuperación incrusta documentos, almacena vectores, recupera elementos similares para una pregunta y proporciona esos fragmentos al modelo como contexto.
Necesitas un lugar para almacenar los embeddings, filtrar metadatos y consultar vecinos más cercanos. Chroma tiene como objetivo ser ese lugar, con una API sencilla de usar.
Qué es Chroma
Una base de datos de incrustación de código abierto con un enfoque en Python: crea una colección, agrega documentos con incrustaciones y metadatos, realiza búsquedas por vector o texto (con una función de incrustación integrada). Puede ejecutarse en el mismo proceso para prototipos o como servicio para equipos pequeños.
Flujo de trabajo principal
Instala y crea un cliente/colección:
"The quarterly revenue exceeded projections."
→ [0.021, -0.143, 0.887, 0.002, ... ] (1536 numbers)
Agrega textos (Chroma puede llamar a una función de incrustación por ti):
import chromadb
Búscalo en los fragmentos más cercanos:
client = chromadb.Client()
collection = client.create_collection("company-docs")collection.add(
documents=["Q3 revenue exceeded projections by 12%"],
metadatas=[{"department": "finance", "quarter": "Q3"}],
ids=["doc-001"]
)
Los filtros de metadatos reducen los resultados a una línea de productos, inquilino o fecha:
results = collection.query(
query_texts=["What was our budget performance last quarter?"],
n_results=3,
where={"department": "finance"} # Optional metadata filter
)
Persistencia y clientes
Los clientes efímeros desaparecen con el proceso; es adecuado para pruebas. Las rutas persistentes conservan los datos entre ejecuciones:
System: You are a helpful assistant. Use the following context to answer.
Los clientes HTTP se comunican con un servidor Chroma cuando superas las limitaciones del modo incrustado:
Context:
- "Q3 revenue exceeded projections by 12%"
- "Engineering headcount grew to support product roadmap"
- "Marketing spend increased customer acquisition"User: How did we perform in Q3?
Dónde encaja frente a alternativas
Chroma destaca para aplicaciones locales, cuadernos de notas y servicios RAG iniciales. Cuando necesite alta disponibilidad en múltiples regiones, operaciones de búsqueda híbrida complejas o una escala extrema, considere clústeres diseñados específicamente para ello (Qdrant, Weaviate, pgvector a gran escala, etc.). Muchos equipos siguen prototipando con Chroma y migran más tarde.
Bucle RAG mínimo
Incorpore la pregunta, realice una búsqueda en la colección, guarde los documentos dentro de un prompt y genere el resultado:
User Query
↓
Embedding Model
↓
Query Vector
↓
ChromaDB (HNSW Index)
↓
Top-K Similar Documents
↓
LLM Prompt (Context + Query)
↓
Accurate, Grounded Answer
pip install chromadb
Mantenga tamaños razonables de los fragmentos, almacene las rutas de origen en los metadatos y mencínelas en la interfaz de respuesta.
Cuándo no usarlo
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
Omita Chroma si ya ha estandarizado con otra capa vectorial, necesita topologías distribuidas complejas desde el primer día o solo cuenta con consultas relacionales sin incrustaciones. De lo contrario, sigue siendo un “cerebro secreto” práctico para chatbots conscientes de documentos.
# Step 1: Load your documents
loader = PyPDFLoader("company-policy.pdf")
documents = loader.load()# Step 2: Split into chunks
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(documents)# Step 3: Embed and store in ChromaDB
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=OpenAIEmbeddings(),
persist_directory="./chroma_store"
)# Step 4: Query it
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
results = retriever.invoke("What is the remote work policy?")for r in results:
print(r.page_content)
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Preferir etiquetas de modelo explícitas en cada ejemplo para que las actualizaciones no cambien silenciosamente el comportamiento a mitad del tutorial.
Lecturas relacionadas
- RAG local completo para PDF con LangChain, Ollama y Chroma — Procesar PDF localmente, integrarlos con Ollama, almacenarlos en Chroma y responder sin conexión; no se necesitan claves de API en la nube una vez que se han cargado los modelos.
- RAG para políticas de HR en entorno de producción con LangChain y LangGraph — Procesamiento de datos, MMR, reescritura consciente del historial, respuestas basadas en información concreta, medidas de seguridad, evaluación, citas y orquestación gráfica para un asistente de políticas de HR.