File size: 4,428 Bytes
f9f6cc7 ca5ff07 04045a5 f9f6cc7 ca5ff07 f9f6cc7 f11692e f9f6cc7 5ddc3cb ca5ff07 5ddc3cb 04045a5 5fe9941 04045a5 f11692e f9f6cc7 266ed99 f9f6cc7 47e2b9b f9f6cc7 9a39797 f9f6cc7 04045a5 5ddc3cb 04045a5 f11692e f9f6cc7 5ddc3cb 04045a5 5ddc3cb 04045a5 5ddc3cb f11692e 04045a5 f11692e 5ddc3cb f11692e 5ddc3cb a3be568 f9f6cc7 04045a5 5ddc3cb 04045a5 f11692e 04045a5 f11692e 04045a5 f11692e 04045a5 f11692e 04045a5 f11692e 04045a5 f11692e f9f6cc7 04045a5 f11692e 04045a5 f11692e a3be568 f9f6cc7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# Instalar bibliotecas necesarias (solo se ejecutar谩 localmente en un Space)
import os
os.system("pip install gradio sentence-transformers pandas numpy scipy chromadb")
# Importar librer铆as necesarias
from sentence_transformers import SentenceTransformer
import pandas as pd
import chromadb
from chromadb.utils import embedding_functions
from datetime import datetime
import gradio as gr
# Configuraci贸n de variables
EMBEDDING_LLM = "jinaai/jina-embeddings-v2-base-es" # Modelo de embedding utilizado
# Cargar el modelo de embeddings
model = SentenceTransformer(
EMBEDDING_LLM,
trust_remote_code=True,
)
# Ruta del archivo CSV (debe estar disponible en el directorio del Space)
file_path = './Diagrama_de_decisi贸n completo.tsv'
# Cargar la base de datos, especificando la codificaci贸n
df = pd.read_csv(
file_path,
encoding='utf-8',
sep='|'
)
df['ID'].astype(str).tolist()
# Crear una columna combinada para embeddings
df['text'] = df.apply(
lambda x: f"Tr谩mite: {x['Tr谩mite']}; Descripci贸n: {x['Descripci贸n']}; Palabras clave: {x['Tag (palabras clave)']}",
axis=1
)
# Generar embeddings
df['embeddings'] = model.encode(df['text'], batch_size=64, show_progress_bar=True).tolist()
# Configurar cliente de ChromaDB persistente (usando una ruta compatible con Spaces)
client_persistent = chromadb.PersistentClient(path='./data_embeddings')
embedding_function = embedding_functions.SentenceTransformerEmbeddingFunction(model_name=EMBEDDING_LLM)
# Crear o cargar colecci贸n en ChromaDB
db = client_persistent.get_or_create_collection(
name='diagrama_decision_db',
embedding_function=embedding_function,
metadata={
'description': 'Tr谩mites y servicios - Centro de Atenci贸n para el Bienestar',
'created': str(datetime.now()),
'hnsw:construction_ef': 120,
'hnsw:search_ef': 120,
'hnsw:M': 5
}
)
# Agregar datos a la colecci贸n
db.add(
ids=df['ID'].astype(str).tolist(),
embeddings=df['embeddings'].tolist(),
documents=df['text'].tolist(),
metadatas=df[['Tr谩mite', 'Descripci贸n', 'Tag (palabras clave)']].to_dict('records')
)
print(f"N煤mero de registros en la colecci贸n: {db.count()}")
# Funci贸n para realizar consultas
def obtener_recomendaciones(preferencias, top_k=5):
# Convertir preferencias en embeddings
consulta_embedding = model.encode(preferencias, show_progress_bar=False)
# Realizar consulta en ChromaDB
results = db.query(query_embeddings=[consulta_embedding], n_results=top_k)
# Verificar si hay resultados
if not results or not results["metadatas"] or not results["metadatas"][0]:
return []
recomendaciones = []
for idx, metadata in enumerate(results["metadatas"][0]):
dist = results["distances"][0][idx]
metadata['distancia_euclidiana'] = dist
recomendaciones.append(metadata)
return recomendaciones
# Funci贸n para procesar resultados y generar una tabla
def procesar_recomendaciones(preferencias):
recomendaciones = obtener_recomendaciones(preferencias)
if not recomendaciones:
return pd.DataFrame([{"Mensaje": "No se encontraron resultados para las preferencias proporcionadas."}])
# Crear una tabla con las recomendaciones
resultados = []
for idx, tramite in enumerate(recomendaciones, 1):
resultados.append({
"#": idx,
"Tr谩mite": tramite.get('Tr谩mite', 'Desconocido'),
"Descripci贸n": tramite.get('Descripci贸n', 'No disponible'),
"Palabras clave": tramite.get('Tag (palabras clave)', 'No disponible'),
"Distancia Euclidiana": tramite.get('distancia_euclidiana', 'N/A')
})
# Convertir los resultados a un DataFrame
return pd.DataFrame(resultados)
# Interfaz de Gradio con formato de tabla
def interfaz(preferencias):
tabla_resultados = procesar_recomendaciones(preferencias)
return tabla_resultados
ui = gr.Interface(
fn=interfaz,
inputs=gr.Textbox(label="Preferencias", placeholder="Escribe tus preferencias, e.g., consulta de tr谩mites, palabras clave"),
outputs=gr.Dataframe(label="Resultados de B煤squeda"),
title="Buscador de Tr谩mites y Servicios con B煤squeda Sem谩ntica",
description="Introduce tus preferencias para obtener resultados relevantes basados en similitud sem谩ntica."
)
# Ejecutar la aplicaci贸n
ui.launch(server_name="0.0.0.0", server_port=7860) |