¿Qué es el RAG? Generación de recuperación aumentada explicada con un ejemplo práctico
RAG permite que un modelo de IA responda a partir de sus propios documentos en lugar de hacerlo únicamente desde la memoria. Aprenda cómo funciona la canalización, ejecute una versión pequeña en Python simple y vea por qué fallan los sistemas reales y cómo probarlos.
- RAG primero encuentra información relevante, la agrega al mensaje y luego le pide al modelo que responda a partir de ella.
- Es la forma habitual de conectar un modelo de lenguaje a datos privados o que cambian con frecuencia.
- La mayoría de los problemas de calidad comienzan con la recuperación y preparación de datos, no con el modelo.
- RAG reduce las respuestas inventadas pero no las elimina, por lo que es necesario probarlo.
Pregúntele a un asistente general de IA sobre la política de reembolso de su empresa y solo podrá adivinar. Nunca ha visto sus documentos. RAG, abreviatura de generación aumentada de recuperación, resuelve este problema buscando la información correcta y entregándola al modelo junto con la pregunta.
Esta guía explica cada etapa en un lenguaje sencillo y luego crea una versión pequeña utilizando únicamente la biblioteca estándar de Python. Ejecutamos ese código en Python 3.13 y las puntuaciones mostradas provienen de esa ejecución. No utiliza ningún modelo de lenguaje, por lo que demuestra recuperación y construcción rápida, y no probamos el paso de respuesta final.
¿Qué es RAG?
La generación de recuperación aumentada es una técnica que combina un paso de búsqueda con un modelo de lenguaje. Cuando llega una pregunta, el sistema busca una fuente de conocimiento, agrega los mejores resultados a la pregunta y le pide al modelo que responda basándose en ese material.
Piense en un examen a libro abierto. Un estudiante con el libro cerrado confía en la memoria y puede recordar mal con seguridad. Un estudiante con libro abierto puede buscar primero la página correcta. RAG le da al modelo ese libro y también le permite señalar qué página utilizó.
El problema que RAG resuelve
Un modelo de lenguaje por sí solo tiene tres límites para su uso empresarial:
- No conoce tus datos privados. Tus pólizas, tickets y contratos no formaron parte de su formación.
- Su conocimiento tiene un límite. No puede saber acerca de un precio que usted cambió esta mañana.
- Puede inventar respuestas. Cuando no está seguro, puede producir algo plausible pero falso.
RAG aborda los tres y no es necesario volver a capacitar nada. Actualice un documento, vuelva a indexarlo y la siguiente respuesta podrá utilizarlo.
Cómo funciona RAG, paso a paso
Un sistema RAG tiene dos tuberías. Uno prepara sus datos con anticipación y el otro los ejecuta para cada pregunta.
Indexación: preparar sus datos
- Cargar: recopila contenido de archivos PDF, wikis, bases de datos o tickets.
- Limpiar y fragmentar: elimine la basura y luego divida los documentos en pequeños pasajes.
- Incrustar: convierte cada pasaje en una lista de números, llamada incrustación, que captura su significado.
- Almacenar: guarda las incrustaciones en un índice con capacidad de búsqueda, a menudo una base de datos vectorial.
Consultar: responder una pregunta.
- Recuperar: incrustar la pregunta y encontrar los pasajes más cercanos en significado.
- Aumento: inserte esos pasajes en el mensaje.
- Generar: el modelo escribe una respuesta usando ese contexto.
La recuperación no tiene por qué utilizar vectores. Puede ser una búsqueda de palabras clave o incluso una consulta SQL, lo que encuentre la información adecuada para sus datos.
Un pequeño ejemplo práctico
Para ver claramente las partes móviles, aquí hay un pequeño recuperador sin bibliotecas. Representa el texto como recuento de palabras, un sustituto mucho más simple de las incrustaciones reales, y puntúa la similitud utilizando la medida del coseno.
import math, re
from collections import Counter
DOCS = {
"refunds": "Refunds are paid within 7 days to the original payment method.",
"shipping": "Standard shipping takes 3 to 5 working days across India.",
"warranty": "All keyboards include a 2 year warranty against defects.",
}
def vectorize(text):
return Counter(re.findall(r"[a-z0-9]+", text.lower()))
def similarity(a, b):
dot = sum(a[word] * b[word] for word in a)
size = math.sqrt(sum(v * v for v in a.values()))
size *= math.sqrt(sum(v * v for v in b.values()))
return dot / size if size else 0
def retrieve(question, k=1):
q = vectorize(question)
scored = [(similarity(q, vectorize(t)), name) for name, t in DOCS.items()]
return sorted(scored, reverse=True)[:k]
def build_prompt(question):
(score, name), = retrieve(question)
return (
"Answer using only the context. If it is not there, say you do not know.\n"
f"Context: {DOCS[name]}\n"
f"Question: {question}"
)
Preguntar sobre reembolsos encuentra el pasaje correcto y genera este mensaje:
print(retrieve("How many days until refunds are paid?"))
# [(0.4558..., 'refunds')]
print(build_prompt("How many days until refunds are paid?"))
# Answer using only the context. If it is not there, say you do not know.
# Context: Refunds are paid within 7 days to the original payment method.
# Question: How many days until refunds are paid?
En un sistema completo, ahora enviaría ese mensaje a un modelo de lenguaje. El detalle importante es la instrucción para admitir cuando falta la respuesta, sobre la cual puede obtener más información en nuestra guía para ingeniería rápida.
Lo que nuestro ejemplo pierde
Ahora intente con una pregunta que signifique lo mismo pero use palabras diferentes:
print(retrieve("When can I get my money back?", k=3))
# [(0.0, 'warranty'), (0.0, 'shipping'), (0.0, 'refunds')]
Cada puntuación es cero, porque la pregunta no comparte palabras con ningún documento. “Devolución de dinero” significa reembolso a un ser humano, pero el recuento de palabras no lo dice. Este resultado único explica por qué los sistemas reales utilizan incrustaciones, que están diseñadas para que el texto con significado similar termine con números similares, incluso sin palabras en común.
Pero no asuma que las incrustaciones lo resuelven todo. Pueden tener dificultades con términos exactos, como códigos de producto y números de error, que la búsqueda de palabras clave maneja muy bien. Es por eso que muchos sistemas de producción utilizan la búsqueda híbrida, combinando los dos enfoques.
Chunking: el paso que la gente subestima
Los documentos se dividen en fragmentos porque los archivos completos son demasiado largos e imprecisos para recuperarlos. El tamaño que elija implica una verdadera compensación:
| Tamaño del fragmento | ventaja | Riesgo |
|---|---|---|
| demasiado pequeño | Coincidencias precisas | Pierde contexto, como a qué producto se aplica una regla |
| demasiado grande | Mantiene el contexto | Diluye el significado y utiliza más indicaciones. |
| Dividido por estructura | Respeta títulos y secciones. | Necesita documentos fuente más limpios |
Unos cientos de palabras con cierta superposición entre fragmentos es un punto de partida común, pero trátelo como una primera suposición para probar. Divida según límites naturales, como títulos, cuando pueda. Y adjunte metadatos, como el título del documento, la fecha y el departamento, para poder filtrar los resultados y citar fuentes.
Mejorando la recuperación
Cuando las respuestas son deficientes, estas son las actualizaciones que más vale la pena probar, aproximadamente en este orden:
- Limpiar los datos. Primero elimine los documentos obsoletos y duplicados. Ningún algoritmo soluciona fuentes contradictorias.
- Utilice búsqueda híbrida. Combine resultados basados en significado y palabras clave.
- Agregue un nuevo clasificador. Busque más candidatos y luego use un modelo especializado para reordenarlos por relevancia.
- Filtrar por metadatos. Restringir los resultados por producto, región o fecha antes de realizar la búsqueda.
- Vuelva a escribir la consulta. Haga un seguimiento vago como “¿qué pasa con la segunda?” en una pregunta completa.
Consejo: Antes de culpar al modelo, observe qué recuperación realmente arrojó. Si el pasaje correcto no estuviera en el contexto, ningún modelo podría haber respondido correctamente a partir de él.
RAG vs ajuste fino
| Pregunta | trapo | Ajuste fino |
|---|---|---|
| ¿Qué añade? | Conocimiento en el momento de las preguntas | Comportamiento o estilo entrenado |
| Actualizando información | Volver a indexar el documento | Entrenar de nuevo |
| ¿Puede citar fuentes? | si | No confiable |
| Lo mejor para | Hechos que cambian | Formato o tono consistente |
No son mutuamente excluyentes. Nuestra comparación de RAG vs ajuste fino vs ingeniería rápida cubre cómo elegir con más profundidad.
Cómo probar un sistema RAG
RAG es software y necesita pruebas como cualquier otro software. Cree un conjunto de preguntas reales junto con los pasajes y las respuestas que espera, luego mida las dos etapas por separado:
| etapa | Pregunta para hacer | nombre común |
|---|---|---|
| Recuperación | ¿Hemos encontrado el pasaje correcto? | Recuerdo de contexto |
| Recuperación | ¿Cuánto de lo que obtuvimos fue útil? | Precisión del contexto |
| Generación | ¿La respuesta está respaldada por el contexto? | fidelidad |
| Generación | ¿Realmente responde a la pregunta? | Relevancia de la respuesta |
Incluya también casos incómodos: preguntas sin respuesta en sus datos, preguntas que utilicen redacción diferente y preguntas con fuentes contradictorias. Vuelva a ejecutar este conjunto cada vez que cambie la fragmentación, los modelos o las indicaciones, como un conjunto de regresión. Nuestro tutorial de pytest muestra cómo ejecutar muchas entradas a través de una sola prueba.
Por qué fallan los sistemas RAG
- La respuesta no está en los datos. El modelo aún puede intentar uno, así que indíquele cómo rechazarlo.
- No se recuperó el fragmento correcto. Esto suele ser un problema de fragmentación o de búsqueda.
- Demasiado contexto. Los pasajes irrelevantes pueden distraer el modelo y aumentar los costos.
- Documentos obsoletos. Una política antigua se puede recuperar con tanta confianza como la actual.
- Tablas y archivos PDF mal analizados. Si la extracción codifica el texto, la recuperación nunca se recupera.
- Pruebas solo con preguntas de demostración. Los usuarios reales expresan las cosas de manera muy diferente.
Seguridad y permisos
RAG conlleva dos riesgos que son fáciles de pasar por alto. Primero, control de acceso: si el índice contiene archivos de recursos humanos, la pregunta de un empleado junior no debe recuperarlos. Aplique los permisos de cada usuario durante la recuperación, porque ordenar al modelo que guarde secretos no es una protección confiable.
En segundo lugar, inyección inmediata. Una página web o un documento recuperado podría contener texto como “ignore sus instrucciones”. Trate el contenido recuperado como datos que no son de confianza, limite las acciones que puede realizar el modelo y requiera que un humano apruebe las sensibles.
Conclusión
RAG es una idea simple con muchos detalles prácticos: encuentre la información correcta y luego pídale al modelo que la use. Comience con un conjunto pequeño y limpio de documentos y unas veinte preguntas reales. Haga que la recuperación funcione bien antes de agregar complejidad, porque una canalización modesta con buenos datos generalmente supera a una sofisticada con datos incorrectos.
Preguntas frecuentes
¿Qué significa RAG en IA?
RAG significa generación aumentada de recuperación. Un sistema recupera información relevante, la agrega al mensaje y el modelo genera una respuesta a partir de ella.
¿RAG detiene las alucinaciones por IA?
Los reduce dándole al modelo fuentes reales, pero no los elimina. Un modelo aún puede interpretar mal el contexto, así que pruebe las respuestas y muestre citas.
¿Necesito una base de datos vectorial para RAG?
No siempre. Los proyectos pequeños pueden utilizar un índice en memoria, búsqueda de palabras clave o SQL. Las bases de datos vectoriales ayudan con grandes colecciones y búsquedas basadas en significados.
¿Cuál es la diferencia entre RAG y ajuste fino?
RAG proporciona información en el momento de las preguntas, por lo que las actualizaciones son rápidas. El ajuste fino entrena un modelo para cambiar su comportamiento o estilo, y es menos adecuado para cambiar hechos.
¿Qué es una incrustación?
Una incrustación es una lista de números que representan el significado del texto. Los pasajes con significados similares tienen números similares, lo que hace posible la búsqueda basada en el significado.
sigue aprendiendo
¿Necesitas ayuda con pruebas, WordPress o SEO?
Ayudamos a los equipos a enviar mejor software y hacer crecer sus sitios. Cuéntenos en qué está trabajando y le sugeriremos un siguiente paso claro.
Más guías sobre testing, IA y desarrollo moderno
¿Te gustó este artículo? Elige un tema y salta directo a nuestros tutoriales más recientes.
Explicación de las alucinaciones de la IA: por qué los modelos de lenguaje inventan cosas y cómo reducirlas
Se explicaron las alucinaciones de la IA: qué son, por qué los modelos de lenguaje las producen, tipos comunes, cómo reducirlas con conexión a tierr…
Leer artículo →DevOpsExplicación de las variables de entorno: archivos .env, secretos y configuración bien hechos
Variables de entorno explicadas con ejemplos de Python que ejecutamos: leerlas y configurarlas, por qué cada valor es una cadena, archivos .env, her…
Leer artículo →Desarrollo de softwareExplicación de la limitación de velocidad de API: algoritmos, encabezados y manejo de errores 429
La limitación de la tasa de API se explica con una simulación que ejecutamos: depósito de tokens, ventana fija, ventana deslizante, 429 respuestas, …
Leer artículo →Automatización de pruebasBurlarse en Python: unittest.mock, patch y los errores que hacen que las pruebas mientan
Burlarse en Python con unittest.mock, probado: Mock y return_value, side_effect, parches donde se usa un nombre, especificación y autospec, fechas d…
Leer artículo →Pruebas de softwareExplicación de la cobertura del código: cobertura de línea versus sucursal y lo que realmente significa 100%
Cobertura del código explicada con una ejecución real de cobertura.py: cobertura de línea, rama y condición, lectura de un informe, por qué una cobe…
Leer artículo →Bases de datos y SQLDELETE vs TRUNCATE vs DROP en SQL: diferencias, reversión y cuándo usar cada uno
DELETE vs TRUNCATE vs DROP explicado con SQL probado: qué elimina cada uno, reversión, activadores, restablecimiento de identidad, velocidad y en qu…
Leer artículo →Bases de datos y SQLVistas SQL explicadas: cree, use y evite los errores, con ejemplos
Vistas SQL explicadas con consultas que ejecutamos: creación de una vista, resultados en vivo, ocultación de columnas, rendimiento, vistas actualiza…
Leer artículo →Desarrollo de softwareInterfaz TypeScript versus tipo: diferencias reales, probadas con el compilador
Interfaz TypeScript versus tipo, verificado con el compilador real: qué pueden hacer ambos, qué puede hacer solo uno, fusión de declaraciones, exten…
Leer artículo →Desarrollo de softwarePython *args y **kwargs explicados: funciones flexibles con ejemplos claros
Python *args y **kwargs explicados con el código que ejecutamos: empaquetado y desempaquetado, orden de parámetros, argumentos solo de palabras clav…
Leer artículo →Desarrollo de softwareFunciones Lambda de Python: sintaxis, usos reales y cuándo no utilizarlas
Funciones lambda de Python explicadas con el código que ejecutamos: sintaxis, clasificación con clave, mapa y filtro, cierres, trampa de enlace tard…
Leer artículo →Inteligencia artificial¿Qué son los agentes de IA? Cómo funcionan, con un bucle de agente simple que puedes ejecutar
¿Qué son los agentes de IA? Una guía sencilla sobre el bucle del agente, las herramientas, la memoria y las barreras de seguridad, con un pequeño bu…
Leer artículo →DevOpsMonitoreo versus observabilidad: la verdadera diferencia, con registros, métricas y seguimientos
Explicación del monitoreo versus observabilidad: fallas conocidas y desconocidas, registros, métricas y seguimientos, un recorrido por incidentes de…
Leer artículo →DevOpsDocker Volumes versus Bind Mounts: persistir los datos del contenedor de la manera correcta
Se explican los volúmenes de Docker frente a los montajes de enlace: por qué desaparecen los datos del contenedor, volúmenes con nombre, montajes de…
Leer artículo →Automatización de pruebasTDD vs BDD: diferencias clave, una función creada en ambos sentidos y cuándo usar cada una
TDD vs BDD explicado con una característica de descuento construida en ambos sentidos: refactor rojo-verde con el código que ejecutamos, escenarios …
Leer artículo →Pruebas de softwarePruebas de Aceptación de Usuario (UAT): Proceso, Lista de Verificación y Ejemplos Reales
Explicación de las pruebas de aceptación del usuario: quién las ejecuta, en qué se diferencia del control de calidad, un proceso de siete pasos, una…
Leer artículo →Bases de datos y SQLValores NULL de SQL explicados: IS NULL, COALESCE, NULLIF y las trampas que se deben evitar
Los valores NULL de SQL se explican con las consultas que ejecutamos: lógica de tres valores, IS NULL, COALESCE, NULLIF, cómo los agregados, las uni…
Leer artículo →Bases de datos y SQLDeclaración SQL CASE WHEN: sintaxis, ejemplos reales y errores comunes
CASO SQL CUANDO se explicó con las consultas que ejecutamos: formularios simples y buscados, orden de condiciones, pivotes con SUMA, trucos COUNT, c…
Leer artículo →Desarrollo de software¿Qué es JWT? Tokens web JSON explicados con un ejemplo práctico
¿Qué es JWT? JSON Web Tokens explicó: las tres partes, un token creado y manipulado en el código que ejecutamos, JWT vs sesiones, almacenamiento, to…
Leer artículo →Desarrollo de softwareExplicación del bucle de eventos de JavaScript: pila de llamadas, microtareas y temporizadores con ejemplos
El bucle de eventos de JavaScript explicado con el código que ejecutamos: pila de llamadas, colas de tareas y microtareas, por qué setTimeout 0 no e…
Leer artículo →Desarrollo de softwareExplicación de los generadores y el rendimiento de Python: ahorre memoria con ejemplos reales
Los generadores de Python y el rendimiento se explican con el código que ejecutamos: cómo se pausan y reanudan, midieron el ahorro de memoria, canal…
Leer artículo →Inteligencia artificial¿Qué son las incrustaciones? Los vectores y la similitud del coseno se explican de forma sencilla
¿Qué son las incrustaciones? Una guía en lenguaje sencillo sobre vectores, similitud de cosenos y búsqueda semántica, con un pequeño ejemplo que eje…
Leer artículo →DevOpsImplementación azul-verde versus implementación canaria: diferencias, compensaciones y cómo elegir
Explicación de la implementación azul-verde versus canaria: cómo funciona cada uno, costo, riesgo y reversión, agrupación estable de usuarios que pr…
Leer artículo →Automatización de pruebasPruebas inestables: qué las causa y cómo solucionarlas para siempre
Pruebas inestables explicadas con demostraciones que realizamos: las causas principales, cómo confirmar y diagnosticar una, correcciones adecuadas p…
Leer artículo →Pruebas de softwarePruebas de carga frente a pruebas de estrés: diferencias, métricas y ejemplos de k6
Explicación de las pruebas de carga frente a las pruebas de estrés: qué prueba cada una, pruebas de picos y de absorción, las métricas que importan,…
Leer artículo →Pruebas de softwareCaso de prueba frente a escenario de prueba: diferencias clave, ejemplos y cuándo utilizar cada uno
Caso de prueba versus escenario de prueba explicado: definiciones claras, una tabla en paralelo, una función de restablecimiento de contraseña tomad…
Leer artículo →Bases de datos y SQLOptimización de consultas SQL: lea planes de ejecución y corrija consultas lentas, con tiempos
Optimización de consultas SQL probada en un millón de filas: lea planes de ejecución, agregue los índices correctos, corrija filtros no sargables, u…
Leer artículo →Bases de datos y SQLSQL UNION vs UNION ALL: diferencias, ejemplos y rendimiento probado
SQL UNION vs UNION ALL explicado con consultas que ejecutamos: duplicados, las reglas que siguen ambos, un error de datos real, rendimiento medido, …
Leer artículo →Desarrollo de softwareTutorial de JavaScript Fetch API: GET, POST, manejo de errores y tiempos de espera
Un tutorial de JavaScript Fetch API probado en un servidor local: GET y POST, por qué 404 no arroja, un asistente reutilizable, cadenas de consulta,…
Leer artículo →Desarrollo de softwareManejo de archivos Python: lectura, escritura, CSV, JSON y pathlib con ejemplos
El manejo de archivos Python se explica con el código que ejecutamos: modos abiertos, lectura de archivos grandes, CSV, JSON, pathlib, archivos bina…
Leer artículo →Desarrollo de softwareClases y objetos de Python: tutorial de programación orientada a objetos con ejemplos reales
Clases y objetos de Python explicados con el código que ejecutamos: __init__, métodos, atributos de clase versus instancia, herencia, propiedades, m…
Leer artículo →Inteligencia artificial¿Qué es un modelo de lenguaje grande? Cómo funcionan los LLM, explicados sin exageraciones
¿Qué es un modelo de lenguaje grande? Los LLM explicados en lenguaje sencillo: tokens, incrustaciones, atención, entrenamiento, ventanas de temperat…
Leer artículo →DevOpsComandos de Linux para principiantes: la guía esencial de terminal con ejemplos
Comandos de Linux para principiantes, agrupados por tarea: navegación, archivos, visualización de registros, grep, canalizaciones, permisos, proceso…
Leer artículo →Automatización de pruebasSelenium vs Playwright: diferencias clave, comparación de códigos y cuál elegir
Comparación de Selenium vs Playwright: arquitectura, espera, soporte de navegador e idioma, depuración, la misma prueba en ambas herramientas, conse…
Leer artículo →Pruebas de softwarePartición de equivalencia: técnica de diseño de pruebas explicada con ejemplos resueltos
Explicación de la partición de equivalencia: cómo encontrar particiones válidas e inválidas, ejemplos prácticos para edades, contraseñas y cupones, …
Leer artículo →Pruebas de softwareSeveridad vs Prioridad en Pruebas de Software: Diferencias, Matriz y Ejemplos Reales
Explicación de gravedad versus prioridad en las pruebas de software: definiciones claras, una matriz de cuatro vías con ejemplos, escalas de niveles…
Leer artículo →Bases de datos y SQLTutorial de subconsultas SQL: tipos, subconsultas correlacionadas y EXISTENCIAS con ejemplos
Un tutorial de subconsultas SQL con consultas que ejecutamos: subconsultas escalares, IN, FROM y SELECT, subconsultas correlacionadas, EXISTS, la tr…
Leer artículo →Bases de datos y SQLTransacciones SQL y ACID explicados: COMMIT, ROLLBACK y niveles de aislamiento
Transacciones SQL y ACID explicadas con una transferencia bancaria que ejecutamos: COMMIT, ROLLBACK, puntos de guardado, bloqueos, niveles de aislam…
Leer artículo →Desarrollo de softwareHoja de trucos de comandos de Git: los comandos que realmente usas, con ejemplos
Una hoja de referencia de comandos de Git agrupada por tarea: configuración, preparación, ramas, controles remotos, almacenamiento, historial y desh…
Leer artículo →Desarrollo de softwareExplicación de las promesas de JavaScript: luego, captura, Promise.all y errores comunes
Las promesas de JavaScript se explican con el código que ejecutamos: estados, luego y cadenas de captura, manejo de errores, Promise.all, allSettled…
Leer artículo →Desarrollo de softwareTutorial del diccionario Python: métodos, ejemplos y patrones comunes
Un tutorial de diccionario de Python con el código que ejecutamos: crear, leer y actualizar dictados, métodos clave, fusión, comprensión, patrones d…
Leer artículo →Inteligencia artificial¿Qué es el RAG? Generación de recuperación aumentada explicada con un ejemplo práctico
¿Qué es RAG? Generación de recuperación aumentada explicada paso a paso: indexación, fragmentación, incrustaciones, recuperación, un pequeño ejemplo…
Leer artículo →DevOpsTutorial de Terraform para principiantes: infraestructura como código desde el primer archivo hasta los módulos
Un tutorial de Terraform para principiantes: comience sin una cuenta en la nube, aprenda init, planifique y aplique, luego variables, resultados, es…
Leer artículo →DevOpsDocker vs Kubernetes: diferencias clave, cómo funcionan juntos y cuál necesita
Docker vs Kubernetes explicó: qué hace cada uno, la misma aplicación se ejecuta con ambos, se comparan Docker Compose y Swarm, los Dockershim cambia…
Leer artículo →Automatización de pruebasTutorial de Pytest para principiantes: accesorios, parametrización y ejemplos reales
Un tutorial de pytest para principiantes con pruebas que ejecutamos en pytest 9.2: afirmaciones, accesorios, parametrización, conftest, marcadores, …
Leer artículo →Pruebas de softwareCiclo de vida de pruebas de software (STLC): 6 fases, criterios de entrada y salida, ejemplo
Se explicó el ciclo de vida de las pruebas de software: seis fases de STLC con criterios de entrada y salida, entregables, un ejemplo de función de …
Leer artículo →Desarrollo de softwareGit merge vs rebase: diferencias, ejemplos y cuándo usar cada uno
Git merge vs rebase explicado con salida real del log, una tabla comparativa, la regla de oro del rebase y un flujo de trabajo seguro para equipos.
Leer artículo →Desarrollo de softwareList comprehension en Python: sintaxis, ejemplos y cuándo evitarla
List comprehension en Python explicada: sintaxis, filtros, if-else, bucles anidados, tiempos medidos y cuándo es mejor un bucle for normal.
Leer artículo →