Skip to content

Commit ec50b51

Browse files
authored
first commit
0 parents  commit ec50b51

File tree

4 files changed

+298
-0
lines changed

4 files changed

+298
-0
lines changed

README.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
2+
# ETL para Integración de Datos de MySQL a Elasticsearch para Bot de WhatsApp
3+
4+
Este proyecto proporciona un proceso ETL (Extract, Transform, Load) que permite extraer datos desde una base de datos MySQL, transformarlos utilizando embeddings vectorizados, y cargarlos en un índice de Elasticsearch. La información cargada en Elasticsearch está optimizada para el modelo de chatbot en WhatsApp, que utiliza el repositorio [BotWhatsappGPT](https://github.com/macespinoza/BotWhatsappGPT).
5+
6+
---
7+
8+
## Estructura del Proyecto
9+
10+
- **main.py**: Código fuente principal que contiene las funciones para extracción, transformación y carga (ETL) de los datos.
11+
- **requirements.txt**: Lista de las dependencias necesarias para ejecutar el proyecto.
12+
- **mysqlsampledatabase.sql**: Base de datos de muestra en formato SQL para pruebas de desarrollo.
13+
14+
## Despliegue en Google Cloud Functions
15+
16+
Este proyecto está diseñado para ser desplegado fácilmente en **Google Cloud Functions**. Sigue estos pasos para el despliegue:
17+
18+
1. **Configura tu entorno de Google Cloud**:
19+
- Asegúrate de tener un proyecto en Google Cloud.
20+
- Configura y autentica el SDK de Google Cloud en tu terminal.
21+
22+
## Ejecución en Local o en Otros Ambientes
23+
24+
Si prefieres ejecutar este proyecto en un entorno local u otro ambiente, solo se requieren cambios menores en el archivo `main.py`:
25+
26+
1. **Ajusta las variables de entorno** en `main.py` o utiliza un archivo `.env` para definir los valores de conexión a MySQL y Elasticsearch.
27+
2. **Instala las dependencias** localmente:
28+
```bash
29+
pip install -r requirements.txt
30+
```
31+
3. **Ejecución**:
32+
```bash
33+
python main.py
34+
```
35+
36+
La ejecución local permite realizar pruebas y ajustes de desarrollo antes de desplegar en Google Cloud Functions.
37+
38+
## Configuración
39+
40+
Antes de ejecutar el script, asegúrate de actualizar las configuraciones necesarias en `main.py`:
41+
42+
1. **Credenciales de MySQL**: Configura las credenciales y la URL de la base de datos.
43+
2. **Conexión a Elasticsearch**: Asegúrate de que el índice y la configuración de Elasticsearch están definidos.
44+
45+
## Integración con el Bot de WhatsApp
46+
47+
El modelo de chatbot en WhatsApp utiliza la base vectorizada creada por este ETL para mejorar las consultas en lenguaje natural. Puedes encontrar el código del bot en el repositorio: [BotWhatsappGPT](https://github.com/macespinoza/BotWhatsappGPT).
48+
49+
---
50+
51+
## Desarrollado por
52+
53+
**MAC: Miguel Angel Cotrina**
54+
[LinkedIn](https://www.linkedin.com/in/mcotrina/)
55+
56+
---
57+
58+
Este proyecto es de código abierto y está disponible para la comunidad con el propósito de mejorar la integración de datos para aplicaciones de inteligencia artificial y chatbots en WhatsApp.

main.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from langchain.document_loaders import DataFrameLoader
2+
from langchain.document_loaders import CSVLoader
3+
from langchain.text_splitter import CharacterTextSplitter
4+
from langchain.embeddings import OpenAIEmbeddings
5+
from langchain_elasticsearch import ElasticsearchStore
6+
from langchain.text_splitter import RecursiveCharacterTextSplitter
7+
import tempfile
8+
import mysql.connector as connection
9+
import pandas as pd
10+
import mysql
11+
import os
12+
13+
14+
def ingestadata(request):
15+
apikey="xxxxxxxxxxxxxxx"
16+
os.environ["OPENAI_API_KEY"] =apikey
17+
#credenciales mysql
18+
myhost="xx.xx.xx.xx"
19+
myuser="xxxxx"
20+
mypws="xxxxx"
21+
mydb="classicmodels"
22+
myquery= """SELECT productName, productline, quantityInStock as stock, MSRP as precio FROM
23+
`classicmodels`.`products`;
24+
"""
25+
#credenciales Elasticsearch
26+
el_url="http://xx.xx.xx.xx:9200"
27+
el_usr="xxxxx"
28+
el_pws="xxxxx"
29+
el_idx="mprod-mcotrina-01"
30+
31+
#conexion a base de datos
32+
mydb = mysql.connector.connect(
33+
host=myhost,
34+
user=myuser,
35+
passwd=mypws,
36+
database=mydb
37+
)
38+
query = myquery
39+
result_df = pd.read_sql(query,mydb)
40+
mydb.close()
41+
42+
# Guardar el DataFrame en un archivo temporal
43+
with tempfile.NamedTemporaryFile(suffix=".csv", delete=False) as temp_file:
44+
result_df.to_csv(temp_file.name, index=False)
45+
temp_csv_path = temp_file.name
46+
47+
# Cargar el archivo temporal usando CSVLoader
48+
loader = CSVLoader(file_path=temp_csv_path)
49+
documents = loader.load()
50+
#explitear el docuemento
51+
text_splitter = RecursiveCharacterTextSplitter(
52+
chunk_size = 650,
53+
chunk_overlap = 0
54+
)
55+
#generamos el embedding
56+
docs = text_splitter.split_documents(documents)
57+
embeddings = OpenAIEmbeddings()
58+
59+
# Crear el store en Elasticsearch
60+
db_el = ElasticsearchStore(
61+
es_url=el_url,
62+
es_user=el_usr,
63+
es_password=el_pws,
64+
index_name=el_idx,
65+
)
66+
67+
# Eliminar el índice si ya existe(esto solo se hace para carga full en caso de Delta el proceso es diferente)
68+
if db_el.client.indices.exists(index=el_idx):
69+
db_el.client.indices.delete(index=el_idx)
70+
71+
db = ElasticsearchStore.from_documents(
72+
docs,
73+
embeddings,
74+
es_url=el_url,
75+
es_user=el_usr,
76+
es_password=el_pws,
77+
index_name=el_idx,
78+
)
79+
db.client.indices.refresh(index=el_idx)
80+
return "ok"

mysqlsampledatabase.sql

Lines changed: 147 additions & 0 deletions
Large diffs are not rendered by default.

requirements.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Function dependencies, for example:
2+
# package>=version
3+
requests
4+
langchain
5+
langchain_experimental
6+
langchain_openai
7+
langchain-elasticsearch
8+
langchain_community
9+
pandas
10+
mysql-connector-python
11+
google-api-python-client
12+
SQLAlchemy
13+
pyarrow

0 commit comments

Comments
 (0)