🏠 Proyecto Ben — Agente IA Inmobiliario
Reporte de arquitectura y progreso | Actualizado: 26 de mayo de 2026
📋 Resumen del Proyecto
Ben es un agente de inteligencia artificial conversacional diseñado para transformar la experiencia de compra y venta de bienes raíces en Colombia.
Permite a los compradores obtener respuestas inmediatas y detalladas sobre cualquier inmueble a través de lenguaje natural vía WhatsApp o web, eliminando las esperas de días por una respuesta de un broker.
🧠 En palabras simples: Imagina que cada apartamento en venta tiene un vendedor virtual disponible 24/7 que sabe TODO sobre ese apartamento y puede responder cualquier pregunta al instante. Eso es Ben.
Propuesta de Valor:
- Para compradores: Respuestas inmediatas 24/7, sin horario, sin esperas
- Para brokers: Eliminación de preguntas repetitivas, leads calificados con scoring de intención
- North Star Metric: Reducir el tiempo de compra/venta de un inmueble (actualmente 9 meses)
Tags:
AWS
Serverless
GenAI
Bedrock
Pay-per-use
🏗️ Arquitectura
[Usuario] → [CloudFront + S3 estático] → [API Gateway]
↓
[Lambda: ben-chat]
↙ ↓ ↘
[S3] [Bedrock] [DynamoDB]
JSONs Claude 4.5 Historial
Fotos Haiku Scoring
Catálogo
🧠 ¿Cómo funciona paso a paso?
1. El usuario escribe una pregunta en el chat web (ej: "¿Cuánto cuesta?")
2. La pregunta viaja por internet hasta el API Gateway (la puerta de entrada)
3. API Gateway le pasa la pregunta a Lambda (el cerebro organizador)
4. Lambda busca los datos del apartamento en S3 (el archivo con toda la info)
5. Lambda le dice a Bedrock/Claude: "Aquí están los datos, responde esta pregunta"
6. Claude genera una respuesta natural y amigable
7. Lambda guarda la conversación en DynamoDB (para recordar qué preguntó antes)
8. La respuesta viaja de vuelta al usuario en ~2 segundos
🎓 Explicación de cada componente (para dummies)
📦 S3 (Simple Storage Service)
¿Qué es? Un disco duro infinito en la nube. Como un Google Drive pero para la aplicación.
¿Qué guarda Ben ahí? Los archivos JSON con toda la info de cada apartamento (precio, habitaciones, fotos, dirección, etc.) y también la página web del chat.
Analogía: Es la bodega donde están las fichas técnicas de todos los apartamentos.
🌐 CloudFront
¿Qué es? Un servicio que hace copias de tu página web en servidores por todo el mundo para que cargue rápido sin importar dónde esté el usuario.
¿Para qué lo usa Ben? Para que la página del chat cargue rápido en Colombia (o donde sea).
Analogía: Es como tener fotocopias de tu menú en cada mesa del restaurante en vez de que todos vayan a la cocina a leerlo.
🚪 API Gateway
¿Qué es? La puerta de entrada. Recibe las preguntas que llegan de internet y las redirige al lugar correcto (la Lambda).
¿Para qué lo usa Ben? Es la URL pública donde el chat envía las preguntas. Sin esto, la Lambda no sería accesible desde internet.
Analogía: Es el recepcionista del edificio. Tú llegas, le dices qué necesitas, y él te conecta con la persona correcta adentro.
URL de Ben: https://b999yf310e.execute-api.us-east-2.amazonaws.com/chat
⚡ Lambda
¿Qué es? Un pedazo de código que se ejecuta SOLO cuando alguien lo necesita. No hay un servidor prendido 24/7 — se enciende, hace su trabajo, y se apaga. Solo pagas por el tiempo que estuvo prendido.
¿Para qué lo usa Ben? Es el cerebro organizador. Recibe la pregunta, busca los datos del apartamento, se los pasa a la IA, y devuelve la respuesta.
Analogía: Es un empleado freelance que solo trabaja cuando hay un cliente. Si nadie pregunta, no cobra.
🤖 Bedrock (Claude Haiku 4.5)
¿Qué es? El servicio de AWS que te da acceso a modelos de IA (como ChatGPT pero de Anthropic). Claude es el modelo que genera las respuestas en lenguaje natural.
¿Para qué lo usa Ben? Lambda le pasa los datos del apartamento + la pregunta del usuario, y Claude genera una respuesta amigable, precisa y en español.
Analogía: Es el vendedor experto que sabe hablar bonito. Tú le das la ficha técnica y él la convierte en una conversación natural.
🗃️ DynamoDB
¿Qué es? Una base de datos ultra rápida que cobra por uso. Si nadie la usa, cuesta $0.
¿Para qué lo usa Ben? Para dos cosas: (1) guardar el historial de cada conversación (así Ben recuerda qué preguntaste antes), y (2) tener un catálogo rápido de inmuebles para búsquedas futuras.
Analogía: Es la libreta donde el vendedor anota todo lo que habló con cada cliente para no repetir información.
🔐 IAM Role
¿Qué es? Los permisos. Define QUÉ puede hacer cada componente. La Lambda necesita permiso para leer S3, escribir en DynamoDB, y llamar a Bedrock.
Analogía: Es la tarjeta de acceso del empleado. Sin ella, no puede entrar a la bodega ni usar el teléfono.
🔔 SNS (Simple Notification Service)
¿Qué es? Un servicio de notificaciones. Puede enviar emails, SMS, o mensajes cuando algo pasa.
¿Para qué lo usa Ben? Para enviarte un email si los costos de la cuenta se pasan de $5 USD al mes.
Analogía: Es la alarma de tu casa. Si alguien entra (o el costo sube), te avisa al celular.
⏰ CloudWatch Alarm
¿Qué es? Un vigilante que monitorea métricas (como el costo de tu cuenta) y dispara una acción cuando se cruza un límite.
¿Para qué lo usa Ben? Revisa diariamente cuánto llevas gastado en el mes. Si supera $5 USD, le dice a SNS que te mande un email de alerta.
Analogía: Es como poner una alarma en tu tarjeta de crédito que te avisa si gastas más de cierto monto.
💰 Costos Estimados
| Escenario | Conversaciones/mes | Costo estimado |
| MVP (1 inmueble) | 100 | ~$2-3/mes |
| 1,000 inmuebles | 10,000 | ~$20-30/mes |
| 100,000 inmuebles | 1,000,000 | ~$300-500/mes |
🧠 ¿Por qué es tan barato? Porque todo es "serverless" (sin servidor). No hay una máquina prendida 24/7 costando plata. Cada componente solo cobra cuando alguien lo usa. Si nadie pregunta un domingo a las 3am, el costo ese rato es literalmente $0.
🔔 Alarma configurada: Si tu cuenta supera $5 USD en el mes, te llega un email a ivan.gazabon@icloud.com. La alarma revisa el costo cada 24 horas. Con el uso actual del MVP (pruebas esporádicas), el costo no debería pasar de $0.10/mes.
🗄️ Estructura de Datos
S3 (datos completos del inmueble):
amzn-s3-ben-ai-test1/
└── apartments/
└── antara-602/
├── description-602.json (todos los detalles)
├── description-602.txt
└── images/
├── bathroom-main.jpg
├── dinning-room.jpg
└── kitchen.jpg
DynamoDB — ben-properties (catálogo para búsqueda):
| Campo | Tipo | Descripción |
| property_id (PK) | String | Identificador único del inmueble |
| city, neighborhood, price, bedrooms... | Varios | Atributos de filtro/búsqueda |
| s3_json_key | String | Ruta al JSON completo en S3 |
DynamoDB — ben-conversations (historial + scoring):
| Campo | Tipo | Descripción |
| conversation_id (PK) | String | ID único de la conversación |
| property_id (SK) | String | Inmueble consultado |
| messages | List | Historial completo de mensajes |
| questions_count | Number | Cantidad de preguntas realizadas |
| lead_score | Number | Puntuación de intención de compra |
🔑 Decisiones de Diseño
- ¿Por qué no OpenSearch? — Cada chat es sobre UN inmueble específico (el usuario ya escaneó el QR). No necesitamos buscar entre miles de documentos. Solo leemos el JSON y se lo pasamos a Claude.
- ¿Por qué DynamoDB desde el inicio? — Costo $0 si no se usa (on-demand). Permite historial de conversaciones, scoring de leads, y búsqueda entre inmuebles a futuro sin refactorear.
- ¿Cómo maneja datos variables por inmueble? — El JSON en S3 puede tener cualquier estructura. Lambda siempre pasa el JSON completo a Claude, quien responde solo con lo que hay. Si un dato no existe, dice que no lo tiene.
- ¿Cómo escala a 100K inmuebles? — Toda la arquitectura es serverless. Lambda escala automáticamente, S3 es infinito, DynamoDB escala on-demand, Bedrock maneja concurrencia.
- ¿Por qué Claude Haiku 4.5 y no Sonnet? — Haiku es 3x más barato y suficientemente inteligente para responder preguntas sobre un inmueble. Sonnet sería overkill para este caso de uso.
✅ Completado (26 de mayo 2026)
| # | Paso | Recurso creado | Estado |
| 1 | Tabla DynamoDB catálogo | ben-properties | ✅ Creada |
| 2 | Tabla DynamoDB conversaciones | ben-conversations | ✅ Creada |
| 3 | Rol IAM para Lambda | ben-lambda-role (permisos: S3, DynamoDB, Bedrock, Logs) | ✅ Creado |
| 4 | Función Lambda | ben-chat (Python 3.12, 256MB, 30s timeout) | ✅ Desplegada |
| 5 | Prueba Lambda → S3 | Lee JSON del inmueble correctamente | ✅ Funciona |
| 6 | Prueba Lambda → DynamoDB | Conecta correctamente | ✅ Funciona |
| 7 | Habilitar modelo Bedrock | Claude Haiku 4.5 + IAM Marketplace policy | ✅ Resuelto |
| 8 | Probar Lambda end-to-end | Ben responde correctamente (2.3s, 99MB RAM) | ✅ Funciona |
| 9 | Crear API Gateway | ben-api (HTTP API, POST /chat) — Probado con curl desde internet | ✅ Funciona |
| 10 | Crear front web | HTML/JS chat tipo WhatsApp subido a S3 | ✅ Funciona |
| 11 | Desplegar front en S3 (website hosting) | Bucket configurado como sitio web estático con acceso público | ✅ En vivo |
✅ Problemas Resueltos
| Problema | Causa | Solución |
| Bedrock: "Model marked as Legacy" | Claude 3.5 Haiku fue deprecado por Anthropic | Migrado a Claude Haiku 4.5 |
| IAM: "Access denied Marketplace" | Bedrock ahora requiere permisos de Marketplace para activar modelos de terceros la primera vez | Policy bedrock-marketplace-access creada |
| Bedrock: "Retry with inference profile" | Modelos nuevos requieren prefijo regional | Prefijo us. agregado al model ID |
| AWS CLI no instalable | Restricciones de admin en máquina corporativa | Se usa CloudShell desde la consola web |
📋 Próximos Pasos
| # | Paso | Descripción | Estado |
| 12 | Mostrar fotos en el chat | Lambda genera URLs de imagen en formato markdown, front las renderiza como <img>. Policy S3 actualizada para /apartments/*. | ✅ Funciona |
| 13 | Migrar inmueble a DynamoDB | antara-602 registrado en ben-properties. Lambda busca dinámicamente por property_id. | ✅ Funciona |
| 14 | Agregar CloudFront (HTTPS) | Poner un CDN delante del S3 para que la URL sea HTTPS y cargue más rápido | ⏳ Pendiente |
| 15 | Dominio personalizado | Conectar un dominio tipo ben.ai o similar en vez de la URL de S3 | ⏳ Pendiente |
| 16 | Integración WhatsApp | Conectar Ben a WhatsApp Business para que funcione vía mensajes | ⏳ Pendiente |
Detalle del paso 12 (fotos):
Problema actual: Ben sabe que existen fotos (están en el JSON) pero solo dice el nombre del archivo ("kitchen.jpg"). No muestra la imagen real.
Solución propuesta: Modificar el prompt de la Lambda para que cuando Ben mencione una foto, incluya la URL completa de S3. Luego el front detecta esas URLs y las muestra como imágenes reales en el chat.
🔧 Datos Técnicos de Referencia
| Parámetro | Valor |
| Región AWS | us-east-2 (Ohio) |
| Account ID | 948512815521 |
| Bucket S3 | amzn-s3-ben-ai-test1 |
| Lambda | ben-chat (Python 3.12, 256MB, 30s) |
| Modelo Bedrock | us.anthropic.claude-haiku-4-5-20251001-v1:0 (Claude Haiku 4.5) |
| Rol IAM | arn:aws:iam::948512815521:role/ben-lambda-role |
| DynamoDB Tables | ben-properties, ben-conversations |
| API Gateway | ben-api (ID: b999yf310e) |
| Endpoint público | https://b999yf310e.execute-api.us-east-2.amazonaws.com/chat |
| Método | POST /chat con body: {"message": "...", "property_id": "..."} |
| Alarma de billing | ben-cost-alarm — Alerta si supera $5 USD/mes → email a ivan.gazabon@icloud.com |
| SNS Topic | arn:aws:sns:us-east-1:948512815521:ben-billing-alert |
| Front web (URL pública) | http://amzn-s3-ben-ai-test1.s3-website-us-east-1.amazonaws.com/front/index.html |
| S3 Website Hosting | Habilitado en amzn-s3-ben-ai-test1 (carpeta /front es pública) |
🧪 Cómo probar Ben ahora mismo
Opción 2 — Desde terminal (curl):
curl -X POST https://b999yf310e.execute-api.us-east-2.amazonaws.com/chat \
-H "Content-Type: application/json" \
-d '{"message": "Hola, cuanto cuesta este apartamento?", "property_id": "apt_001"}'
Respuesta esperada: Ben te dice el precio ($1.000.000.000 COP), la administración ($1.500.000), y ofrece más detalles.
🎓 ¿Qué hicimos hoy? (resumen para dummies)
Sesión del 26 de mayo 2026:
1. Verificamos que todo seguía funcionando — Corrimos un chequeo de salud de todos los componentes (S3, DynamoDB, Lambda, IAM). Todo OK.
2. Creamos el API Gateway — Es la "puerta de entrada" que permite que cualquier persona en internet le hable a Ben. Sin esto, la Lambda solo era accesible internamente. Ahora tiene una URL pública.
3. Configuramos CORS — Un permiso especial que le dice al navegador "sí, está bien que esta página web hable con mi API aunque estén en dominios diferentes". Sin esto, el navegador bloquea la comunicación por seguridad.
4. Creamos el front web — Una página HTML con un chat tipo WhatsApp. Cuando escribes algo, envía tu pregunta al API Gateway, que la pasa a Lambda, que consulta a Claude, y te devuelve la respuesta. Todo en ~2 segundos.
5. Subimos el front a S3 y lo hicimos público — Configuramos el bucket de S3 como "sitio web estático" para que cualquiera pueda abrir la URL y usar el chat sin necesidad de instalar nada.
6. Configuramos alarma de costos — Si la cuenta supera $5 USD en el mes, te llega un email. Con el uso actual (pruebas), el costo es menor a $0.10/mes.
Resultado: Ben está en vivo y accesible desde cualquier navegador. Cualquier persona con el link puede preguntarle sobre el apartamento Antara 602 y recibe respuestas inmediatas de IA.
Actualizado el 26 de mayo de 2026 | Proyecto Ben MVP — Arquitectura Serverless en AWS