Construcción de bases de conocimiento personalizadas con DeepSeek Embeddings

En la era de los modelos de lenguaje y de los sistemas de Generación Aumentada por Recuperación (RAG), las bases de conocimiento juegan un papel crucial para dotar a los modelos de IA de información factual actualizada.

Una base de conocimiento en este contexto suele ser una colección de documentos o datos procesados a un formato fácilmente consultable por IA, a menudo convirtiendo texto en embeddings numéricos para búsqueda semántica.

A diferencia de la búsqueda por palabras clave tradicional, los embeddings capturan el significado del texto en vectores de alta dimensión, permitiendo encontrar información relevante aunque no haya coincidencias exactas de palabras.

Este enfoque semántico es vital en aplicaciones como preguntas y respuestas, análisis de documentos y chatbots que requieren contexto preciso.

DeepSeek Embeddings ha emergido como una opción sólida para construir estos sistemas. DeepSeek es una plataforma avanzada de IA open-source reconocida por sus modelos de lenguaje de alto rendimiento (como DeepSeek-V2, DeepSeek V3, R1, etc.), que rivalizan en capacidad con soluciones propietarias.

Además de modelos generativos, DeepSeek ofrece potentes modelos de embeddings que podemos aprovechar para crear bases de conocimiento semánticas personalizadas.

En este artículo técnico exploraremos qué son los embeddings, qué ofrece específicamente DeepSeek Embeddings, y cómo utilizarlo paso a paso para construir una base de conocimiento propia optimizada para desarrolladores.

También compararemos DeepSeek con otros sistemas populares (OpenAI, Cohere, HuggingFace), cubriendo rendimiento, licenciamiento y casos de uso, y proporcionaremos recomendaciones y buenas prácticas para llevar estos sistemas a producción de forma eficiente.

¿Qué son los embeddings y qué ofrece DeepSeek Embeddings?

Un embedding es una representación numérica de un texto (palabra, frase o documento) en forma de vector denso de dimensiones fijas. Estos vectores se construyen de tal forma que textos con significado semántico similar queden próximos entre sí en el espacio vectorial, incluso si no comparten palabras clave. Gracias a ello, los embeddings permiten comparar similitud de significado entre textos de manera eficiente, habilitando funcionalidades como búsqueda semántica, clustering de documentos, recomendación de contenidos y provisión de “memoria” contextual para chatbots.

Por ejemplo, un sistema de recomendación puede mapear descripciones de productos a vectores y sugerir items similares buscando los vectores más cercanos, o un chatbot puede recuperar fragmentos relevantes de documentación convirtiendo la pregunta del usuario a vector y encontrando párrafos con vectores cercanos.

DeepSeek Embeddings se refiere a los modelos de DeepSeek diseñados para generar estas representaciones vectoriales de textos. DeepSeek proporciona modelos de embedding de alta calidad que transforman texto en vectores densos capturando el significado semántico. Su modelo de embedding por defecto (comúnmente referenciado como deepseek-embedding-v2) convierte cualquier texto de entrada en un vector de 768 dimensiones.

Cada dimensión de este vector numérico representa algún aspecto latente del significado del texto. Textos semánticamente similares producirán vectores cercanos (medidos, por ejemplo, con similitud de coseno o producto interno), incluso si no comparten palabras, lo que hace a los embeddings ideales para implementar buscadores semánticos e inteligentes.

¿Por qué DeepSeek Embeddings? Los modelos de DeepSeek para embedding ofrecen capacidades comparables a las de servicios propietarios, manteniendo la flexibilidad de una plataforma abierta. En particular, DeepSeek-Embedding-v2 (versión 2) es el modelo dedicado recomendado para generar embeddings, análogo a cómo OpenAI ofrece text-embedding-ada-002 para esta tarea.

DeepSeek ha mejorado la precisión y eficiencia en su versión v2 frente a v1, y produce vectores de longitud 768 (en comparación, el modelo de OpenAI Ada-002 utiliza 1536 dimensiones).

Contar con 768 dimensiones implica vectores más compactos, lo cual equilibra expresividad semántica con menor coste de almacenamiento y cómputo en la base vectorial. Además, los embeddings de DeepSeek capturan información multilingüe, ya que sus modelos han sido entrenados en enormes corpus en inglés y chino, entre otros idiomas.

Esto significa que operan en un espacio semántico compartido entre lenguajes, permitiendo incluso recuperación cruzada (por ejemplo, una consulta en español podría encontrar un documento relevante en inglés). Esta capacidad multilingüe de DeepSeek es una ventaja destacada para bases de conocimiento globales.

Es importante resaltar que DeepSeek proporciona modelos especializados para embeddings, a diferencia de usar directamente un modelo generativo para este fin. Si bien técnicamente se podría usar un modelo grande (ej. DeepSeek-R1 o V3) extrayendo sus estados internos para obtener embeddings, no están optimizados para consistencia semántica en la vectorización.

La práctica recomendada (respaldada por la comunidad) es utilizar modelos dedicados de embedding para la etapa de recuperación, ya que los modelos ajustados para chat podrían introducir ruido en los vectores. De hecho, en foros especializados se sugiere no usar DeepSeek-R1 para retrieval, sino optar por embeddings dedicados (el modelo Qwen de Alibaba es citado como una alternativa sobresaliente en benchmarks).

En nuestro caso, nos centraremos en DeepSeek-Embedding-v2, el modelo dedicado de DeepSeek para obtener las mejores prestaciones en búsqueda semántica.

Comparativa con OpenAI, Cohere, HuggingFace y otros sistemas de embeddings

Al evaluar DeepSeek Embeddings frente a otras opciones populares, conviene analizar varios aspectos: calidad de los embeddings (precisión semántica), dimensiones del vector, soporte multilingüe, facilidad de uso, licencia y coste.

  • OpenAI (Modelo text-embedding-ada-002) – Es uno de los servicios más utilizados por su facilidad (API directa) y rendimiento sólido. Genera vectores de 1536 dimensiones con alta calidad en múltiples tareas. Su principal ventaja es que “funciona de caja” vía API en la nube de OpenAI, sin necesidad de infraestructura propia. Ada-002 obtiene resultados destacados en benchmarks como MTEB, lo que lo hace un baseline fiable. Sin embargo, es un modelo cerrado: no es posible afinarlo con datos propios ni ejecutarlo localmente, y su uso implica enviar datos a un servicio externo. A nivel de coste, OpenAI cobra del orden de $0.0001 por cada 1K tokens procesados en embeddings, un precio competitivo pero que puede acumularse con grandes volúmenes de datos. También impone ciertas limitaciones de velocidad y tamaño de entrada (máximo ~8K tokens por solicitud en Ada-002).
  • Cohere – Cohere ofrece modelos de embedding vía API (p. ej. embed-multilingual-v2, embed-english-v3 y versiones posteriores). Una ventaja es que manejan entradas de longitud considerable (orientado a párrafos o documentos) y ofrecen modelos especializados por dominio, por ejemplo enfocados a comercio electrónico, obteniendo mejor relevancia en ese ámbito. La calidad de Cohere es comparable a OpenAI en muchos casos, y suelen actualizar sus modelos con versiones (v3, v4, etc.) para mejorar precisión. No obstante, al igual que OpenAI, son servicios propietarios: no se pueden autohostear, y el licenciamiento es cerrado. El costo de Cohere por embedding está en el mismo orden de magnitud que OpenAI (cobrando por token procesado), aunque con distintos planes según el modelo y volumen. Cohere se ha posicionado como una alternativa viable cuando se requiere un equilibrio entre rendimiento y ciertas características como longitudes de entrada mayores o modelos adaptados a tareas específicas.
  • Modelos abiertos (HuggingFace/Sentence Transformers y otros) – La comunidad open-source ofrece multitud de modelos de embeddings pre-entrenados que se pueden ejecutar localmente. Por ejemplo, la librería Sentence Transformers (basada en Transformers de HuggingFace) provee modelos populares como all-mpnet-base-v2 (768 dimensiones) o all-MiniLM-L6-v2 (384 dimensiones), que son ampliamente usados para propósitos generales. Estos modelos abiertos tienen la ventaja de ser gratuitos (sin costo por uso, más allá del computacional), personalizables (pueden afinarse en datos propios) y pueden integrarse sin enviar datos a terceros. Muchos son más ligeros que los modelos de las grandes APIs, por lo que pueden usarse en entornos con recursos limitados o incluso en el dispositivo del cliente (por ejemplo, MiniLM se emplea en móviles por su tamaño compacto). La contrapartida es que su rendimiento varía: algunos pueden no alcanzar la precisión de Ada-002 en semantic search, y suelen tener límites de longitud de entrada más bajos (típicamente 512 tokens). Otro exponente es Qwen-7B de Alibaba, un modelo open-source de 7 mil millones de parámetros especializado en embeddings, que encabeza rankings de calidad semántica (MTEB) y ha ganado adopción en la comunidad. En general, los modelos open-source ofrecen mayor control (puedes alojarlos en tus servidores, garantizando privacidad y eliminando dependencia de un proveedor) a cambio de requerir potencia de cómputo propia y cierto trabajo de integración.
  • DeepSeek Embeddings – Ubicado en un punto interesante de este espectro, DeepSeek ofrece lo mejor de ambos mundos: calidad state-of-the-art comparable a los servicios líderes, con la flexibilidad de un ecosistema abierto. Sus modelos de embedding alcanzan un rendimiento competitivo en comprensión semántica, cercano a las soluciones de OpenAI y Google según pruebas internas, gracias a su entrenamiento masivo (2 trillones de tokens, bilingüe). A la vez, DeepSeek es una plataforma abierta: su modelo principal (DeepSeek-R1, para chat) está publicado bajo licencia MIT, y aunque el modelo específico de embeddings se consume vía API, la compañía ha liberado pesos de algunos modelos (como DeepSeek-V2 236B y versiones reducidas de R1) para uso local. Esto significa que tienes la opción de autohospedaje: por un lado, DeepSeek ofrece una API en la nube compatible con el formato de OpenAI (lo que hace trivial integrarlo en aplicaciones existentes); por otro lado, si cuentas con el hardware adecuado, podrías ejecutar determinados modelos DeepSeek en tus propios servidores, evitando costos por token y cumpliendo requisitos de privacidad de datos. En términos de coste, la API de DeepSeek se sitúa en precio similar o menor que OpenAI. Por ejemplo, su modelo de chat R1 se ofrece ~$0.28 por millón de tokens de entrada (unos $0.00028 por 1K tokens), lo cual sugiere que el embedding podría tener un costo en el mismo orden o inferior al de Ada-002. Y si se opta por la ruta self-hosted, el costo variable por uso desaparece a cambio de la inversión en infraestructura. En cuanto a licencia y personalización, la filosofía de DeepSeek enfatiza la apertura: los desarrolladores pueden inspeccionar el funcionamiento del modelo e incluso afinar los pesos abiertos para adaptarlos a nichos o datos específicos, algo imposible con los servicios cerrados. Esta capacidad de fine-tuning sobre las bases del modelo permite llevar la calidad más allá en dominios particulares (por ejemplo, afinando los embeddings con vocabulario médico, legal, etc., se podría mejorar la relevancia en esas áreas).

En resumen, DeepSeek Embeddings se presenta como una alternativa potente a las soluciones propietarias como OpenAI, ofreciendo calidad competitiva, costos potencialmente menores y mayor control sobre la implementación.

Para un equipo de desarrolladores, esto significa evitar la dependencia total de un proveedor (vendor lock-in), la posibilidad de operar on-premises si la política lo exige, y participar de una comunidad abierta que está construyendo integraciones y herramientas en torno a DeepSeek (por ejemplo, plugins de LangChain, SDKs no oficiales, soporte en frameworks como Ollama).

En los siguientes apartados profundizaremos en cómo utilizar concretamente DeepSeek Embeddings para construir un sistema de recuperación de información aumentada con IA.

Uso de DeepSeek Embeddings en bases de conocimiento (RAG, chatbots, etc.)

Un flujo típico para incorporar embeddings en una base de conocimiento es a través de un sistema de Retrieval-Augmented Generation (RAG).

En este esquema, combinamos lo mejor de la búsqueda semántica con las capacidades generativas de un modelo de lenguaje: primero recuperamos del vectorizador los documentos más relevantes para la consulta del usuario, y luego esos fragmentos se proporcionan al modelo LLM para que genere una respuesta fundamentada en la información recuperada.

DeepSeek Embeddings encaja en la fase de recuperación de este pipeline, proporcionando el “motor” semántico que encuentra el conocimiento pertinente dentro de nuestros datos.

¿Cómo sería este proceso a grandes rasgos? Imaginemos que queremos construir un chatbot que responda preguntas sobre el conjunto de manuales internos de nuestra empresa. Los pasos serían:

  1. Indexación previa: Tomamos todos los documentos (PDFs, HTMLs, Markdown, etc.) y extraemos su contenido textual. Cada documento se divide en porciones manejables (chunks) y a cada porción le generamos un vector embedding usando DeepSeek. Esos vectores se almacenan en una base de datos vectorial junto con referencias al texto original. Tras este proceso offline, ya tenemos nuestra base de conocimiento vectorizada: esencialmente un índice semántico de todos los contenidos.
  2. Consulta: Cuando llega una pregunta del usuario, el sistema convierte la pregunta en un vector embedding (utilizando el mismo modelo DeepSeek, para estar en el mismo espacio vectorial). Con ese vector de consulta, realiza una búsqueda de vecinos más cercanos en la base vectorial, recuperando por ejemplo los 5-10 fragmentos de texto más similares semánticamente a la pregunta. Estos fragmentos son, presumiblemente, los pasajes más relevantes que contienen la respuesta o información relacionada.
  3. Generación: Finalmente, el conjunto de fragmentos recuperados se pasa como contexto al modelo generativo (por ejemplo, DeepSeek-R1, GPT-4, etc.), formulando un prompt que incluya la pregunta del usuario más la información de contexto. El modelo entonces elabora una respuesta basada en el conocimiento proporcionado, citando o utilizando los detalles de los documentos relevantes. De esta forma, el chatbot responde con información específica y respaldada por la base de conocimiento, en lugar de solo con conocimiento general entrenado en sus pesos.

Este enfoque permite construir asistentes de IA que son fácticos y actualizables, ya que se alimentan de una base de conocimiento personalizable. No importa qué tan “grande” sea el modelo de lenguaje subyacente: si no contiene ciertos datos (por ejemplo, políticas internas de la empresa, documentación de un producto propio, legislación local, etc.), mediante RAG puede acceder a ellos siempre que estén en la base de conocimiento indexada.

Casos de uso comunes incluyen chatbots de soporte al cliente (que refieren respuestas de manuales de producto o FAQs), sistemas de búsqueda semántica empresarial (para que empleados consulten información en múltiples repositorios), asistentes para análisis de contratos o legales (respondiendo preguntas con base en un corpus legal), o incluso tutores inteligentes que se basan en materiales educativos proporcionados.

En todos estos, los embeddings son la pieza central para que la máquina entienda la semántica de la pregunta y los documentos, y así lograr un matching mucho más inteligente que un buscador de texto literal.

Figura 1: Diagrama de flujo de un sistema RAG que integra DeepSeek (motor de embeddings) con una base vectorial y un modelo generativo. Los documentos se indexan en vectores; ante una pregunta, se buscan vectores similares y los resultados se usan como contexto para la respuesta del LLM.

En la figura 1 se ilustra este flujo: a la izquierda se ingesta e indexa la información (con DeepSeek generando vectores); a la derecha, ante una consulta, la búsqueda vectorial trae contenido relevante que luego el modelo de lenguaje utiliza para componer la respuesta final.

A continuación, desarrollaremos una guía paso a paso para implementar este pipeline con DeepSeek Embeddings, desde la preparación de los datos hasta la puesta en producción.

Guía paso a paso: Construir una base de conocimiento con DeepSeek Embeddings

A continuación, describimos un pipeline típico para construir tu propia base de conocimiento personalizada utilizando DeepSeek Embeddings. Este pipeline cubre desde la ingestión de documentos, pasando por la generación de embeddings y almacenamiento, hasta las consultas con un LLM.

Paso 1: Carga de documentos y preprocesamiento. El primer paso es reunir y preparar los documentos que formarán parte de la base de conocimiento. Los documentos pueden venir en diversos formatos: archivos PDF, páginas HTML, documentos Word, Markdown, texto plano, etc. Será necesario extraer el texto bruto de cada uno usando herramientas adecuadas a cada formato (por ejemplo, librerías como PyMuPDF o pdfplumber para PDF, librerías de scraping o BeautifulSoup para HTML, etc.). Si utilizas frameworks como LangChain, estos proveen loaders para muchos formatos comunes. Durante esta etapa, es recomendable realizar cierta limpieza del texto: remover caracteres o saltos de línea innecesarios, eliminar contenido irrelevante (por ejemplo, navegaciones o headers/footers repetitivos en cada página), y unificar codificaciones de texto. El objetivo es obtener, por cada documento, un bloque de texto limpio y procesable.

Una vez tenemos los textos, conviene segmentarlos. ¿Por qué? Dos razones principales: evitar exceder los límites de contexto de los modelos y mantener la coherencia semántica de cada embedding. Si intentáramos meter un documento extenso completo en un único vector, podríamos sobrepasar la cantidad de tokens que el modelo de embedding puede procesar de una vez, o diluir tanto el contenido que el vector resultante no representaría claramente ninguna idea en particular.

Por ello, dividimos cada documento en fragmentos o chunks antes de generar los embeddings. Un chunk ideal suele ser del tamaño de un párrafo o sección corta, lo suficiente para contener una idea completa pero no tanto como para perder especificidad. Comúnmente se usan técnicas como: separar por párrafos o encabezados si el documento tiene estructura, o usar una ventana deslizante de longitud fija con solapamiento (por ejemplo, trozos de ~300 palabras con 50 palabras de solapamiento entre chunks).

El solapamiento ayuda a no perder contexto en los bordes, de modo que si una frase clave queda cortada entre dos chunks, aún haya redundancia que permita entenderla en cualquiera de los fragmentos siguientes.

A continuación un ejemplo en Python usando LangChain para dividir texto en chunks manejables:

from langchain.text_splitter import RecursiveCharacterTextSplitter

# Supongamos que docs es una lista de strings con el texto de cada documento
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
all_chunks = []
for doc in docs:
    chunks = splitter.split_text(doc)
    all_chunks.extend(chunks)
print(f"Se generaron {len(all_chunks)} fragmentos a partir de {len(docs)} documentos.")

En este ejemplo, cada chunk tendrá máximo 500 caracteres (aprox. 100-120 palabras) y se solapan 50 caracteres entre fragmentos consecutivos. Podemos ajustar el tamaño (chunk_size) y solapamiento según el tipo de contenido y los límites del modelo de embedding.

Una buena práctica es comenzar con chunks del orden de 200 a 500 palabras, y usar algo de solapamiento (por ejemplo 1-2 frases) si sospechamos que una idea importante podría quedar cortada entre dos segmentos. Hacer pruebas de búsqueda con distintos tamaños puede ayudar a refinar la estrategia: si los chunks son demasiado grandes, el embedding puede diluir detalles importantes; si son demasiado pequeños, se pierde contexto útil.

DeepSeek-Embedding-v2 soporta contextos de entrada muy amplios (hasta 128k tokens teóricamente), pero incluso así, dividir en porciones más enfocadas suele mejorar la relevancia de la búsqueda. Además, garantizar que cada chunk que indexamos quede por debajo del límite de tokens del modelo nos evita problemas (otros modelos pueden tener límites más bajos, e.g. 512 tokens).

Paso 2: Generación de embeddings con DeepSeek. Con los textos fragmentados, procedemos a convertir cada chunk en su correspondiente vector mediante el modelo de DeepSeek. Tenemos dos vías principales para usar DeepSeek Embeddings: vía API cloud de DeepSeek, o ejecutando un modelo localmente. La forma más sencilla es usando la API en la nube, que es totalmente compatible en formato con la de OpenAI.

Para ello necesitamos un API key de DeepSeek (que se obtiene al registrarse en su plataforma). Las llamadas se hacen al endpoint https://api.deepseek.com/v1/embeddings indicando el modelo a usar (por ejemplo "model": "deepseek-embedding-v2") y el texto de entrada (podemos enviar un solo texto o un arreglo de textos para procesamiento en lote). A continuación se muestra un ejemplo de cómo obtener embeddings de DeepSeek vía API con Python:

import requests

API_URL = "https://api.deepseek.com/v1/embeddings"
API_KEY = "TU_API_KEY"

texts = [
    "La inteligencia artificial está transformando industrias.",
    "Las bases de datos vectoriales permiten búsquedas semánticas eficientes."
]
payload = {"model": "deepseek-embedding-v2", "input": texts}
headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}

response = requests.post(API_URL, json=payload, headers=headers)
data = response.json()
embeddings = [item["embedding"] for item in data["data"]]
print(f"Generadas {len(embeddings)} embeddings de dimensión {len(embeddings[0])}.")

Este código envía dos frases de ejemplo a la API de DeepSeek y recibe sus correspondientes vectores (cada uno de longitud 768 para el modelo v2). Bajo el capó, el servicio de DeepSeek procesa cada texto a través de su modelo de embedding y devuelve un JSON con los vectores.

La API de DeepSeek sigue casi exactamente el mismo formato que la de OpenAI, lo que significa que incluso podríamos usar librerías oficiales de OpenAI simplemente cambiando el base_url y la clave (por ejemplo, con la librería openai en Python) para apuntar a DeepSeek. Esta compatibilidad hace muy sencilla la integración en código existente.

Al generar embeddings de múltiples chunks, es recomendable hacerlo en batch para ganar eficiencia. La API de DeepSeek acepta un arreglo de entradas, por lo que podemos enviar por ejemplo 20 fragmentos en cada solicitud en lugar de uno por uno. Esto aumenta el throughput y reduce la sobrecarga de llamadas HTTP.

Habrá que tener en cuenta los límites de velocidad (rate limit) de la API y el tamaño total de tokens por petición, pero normalmente procesar en lotes moderados optimiza el tiempo. Por otro lado, si manejamos volúmenes muy grandes de datos o requerimos privacidad absoluta, podríamos explorar la opción local: DeepSeek ha liberado ciertos modelos que se pueden ejecutar en servidores propios (por ejemplo DeepSeek-R1 en versiones reducidas), y herramientas como Ollama facilitan montar un servidor local que sirva el modelo y desde el cual obtener embeddings mediante una API local.

Un ejemplo de esto es usar Ollama para descargar y correr deepseek-r1 en una GPU local, y luego configurar la función de embedding de un vector DB (como Chroma) para que apunte a ese modelo local. Sin embargo, cabe reiterar que si buscamos la mejor calidad semántica, lo ideal es usar el modelo de embedding dedicado de DeepSeek (v2) ya sea vía API o si en el futuro liberan sus pesos. Usar un modelo general como R1 para generar vectores puede resultar en embeddings menos precisos en cuanto a similitud de significado. Por ello, nos ceñiremos al uso de la API con deepseek-embedding-v2 en este pipeline.

Después de iterar sobre todos los chunks y obtener sus vectores, tendremos esencialmente una matriz de embeddings que representa toda nuestra base de conocimiento. Por ejemplo, si teníamos 1000 fragmentos, ahora tendremos 1000 vectores de 768 dimensiones, que podemos pensar como puntos en el espacio semántico.

Conviene guardar estos vectores, asociándolos de alguna forma con la información original (por ej., un ID de documento y quizás la posición o sección del chunk). En el siguiente paso, almacenaremos todo esto en una base de datos vectorial.

Paso 3: Almacenamiento en una base vectorial (FAISS, Chroma, Qdrant, etc.). Una vez obtenidos los embeddings, necesitamos un mecanismo eficiente para almacenarlos y consultarlos por similitud. Aquí entran las vector databases o índices vectoriales. Existen múltiples opciones, tanto en memoria como servicios persistentes, entre las más populares están:

  • FAISS: biblioteca de Facebook AI, que permite realizar búsquedas de vectores muy rápidamente en memoria (y soporta índices aproximados, compresión, etc.). Es ideal para integrarlo en aplicaciones Python locales o servicios donde mantener el índice en memoria está bien.
  • ChromaDB: una base vectorial open-source que provee una interfaz sencilla en Python, persistencia opcional a disco y características como filtrado por metadatos.
  • Qdrant: base de datos vectorial orientada a alto rendimiento, con búsqueda aproximada HNSW por defecto, soporte de filtrado, clustering, distribución en múltiples nodos, etc., accesible vía REST o clientes en varios lenguajes.
  • Otras: Milvus, Pinecone, Weaviate, Elasticsearch/OpenSearch (con plugin de k-NN), etc.

La elección dependerá de requisitos de escala, despliegue y preferencias de stack. Para nuestro pipeline ilustrativo, podríamos usar FAISS por simplicidad (manteniendo todo en memoria dentro de nuestro proceso Python), sabiendo que el mismo concepto se traduce a otros motores.

El proceso de indexación consiste en crear un índice especificando la dimensión de los vectores y el tipo de métrica de similitud, luego agregar todos nuestros vectores al índice. Por ejemplo, con FAISS:

import faiss, numpy as np

dim = len(embeddings[0])  # dimensión del embedding, debería ser 768 para DeepSeek v2
index = faiss.IndexFlatIP(dim)  # Index de "Inner Product" (equivalente a similitud de coseno si normalizamos)
# Si quisiéramos normalizar los vectores para usar coseno:
# embedding_matrix = np.array(embeddings, dtype='float32')
# faiss.normalize_L2(embedding_matrix)
# index.add(embedding_matrix)
embedding_matrix = np.array(embeddings, dtype='float32')
index.add(embedding_matrix)

En el ejemplo, usamos un índice IndexFlatIP de FAISS, que calcula distancias por producto interno (IP). Si los embeddings se normalizan a longitud 1, el producto interno es equivalente a la similitud coseno, que es la métrica común en embeddings textuales.

Alternativamente, podríamos usar IndexFlatL2 (distancia Euclídea al cuadrado), que también equivale a coseno si los vectores están normalizados. Lo importante es configurar la métrica acorde al tipo de embeddings: la mayoría de embeddings (incluyendo DeepSeek y OpenAI) no vienen normalizados de por sí, y suelen funcionar bien con producto interno directo. En cualquier caso, hay que ser consistente: usar la misma normalización y métrica tanto al indexar como al buscar.

Junto con los vectores, necesitaremos almacenar algún identificador o referencia. Por ejemplo, podríamos asignar a cada chunk un ID numérico secuencial o alguna clave compuesta por el ID del documento original y un índice de fragmento.

Muchas bases vectoriales permiten adjuntar también metadatos arbitrarios a cada vector (por ejemplo, el título del documento, el capítulo, la fecha, etc.) y luego filtrar búsquedas según esos metadatos. Esto es muy útil en entornos reales: podríamos querer buscar solo en documentos de cierto tipo, o priorizar resultados recientes, etc., mediante filtros por metadato.

Si usamos FAISS puro, tendremos que gestionar metadatos por nuestra cuenta (por ejemplo, manteniendo un arreglo paralelo de estructuras con la info de cada ID). En Chroma o Qdrant, en cambio, uno inserta documentos con sus embeddings y metadatos en una colección, y luego puede realizar consultas del estilo: «dame los vecinos más cercanos a este vector dentro de los que cumplen categoria='manual'«.

En nuestro caso, supondremos que almacenamos externamente una lista all_chunks con los textos de cada fragmento en el mismo orden que los embeddings, de modo que podamos mapear resultados de vuelta al texto. También tendremos listas para IDs o metadatos si hace falta.

Paso 4: Consulta semántica y recuperación de resultados. Con el índice vectorial construido, ya podemos realizar búsquedas. Supongamos que tenemos una consulta del usuario (por ejemplo: «¿Cómo está cambiando la IA el sector financiero?»). El proceso de consulta sería:

  1. Tomar la cadena de pregunta y generar su embedding usando el mismo modelo DeepSeek. (En producción, conviene también normalizar o preprocesar la pregunta: podría convertirse a minúsculas, remover caracteres especiales irrelevantes, etc., aunque los modelos modernos entienden lenguaje natural directamente. El embedding actúa en texto puro generalmente, no en tokens preprocesados, así que este paso puede ser mínimo). Obtendremos un vector de 768 dim para la pregunta.
  2. Usar el índice vectorial para obtener los k vectores más similares a la pregunta. En FAISS, haríamos algo como:
query_vec = np.array([q_embedding], dtype='float32')
k = 5
distances, indices = index.search(query_vec, k)  # busca los 5 más cercanos
for idx, dist in zip(indices[0], distances[0]):
    print(f"Resultado ID: {idx}, similitud: {dist}, texto: {all_chunks[idx][:100]}...")

Este código recuperaría, por ejemplo, 5 fragmentos candidatos junto con sus distancias (o scores de similitud) y podríamos inspeccionar sus contenidos. En una base vectorial más avanzada, usaríamos su método de consulta específico, que generalmente retorna también los metadatos junto con la distancia. Es importante destacar que k (el número de vecinos a recuperar) es un parámetro que podemos tunear: empezar con k=5 es común, pero si notamos que a veces falta información, aumentar a k=10 o más puede ser útil. Luego, nuestra aplicación podría filtrar o reordenar esos resultados.

Por ejemplo, podríamos descartar aquellos cuya similitud esté por debajo de cierto umbral (si la métrica lo permite), o podríamos introducir un paso de re-ranqueo usando un modelo más pesado (un cross-encoder que evalúe query-chunk juntos) para ordenar mejor los resultados. Esta última técnica mejora la precisión a costa de más cómputo, y suele reservarse para aplicaciones críticas donde queremos máxima exactitud en la recuperación.

  1. Uso de los resultados en el LLM: finalmente tomaríamos los textos de los chunks recuperados y los pasaríamos como contexto al modelo generativo junto con la pregunta. Por ejemplo, podríamos construir un prompt estilo: «Usando la siguiente información, responde la pregunta…» seguido de los fragmentos relevantes y luego la pregunta del usuario. Si usamos la API de DeepSeek (que soporta tanto embeddings como chat completions) podríamos llamar al modelo de chat DeepSeek-R1 con ese prompt. O podríamos usar otro LLM como GPT-4 vía API de OpenAI, etc., según los recursos disponibles. Lo importante es que ahora el LLM tiene a mano la información específica para responder correctamente.

Cabe mencionar que integrar este proceso en una aplicación implica también diseñar la interfaz o API final. En un producto real, podríamos exponer un endpoint REST /query que reciba la pregunta y devuelva las respuestas o los documentos más relevantes.

Por ejemplo, usando FastAPI en Python podríamos montar un servicio donde en el método POST de /query se ejecute la búsqueda vectorial y se retornen los resultados encontrados (y opcionalmente la respuesta formulada).

Esto permitiría conectar nuestra base de conocimiento a una interfaz de chat, a una aplicación web, etc., manteniendo la lógica de RAG encapsulada en el backend.

Al terminar esta etapa, habremos logrado construir nuestra base de conocimiento semántica: indexamos los documentos, generamos embeddings con DeepSeek, los almacenamos en un índice vectorial y podemos consultar eficientemente por significado.

En esencia, hemos creado nuestro propio mini-Google semántico o una versión personalizada de un servicio como el retrieval plugin de OpenAI, pero con nuestros datos y usando tecnología abierta de DeepSeek.

En los siguientes apartados, profundizaremos en algunas recomendaciones técnicas para optimizar este pipeline y en casos de uso y ventajas específicas al utilizar DeepSeek Embeddings frente a otras alternativas.

Recomendaciones técnicas y mejores prácticas

Construir una base de conocimiento con embeddings es tanto un arte como una ciencia. A continuación resumimos algunas recomendaciones técnicas y buenas prácticas para asegurar que tu sistema sea preciso, eficiente y robusto en producción:

  • Tamaño de chunk óptimo: Selecciona un tamaño de fragmento adecuado para tu dominio. Como regla general, comienza con chunks de ~200-500 palabras. Fragmentos demasiado grandes pueden mezclar varios temas y “diluir” el embedding, haciendo más difícil encontrar la respuesta exacta. Fragmentos muy pequeños pueden carecer de contexto y resultar insuficientes por sí solos. Usa solapamiento de 1-2 oraciones si un concepto importante podría quedar dividido entre dos chunks adyacentes. Además, asegúrate de que el tamaño no exceda el límite de tokens del modelo de embedding: aunque DeepSeek admite ventanas amplias (decenas de miles de tokens), muchos modelos open-source tienen límites de 512 o 1024 tokens, por lo que mantener chunks dentro de esos límites mejora la compatibilidad.
  • Preprocesamiento de texto: Invierte tiempo en limpiar y estructurar bien tus datos antes de embeddear. Esto incluye eliminar texto irrelevante (ej. firmas de email, navegación web, código HTML), normalizar encoding y quizá convertir todo a minúsculas consistente (aunque los modelos modernos manejan mayúsculas, una normalización puede reducir variaciones inútiles). Si tus documentos tienen secciones repetitivas (p.ej. disclaimer en cada página), considera eliminarlas para no sesgar los resultados: si no son contenido informativo, solo añadirán ruido al índice. Un buen preprocesamiento mejora tanto la calidad de los embeddings como la pertinencia de los resultados recuperados.
  • Control de calidad de embeddings: Es aconsejable validar de manera cualitativa que los embeddings estén funcionando como esperas. Por ejemplo, toma algunas consultas de prueba y verifica manualmente que los documentos relevantes aparezcan entre los más similares. Si notas resultados inesperados, puede ser indicio de que los chunks son muy grandes/pequeños o de que el modelo de embedding no capta bien cierto vocabulario. También puedes calcular similitudes intrínsecas: por ejemplo, elegir dos párrafos que deberían ser muy similares y comprobar que la distancia coseno entre sus vectores sea efectivamente alta. Estas inspecciones te darán confianza en que el espacio vectorial refleja la semántica adecuada.
  • Batching y throughput: Al generar embeddings para muchos textos, utiliza procesamiento en lote para acelerar la indexación. DeepSeek Embeddings permite enviar un array de textos en cada llamada, así que aprovecha eso (por ejemplo, envía 20-50 fragmentos por solicitud, según tamaño) en lugar de 1 por 1. Asimismo, si operas localmente con un modelo, agrupar las inferencias (o paralelizarlas si es posible) te ahorrará tiempo. Recuerda que la indexación inicial normalmente es un proceso offline (se hace una vez), pero también aplica esta filosofía a las consultas: si tu aplicación recibe muchas preguntas repetitivas, podrías procesarlas en lote si el caso lo permite, o más sencillamente aprovechar cache (ver siguiente punto).
  • Caché de embeddings: Implementa mecanismos de caché para no recalcular embeddings innecesariamente. Para la fase de indexación, una vez calculado el vector de un documento, guárdalo (por ejemplo, en disco usando NumPy save() o pickle, o en la propia base vectorial persistente). Si el servicio se reinicia, no tendrás que re-procesar todos los documentos desde cero. Del lado de las consultas, también puedes cachear los embeddings de las preguntas de los usuarios, por ejemplo usando la propia cadena de pregunta como clave en un diccionario. Si la misma o muy similar pregunta llega repetidamente, puedes reutilizar el vector ya calculado en lugar de volver a llamar al modelo. Esto reduce latencia y costo, especialmente cuando los usuarios suelen reiterar dudas similares. Algunas bases vectoriales (p. ej. Chroma, Qdrant) por defecto persisten los datos en disco, actuando de hecho como cache del índice en memoria.
  • Ajustar el número de resultados (k): El hiperparámetro k (cuántos embeddings vecinos recuperas) puede influir en la calidad final. Si pides muy pocos resultados (p.ej. solo 1), puedes perder contexto relevante; si pides demasiados, podrías introducir ruido irrelevante. Un punto de partida típico es k=5. Si notas que el asistente a veces “no sabe” la respuesta cuando en realidad había un documento que la contenía, prueba incrementando a k=10. Luego en la etapa generativa puedes filtrar por puntaje de similitud para no meter contenido poco relevante. También podrías hacer que el LLM use todos los resultados pero pondere su relevancia (muchos frameworks de prompt permiten indicar qué contexto es más importante). En definitiva, monitorea y ajusta k según el equilibrio precisión/recobrado que necesites.
  • Métrica de similitud apropiada: Asegúrate de usar la métrica correcta en tu vector DB. La mayoría de embeddings de texto funcionan con similitud de coseno o producto interno como medida de cercanía. Algunas bases (FAISS, etc.) requieren normalizar los vectores manualmente si quieres coseno puro. Otras (Qdrant, Chroma) permiten especificar directamente la métrica («Cosine», «Dot», «L2») al crear la colección. Revisa la documentación de tu herramienta y haz pruebas. Un error común sería usar distancia Euclídea sin normalizar, lo cual no es exactamente equivalente a coseno y puede alterar qué resulta «más cercano». En general, normaliza los vectores o utiliza dot product para reflejar similitud coseno, a menos que tengas razones específicas para otra métrica.
  • Uso de metadatos y filtrado: Aprovecha metadatos contextuales para mejorar la relevancia. Por ejemplo, si tienes documentos de distintos tipos (manuales técnicos vs documentos de marketing), podrías etiquetar cada fragmento con un campo «tipo». Luego, si el usuario realiza una pregunta técnica, podrías filtrar la búsqueda para que priorice los de tipo técnico. Muchas bases vectoriales permiten pasar filtros en la consulta (ej. filter={"tipo": "tecnico"}). Asimismo, metadatos como fechas pueden ayudarte a implementar cierto recency bias o a segmentar información por versión, autor, etc. El motor de embeddings en sí no distingue estas cosas, pero combinándolo con filtrado estructurado logras un enfoque híbrido muy potente: restringir por criterios exactos y luego rankear por similitud semántica dentro de ese subconjunto.
  • Búsqueda híbrida (palabra clave + vectorial): En algunos casos, una combinación de métodos arroja los mejores resultados. Por ejemplo, podrías primero hacer una búsqueda tradicional de palabras clave para acotar documentos candidatos, y luego dentro de esos hacer la búsqueda vectorial. Esto garantiza que términos muy específicos (nombres propios, códigos) coincidan exactamente, mientras el embedding se encarga de la parte conceptual. Herramientas como OpenSearch permiten sumar puntuaciones de keyword y de vector en una misma consulta. Si tu dominio lo permite, considera esta estrategia híbrida para cubrir consultas muy amplias o muy exactas a la vez.
  • Re-rankers y segunda pasada: Para aplicaciones donde la precisión es crítica (por ejemplo, un sistema que debe encontrar un párrafo de contrato que responde a una pregunta legal), puede valer la pena añadir una capa de reranqueo. Esto implica tomar los top digamos 10 resultados del buscador vectorial y luego pasarlos por un modelo más costoso pero más preciso que evalúe la relevancia de cada uno respecto a la pregunta. Un enfoque común es usar un modelo cross-encoder BERT-like que concatena pregunta y pasaje y predice relevancia. Este modelo tiene conocimiento más fino que un embedding aislado, por lo que puede ordenar mejor los resultados. La desventaja es el coste computacional adicional, pero quizás compense si necesitas máxima confianza en las respuestas.
  • Supervisión y mejora continua: Una base de conocimiento no es estática; hay que monitorizar su desempeño. En producción, registra las consultas reales de usuarios y analiza si los resultados devueltos fueron útiles. Si detectas preguntas frecuentes que no están siendo bien contestadas, eso indica que quizá falte información en la base (habría que añadir nuevos documentos) o que necesites ajustar la estrategia (quizá hacer chunks más grandes en cierta sección, o entrenar un modelo especializado). DeepSeek, al ser una plataforma abierta, incluso te brinda la posibilidad de afinar su modelo de embedding con datos propios si fuera necesario. Si recopilas suficientes ejemplos de consultas y fragmentos relevantes (p. ej. mediante feedback de usuarios o curación manual), podrías crear un dataset de entrenamiento y realizar fine-tuning del modelo de embedding para que se adapte mejor a tu dominio. Esto es un esfuerzo avanzado, pero puede dar un impulso notable en precisión si tu dominio tiene jerga muy específica o tipos de preguntas recurrentes. En todo caso, mantener un ciclo de mejora continua – añadir datos nuevos, retirar o archivar lo obsoleto, monitorizar la calidad de las respuestas – asegurará que tu base de conocimiento siga siendo útil y confiable con el tiempo.
  • Escalabilidad y rendimiento: A medida que tu base crezca, vigila el rendimiento de las búsquedas. Un índice flat (exhaustivo) como FAISS IndexFlat irá tardando más linealmente con cada vector añadido. FAISS puede manejar millones de vectores en memoria con velocidad razonable (apoyándose en BLAS para operaciones vectoriales), pero si hablamos de decenas de millones, quizás debas pasar a índices aproximados (como IVF, HNSW) que escalan sub-linealmente a cambio de una mínima pérdida de exactitud. Qdrant, Milvus y otros utilizan HNSW por defecto, lo que les permite búsqueda muy rápida incluso con colecciones grandes, por eso son buenas opciones para producción a gran escala. También considera los recursos: muchos de estos índices mantienen los vectores en RAM; asegúrate de dimensionar suficiente memoria, o utiliza opciones de almacenamiento en disco si las ofrecen (por ejemplo, FAISS tiene índices basados en mapa a disco, Qdrant puede usar almacenamiento en SSD). Si tu tráfico de consultas es alto, quizá necesites replicar la base de vectores en varios nodos para balancear carga. Todas estas decisiones entran en juego al llevar el sistema a producción, y las soluciones suelen implicar un balance entre coste, velocidad y precisión. Empieza con un prototipo simple y luego mide cuánta infraestructura requiere tu caso de uso real.

Siguiendo estos consejos, podrás mantener un sistema de búsqueda semántica ágil y certero: rápido al responder y acertado al encontrar el conocimiento relevante. Muchas de estas prácticas se aprenden iterando según las necesidades específicas de tu aplicación, ¡así que mide todo lo que puedas y ajústalo en consecuencia!

Casos de uso reales y ventajas de DeepSeek Embeddings

La utilización de embeddings de DeepSeek para construir bases de conocimiento abre oportunidades en diversos escenarios prácticos. Algunos casos de uso reales donde esta tecnología aporta valor son:

Chatbots de soporte al cliente: Empresas han implementado asistentes virtuales que responden preguntas frecuentes utilizando documentación interna vectorizada. Por ejemplo, un bot puede tener indexados manuales de usuario, preguntas frecuentes y políticas de garantía; cuando el cliente hace una pregunta, el bot recupera los párrafos relevantes de esos documentos (vía embeddings DeepSeek) y formula una respuesta precisa. La ventaja de DeepSeek en este caso es doble: su capacidad multilingüe permite atender a clientes en distintos idiomas con el mismo sistema, y al ser open-source puede desplegarse en las instalaciones de la empresa si hay restricciones de privacidad (evitando enviar datos sensibles a servicios externos).

Búsqueda semántica corporativa: Organizaciones con grandes repositorios de documentos (wikis internas, informes, correos, transcripciones de reuniones) han comenzado a usar motores semánticos para permitir a sus empleados encontrar información de forma más natural. Con DeepSeek, se puede montar un buscador interno donde el empleado escribe una pregunta en lenguaje natural (ej. «política de viajes internacionales para contratistas») y el sistema devuelve los fragmentos de documentos relevantes en lugar de una lista de archivos por nombre. La alta capacidad de DeepSeek para entender lenguaje natural y jerga especializada (gracias a su entrenamiento masivo) le da ventaja en ambientes con terminología propia, y su desempeño de nivel GPT a una fracción del costo facilita escalar esto a toda la empresa.

Asistentes para análisis de documentos extensos: Imaginemos estudios legales analizando contratos o leyes, o analistas financieros revisando informes anuales. Con RAG potenciado por DeepSeek, se pueden hacer preguntas complejas sobre esos textos (p. ej. «¿Cuál es la cláusula de indemnización en este contrato?») y obtener respuestas apoyadas en los párrafos exactos. DeepSeek Embeddings permite indexar miles de páginas y luego recuperar con rapidez la sección pertinente, agilizando enormemente el trabajo. De hecho, la comunidad ha reportado experimentos exitosos construyendo asistentes legales usando DeepSeek-R1 para la generación y modelos como Qwen-7B para embeddings en la fase de recuperación. Pero dado que ahora DeepSeek ofrece su propio modelo de embeddings, podrías mantener todo el stack en DeepSeek (embedding + LLM) beneficiándote de su optimización mutua.

Aplicaciones en educación y entrenamiento: Otro caso es crear tutores virtuales personalizados. Por ejemplo, cargar todos los apuntes de un curso, presentaciones y libros de texto en una base vectorial, y luego permitir a un estudiante preguntar cualquier duda para que el sistema (con embeddings DeepSeek) encuentre la explicación en el material de estudio y la presente de forma dialogada. Aquí la precisión semántica de los embeddings es clave para distinguir conceptos similares y encontrar la explicación correcta, algo en lo que DeepSeek ha demostrado un rendimiento de primera línea comparable a los modelos de Google u OpenAI.

Sistemas de recomendación de contenidos: Más allá de Q&A, los embeddings pueden impulsar recomendadores. Por ejemplo, una plataforma de documentación técnica puede, tras vectorizar todos sus artículos, recomendar lecturas relacionadas: «Los usuarios que leyeron este artículo también vieron estos otros», basado en cercanía de embeddings. DeepSeek Embeddings brinda vectores de alta calidad que capturan relaciones sutiles, mejorando la relevancia de tales recomendaciones. Y al ser un sistema que puedes alojar tú mismo, es viable integrarlo directamente en la plataforma sin costos prohibitivos por cada solicitud de recomendación.

Las ventajas específicas de usar DeepSeek Embeddings en estos escenarios se resumen en:

Alto rendimiento semántico: Los modelos DeepSeek han sido entrenados a escala masiva y con técnicas avanzadas (como Mixture-of-Experts) que les permiten lograr más del 90% de la calidad de los mejores modelos de OpenAI en muchas tareas. En embeddings, esto se traduce en encontrar respuestas correctas con alta precisión, comparables a las mejores soluciones del mercado. Todo ello manteniendo vectores de tamaño moderado (768D) que facilitan su manejo.

Coste efectivo y flexibilidad de despliegue: Como mencionamos, DeepSeek ofrece un costo por token similar o inferior a OpenAI, y crucialmente, te da la opción de no pagar por token si inviertes en tu propio servidor con el modelo. Para proyectos a gran escala (imaginemos indexar cientos de millones de documentos), esta libertad de autogestionar el modelo puede representar ahorros enormes a largo plazo. También evita situaciones de límites de uso impuestos por terceros o sorpresas en facturación. En entornos empresariales, poder desplegar la solución internamente puede ser un requisito (por cumplimiento de GDPR, datos confidenciales, etc.), y DeepSeek cumple ese requisito gracias a su naturaleza abierta.

Ecosistema abierto y en crecimiento: Al alinear su API con la de OpenAI, DeepSeek se hace compatible con multitud de herramientas existentes (SDKs, integraciones en servicios, etc.). Ya existen integraciones con frameworks populares: por ejemplo, LangChain tiene soporte para DeepSeek como proveedor de embeddings y LLM; Ollama facilita su uso local; hay conectores para vector stores como Chroma, Milvus, OpenSearch, etc. La comunidad open-source está adoptando DeepSeek rápidamente, lo que significa que aparecerán más recursos, tutoriales y soporte con el tiempo. No estás atado a un único proveedor que puede cambiar sus políticas; al contrario, puedes beneficiarte de mejoras continuas e incluso contribuir tú mismo.

Personalización y mejora: Dado que los modelos base de DeepSeek son abiertos, existe la posibilidad de afinarlos a medida. Esto es una gran ventaja para casos de nicho donde un modelo genérico no da en el clavo. Si tu aplicación trata con lenguaje muy específico (ej. siglas médicas, términos técnicos internos), puedes entrenar (fine-tune) el modelo de embeddings con ejemplos representativos para que aprenda esas similitudes particulares. OpenAI o Cohere no ofrecen esa capacidad en sus modelos propietarios. Con DeepSeek tienes la propiedad del modelo en tus manos para ajustarlo según tus necesidades, lo cual es oro para equipos de IA avanzados.

Innovación rápida: Al ser un proyecto puntero (introducido en 2025) y con una fuerte comunidad global, DeepSeek está lanzando versiones mejoradas con rapidez. Ya se habla de un posible deepseek-embedding-v3 con más dimensiones o mayor precisión. También la empresa detrás (DeepSeek AI) experimenta con contextos enormes (hasta 128K tokens) y enfoques novedosos en sus LLMs, lo que probablemente se trasladará en embeddings más potentes en futuras iteraciones. Adoptar DeepSeek ahora te pone en la vía de aprovechar esas mejoras en cuanto estén disponibles, muchas veces sin costo adicional. Por ejemplo, si sale un modelo v3 y mantienen el mismo endpoint, podrías beneficiarte de mayor calidad simplemente solicitándolo en la API.

En definitiva, el uso de DeepSeek Embeddings permite construir soluciones de recuperación de información robustas y escalables que rivalizan con las capacidades de gigantes tecnológicos, a la vez que te brindan más control sobre tus datos y costos. Hemos visto cómo diseñar un pipeline completo de RAG con estos embeddings, las mejores prácticas para optimizarlo, y los beneficios concretos que aporta en escenarios de la vida real.

Con este conocimiento, equipos de desarrollo e ingeniería pueden crear asistentes inteligentes, buscadores semánticos y sistemas de IA centrados en conocimiento propio de forma eficiente, aprovechando la sinergia de los modelos abiertos de DeepSeek con las últimas técnicas de gestión de vectores y LLMs. ¡Manos a la obra y feliz construcción de bases de conocimiento inteligentes!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *