Qries Bogotá, Colombia.

Qries https://eduard-martinez.github.io

Qries

Qries @emartigo

Qries eduard-martinez

Qries eduard-martinez

1. ¿Qué es DeepSeek?

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.

2. ¿Cómo instalar DeepSeek-R1 en mi PC?

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.

2.1. Instalar Ollama

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.

2.2. Instalar DeepSeek-R1

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:

2.3. Verificar la instalación

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.

3. ¿Cómo usar DeepSeek desde R?

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.

3.1. Instalar 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')

3.2. ¿Cómo hacer consultas desde R?

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."

3.3. ¿Cómo hacer varias consultas al tiempo?

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:

3.3.1. Definir el dataframe

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"))

3.3.2. Definición de la función f_query para generar consultas

Se 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")
}

3.3.2. Aaplicar la función 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)

3.3.3. Ejecutar las solicitudes en paralelo y obtener respuestas

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)

3.3.4. Procesar las respuestas del modelo para extraer solo la solución

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)

4. Conclusiones

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ó.