619 - Programar con Inteligencia Artificial en local
Programar con Inteligencia Artificial en local con #VSCode #Nvidia y #tabby, utilizar el completado mediante un modelo de lenguaje local
Esto de la Inteligencia Artificial, o mejor dicho de los modelos de lenguaje, es algo a lo que tenemos que sacar el máximo partido. En este sentido, ya he dedicado algunos episodios a su utilización. En concreto el episodio 612, titulado Commits y ChatGPT, lo dediqué a aprovechar ChatGPT para crear los mensajes de commit, y el episodio 614 titulado Mejorar tu programación con ChatGPT, te di algunas ideas para mejorar tu nivel de programación utilizando ChatGPT como tu pair programming. Sin embargo, hasta el momento, he estado utilizando modelos de lenguaje que se encuentran en la nube. Así que, tenía una espinita clavada en el corazón, programar con Inteligencia Artificial en local. Así, en este episodio, te voy a mostrar como programar con Inteligencia Artificial en local. Pero, en una nueva variante a las anteriores, realizando sugerencias de completado.
Programar con Inteligencia Artificial en local
Sobre el Code Completion
¿Que es el Code Completion? Se trata de una característica que integran los entornos de desarrollo modernos, que ayuda al desarrollador a completar código, a la hora de escribir. Por ejemplo, en el siguiente ejemplo, al escribir console.log(
y pulsar Tab
, se completa el código console.log('Hola')
. Antes de la aparición de la Inteligencia Artificial, esto se limitaba a identificadores de lenguaje, como if
, for
, while
, etc, palabras reservadas, y otros elementos de sintaxis. Para ello se utilizaban diccionarios estáticos o plantillas predefinidas. Sin embargo, con la aparición de la Inteligencia Artificial, el Code Completion ha alcanzado nuevos niveles, en el sentido de que se puede realizar sugerencias completamente dinámicas y basadas en el contexto.
Si llevas un tiempo desarrollando, y has utilizado editores como VSCode, Pycharm, o Sublime Text, ya sabes que el Code Completion es algo que utilizas con frecuencia. Ya te habrás dado cuenta de la cantidad de código que este tipo de herramientas te evita escribir. Por esto, recurrir a Inteligencia Artificial para completar código, es algo que te puede resultar muy útil.
Sobre mis reticencias
Hasta la fecha he sido bastante reticente al uso de la Inteligencia Artificial para la generación de código, por dos razones principales. La primera es que a mi me gusta programar, y por tanto lo que genera la Inteligencia Artificial, no lo genero yo. La segunda es que en general, la parte generativa de la Inteligencia Artificial, no siempre me ha dado buenos resultados. Mas bien, todo lo contrario. Resultados bastante decepcionantes.
Sin embargo, no había visto el uso de la inteligencia artificial como la opción del Code Completion, una ayuda al desarrollo de código, una evolución del completado. En el caso de verlo de esta forma, la cosa cambia sustancialmente. Y es que una cosa es generar código a las bravas, y otra cuestión completamente distinta es predecir el código que quiero escribir a continuación en base al contexto, que esto es básicamente el cometido de los Modelos de Lenguaje actuales y la Inteligencia Artificial.
Ha sido en este punto donde me he decidido, definitivamente, a utilizar los Modelos de Lenguaje para ayudarme con el Code Completion. Y lo he realizado desde dos sentidos. Por un lado, una solución privativa como es Copilot y por otro, una solución Open Source como es Tabby.
En este caso te voy a hablar de la solución Open Source, y en futuros episodios te hablaré sobre Copilot e incluso, y si es posible, realizaré una comparativa entre ambas soluciones, para que puedas elegir la que mejor se adapte a tus necesidades. Además, si es posible, realizaré algún vídeo para que veas como se comporta y como predice el código o incluso el texto que voy a escribir.
Por otro lado, estoy explorando y experimentando con los distintos Modelos de lenguaje que Tabby ofrece, para ver cual de ellos se adapta mejor a mi infraestructura y cual ofrece mejores resultados para lo que yo hago, tanto escribir como programar.
Tabby
Tabby, es un asistente para programar con Inteligencia Artificial, es de código abierto y autoalojada (self hosted).
Características
- Open (Abierto): Tabby es libre, de código abierto y compatible con los principales Modelos de lenguaje utilizados para desarrollar. Modelos de lenguaje como pueden ser, CodeLlama, StarCoder o CodeGen. De hecho, puedes usar y combinar tus modelos preferidos sin tener que implementar nada por tu cuenta. Además de forma sencilla.
- End-to-End (De extremo a extremo): Mientras que la mayoría de las herramientas de programación consideran el Code Completion, o autocompletado de código como un simple recubrimiento de los LLMs de codificación, en el mundo real, las optimizaciones en las extensiones del IDE pueden ser tan importantes como las capacidades de los Modelos de lenguaje de codificación. Tabby optimiza toda la pila:
- Extensiones de IDE: Tabby logra una transmisión precisa y una cancelación con una estrategia de almacenamiento en caché adaptativa para garantizar una finalización rápida (en menos de un segundo).
- Servicio de modelos: Tabby analiza el código relevante en etiquetas Tree Sitter para proporcionar indicaciones efectivas.
- Experiencia de Usuario y Desarrollador: La clave para soluciones sostenibles de código abierto es facilitar la contribución de todos a los proyectos. Los expertos en IA deben sentirse cómodos comprendiendo y mejorando la calidad de las sugerencias. El equipo de EngOps debe encontrar fácil la configuración y sentirse en control de los datos. Los desarrolladores deben tener un momento «aha» durante el tiempo de codificación. Tabby optimiza la experiencia para estos usuarios principales para mejorar la productividad de tu equipo.
Instalación
Tienes a tu disposición diferentes opciones para instalar Tabby en tu equipo, ya sea que utilices Linux, Windows o Mac. En este caso voy te contaré como hacer en Linux, como no podía ser de otra forma. Y además te lo mostraré tanto en Docker como directamente sobre tu máquina, para que elijas la opción que mas te convenza. En mi caso particular, estoy utilizando Docker. Así que es tan sencillo, como utilizar el siguiente docker-compose.yml
:
services:
tabby:
image: tabbyml/tabby
container_name: tabby
restart: always
init: true
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
command: serve --model StarCoder2-3B --device cuda --chat-model Qwen2-1.5B-Instruct
environment:
TABBY_WEBSERVER_JWT_TOKEN_SECRET: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ports:
- 8080:8080
volumes:
- $HOME/.config/tabby:/data
Aquí como ves está definido tanto el modelo que se utiliza para el completado, como el que se utiliza para el chat. Puedes cambiar estos modelos por los que prefieras. En mi caso, estoy utilizando estos modelos, pero puedes utilizar los que prefieras. Además, he definido un volumen para guardar los datos de Tabby, y un puerto para acceder a la interfaz web de Tabby.
Un detalle mas es que estoy utilizando la gráfica para conseguir un mejor rendimiento. Si no tienes gráfica, o no quieres utilizarla, puedes eliminar la sección deploy
.
Cambia la variable TABBY_WEBSERVER_JWT_TOKEN_SECRET
por un valor aleatorio, y asegúrate de que sea un valor seguro. Este valor se utiliza para firmar los tokens JWT que se utilizan para la autenticación.
Indicarte que la primera vez que inicias el servicio, tardará en iniciarse, ya que tiene que descargar los modelos de lenguaje. Pero una vez descargados, el inicio es inmediato.
Lanza el log utilizando docker compose logs -f tabby
para ver el log de Tabby. Y cuando veas que se ha iniciado correctamente, abre tu navegador y accede a http://localhost:8080
para acceder a la interfaz web de Tabby y poder registrarte.
Registro
Una vez que se ha desplegado por primera vez y accedes a la interfaz web de Tabby, la primera cuenta que se registra se considerará la cuenta de administrador. Por lo que, si quieres tener acceso a la administración de Tabby, asegúrate de ser el primero en registrarte.
Una vez has hecho login te redirigirá a la página de inicio, que contiene información básica de tu cuenta, así como los credenciales necesarios para conectar el IDE que estés utilizando con Tabby.
Conecta con tu editor
Una vez ya tienes los credenciales, tienes que utilizarlos para conectar tu editor o editores con Tabby. Dependiendo de que editor utilices lo tendrás que hacer de una forma u otra. En mi caso, yo lo he hecho tanto con VSCode como con Neovim. Y en ambos casos ha sido realmente sencillo.
Complementos para tu editor
Existen complementos para VSCode, para las distintas soluciones de IntelliJ y para Vim y Neovim. Decirte, que en mi caso, lo he utilizado para VSCode y Neovim, y en ambos casos ha sido realmente sencillo utilizar.
En el caso de Neovim, si utilizas Lazy
es tan sencillo como añadir lo siguiente,
return {
"tabbyML/vim-tabby",
}
En el caso de VSCode la extensión tiene el id TabbyML.vscode-tabby
.
Por otro lado en tu equipo, en el directorio ~/.tabby-client/agent
, tienes que modifica el archivo config.toml
y añadir la configuración del servidor, es decir básicamente el token, siguiendo la información que encontrarás en el propio archivo.
Situación actual
Ahora mismo estoy probando Tabby en VSCode y Copilot en Neovim. Y la verdad es que estoy bastante contento con los resultados. En ambos casos, la sugerencia de completado es bastante buena, y sobre todo rápida. Tanto la solución local de la mano de Tabby como la de Copilot.
Pero todavía me queda bastante trabajo de prueba con Tabby, porque quiero probar distintos modelos de lenguaje, y ver el comportamiento de cada uno de ellos. Tanto en lo que se refiere al resultado del completado, como en lo que se refiere a la velocidad de respuesta. Al final, es casi tan importante una cosa como la otra. Si conseguimos una velocidad de respuesta rápida y el resultado es malo, no nos vale la solución, y lo mismo en el caso contrario.
Tengo que adelantarte, que con la configuración que estoy utilizando actualmente, el completado de código es bastante bueno, y llega a sorprenderme. Sin embargo, cuando lo pongo a completar texto, la cosa cambia por completo.
Desde luego es una opción mas que interesante, sobre todo si no quieres que nada salga de casa.