{"id":17494,"date":"2025-08-20T14:50:19","date_gmt":"2025-08-20T21:50:19","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=17494"},"modified":"2025-08-21T12:48:21","modified_gmt":"2025-08-21T19:48:21","slug":"rag-app-vector-ios","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/rag-app-vector-ios\/","title":{"rendered":"C\u00f3mo constru\u00ed una aplicaci\u00f3n RAG para plantas con Couchbase Vector Search en iOS"},"content":{"rendered":"<p>\u00bfConoces esa sensaci\u00f3n cuando ves una planta preciosa en la tienda pero no tienes ni idea de lo que es ni de c\u00f3mo cuidarla? Eso es exactamente lo que me pas\u00f3 a m\u00ed la primavera pasada, y me hizo pensar: \u00bfy si pudiera apuntar con mi tel\u00e9fono a cualquier planta y saberlo todo sobre ella al instante?<\/p>\n<p>As\u00ed que cre\u00e9 PlantPal, una aplicaci\u00f3n para iOS que identifica plantas a partir de fotos y ofrece consejos de cuidado basados en inteligencia artificial. \u00bfLo mejor? Todo se ejecuta en el dispositivo utilizando la b\u00fasqueda vectorial de Couchbase. No se necesita Internet, no se env\u00edan fotos a servidores, solo pura magia local de identificaci\u00f3n de plantas.<\/p>\n<h2 style=\"font-weight: 400\">Lo que he construido<\/h2>\n<p>PlantPal result\u00f3 ser toda una aventura t\u00e9cnica. B\u00e1sicamente, es una aplicaci\u00f3n RAG capaz de identificar plantas a partir de tu c\u00e1mara y luego chatear contigo para darte instrucciones sobre su cuidado. Pero esto es lo que la diferencia de otras aplicaciones para plantas:<\/p>\n<p>Todo se ejecuta localmente en tu tel\u00e9fono. Apunta tu c\u00e1mara a una planta serpiente, y sabr\u00e1 al instante que es una planta serpiente. Preg\u00fantale \"\u00bfcon qu\u00e9 frecuencia debo regar esto?\" y te dar\u00e1 consejos espec\u00edficos para esa planta en concreto, todo ello sin enviar ni un solo byte a la nube.<\/p>\n<p>Ah, y me las arregl\u00e9 para exprimir toda la aplicaci\u00f3n de un rid\u00edculo 800 MB a s\u00f3lo 14 MB. M\u00e1s sobre este desastre m\u00e1s adelante.<\/p>\n<h2 style=\"font-weight: 400\">V\u00eddeo de demostraci\u00f3n<\/h2>\n<div style=\"width: 480px;\" class=\"wp-video\"><!--[if lt IE 9]><script>document.createElement('video');<\/script><![endif]-->\n<video class=\"wp-video-shortcode\" id=\"video-17494-1\" width=\"480\" height=\"840\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/plant-app-video-1.mp4?_=1\" \/><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/plant-app-video-1.mp4\">https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/plant-app-video-1.mp4<\/a><\/video><\/div>\n<h2 style=\"font-weight: 400\">La pila tecnol\u00f3gica (o c\u00f3mo aprend\u00ed a amar las bases de datos vectoriales)<\/h2>\n<p>Construir esta cosa requiri\u00f3 bastantes piezas:<\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><b>iOS + Swift<\/b> - Obviamente, como lo quer\u00eda en mi iPhone<\/li>\n<li><b>B\u00fasqueda vectorial en Couchbase Lite<\/b> - Esto cambi\u00f3 las reglas del juego para la identificaci\u00f3n de plantas locales.<\/li>\n<li><b>MobileCLIP<\/b> - Modelo de visi\u00f3n por ordenador de Apple para convertir im\u00e1genes en n\u00fameros<\/li>\n<li><b>N\u00facleo ML<\/b> - Para ejecutar todo localmente<\/li>\n<li><b>Modelos de cimentaci\u00f3n<\/b> &#8211; <a href=\"https:\/\/developer.apple.com\/machine-learning\/foundation-models\/\" target=\"_blank\" rel=\"noopener\">Marco de IA en dispositivos de Apple<\/a> para la funcionalidad de chat, proporcionando capacidades LLM de privacidad sin dependencias de la nube.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Toda la filosof\u00eda era \"<em>mantener todo a nivel local<\/em>.\" Sin API en la nube, sin enviar fotos de plantas a servidores aleatorios, sin pesadillas de privacidad. Solo t\u00fa, tu tel\u00e9fono y unas matem\u00e1ticas muy inteligentes.<\/p>\n<hr \/>\n<h2 style=\"font-weight: 400\">Primera parte: La b\u00fasqueda vectorial: no es tan aterradora como parece<\/h2>\n<h3 style=\"font-weight: 400\">Por qu\u00e9 la mayor\u00eda de las aplicaciones para plantas son un asco<\/h3>\n<p>Seamos sinceros: la mayor\u00eda de las aplicaciones de identificaci\u00f3n de plantas son bastante frustrantes. Haces una foto, esperas entre 3 y 5 segundos a que se cargue en alg\u00fan servidor y luego recibes un resultado que puede ser exacto o no. Adem\u00e1s, b\u00e1sicamente est\u00e1s enviando fotos de tus plantas de interior a qui\u00e9n sabe d\u00f3nde.<\/p>\n<p>Quer\u00eda algo que funcionara al instante, como apuntar con la c\u00e1mara a una planta y saber inmediatamente qu\u00e9 es. Sin esperas, sin necesidad de internet, sin problemas de privacidad.<\/p>\n<p><b>B\u00fasqueda de vectores.<\/b> Lo s\u00e9, lo s\u00e9: suena muy t\u00e9cnico e intimidatorio. Pero en realidad es una soluci\u00f3n bastante elegante una vez que te haces a la idea.<\/p>\n<h3 style=\"font-weight: 400\">La magia de las incrustaciones vectoriales<\/h3>\n<p>Esto es lo mejor: puedes convertir cualquier imagen en una lista de n\u00fameros. No como valores de p\u00edxeles, sino como n\u00fameros significativos que representan lo que hay DENTRO de la imagen.<\/p>\n<pre class=\"\">Rose photo \u2192 [0.1, 0.8, 0.3, ...] (512 numbers)\r\nTulip photo \u2192 [0.9, 0.2, 0.1, ...] (512 numbers)\r\n<\/pre>\n<p>Lo bonito es que plantas similares acaban teniendo n\u00fameros similares. Dos fotos de rosas tendr\u00e1n vectores muy parecidos, mientras que una rosa y un cactus ser\u00e1n completamente diferentes.<\/p>\n<p>Una vez que tuve esta idea, la soluci\u00f3n se hizo obvia: \u00a1basta con comparar los n\u00fameros! Couchbase Vector Search se encarga de encontrar vectores similares de forma eficiente.<\/p>\n<p>La aplicaci\u00f3n real result\u00f3 ser sorprendentemente limpia:<\/p>\n<pre class=\"nums:false lang:swift decode:true\">func search(image: UIImage) -&gt; [Record] {\r\n    \/\/ Convierte la foto de la c\u00e1mara en n\u00fameros\r\n    let embeddings = AI.shared.embeddings(for: imagen, atenci\u00f3n: .zoom(factores: [1, 2]))\r\n    \r\n    for embedding in embeddings {\r\n        let plantBuscarResultados = self.buscarPlantas(vector: incrustaci\u00f3n)\r\n        if !plantSearchResults.isEmpty {\r\n            return plantaResultadosB\u00fasqueda\r\n        }\r\n    }\r\n    return []\r\n}\r\n<\/pre>\n<hr \/>\n<h2 style=\"font-weight: 400\">Parte 2: la gran migraci\u00f3n MobileCLIP<\/h2>\n<h3 style=\"font-weight: 400\">Cuando el Marco de Visi\u00f3n no era suficiente<\/h3>\n<p>As\u00ed que aqu\u00ed es donde las cosas se pusieron interesantes. Empec\u00e9 con el framework Vision de Apple porque, bueno, est\u00e1 integrado en iOS y parec\u00eda la elecci\u00f3n obvia. Para mi prueba inicial con 47 fotos de plantas, funcion\u00f3 perfectamente bien. Me sent\u00eda muy bien conmigo mismo.<\/p>\n<p>Entonces me volv\u00ed ambicioso. \u00bfY si pudiera crear una base de datos con m\u00e1s de 15.000 especies de plantas? Fue entonces cuando todo se vino abajo.<\/p>\n<p><strong>El problema era la precisi\u00f3n.<\/strong>\u00a0Cuando prob\u00e9 las incrustaciones de Vision en conjuntos de datos m\u00e1s grandes, las plantas que parec\u00edan similares se confund\u00edan entre s\u00ed. Por ejemplo, la aplicaci\u00f3n cre\u00eda que una planta serpiente era una planta ZZ, lo que no es bueno cuando se trata de dar consejos de riego.<\/p>\n<p>Resulta que las incrustaciones de Vision Framework no eran lo suficientemente distintas para mi caso. Los vectores de plantas de aspecto similar estaban demasiado juntos, por lo que la aplicaci\u00f3n no pod\u00eda distinguirlos con fiabilidad.<\/p>\n<h3 style=\"font-weight: 400\">MobileCLIP<\/h3>\n<p>Despu\u00e9s de investigar un poco (y mucha frustraci\u00f3n), descubr\u00ed MobileCLIP. Est\u00e1 dise\u00f1ado espec\u00edficamente para tareas de similitud de im\u00e1genes, y la diferencia fue de la noche al d\u00eda. De repente, las plantas similares ten\u00edan incrustaciones mucho m\u00e1s definidas y mi precisi\u00f3n aument\u00f3 considerablemente.<\/p>\n<p>La migraci\u00f3n supuso un poco de trabajo -tuve que reescribir el proceso de generaci\u00f3n de incrustaciones-, pero mereci\u00f3 la pena. Ahora puedo escalar con confianza a miles de especies de plantas sin que la precisi\u00f3n se caiga por un precipicio.<\/p>\n<hr \/>\n<h2 style=\"font-weight: 400\">Parte 3: El desastre de los 800 MB (y c\u00f3mo lo arregl\u00e9)<\/h2>\n<h3 style=\"font-weight: 400\">Cuando tu aplicaci\u00f3n sea m\u00e1s grande que la mayor\u00eda de los juegos<\/h3>\n<p>\u00bfRecuerdas cuando mencion\u00e9 el desastre de los 800 MB? S\u00ed, sobre eso...<\/p>\n<p>Mi primera versi\u00f3n era absolutamente rid\u00edcula. Enviaba la base de datos de plantas completa con im\u00e1genes de alta resoluci\u00f3n, adem\u00e1s de m\u00faltiples modelos MobileCLIP (S0, S1, S2, BLT -porque para qu\u00e9 elegir, \u00bfverdad?), m\u00e1s todos los modelos de texto que pensaba que podr\u00eda necesitar alg\u00fan d\u00eda. La aplicaci\u00f3n ten\u00eda b\u00e1sicamente el tama\u00f1o de un juego AAA para m\u00f3viles.<\/p>\n<p>Nadie va a descargarse una aplicaci\u00f3n de 800 MB para identificar plantas. Quiero decir, \u00bflo har\u00edas?<\/p>\n<h3 style=\"font-weight: 400\">El avance de la precomputaci\u00f3n<\/h3>\n<p>Fue entonces cuando tuve lo que me gusta llamar mi momento \"duh\". \u00bfPor qu\u00e9 estaba generando incrustaciones para las mismas 47 plantas cada vez que se iniciaba la aplicaci\u00f3n? Eso es... un desperdicio.<\/p>\n<p><b>Lo que estaba haciendo (mal):<\/b><\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><strong>Paquete de aplicaciones:<\/strong> Im\u00e1genes de las plantas (10MB) + Todos los modelos (800MB) = 810MB<\/li>\n<li><strong>Cada vez que se inicia una aplicaci\u00f3n:<\/strong> Generar incrustaciones para todas las plantas de referencia<\/li>\n<li><strong>Resultado:<\/strong> Arranque lento, tama\u00f1o de archivo rid\u00edculo<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><b>Lo que deber\u00eda haber estado haciendo:<\/b><\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><strong>Tiempo de construcci\u00f3n:<\/strong> Generar incrustaciones una vez a partir de im\u00e1genes de plantas<\/li>\n<li><strong>Paquete de aplicaciones:<\/strong> Incrustaciones precalculadas (500 KB) + 1 modelo (14 MB) = 14 MB<\/li>\n<li><strong>Tiempo de ejecuci\u00f3n:<\/strong> Generar incrustaciones s\u00f3lo para las fotos nuevas de la c\u00e1mara<\/li>\n<li><strong>Resultado:<\/strong> Inicio instant\u00e1neo, aplicaci\u00f3n de tama\u00f1o normal<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Aqu\u00ed est\u00e1 el cargador de incrustaci\u00f3n precalculado:<\/p>\n<pre class=\"nums:false lang:swift decode:true\">clase BuildTimeEmbeddingLoader {\r\n    private var preComputedEmbeddings: [String: PreComputedPlantEmbedding] = [:]\r\n    \r\n    func loadPreComputedEmbeddings() {\r\n        guard let embeddingsURL = Bundle.main.url(forResource: \"plant_embeddings\", withExtension: \"json\"),\r\n              let datos = try? Data(contentsOf: embeddingsURL),\r\n              let incrustaciones = try? JSONDecoder().decode([PreComputedPlantEmbedding].self, from: data) else {\r\n            return\r\n        }\r\n        \r\n        \/\/ Cargar 47 plantas \u00d7 512 dimensiones = ~500 KB en total\r\n        para incrustaci\u00f3n en incrustaciones {\r\n            preComputedEmbeddings[embedding.plantId] = embedding\r\n        }\r\n        \r\n        print(\" \u00a1Cargadas \\(embeddings.count) plantas!\")\r\n    }\r\n}<\/pre>\n<p><b>Ventajas:<\/b><\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><b>Inicio instant\u00e1neo de la aplicaci\u00f3n:<\/b>\u00a0No es necesario generar incrustaciones<\/li>\n<li><b>98% almacenamiento m\u00e1s peque\u00f1o:<\/b>\u00a0Incrustaciones frente a im\u00e1genes<\/li>\n<li><b>Mayor duraci\u00f3n de la bater\u00eda:<\/b>\u00a0Menos c\u00e1lculos en tiempo de ejecuci\u00f3n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr \/>\n<h2 style=\"font-weight: 400\">Parte 4: hacer que Couchbase haga el trabajo pesado<\/h2>\n<h3 style=\"font-weight: 400\">Configuraci\u00f3n de la base de datos (m\u00e1s f\u00e1cil de lo que esperaba)<\/h3>\n<p>Ser\u00e9 sincero: cuando o\u00ed por primera vez \"base de datos vectorial\", pens\u00e9 que ser\u00eda algo enorme y complicado. Pero Couchbase Lite lo hizo sorprendentemente sencillo:<\/p>\n<pre class=\"nums:false lang:swift decode:true\">\/\/ Habilitar la extensi\u00f3n de b\u00fasqueda vectorial\r\nprobar CouchbaseLiteSwift.Extension.enableVectorSearch()\r\n\r\n\/\/ Crear base de datos local\r\n\u00a1let base de datos = try! CouchbaseLiteSwift.Database(name: \"plantpal\")\r\nlet collection = try! database.defaultCollection()\r\n\r\n\/\/ \u00cdndice vectorial para incrustaciones de plantas de 512 dimensiones (tama\u00f1o de salida del modelo MobileCLIP S1)\r\n\/\/ VectorIndexConfiguration define los par\u00e1metros del \u00edndice: expresi\u00f3n de datos, dimensiones del vector, centroides de agrupaci\u00f3n y m\u00e9trica de distancia\r\nvar imageVectorIndex = VectorIndexConfiguration(expresi\u00f3n: \"imagen\", dimensiones: 512, centroides: 8)\r\nimageVectorIndex.metric = .cosine\r\nimageVectorIndex.isLazy = true\r\n\r\ntry! collection.createIndex(withName: \"ImageVectorIndex\", config: imageVectorIndex)\r\n\r\n\/\/ B\u00fasqueda de texto completo para nombres de plantas\r\nlet ftsIndex = FullTextIndexConfiguration([\"nombre\", \"nombrecient\u00edfico\"])\r\ntry! collection.createIndex(withName: \"PlantNameIndex\", config: ftsIndex)\r\n\r\nprint(\" \u00a1Base de datos de b\u00fasqueda vectorial lista!\")<\/pre>\n<h3 style=\"font-weight: 400\">El SQL++ que lo cambi\u00f3 todo<\/h3>\n<p>Aqu\u00ed es donde Couchbase realmente brilla. En lugar de escribir complejos algoritmos de similitud, puedo usar SQL++ con una funci\u00f3n vectorial especial. Es casi demasiado f\u00e1cil:<\/p>\n<pre class=\"nums:false lang:swift decode:true\">private func buscarPlantas(vector: [Float]) -&gt; [Registro] {\r\n    let sql = \"\"\"\r\n        SELECT tipo, nombre, nombrecient\u00edfico, precio, ubicaci\u00f3n,\r\n               wateringSchedule, careInstructions, characteristics,\r\n               APPROX_VECTOR_DISTANCE(imagen, $embedding) AS distancia\r\n        FROM _\r\n        WHERE tipo = \"planta\r\n          AND distance BETWEEN 0 AND 0.4\r\n        ORDER BY distancia, nombre\r\n        LIMIT 1\r\n    \"\"\"\r\n   \r\n    let query = try collection.database.createQuery(sql)\r\n    query.parameters = Par\u00e1metros()\r\n        .setArray(MutableArrayObject(datos: vector), forName: \"incrustaci\u00f3n\")\r\n\r\n    \/\/ Procesar los resultados en objetos Plant\r\n    var records = [Record]()\r\n    for result in try query.execute() {\r\n        let planta = Planta(\r\n            nombre: resultado[\"nombre\"].cadena ?? \"\",\r\n            scientificName: result[\"scientificName\"].string,\r\n            wateringSchedule: extractWateringSchedule(from: result),\r\n            careInstructions: extractCareInstructions(de: resultado),\r\n            caracter\u00edsticas: extractCaracter\u00edsticas(de: resultado)\r\n        )\r\n        records.append(planta)\r\n    }\r\n\r\n    return registros\r\n}<\/pre>\n<p><b>The `<\/b><a href=\"https:\/\/docs.couchbase.com\/couchbase-lite\/current\/csharp\/working-with-vector-search.html#vector-search-sql-support\" target=\"_blank\" rel=\"noopener\"><b>DISTANCIA_VECTOR_APROX<\/b><\/a><b>` function calculates approximate distance between a target vector and vectors in the database, enabling efficient hybrid search with SQL++ queries and support for multiple distance metrics.<\/b><\/p>\n<hr \/>\n<h2 style=\"font-weight: 400\">Parte 5: ense\u00f1ar plantas a la IA<\/h2>\n<h3 style=\"font-weight: 400\">Hacer que el chat sea realmente \u00fatil<\/h3>\n<p>Vale, as\u00ed que pod\u00eda identificar plantas. Guay. \u00bfY luego qu\u00e9? Quer\u00eda que los usuarios pudieran hacer preguntas como \"\u00bfcon qu\u00e9 frecuencia debo regar esto?\" y obtener respuestas realmente \u00fatiles, no consejos gen\u00e9ricos sobre el cuidado de las plantas.<\/p>\n<p>Aqu\u00ed es donde entra en juego RAG (Retrieval-Augmented Generation). B\u00e1sicamente, necesitaba dar a la IA un contexto espec\u00edfico sobre la planta que acababa de identificar. As\u00ed es como estructur\u00e9 todo ese conocimiento sobre las plantas:<\/p>\n<pre class=\"lang:swift decode:true\">clase Plant: Record {\r\n    let nombre: \u00bfCadena?\r\n    let nombreCient\u00edfico: \u00bfCadena?\r\n    let wateringSchedule: \u00bfPrograma de riego?\r\n    let instruccionesdecuidado: CareInstructions?\r\n    let caracter\u00edsticas: PlantCharacteristics?\r\n    \r\n    struct ProgramaDeRiego {\r\n        let frecuencia: Cadena\r\n        let cantidad: Cadena\r\n        let notas: Cadena\r\n    }\r\n\r\n    struct InstruccionesDeCuidado {\r\n        let luz: Cadena\r\n        let temperatura: Cadena\r\n        let humedad: Cadena\r\n        let abono: Cadena\r\n        let poda: Cadena\r\n    }\r\n    \r\n    struct Caracter\u00edsticasDeLaPlanta {\r\n        let t\u00f3xicoParaMascotas: Bool\r\n        let purificadorDeAire: Bool\r\n        let floraci\u00f3n: Bool\r\n        let dificultad: Cadena\r\n    }\r\n}<\/pre>\n<p>Cuando se identifica una planta, construyo un contexto rico para la IA a partir de datos locales:<\/p>\n<pre class=\"nums:false lang:swift decode:true\">private func construirContextoPlanta(para planta: Planta) -&gt; Cadena {\r\n    let context = \"\"\"\r\n    Eres PlantPal, un asistente experto en el cuidado de plantas. S\u00d3LO puedes responder preguntas sobre: \\(\u00bfnombre.planta? \"Planta desconocida\").\r\n\r\n    INFORMACI\u00d3N SOBRE LA PLANTA:\r\n    Nombre: \\(nombre.planta ?? \"Desconocida\")\r\n    Nombre cient\u00edfico: \\(\u00bfnombre cient\u00edfico de la planta? \"No disponible\")\r\n\r\n    HORARIO DE RIEGO:\r\n    \\(frecuencia de riego de la planta: \"No especificada\")\r\n    \\(\u00bfnotas en el programa de riego de la planta?)\r\n\r\n    INSTRUCCIONES DE CUIDADO:\r\n    Luz: \\(\u00bfInstrucciones de cuidado de la planta? \u00bfluz? \"No especificado\")\r\n    Temperatura: \\(\u00bfInstrucciones de cuidado de la planta? \u00bftemperatura? \"No especificado\")\r\n    Humedad: \\(\u00bfInstrucciones para el cuidado de la planta? humedad? \"No especificado\")\r\n\r\n    CARACTER\u00cdSTICAS:\r\n    Seguro para mascotas: \\(plant.characteristics?.toxicToPets == false ? \"Yes\" : \"No\")\r\n    Purificador del aire: \\(plant.characteristics?.airPurifying == true ? \"Yes\" : \"No\")\r\n    Dificultad: \\(plant.characteristics?.difficulty ?? \"No especificado\")\r\n    \"\"\"\r\n\r\n    devolver contexto\r\n}<\/pre>\n<p>Esto proporciona respuestas de IA ricas y contextuales utilizando la informaci\u00f3n de cuidados espec\u00edficos de la planta identificada.<\/p>\n<h3 style=\"font-weight: 400\">Integraci\u00f3n de modelos de cimentaci\u00f3n<\/h3>\n<p>La funci\u00f3n de chat aprovecha <a href=\"https:\/\/developer.apple.com\/documentation\/foundation\/\" target=\"_blank\" rel=\"noopener\">Modelos de fundaci\u00f3n de Apple<\/a> para el procesamiento del lenguaje natural en el dispositivo, lo que garantiza la privacidad de todas las conversaciones a la vez que proporciona orientaci\u00f3n inteligente para el cuidado de las plantas mediante respuestas adaptadas al contexto.<\/p>\n<hr \/>\n<h2 style=\"font-weight: 400\">Parte 6: optimizaci\u00f3n del rendimiento<\/h2>\n<h3 style=\"font-weight: 400\">Viaje de reducci\u00f3n de tama\u00f1o<\/h3>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><b>Empez\u00f3 con:<\/b> 8 modelos MobileCLIP (800 MB)<\/li>\n<li><b>Optimizado para:<\/b> 1 modelo MobileCLIP-S1 (120 MB)<\/li>\n<li><b>Resultado:<\/b> 85% \u00a1Reducci\u00f3n de tama\u00f1o con mayor precisi\u00f3n!<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2 style=\"font-weight: 400\">Parte 7: Lo que aprend\u00ed (por las malas)<\/h2>\n<h3 style=\"font-weight: 400\">Cosas que realmente funcionaron<\/h3>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><b>Incrustaciones precalculadas<\/b> - Este ha sido probablemente mi mayor logro. Pasar de generar incrustaciones en cada inicio a precomputarlas me ha ahorrado tiempo de inicio y 98% del tama\u00f1o de la aplicaci\u00f3n.<\/li>\n<li><b>MobileCLIP<\/b> - Mucho mejor que Vision framework para distinguir entre plantas similares. Merece totalmente la pena el dolor de cabeza de la migraci\u00f3n.<\/li>\n<li><b>B\u00fasqueda vectorial en Couchbase<\/b> - Disponer de SQL para operaciones vectoriales cambia las reglas del juego. Se acab\u00f3 escribir algoritmos de similitud personalizados.<\/li>\n<li><b>Todo a nivel local<\/b> - A los usuarios les encanta no tener que preocuparse por la conectividad a Internet o la privacidad.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2 style=\"font-weight: 400\">Cosas que no salieron bien<\/h2>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><b>Optimizaci\u00f3n del tama\u00f1o del modelo<\/b> - Pas\u00e9 por demasiadas iteraciones tratando de encontrar el equilibrio adecuado entre la precisi\u00f3n y el tama\u00f1o del archivo. Enviar 8 modelos diferentes no fue... inteligente.<\/li>\n<li><b>Umbrales de similitud<\/b> - Tard\u00e9 una eternidad en afinarlos correctamente. Demasiado estricto y nada coincide, demasiado flojo y todo coincide.<\/li>\n<li><b>Automatizaci\u00f3n de edificios<\/b> - Configurar el proceso de generaci\u00f3n de incrustaciones para que se ejecute durante la compilaci\u00f3n ha sido m\u00e1s complicado de lo esperado.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 style=\"font-weight: 400\">Si volviera a empezar<\/h3>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><b>Piense en el tama\u00f1o de la aplicaci\u00f3n desde el primer d\u00eda<\/b> - No env\u00edes aplicaciones de 800 MB, la gente no las descargar\u00e1<\/li>\n<li><b>Pruebe su modelo de integraci\u00f3n a escala<\/b> - Lo que funciona para 50 plantas puede no funcionar para 5.000.<\/li>\n<li><b>Couchbase Vector Search es tu amigo<\/b> - No reinvente la comparaci\u00f3n de similitudes vectoriales<\/li>\n<li><b>Optimizaci\u00f3n en tiempo de compilaci\u00f3n &gt; optimizaci\u00f3n en tiempo de ejecuci\u00f3n<\/b> - Hacer el trabajo pesado durante la construcci\u00f3n, no cuando los usuarios est\u00e1n esperando<\/li>\n<li><b>Los datos reales lo revelan todo<\/b> - Tu algoritmo puede funcionar perfectamente con im\u00e1genes de prueba y fallar por completo con las fotos reales de los usuarios.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2 style=\"font-weight: 400\">\u00bfY ahora qu\u00e9?<\/h2>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>Ampliaci\u00f3n a m\u00e1s especies vegetales<\/li>\n<li>A\u00f1adir recordatorios para el cuidado de las plantas y seguimiento del progreso<\/li>\n<li>Funciones comunitarias para compartir plantas<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr \/>\n<h2 style=\"font-weight: 400\">Conclusi\u00f3n<\/h2>\n<p>Construir PlantPal result\u00f3 ser mucho m\u00e1s educativo de lo que esperaba. Empec\u00e9 pensando \"\u00bfqu\u00e9 tan dif\u00edcil puede ser identificar una planta?\" y termin\u00e9 con un profundo conocimiento de las bases de datos vectoriales, los modelos de incrustaci\u00f3n y el arte de la optimizaci\u00f3n m\u00f3vil.<\/p>\n<p>\u00bfY lo mejor? Ahora puedo apuntar con mi tel\u00e9fono a cualquier planta y saber al instante de qu\u00e9 planta se trata y c\u00f3mo cuidarla. No hace falta Internet, no hay problemas de privacidad, es pura magia local.<\/p>\n<p><b>Lo que m\u00e1s me enorgullece:<\/b><\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>De una monstruosidad de 800 MB a una elegante aplicaci\u00f3n de 14 MB<\/li>\n<li>Respuestas instant\u00e1neas con precomputaci\u00f3n inteligente<\/li>\n<li>Construir algo que funcione de forma fiable en el mundo real<\/li>\n<li>Demostrar que la IA compleja no necesita servidores en la nube<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>La b\u00fasqueda vectorial result\u00f3 ser el punto perfecto entre simplicidad y potencia. Couchbase me lo puso mucho m\u00e1s f\u00e1cil de lo que pensaba: poder usar SQL para operaciones vectoriales es casi como hacer trampas.<\/p>\n<p>Si est\u00e1s pensando en crear algo similar, empieza poco a poco e itera. Mi primera versi\u00f3n era terrible, pero cada iteraci\u00f3n me ense\u00f1\u00f3 algo nuevo. Y, por supuesto, no lances una aplicaci\u00f3n de 800 MB en tu primer intento. Cr\u00e9eme.<\/p>\n<hr \/>\n<p><i>\u00bfHas construido algo con b\u00fasqueda vectorial? Me encantar\u00eda que me lo contaras. Y si intentas crear tu propia aplicaci\u00f3n de identificaci\u00f3n de plantas, ponte en contacto conmigo: siempre tengo curiosidad por ver qu\u00e9 inventan los dem\u00e1s.<\/i><\/p>\n<p><b>Recursos:<\/b><\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><a href=\"https:\/\/github.com\/midopooler\/PlantPal\" target=\"_blank\" rel=\"noopener\">C\u00f3digo fuente PlantPal<\/a><\/li>\n<li><a href=\"https:\/\/docs.couchbase.com\/couchbase-lite\/current\/c\/vector-search.html\" target=\"_blank\" rel=\"noopener\">Documentos de b\u00fasqueda vectorial en Couchbase<\/a><\/li>\n<li><a href=\"https:\/\/machinelearning.apple.com\/research\/mobileclip\" target=\"_blank\" rel=\"noopener\">MobileCLIP Papel<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/?family=couchbase-lite\">Descargar Couchbase Lite<\/a><\/li>\n<li><a class=\"c-link\" href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/mobile\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-stringify-link=\"https:\/\/www.couchbase.com\/products\/mobile\/\" data-sk=\"tooltip_parent\">M\u00e1s informaci\u00f3n sobre Couchbase Mobile<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>You know that feeling when you see a beautiful plant at the store but have no idea what it is or how to care for it? That&#8217;s exactly what happened to me last spring, and it got me thinking &#8211; [&hellip;]<\/p>","protected":false},"author":85668,"featured_media":17496,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[10122,1815,1810,9409,9937],"tags":[10149],"ppma_author":[10150],"class_list":["post-17494","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artificial-intelligence-ai","category-best-practices-and-tutorials","category-couchbase-mobile","category-swift","category-vector-search","tag-coreml"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How I Built a Plant RAG Application with Couchbase Vector Search on iOS - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Everything runs on-device using Couchbase vector search. No internet required, no photos sent to servers, just pure local plant identification magic.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/rag-app-vector-ios\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How I Built a Plant RAG Application with Couchbase Vector Search on iOS\" \/>\n<meta property=\"og:description\" content=\"Everything runs on-device using Couchbase vector search. No internet required, no photos sent to servers, just pure local plant identification magic.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/rag-app-vector-ios\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-08-20T21:50:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-21T19:48:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/blog-plant-rag-app.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Pulkit Midha - Developer Evangelist\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Pulkit Midha - Developer Evangelist\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/\"},\"author\":{\"name\":\"Pulkit Midha - Developer Evangelist\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a5479b7c0b1e18e90b26eb1c23614247\"},\"headline\":\"How I Built a Plant RAG Application with Couchbase Vector Search on iOS\",\"datePublished\":\"2025-08-20T21:50:19+00:00\",\"dateModified\":\"2025-08-21T19:48:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/\"},\"wordCount\":1819,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/blog-plant-rag-app.png\",\"keywords\":[\"coreml\"],\"articleSection\":[\"Artificial Intelligence (AI)\",\"Best Practices and Tutorials\",\"Couchbase Mobile\",\"Swift\",\"Vector Search\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/\",\"name\":\"How I Built a Plant RAG Application with Couchbase Vector Search on iOS - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/blog-plant-rag-app.png\",\"datePublished\":\"2025-08-20T21:50:19+00:00\",\"dateModified\":\"2025-08-21T19:48:21+00:00\",\"description\":\"Everything runs on-device using Couchbase vector search. No internet required, no photos sent to servers, just pure local plant identification magic.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/blog-plant-rag-app.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/blog-plant-rag-app.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How I Built a Plant RAG Application with Couchbase Vector Search on iOS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a5479b7c0b1e18e90b26eb1c23614247\",\"name\":\"Pulkit Midha - Developer Evangelist\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/55878bb5199f5fed15902ca3d02d7db8\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/pulkit-midha-couchbase.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/pulkit-midha-couchbase.png\",\"caption\":\"Pulkit Midha - Developer Evangelist\"},\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/pulkitmidha\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How I Built a Plant RAG Application with Couchbase Vector Search on iOS - The Couchbase Blog","description":"Todo se ejecuta en el dispositivo utilizando la b\u00fasqueda vectorial Couchbase. No se requiere Internet, no se env\u00edan fotos a servidores, solo pura magia local de identificaci\u00f3n de plantas.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/rag-app-vector-ios\/","og_locale":"es_MX","og_type":"article","og_title":"How I Built a Plant RAG Application with Couchbase Vector Search on iOS","og_description":"Everything runs on-device using Couchbase vector search. No internet required, no photos sent to servers, just pure local plant identification magic.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/rag-app-vector-ios\/","og_site_name":"The Couchbase Blog","article_published_time":"2025-08-20T21:50:19+00:00","article_modified_time":"2025-08-21T19:48:21+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/blog-plant-rag-app.png","type":"image\/png"}],"author":"Pulkit Midha - Developer Evangelist","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Pulkit Midha - Developer Evangelist","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/"},"author":{"name":"Pulkit Midha - Developer Evangelist","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a5479b7c0b1e18e90b26eb1c23614247"},"headline":"How I Built a Plant RAG Application with Couchbase Vector Search on iOS","datePublished":"2025-08-20T21:50:19+00:00","dateModified":"2025-08-21T19:48:21+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/"},"wordCount":1819,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/blog-plant-rag-app.png","keywords":["coreml"],"articleSection":["Artificial Intelligence (AI)","Best Practices and Tutorials","Couchbase Mobile","Swift","Vector Search"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/","url":"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/","name":"How I Built a Plant RAG Application with Couchbase Vector Search on iOS - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/blog-plant-rag-app.png","datePublished":"2025-08-20T21:50:19+00:00","dateModified":"2025-08-21T19:48:21+00:00","description":"Todo se ejecuta en el dispositivo utilizando la b\u00fasqueda vectorial Couchbase. No se requiere Internet, no se env\u00edan fotos a servidores, solo pura magia local de identificaci\u00f3n de plantas.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/blog-plant-rag-app.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/blog-plant-rag-app.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/rag-app-vector-ios\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How I Built a Plant RAG Application with Couchbase Vector Search on iOS"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a5479b7c0b1e18e90b26eb1c23614247","name":"Pulkit Midha - Desarrollador Evangelista","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/55878bb5199f5fed15902ca3d02d7db8","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/pulkit-midha-couchbase.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/pulkit-midha-couchbase.png","caption":"Pulkit Midha - Developer Evangelist"},"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/pulkitmidha\/"}]}},"authors":[{"term_id":10150,"user_id":85668,"is_guest":0,"slug":"pulkitmidha","display_name":"Pulkit Midha - Developer Evangelist","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/pulkit-midha-couchbase.png","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/08\/pulkit-midha-couchbase.png"},"author_category":"1","last_name":"Midha - Developer Evangelist","first_name":"Pulkit","job_title":"","user_url":"","description":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/17494","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/85668"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=17494"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/17494\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/17496"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=17494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=17494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=17494"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=17494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}