5 consejos y trucos de codificación agente
Imagen del editor
Preparación
La codificación agente solo parece «inteligente» cuando envía diferencias correctas, pasa pruebas y deja un huella impreso en el que puede echarse en brazos. La forma más rápida de calar allí es dejar de pedirle a un agente que «cree una función» y comenzar a darle un flujo de trabajo del que no pueda escapar.
Ese flujo de trabajo debería forzar claridad (qué cambia), evidencia (qué pasó) y contención (qué puede tocar). Los siguientes consejos son patrones concretos que puede incluir en el trabajo diario con agentes de código, ya sea que esté utilizando un agente CLI, un asistente IDE o un maniquí de uso de herramientas personalizado.
1. Utilice un planisferio de repositorio para evitar refactores ciegos
Agentes volverse genérico cuando no comprendan la topología de su código cojín. Por defecto utilizan refactorizadores amplios porque no pueden situar de forma confiable las uniones correctas. Ofrezca al agente un planisferio de repositorio que sea breve, obstinado y centrado en las partes importantes.
Cree una instantánea inteligible por máquina de la estructura de su tesina y los puntos de entrada secreto. Mantenlo por debajo de unos cientos de líneas. Actualícelo cuando cambien las carpetas principales. Luego introduzca el planisferio en el agente antiguamente de cualquier codificación.
Aquí tienes un creador sencillo que puedes economizar tools/repo_map.py:
de pathlib import Ruta INCLUDE_EXT = {«.py», «.ts», «.tsx», «.go», «.java», «.rs»} SKIP_DIRS = {«node_modules», «.git», «dist», «build», «__pycache__»} root = Path(__file__).resolve().parents(1) líneas = () for p in sorted(root.rglob(«*»)): si existe (parte en SKIP_DIRS para parte en p.parts): continúe si p.is_file() y p.suffix en INCLUDE_EXT: rel = p.relative_to(root) lines.append(str(rel)) print(«n».join(lines(:600)))
|
de rutalib importar Camino INCLUDE_EXT = {«.py», «.ts», «.tsx», «.ir», «.Java», «.rs»} SALTAR_DIRS = {«módulos_nodo», «.git», «distrito», «construir», «__pycache__»} raíz = Camino(__archivo__).resolver().padres(1) pauta = () para pag en arreglado(raíz.rglob(«*»)): si cualquier(parte en SALTAR_DIRS para parte en pag.regiones): continuar si pag.es_archivo() y pag.sufijo en INCLUDE_EXT: rel = pag.relativo_a(raíz) pauta.añadir(condena(rel)) imprimir(«ártico».unirse(pauta(:600))) |
Agregue una segunda sección que nombre los archivos «calientes» reales, no todos. Ejemplo:
Puntos de entrada:
api/server.ts(enrutamiento HTTP)core/agent.ts(planificación + llamadas a herramientas)core/executor.ts(corredor de comando)packages/ui/App.tsx(shell primero)
Convenciones secreto:
- Nunca edite archivos generados en
dist/ - Todas las escrituras de cojín de datos pasan
db/index.ts - Las banderas de características viven en
config/flags.ts
Esto reduce el espacio de búsqueda del agente y evita que reescriba «útilmente» la porción del repositorio porque se perdió.
2. Forzar las primeras ediciones del parche con un presupuesto diferente
Los agentes descarrilan cuando editan como un humano con tiempo ilimitado. Oblíguelos a comportarse como un colaborador disciplinado: proponga un parche, manténgalo pequeño y explique la intención. Un truco práctico es un presupuesto diferencial, un margen palmario de líneas cambiadas por iteración.
Utilice un flujo de trabajo como este:
- El agente produce un plan y una repertorio de archivos.
- El agente produce solo una diferencia unificada
- Aplicas el parche
- Pruebas ejecutadas
- Próximo parche solo si es necesario
Si está creando su propio tirabuzón de agentes, asegúrese de aplicarlo mecánicamente. Ejemplo de pseudológica:
MAX_CHANGED_LINES = 120 def count_changed_lines(unified_diff: str) -> int: devuelve suma(1 para la bisectriz en unified_diff.splitlines() si line.startswith((«+», «-«)) y no line.startswith((«+++», «—«))) cambió = count_changed_lines(diff) si cambió > MAX_CHANGED_LINES: aumentar ValueError(f»Diff demasiado alto: {cambiado} líneas cambiadas»)
|
MAX_CHANGED_LINES = 120 definición contar_líneas_cambiadas(diferencia_unificada: condena) -> inalterable: devolver suma(1 para bisectriz en diferencia_unificada.líneas divididas() si bisectriz.comienza con((«+», «-«)) y no bisectriz.comienza con((«+++», «—«))) cambió = contar_líneas_cambiadas(diferencia) si cambió > MAX_CHANGED_LINES: aumentar Error de valía(F«Diff demasiado alto: {cambiado} líneas cambiadas») |
Para flujos de trabajo manuales, incluya la restricción en su mensaje:
- Genera solo una diferencia unificada
- Frontera precioso: 120 líneas modificadas en total
- Sin formato o refactorizaciones no relacionadas
- Si necesita más, deténgase y solicite un segundo parche.
Los agentes responden adecuadamente a restricciones que son mensurables. «Mantenlo al insignificante» es vaporoso. “120 líneas modificadas” es ejecutable.
3. Convertir los requisitos en pruebas de acogida ejecutables
Las solicitudes vagas pueden impedir que un agente edite correctamente su hoja de cálculo, y mucho menos genere el código adecuado. La forma más rápida de concretar un agente, independientemente de su patrón de diseñoes traducir los requisitos en pruebas antiguamente de la implementación. Trate las pruebas como un resolución que el agente debe cumplir, no como un complemento de mejor esfuerzo.
Un patrón ágil:
- Escriba una prueba fallida que capture el comportamiento de la característica
- Ejecute la prueba para confirmar que equivocación por el motivo correcto
- Deje que el agente implemente hasta que pase la prueba.
Ejemplo en Python (pytest) para un limitador de velocidad:
importar tiempo desde myapp.ratelimit importar SlidingWindowLimiter def test_allows_n_requests_per_window(): lim = SlidingWindowLimiter(limit=3, window_segundos=1) afirmar lim.allow(«u1») afirmar lim.allow(«u1») afirmar lim.allow(«u1») afirmar no lim.allow(«u1») time.sleep(1.05) afirmar lim.allow(«u1»)
|
importar tiempo de miaplicación.margen de velocidad importar Limitador de ventana corrediza definición test_allows_n_requests_per_window(): Lim = Limitador de ventana corrediza(margen=3, ventana_segundos=1) afirmar Lim.permitir(«u1») afirmar Lim.permitir(«u1») afirmar Lim.permitir(«u1») afirmar no Lim.permitir(«u1») tiempo.pernoctar(1.05) afirmar Lim.permitir(«u1») |
Ahora el agente tiene un objetivo objetivo. Si “piensa” que ya está hecho, la prueba decide.
Combine esto con comentarios de la útil: el agente debe ejecutar el conjunto de pruebas y pegar el resultado del comando. Ese único requisito acaba con toda una clase de finalizaciones seguras pero incorrectas.
Fragmento rápido que funciona adecuadamente:
- Paso 1: escribir o perfeccionar pruebas
- Paso 2: Ejecutar pruebas
- Paso 3: Implementar hasta que pasen las pruebas.
Incluya siempre los comandos exactos que ejecutó y el breviario final de la prueba.
Si las pruebas fallan, explique la equivocación en un párrafo y luego aplique el parche.
4. Agregue un paso de “pato de tirachinas” para detectar suposiciones ocultas
Los agentes hacen suposiciones silenciosas sobre las formas de los datos, las zonas horarias, el manejo de errores y la simultaneidad. Puedes sacar a la luz esas suposiciones con un momento forzado de «pato de tirachinas», acoplado antiguamente de codificar.
Pide tres cosas, en orden:
- Suposiciones que hace el agente
- ¿Qué podría romper esas suposiciones?
- ¿Cómo los validaremos?
Sea breve y obligatorio. Ejemplo:
- Antiguamente de codificar: enumere 5 supuestos
- Para cada uno: un paso de fuerza utilizando código o registros existentes
- Si alguna suposición no se puede validar, haga una pregunta aclaratoria y deténgase.
Esto crea una pausa que a menudo evita confirmaciones arquitectónicas incorrectas. Además le brinda un punto de control de revisión sencillo. Si no está de acuerdo con una suposición, puede corregirla antiguamente de que el agente escriba el código que la integra.
Una conquista global es detectar tempranamente los desajustes en los contratos de datos. Ejemplo: el agente supone que hay una marca de tiempo ISO-8601pero la API devuelve milisegundos de época. Eso una discrepancia puede derivar en una cascada de desamparo de «corrección de errores». El escalón del pato de tirachinas lo elimina.
5. Haga que la salida del agente sea reproducible con recetas de ejecución
La codificación agente equivocación en los equipos cuando nadie puede reproducir lo que hizo el agente. Para solucionarlo, solicite una récipe de ejecución: los comandos exactos y las notas de entorno necesarias para repetir el resultado.
Adopte una convención simple: cada ejecución de agente termina con un RUN.md fragmento que puede pegar en una descripción de relaciones públicas. Debe incluir configuración, comandos y resultados esperados.
Plantilla:
## Ejecutar entorno de récipe: – SO: – Tiempo de ejecución: (traducción nodo/python/go) Comandos: 1)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
## Ejecutar récipe Animación: – SO: – Tiempo de ejecución: (nodo/pitón/ir traducción) Comandos: 1) <dominio> 2) <dominio> Esperado: – Pruebas: <breviario> – Hilas: <breviario> – Manual controlar: <qué a hacer clic o rizo> Ejemplo para a Nodo API cambiar: ## Ejecutar récipe Animación: – Nodo 20 Comandos: 1) npm ci 2) npm prueba 3) npm pasar hilas 4) nodo guiones/fumar.js Esperado: – Pruebas: 142 suficiente – Hilas: 0 errores – Fumar: «DE ACUERDO» impreso |
Esto hace que el trabajo del agente sea portátil. Además mantiene la autonomía honesta. Si el agente no puede producir una récipe de ejecución limpia, probablemente no haya validado el cambio.
Concluyendo
La codificación agente prosperidad rápidamente cuando la tratas como ingeniería, no como trepidación. Los mapas de repositorios dejan de deambular a ciegas. Las diferencias del primer parche mantienen los cambios revisables. Las pruebas ejecutables convierten los requisitos establecidos a mano en objetivos objetivos. Un puesto de control de pato de tirachinas expone suposiciones ocultas antiguamente de que se conviertan en insectos. Las recetas de ejecución hacen que todo el proceso sea reproducible para los compañeros de equipo.
Estos trucos no reducen la capacidad del agente. Lo afilan. La autonomía se vuelve útil una vez que está limitada, mensurable y vinculada a la feedback actual de las herramientas. Ahí es cuando un agente deja de sonar impresionante y comienza a cursar trabajos que puede fusionar.