File size: 4,033 Bytes
53e0a4a
dea6e8d
 
 
bfc91a3
dea6e8d
bfc91a3
11cb4f2
 
 
 
 
a82575a
f51ae5a
a82575a
 
 
21403be
0cb9508
a6db4fa
0561f54
 
 
 
 
 
 
 
a6db4fa
 
0561f54
 
70e3b22
0561f54
a6db4fa
 
0561f54
 
 
 
 
 
a6db4fa
 
0561f54
1d89743
a6db4fa
 
0561f54
a7b4a94
a6db4fa
 
0561f54
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a6db4fa
7b89b77
f8af787
0561f54
f8af787
f69ae09
 
 
 
a7b4a94
f8af787
 
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
import streamlit as st
import getpass
import os

os.environ["OPENAI_API_KEY"] = st.secrets['OPENAI_API_KEY']  # agregada en la config de hugginface
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = st.secrets['OPENAI_API_KEY']

from langchain.prompts import PromptTemplate
from langchain.chains.llm import LLMChain
from langchain.chains.combine_documents.stuff import StuffDocumentsChain
from langchain.chains import RetrievalQA
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain_community.document_loaders import HuggingFaceDatasetLoader
from langchain_community.embeddings import HuggingFaceEmbeddings

with st.status("Cargando Aplicación...", expanded=False) as status:
    st.write("Cargando Dataset...")
    #Carga de DATASET
    dataset_name = "Waflon/FAQ"
    page_content_column = "respuestas"
    loader = HuggingFaceDatasetLoader(dataset_name, page_content_column)
    data = loader.load()
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=150)
    #Transformado a tipo de dato especifico para esto
    docs = text_splitter.split_documents(data)

    st.write("Cargando modelo de Sentence-Transformer...")
    #Modelo QA sentence similarity
    modelPath = 'sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2' #español
    model_kwargs = {'device':'cpu'} # cuda or cpu
    encode_kwargs = {'normalize_embeddings': False}

    st.write("Embeddings...")
    #Embeddings que transforman a vectores densos multidimensionales las preguntas del SII
    embeddings = HuggingFaceEmbeddings(
        model_name=modelPath,     # Ruta a modelo Pre entrenado
        model_kwargs=model_kwargs, # Opciones de configuracion del modelo
        encode_kwargs=encode_kwargs # Opciones de Encoding
    )

    st.write("Base de datos FAISS...")
    #DB y retriever
    db = FAISS.from_documents(docs[:2], embeddings)  # Create a retriever object from the 'db' with a search configuration where it retrieves up to 4 relevant splits/documents.

    st.write("Retriever...")
    retriever = db.as_retriever(search_kwargs={"k": 3})
    status.update(label="App cargada con exito!", state="complete")

    st.write("Prompt template...")
    prompt_template = """Usa los siguientes fragmentos de contextos para responder una pregunta al final. Por favor sigue las siguientes reglas:
    1. Si la pregunta requiere vinculos, por favor retornar solamente las vinculos de los vinculos sin respuesta
    2. Si no sabes la respuesta, no inventes una respuesta. Solamente di **No pude encontrar la respuesta definitiva, pero tal vez quieras ver los siguientes vinculos** y agregalos a la lista de vinculos.
    3. Si encuentras la respuesta, escribe una respuesta concisa y agrega la lista de vinculos que sean usadas **directamente** para derivar la respuesta. Excluye los vinculos que sean irrelevantes al final de la respuesta
    
    {contexto}
    
    Pregunta: {question}
    Respuesta Util:"""
    
    
    QA_CHAIN_PROMPT = PromptTemplate.from_template(prompt_template) # prompt_template defined above
    llm_chain = LLMChain(llm=ChatOpenAI(), prompt=QA_CHAIN_PROMPT, callbacks=None, verbose=True)
    document_prompt = PromptTemplate(
        input_variables=["page_content", "url"],
        template="Contexto:\n{page_content}\nVinculo: {url}",
    )
    combine_documents_chain = StuffDocumentsChain(
        llm_chain=llm_chain,
        document_variable_name="contexto",
        document_prompt=document_prompt,
        callbacks=None,
    )
    qa = RetrievalQA(
        combine_documents_chain=combine_documents_chain,
        callbacks=None,
        verbose=True,
        retriever=retriever,
    )

    
    status.update(label="Finalizado!", state="complete")
    
def main(): 
    pregunta = st.text_area('Ingrese su pregunta')
    if pregunta:
        out = qa(str(pregunta))
        st.write(out)

if __name__ == "__main__":
    main()