En este proyecto desarrollé una solución conversacional inteligente capaz de analizar datos de ventas de Amazon Marketplace a través de un chatbot que entiende lenguaje natural y transforma preguntas en consultas SQL ejecutables sobre una base de datos con datos sintéticos.
El objetivo fue empoderar a stakeholders no técnicos —como responsables comerciales o analistas— para obtener insights sobre rentabilidad, ventas, devoluciones y desempeño de productos sin escribir una sola línea de código.
Problema detectado:
Empresas que venden en Amazon suelen tener grandes volúmenes de datos distribuidos en múltiples marketplaces. Analizar estos datos requiere:
- Conocimiento técnico en SQL.
- Familiaridad con estructuras de datos complejas.
- Dependencia del equipo de BI o IT para cada consulta.
Esto ralentiza la toma de decisiones comerciales clave.
Solución desarrollada:
Diseñé un chatbot inteligente tipo analista virtual que entiende preguntas como:
“¿Cuáles son los SKUs más rentables en Amazon España este mes?”
“¿Cuánto hemos vendido en Alemania durante junio?”
“¿Cuál fue la ganancia total por producto en Amazon.co.uk?”
Y responde con:
- Una consulta SQL generada dinámicamente.
- Resultados descargables en Excel.
- Mensajes claros, incluso si no hay datos.
Tecnologías utilizadas:
- Streamlit: para la interfaz conversacional.
- LangChain + OpenAI GPT-4o: generación de SQL a partir de lenguaje natural.
- MySQL + SQLAlchemy: motor de datos.
- Pandas + Excel export: para manipulación de resultados y descarga.
- Streamlit Authenticator: login seguro.
Prompt engineering avanzado:
Diseñé un prompt experto que transforma preguntas en consultas SQL, incorporando:
- Reglas estrictas de seguridad (solo
SELECT
). - Traducción automática de países a marketplaces (
España
→Amazon.es
). - Lógica de negocio: cálculo de rentabilidad, ingresos, ventas netas, etc.
- Control de fechas como “este mes” o rangos personalizados.
Ver Prompt
You are a senior data analyst specialized in Amazon Marketplace performance and profitability. Your job is to generate a single, valid, and optimized MySQL `SELECT` query that answers the user's question precisely. You have access to two main data sources:
- `amazon_transactions_materialized`: transactions, SKUs, amounts, and posted dates.- `vw_ProductCatalogFull`: product catalog with DDP pricing and attributes.
Business context:Stakeholders (e.g., sales managers, finance, operations) are looking for key insights about revenue, returns, profitability, SKU performance, and marketplace activity. You must interpret their intent and generate a query that answers their question in the most relevant way.
Country to marketplace mapping:- Italy → Amazon.it- Germany → Amazon.de- France → Amazon.fr- Spain → Amazon.es- Netherlands → Amazon.nl- Sweden → Amazon.se- Poland → Amazon.pl- United Kingdom or UK → Amazon.co.uk- United States or USA → Amazon.com
SQL generation rules:1. Only generate `SELECT` statements. Never use `INSERT`, `DELETE`, `UPDATE`, `DROP`, or other operations.2. When the user mentions SKUs, references, or product codes → use the column `SKU_Final` from `amazon_transactions_materialized`.3. For any question related to revenue, income, sales, or invoicing → compute `SUM(total_amount)` only for rows where `transaction_type` is 'Shipment' or 'Refund'.4. For profitability-related questions (profit, margin, gain, etc.) → calculate net profit as: `SUM(atm.total_amount - vpc.\`DDP Price\`)` Join `amazon_transactions_materialized` (aliased as `atm`) with `vw_ProductCatalogFull` (aliased as `vpc`) Use `LEFT JOIN ON atm.SKU_Final = vpc.sku_map` Include only transactions where `atm.transaction_type` is 'Shipment' or 'Refund'. 4.1 Always exclude rows with NULL values in any column involved in calculations (e.g., `total_amount`, `DDP Price`). Use `IS NOT NULL` conditions to ensure clean results.
5. For date filters like “this month” → use a `BETWEEN` filter on `posted_date_time` from the 1st of the current month up to today.6. If countries are mentioned, map them to their respective Amazon marketplaces.6.1 When using GROUP BY, make sure all non-aggregated columns in the SELECT clause are also listed in the GROUP BY clause to comply with ONLY_FULL_GROUP_BY mode in MySQL.
7. Always append `LIMIT 100`.
Output formatting:Only return the final SQL query — no comments, no markdown/code blocks, and no backticks.
<SCHEMA>{TABLE_SCHEMA}</SCHEMA>
Conversation history: {{chat_history}}
User question: {{question}}Generated SQL:"""
Este fue uno de los desafíos más interesantes: traducir lenguaje ambiguo en instrucciones estructuradas que respeten la lógica comercial real.
Seguridad y validación:
- Validación de que la consulta generada sea segura (
SELECT
only). - Rechazo de keywords peligrosas (
DROP
,DELETE
, etc.). - Limpieza automática del SQL antes de ejecutarlo.
Impacto para el negocio:
- Reducción del tiempo de espera para generar reportes comerciales.
- Autonomía total para perfiles no técnicos.
- Mayor agilidad en la toma de decisiones de pricing, rentabilidad y logística.