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)