Cómo trabajar con agentes de codificación de IA

Permítanme comenzar diciendo que soy un gran admirador de los agentes de codificación; ayudan a agilizar la producción de código. Pero según las preguntas que me hacen y las experiencias que la gente comparte conmigo, no se utilizan de la mejor manera.

Dicho esto, hablemos de agentes codificadores. La premisa principal de un agente de codificación es que es una herramienta que le ayuda a escribir mejor código. Puede hacerlo proporcionando contexto a los agentes de codificación, analizando problemas, revisando su trabajo y manteniendo el control.

¡Esa última parte es la más importante! No hace mucho, cuando podías usar IA para generar código, solo obtenías unas pocas líneas de autocompletar. Luego vinieron los asistentes de codificación de IA capaces de producir funciones completas o explicar errores.

Un par de años después y muchos avances tecnológicos, ahora tenemos una situación diferente.

Agentes codificadores.

En lugar de simplemente proponer código, un agente puede examinar un repositorio, crear y modificar archivos, ejecutar pruebas, leer mensajes de error, realizar más cambios y repetir el proceso hasta lograr el objetivo deseado. Usted, como desarrollador, ya no le pregunta a la IA: “¿Podría escribir esa función? En lugar de eso, ahora pregunta: ¿Puede abordar este problema, revisar el código base y encontrar una solución?

Algunos podrían argumentar ahora que si la IA asume una mayor parte del trabajo de programación, ¿qué debería estar haciendo realmente el programador?

¡Me gusta pensar en ello como si el programador todavía pensara y planificara mucho, y usara la IA como herramienta para hacer que el proceso fuera más eficiente (en su mayor parte)!

¿Qué diferencia a los agentes codificadores?

Antes de profundizar más, debemos distinguir las diferentes formas de programación asistida por IA disponibles y cómo progresaron con el tiempo.

Comencemos con las herramientas de autocompletar. Una herramienta de autocompletar puede predecir la siguiente línea de código. Estas herramientas están disponibles en la mayoría de los editores de código y en plataformas en línea como Google Colab. Todo su trabajo es intentar predecir lo que escribirás a continuación.

Luego, tenemos asistentes de IA, que pueden responder a solicitudes simples como:

Escriba una función de Python para analizar este archivo.

Finalmente, tenemos agentes codificadores que pueden convertir en realidad un objetivo de alto nivel.

Agregue soporte para analizar la entrada CSV.Utilice la arquitectura del analizador existente,agregue pruebas y asegúrese de que la actualEl conjunto de pruebas aún pasa.

La diferencia es el bucle. Entonces, en lugar de simplemente generar texto, el agente puede interactuar con su entorno. Que es precisamente lo que le da su potencia y lo que hace que trabajar con él sea diferente.

Imagen del autor

Probablemente te hayas encontrado con este escenario si has utilizado un agente de codificación. Le das una instrucción aparentemente sencilla:

Crear autenticación para mi aplicación.

El agente comienza con entusiasmo a cambiar sus archivos; crea nuevas clases, agrega dependencias y tal vez incluso altere la base de datos.

Al final, terminas con una gran cantidad de código, código que puede no ser el código que realmente querías.

Este es el punto en el que la gente empieza a renunciar a la codificación y a los agentes, y a culpar al modelo. Pero el problema aquí no era el modelo; más bien, las instrucciones especifican muy poco.

Una mejor solicitud podría ser:

Agregue autenticación de correo electrónico/contraseña.Primero inspeccione el usuario existente y la autenticación.código. No modifique la base de datos todavía.Siga el patrón de manejo de errores existente.Agregar pruebas para:inicio de sesión válidocontraseña no válidausuario desconocidoAntes de realizar cambios, explique su plan.

La segunda solicitud le da al agente algo mucho más valioso que palabras adicionales; le da restricciones.

El contexto importa más que las indicaciones

El mensaje que utilice es muy importante, pero sin contexto, no puede servir de mucho. Si le pide a un agente que modifique el repositorio, el repositorio en sí contiene mucho contexto, como arquitectura existente, convenciones de nomenclatura, dependencias, pruebas, configuración y documentación.

Darle a un agente un mensaje sin contexto es como conducir un automóvil sin GPS en un país nuevo. Ambos te llevarán a alguna parte, pero no a donde quieres ir.

Por ejemplo, un mensaje como:

Corrija el error en el analizador.no obtendrá los mismos resultados que este:Corrija el error en src/parser.py.Antes de cambiar algo, lea:LÉAME.mdsrc/parser.pypruebas/test_parser.pySiga el patrón de manejo de errores existente.Ejecute las pruebas del analizador después de realizar el cambio.

El segundo mensaje proporciona al modelo un entorno mejorado para el razonamiento. Es por eso que las instrucciones y la documentación a nivel de proyecto son cada vez más importantes cuando se trabaja con agentes de codificación.

Vale la pena detenerse aquí y enfatizar que las indicaciones más largas no son necesariamente mejores. En la mayoría de los casos, un buen mensaje es aquel que le muestra al agente dónde buscar.

Otra cosa importante a la que prestar atención es: no le pida al agente que cambie el código de inmediato; en su lugar, siga este bucle:

Preguntar → Inspeccionar → Planificar → Implementar → Probar → Revisar.

Comience pidiéndole al agente que inspeccione el repositorio sin realizar cambios.

Por ejemplo:

Primero inspeccione el repositorio.No modifique ningún archivo.Identificar:Dónde reside actualmente esta funcionalidad.Qué archivos es probable que cambien.Pruebas existentes relacionadas con el mismo.Cualquier limitación arquitectónica.Luego proponga un plan de implementación.

Este paso le ahorrará mucho tiempo (y posibles errores), ya que le brinda la oportunidad de detectar un malentendido antes de que el agente actúe modificando 15 archivos. Una vez que pueda ver la lógica del agente, podrá comenzar a solicitar cambios precisos.

Centrarse en problemas pequeños y comprobables

Una cosa que veo que hace mucha gente es darle al agente una tarea enorme, como:

Vuelva a escribir toda esta solicitud.

¡Será difícil revisar la capacidad del agente para realizar cambios importantes, porque tendrá que revisar mucho código! En su lugar, divida el trabajo en pequeñas tareas e, idealmente, pruebe después de cada adición:

Tarea 1:Agregue la clase de analizador.Tarea 2:Agregue pruebas unitarias.Tarea 3:Integrelo con la tubería existente.Tarea 4:Refactorizar código duplicado.

En este caso, si hay un problema, ¡tendrás una buena idea del lugar donde ocurrió! Esta es una habilidad útil más allá de la IA; es buena ingeniería de software.

Es útil recordar que un agente no tiene un conocimiento inherente de si el código funciona en su entorno particular. Así es como puedes utilizar estos agentes. Por ejemplo, si le pide a un agente que implemente una función y ejecute el conjunto de pruebas, y tres pruebas fallan, el agente puede leer el rastreo, identificar el código relevante, realizar un cambio y volver a ejecutar las pruebas.

Esta es una de las razones por las que las buenas pruebas se vuelven aún más valiosas en un flujo de trabajo de desarrollo impulsado por agentes. Mira, las pruebas ya no son sólo para desarrolladores; más bien, pueden convertirse en parte del entorno del agente.

Demos un paso atrás: un agente puede pasar cada prueba y aun así producir una mala implementación. Aquí es donde los desarrolladores (como tú y como yo la mayor parte del tiempo) siguen siendo muy esenciales. Cuando revisa el código generado por el agente, debe verificar:

¿Es este el diseño correcto?

¿Se ajusta a la arquitectura existente?

¿El agente hizo cambios innecesarios?

¿Existen suposiciones ocultas?

¿Introdujo una dependencia?

¿Qué sucede con las entradas inusuales?

¿Se puede mantener el código?

¿Hay implicaciones de seguridad?

Todos sabemos que la IA abarata la producción de código, pero comprenderlo sigue siendo caro.

¿Cuándo debería utilizar un agente?

Bien, debo señalar que no todas las tareas de programación necesitan un agente autónomo. Para una pequeña pregunta, un asistente de IA normal puede ser más rápido, o incluso una implementación escrita a mano.

Por ejemplo:

“¿Por qué esta expresión de Python devuelve Ninguno?”

Hay pocas razones para darle acceso a un agente a un repositorio completo. Sin embargo, algo como:

“Descubra por qué fallan estas pruebas de integración, identifique la causa raíz, implemente la solución y ejecute las pruebas pertinentes”.

Es mucho mejor para un agente. Una simple regla general es algo como:

Tarea

Tipo de asistencia de IA

“Explica este error”

asistente de IA

“Escribe esta pequeña función”

Asistente de codificación

“Refactorizar este archivo”

Asistente/agente de codificación

“Encuentre y solucione este error”

Agente codificador

“Agregue esta función en todo el repositorio”

Agente codificador

“Investigue por qué falla el conjunto de pruebas”

Agente codificador

“Reescribe toda la aplicación”

Agente + puntos de control humanos

“Mejorar este código”

Ninguno de los dos: primero defina el problema

Cuanto más implica la tarea exploración, múltiples acciones y retroalimentación, más útil se vuelve un agente. Y sólo es útil si le proporcionas 5 cosas:

Una buena solicitud de agente de codificación suele contener cinco cosas:

Meta:Agregue soporte para entrada XYZ.Contexto:Inspeccione src/parser.py y las pruebas del analizador existentes.Restricciones:No cambie la API pública.Criterios de aceptación:Las pruebas existentes continúan pasando y agregandopruebas para la entrada XYZ.Validación:Ejecute pytest tests/test_parser.py.

La única pregunta que queda ahora es: ¿qué agente utilizar?

Hoy en día, existe un ecosistema creciente de agentes de codificación, incluidos los integrados en IDE, así como agentes basados ​​en terminales y en la nube. Lo que debes preguntarte es:

¿Qué flujo de trabajo se adapta a mi problema?

Si pasa la mayor parte de su tiempo dentro de un IDE, un agente integrado en IDE puede resultarle natural. Si trabaja principalmente desde la terminal, un agente basado en la terminal puede tener más sentido. Si su flujo de trabajo de desarrollo gira en torno a GitHub, la integración del repositorio y de las solicitudes de extracción puede ser más importante.

Pensamientos finales

A lo largo de los años, los programadores han tenido que adaptarse a los últimos avances tecnológicos. Esto no ha sido más frecuente que con la aparición de los agentes codificadores. El conjunto de habilidades necesarias al programar utilizando agentes de codificación es ligeramente diferente. ¡Necesita comprender los algoritmos y la arquitectura, y aún debe realizar la depuración! También necesita ser bueno asignando trabajo a una máquina que pueda actuar en su nombre.

Debe definir el problema, proporcionar algo de contexto, establecer las limitaciones y luego revisar el resultado. La cuestión es que un agente de IA puede trabajar mucho más rápido y producir mucho más código en un corto período de tiempo. Lo que significa que una buena delegación se vuelve aún más importante. La pregunta más interesante sobre los agentes codificadores no es:

¿Cuánta programación puede automatizarse con IA?

Estamos pasando de una situación en la que los desarrolladores escribían principalmente código a una en la que son cada vez más responsables de dirigir, evaluar y coordinar los sistemas generadores de código.

Ese hecho no reduce la importancia de la programación. En ciertos aspectos, hace que la comprensión del software sea más importante. Lo difícil no consiste en escribir el código, que se puede hacer en apenas unos segundos.

La parte difícil es saber qué deberían hacer esas diez líneas y si deberían existir. Los mejores desarrolladores de la era de los agentes no serán necesariamente las personas que escriban la mayor cantidad de código.

Serán las personas que sabrán qué problemas presentarle a la máquina, cómo presentárselos y cuándo no confiar en la respuesta.