https://eduard-martinez.github.io
DeepSeek es un Gran Modelo de Lenguaje (LLM, por sus siglas en inglés) desarrollado por la empresa china homónima, con el objetivo de competir con los gigantes del mercado en inteligencia artificial generativa, como OpenAI, Meta y Google. Fundada en 2023, la empresa captó la atención de los medios al lanzar su modelo DeepSeek-R1 el 20 de enero de 2025. No solo afirmó que su rendimiento estaba a la altura de OpenAI-o1, sino que además lo publicó como software de código abierto, permitiendo que cualquier persona lo descargue, lo utilice, lo modifique y analice su estructura. En este contexto, DeepSeek también compartió versiones “destiladas” del modelo, las cuales son más ligeras y, por lo tanto, menos exigentes en términos de recursos computacionales, facilitando su ejecución en prácticamente cualquier computadora moderna con especificaciones promedio.
¿Qué versión de DeepSeek instalar? Elegir el modelo adecuado depende del equilibrio entre capacidad y rendimiento en tu equipo. A la fecha de escribir esta entrada (2025-02-11), existen siete modelos diferentes, que van desde 1.5 billones de parámetros hasta los 671 billones del modelo completo. Cabe destacar que las versiones destiladas, aunque más pequeñas, conservan gran parte del rendimiento del modelo original de 617b parámetros, siendo capaces de razonar y resolver tareas complejas con un alto nivel de precisión. Para la mayoría de los usuarios, el modelo de 671B (671 billones de parámetros) está fuera de alcance, a menos que cuenten con un clúster de servidores. En términos de hardware, se recomienda al menos 8 GB de RAM para 7B, 16 GB para 13B y 32 GB para 33B. Una buena estrategia es comenzar con 7B e ir probando versiones más grandes según el desempeño de tu computadora. Sin embargo, más parámetros no siempre significan mejores respuestas. La calidad del prompt juega un papel clave, y un modelo de 8B con un buen prompt puede superar a uno más grande con instrucciones mal formuladas.
Para utilizar DeepSeek-R1 en tu computadora, primero debes instalar Ollama, una plataforma de código abierto que facilita la descarga y ejecución de modelos de lenguaje de manera local. Luego, podrás seleccionar la versión de DeepSeek-R1 más adecuada según los recursos de tu equipo e instalarla siguiendo unos sencillos pasos. A continuación, te mostramos cómo realizar todo el proceso.
Primero debes ir a la plataforma de Ollama, una vez dentro de la página debes seleccionar la sección Download:
Luego, debes elegir el sistema operativo (macOS, Linux o Windows) en el que vas realizar el proceso de instalación:
Una vez descargado el instalador, ejecútalo en tu sistema operativo.
En Windows
, simplemente ejecútalo como administrador, y en
macOS
, descomprime el archivo y muévelo a la carpeta de
Aplicaciones.
Para instalarlo, ve a la página de Ollama y, en la pestaña Models, encontrarás todos los modelos de código abierto disponibles.
Selecciona la opción deepseek-r1 para que te muestre las versiones del módelo que están disponibles:
Ahora elige la versión que deseas instalar en tu computadora de manera local. Se estima que para utilizar el modelo de 7 billones de parámetros se requieren al menos 8 GB de RAM. Una buena estrategia es comenzar probando este modelo y, a partir de ahí, intentar con versiones más grandes, evaluando si tu computadora puede ejecutarlas sin inconvenientes. Para instalar la versión de 7B, haz clic en el círculo rojo para copiar el código de instalación.
Posteriormente, ve a la CMD de tu equipo (en Windows) o a la terminal (en macOS), pega el código y presiona la tecla Enter. Si no encuentras la terminal, puedes abrir RStudio y, en la pestaña que está al lado de la consola, encontrarás una sección llamada Terminal. Pega el código allí y presiona Enter.
A continuación, te mostraré un ejemplo usando la terminal de RStudio:
Cuando haya terminado la instalación, puedes probar si el modelo se
está ejecutando localmente escribiendo Hi, DeepSeek!
y
presionando la tecla Enter
Una vez hayas terminado de probar el modelo, recuerda escribir
/bye
en la terminal y presionar Enter para
cerrarlo y evitar que siga ejecutándose en segundo plano.
Para interactuar con los modelos de lenguaje instalados localmente en tu computadora, es necesario utilizar el paquete ollamar, el cual permite gestionar modelos compatibles con la plataforma Ollama de manera eficiente. A continuación, aprenderás cómo instalar ollamar y cargar las librerías necesarias para ejecutar consultas en estos modelos. Además, exploraremos cómo verificar qué modelos tienes disponibles y cómo instalar nuevos modelos en caso de que aún no los hayas descargado.
ollamar
El siguiente código se encarga de instalar y cargar el paquete ollamar, el cual permite interactuar con modelos de lenguaje instalados localmente a través de la plataforma Ollama.
install.packages('ollamar')
El siguiente código instala y carga el paquete pacman
,
una herramienta que facilita la gestión de paquetes en R. Luego, con la
función p_load
, se cargan varias librerías esenciales:
library(pacman)
p_load(tidyverse, ## Manipulación y visualización de datos
httr2, ## Solicitudes HTTP y paralelizar consultas
glue, ## Construir cadenas de texto dinámicas
ollamar) ## Llamar ollamar
Posteriormente, debes revisar qué modelos tienes disponibles para
ejecutar en tu PC. Usando la función list_models()
de la
librería ollamar
:
list_models() %>% tibble()
## # A tibble: 6 × 5
## name size parameter_size quantization_level modified
## <chr> <chr> <chr> <chr> <chr>
## 1 deepseek-r1:1.5b 1.1 GB 1.8B Q4_K_M 2025-02-11T08:35…
## 2 deepseek-r1:14B 9 GB 14.8B Q4_K_M 2025-01-29T20:14…
## 3 deepseek-r1:32b 19.9 GB 32.8B Q4_K_M 2025-01-29T20:20…
## 4 deepseek-r1:7B 4.7 GB 7.6B Q4_K_M 2025-02-04T13:09…
## 5 deepseek-r1:8b 4.9 GB 8.0B Q4_K_M 2025-01-27T21:56…
## 6 deepseek-r1:latest 4.7 GB 7.6B Q4_K_M 2025-02-11T08:48…
Si deseas instalar otro modelo, podrás hacerlo usando la función
pull
de la librería ollamar.
Esto es
equivalente a usar en la terminal
ollama run deepseek-r1:14b
pull('deepseek-r1:14b')
Esta sección está fuertemente inspirada de la introducción al paquete ollamar
Para realizar una pregunta a tu modelo, debes usar la función
generate
, que tiene diversos argumentos. Para nuestros
propósitos, solo necesitarás tres de estos:
model
: te permite especificar el modelo que deseas
utilizar.
prompt
: en este argumento escribirás tu consulta al
modelo.
output
: este argumento te permite definir el tipo de
objeto en el cual se te retornará la respuesta. Aunque puede tomar
varios valores, los que te interesan principalmente son:
text
que retorna un vector de texto, df
que
retorna la respuesta en formato tidy, en un dataframe y req
que retorna un tipo de objeto manipulable a través del paquete
httr2.
Puedes probar con el siguiente ejemplo usando el modelo de 1.5 billones de parámetros:
## Respuesta en formato dataframe
resp1 <- generate("deepseek-r1:1.5b",
"What is the history behind daylight saving hours?",
output = "df")
resp1
## # A tibble: 1 × 3
## model response created_at
## <chr> <chr> <chr>
## 1 deepseek-r1:1.5b "<think>\n\n</think>\n\nDaylight saving hours are… 2025-02-1…
## Respuesta en formato texto
resp2 <- generate("deepseek-r1:1.5b",
"What is the history behind daylight saving hours?",
output = "text")
resp2
## [1] "<think>\n\n</think>\n\nDaylight saving hours were established as part of the United States' transition to a solar energy system, aimed at maximizing solar energy production by aligning with the sun's position in the sky. This change was made after several decades and required careful planning and coordination between different regions."
Nótese que el patrón *** denota el final del razonamiento del modelo y el comienzo de la respuesta. En ese caso, si solo quieres quedarte con la respuesta, podrías hacer lo siguiente:
resp1$response %>%
str_extract_all("\n</think>\n\n.*") %>% ### Extraer el texto sin el delimitador
str_remove_all('\n</think>\n\n') %>% ### Eliminar el delimitador de respuesta
print()
## [1] "Daylight saving hours are a historical time standard adopted by the world to adjust local clocks during certain times of year to improve energy efficiency and save on electricity costs. The concept was introduced in Britain in 1953, but it evolved from practical considerations such as managing daylight duration for agricultural purposes and navigation."
Finalmente, consideremos el caso en que disponemos de un dataframe con una columna de texto o un vector de texto sobre el cual queremos realizar consultas a un modelo de lenguaje. El siguiente código lleva a cabo este proceso y extrae las soluciones. A continuación, se explica cada paso:
En este ejemplo, trabajamos con un dataframe que contiene ecuaciones matemáticas en formato de texto. Nuestro objetivo es consultar un modelo de texto (DeepSeek) para resolver cada ecuación.
df <- data.frame(
equations = c("Y = 2X^2 + 4X - 6",
"Y = 4X^2 - 8X + 3",
"Y = 3X^2 - 9X + 6"))
f_query
para generar
consultasSe define la función f_query
, que toma un texto como
entrada y genera un prompt con la ecuación utilizando
glue()
, que formatea el texto dinámicamente. Se envía la
consulta al modelo DeepSeek (deepseek-r1:1.5B
),
solicitándole que resuelva la ecuación. El resultado se devuelve como un
objeto de solicitud (req
), para ser procesado en los
siguientes pasos del código.
f_query <- function(text) {
## Crear el prompt para el modelo
query <- glue("Find the X that solve Y equation: {text}")
## Enviar la consulta al modelo DeepSeek
generate(model="deepseek-r1:8b", prompt=query, output = "req")
}
f_query
a cada ecuación en
el dataframe.La función lapply(df$equations, f_query)
recorre cada
ecuación en la columna equations
y genera una consulta
(query
) al modelo de texto DeepSeek. Como resultado,
reqs
almacena una lista de solicitudes
(requests
) que serán procesadas posteriormente.
reqs <- lapply(df$equations, f_query)
La función req_perform_parallel(reqs)
toma la lista de
solicitudes (reqs) y las ejecuta simultáneamente para obtener las
respuestas del modelo de texto. La columna solve del dataframe df se
llena con las respuestas generadas por el modelo.
df$solve <- req_perform_parallel(reqs)
## Iterating ■■■■■■■■■■■ 33% | ETA: 2mIterating ■■■■■■■■■■■■■■■■■■■■■ 67% | ETA:
## 31s
df$solve[1]
## [[1]]
## <httr2_response>
## POST http://127.0.0.1:11434/api/generate
## Status: 200 OK
## Content-Type: application/json
## Body: In memory (5901 bytes)
La función sapply(df$solve, resp_process, "text")
procesa cada respuesta bruta recibida, extrayendo el texto relevante.
str_extract_all("\n</think>\n\n.*")
busca un patrón
específico en la respuesta del modelo, extrayendo únicamente la parte
que contiene la solución de la ecuación.
str_remove_all('\n</think>\n\n')
serviría para
limpiar aún más el texto si fuera necesario.
df$solve <- sapply(df$solve, resp_process, "text") %>% str_extract_all("Final Answer(.|\n)+") %>%
str_squish() %>%
str_remove_all("\\\\")
## Warning in stri_replace_all_regex(string, pattern,
## fix_replacement(replacement), : argument is not an atomic vector; coercing
Finalmente, print(df) muestra el dataframe actualizado, donde la columna solve contiene las soluciones extraídas para cada ecuación.
print(df)
## equations
## 1 Y = 2X^2 + 4X - 6
## 2 Y = 4X^2 - 8X + 3
## 3 Y = 3X^2 - 9X + 6
## solve
## 1 Final Answer The solutions for ( X ) are: [ boxed{X = 1 pm frac{sqrt{2(Y - 4)}}{2}} ]
## 2 Final Answer:** [ boxed{,X = dfrac{3}{2}; text{and}; X = dfrac{1}{2},} ]
## 3 character(0)
A pesar de sus ventajas, DeepSeek-R1
tiene algunas
limitaciones. Aunque usar un LLM en local mejora la privacidad y permite
adaptarlo a necesidades específicas, el modelo fue entrenado
principalmente en inglés y mandarín, por lo que su desempeño en otros
idiomas, como el español, es más limitado. No es que funcione mal, pero
está lejos de su rendimiento en los idiomas principales, e incluso es
común que responda en inglés cuando se le consulta en español.
Otro punto a considerar es el consumo de recursos. Al ejecutarlo en
local, usamos nuestra propia computadora, lo que puede ser un problema
si no tenemos suficiente capacidad. Los modelos más grandes quedan fuera
del alcance para muchos equipos, y hacer consultas grandes o simultáneas
puede tomar bastante tiempo. Finalmente, DeepSeek-R1
es muy
sensible a la forma en que se le formulan las preguntas. Un buen prompt
puede hacer la diferencia más que el tamaño del modelo, y como cualquier
LLM, puede generar respuestas incorrectas o sin relación con lo que se
le preguntó.