File size: 3,240 Bytes
bdf087d
 
 
 
 
 
 
 
 
 
2bcd23c
bdf087d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2bcd23c
 
bdf087d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.embeddings import BedrockEmbeddings
from langchain_aws import ChatBedrock
from langchain_community.vectorstores import Chroma
from langchain.chains import ConversationalRetrievalChain
import os
import zipfile

#el archivo ruta_zip debe existir y es el directorio compreso con la base de datos vectorial Chromadb
def descomprimir_archivo_zip(ruta_zip, ruta_destino):
    """
    Descomprime un archivo ZIP en la ruta de destino especificada.

    :param ruta_zip: Ruta del archivo ZIP a descomprimir.
    :param ruta_destino: Directorio donde se descomprimirá el archivo.
    """
    # Verificar si la ruta de destino existe, si no, crearla
    if not os.path.exists(ruta_destino):
        os.makedirs(ruta_destino)
    
    # Abrir el archivo ZIP
    with zipfile.ZipFile(ruta_zip, 'r') as zip_ref:
        # Extraer todos los archivos en la ruta de destino
        zip_ref.extractall(ruta_destino)
        print(f'Archivos extraídos en: {ruta_destino}')


def cargar_base_datos(directorio_data,embedder):
    """
    Carga una base de datos en el directorio especificado usando Chroma.

    :param directorio_data: Ruta del directorio donde se encuentra la base de datos.
    """
    # Verificar si la ruta del directorio de datos existe
    if not os.path.exists(directorio_data):
        raise FileNotFoundError(f'El directorio {directorio_data} no existe.')

    # Cargar la base de datos utilizando Chroma
    vectorstore = Chroma(persist_directory =directorio_data,embedding_function=embedder)
    
    print(f'Base de datos cargada desde: {directorio_data}')
    return vectorstore





#Inicializar LLM y Embedding de Amazon BedRock
#Las variables de ambiente AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION se deben configurar 
#en los secretos y variables de ambiente de HuggingFace
def initLLM():
    return ChatBedrock(model_id="anthropic.claude-3-sonnet-20240229-v1:0")
def initEmbedder():
   return BedrockEmbeddings(model_id='amazon.titan-embed-text-v1')
 


# Función para manejar el chat
def handle_chat(message, history):
    # Ejemplo sencillo de respuesta de chat
    print(chromaDB)
    pdf_qa=ConversationalRetrievalChain.from_llm(llm=initLLM(),
                                             retriever=chromaDB.as_retriever(search_kwargs={'k':10}),
                                             verbose=True)
    chat_history = []
    resultado=pdf_qa({"question":message,"chat_history": chat_history})
    return resultado["answer"]


# Definir la interfaz de Gradio
with gr.Blocks() as demo:
        # Elementos para el chat
        chatbot = gr.ChatInterface(fn=handle_chat, undo_btn=None,clear_btn=None,retry_btn=None)
       

   
# Ejecutar la aplicación
if __name__ == "__main__":
    bedrock_llm=initLLM()
    bedrock_embedder=initEmbedder()
    ruta_zip = './data.zip'
    ruta_destino = '.'
    print("Extrayendo base vectorial")
    descomprimir_archivo_zip(ruta_zip, ruta_destino)
    directorio_data = 'data'  # Ruta del directorio de datos
    chromaDB = cargar_base_datos(directorio_data,bedrock_embedder)
    demo.launch()