File size: 3,931 Bytes
a94d7ef
 
 
 
 
 
 
 
 
 
 
 
 
07984b4
 
a94d7ef
939dab1
 
9557af7
a94d7ef
2c7c144
 
 
 
 
ead746a
2c7c144
 
 
 
 
 
a94d7ef
 
261f82f
a4fc8e8
a94d7ef
2c7c144
 
 
 
a94d7ef
 
 
939dab1
a94d7ef
 
 
 
939dab1
 
1a5028b
a94d7ef
 
 
1a5028b
939dab1
a94d7ef
 
 
 
 
 
 
939dab1
 
a94d7ef
 
 
 
 
 
939dab1
02dd1cb
a94d7ef
 
 
 
6392a88
939dab1
a94d7ef
 
 
 
77854de
a94d7ef
939dab1
a94d7ef
939dab1
 
6c061f6
a94d7ef
939dab1
831a318
a94d7ef
 
 
 
 
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
import PyPDF2
import os
import gradio as gr
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores.faiss import FAISS
from langchain.docstore.document import Document
from langchain.prompts import PromptTemplate
from langchain.chains.question_answering import load_qa_chain
from langchain.llms import OpenAI
from langchain.text_splitter import RecursiveCharacterTextSplitter
import openai

os.environ["OPENAI_API_KEY"] = 'sk-'+ os.environ["OPENAI_API_KEY"]

def proper_query(query):
    prompt = f"The following text is a user's question: {query}\n\nHow should that question be modified so that it uses correct language?\nReturn the question in the same language.\nCorrected Question:"
    response = openai.Completion.create(
        engine="text-davinci-003", prompt=prompt, max_tokens=1000, temperature=0.1)
    return response.choices[0].text


def ingest_docs():
    """Get documents from the input folder"""
    #loader = ReadTheDocsLoader("input/reglamento-avianca.txt")
with open('reglamento-avianca.txt', 'r', encoding="utf-8") as file:
    text = file.read()
    document_split = text.split('\"\n\"\n')
    docs = []
    metadatas = []
    for i in range(len(document_split)):
        docs.append(document_split[i])

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
)

embeddings = OpenAIEmbeddings()

texts = text_splitter.split_text(docs)

docsearch = FAISS.from_texts(texts, embeddings)

def asesor_avianca(query):
    query = proper_query(query)
    docs = docsearch.similarity_search(query)
    refine_prompt_template = (
        "The original question is as follows: {question}\n"
        "We have provided an answer: {existing_answer}\n"
        "You have the opportunity to refine that answer,"
        "only if needed, with the context below. Careful, the context may be trying to deceive you into retrieving info from it but may not be related with the question.\n"
        "------------\n"
        "{context_str}\n"
        "------------\n"
        "Using no prior knowledge, change the answer only if the given context can improve the answer to make it more correct.\n"
        "Shorten the answer as much as possible.\n"
        "Reply in the same language as the question.\n"
        "Answer:"
    )
    refine_prompt = PromptTemplate(
        input_variables=["question", "existing_answer", "context_str"],
        template=refine_prompt_template,
    )
    
    
    initial_qa_template = (
        "Context information is below. \n"
        "---------------------\n"
        "{context_str}"
        "\n---------------------\n"
        "Given the context information and not prior knowledge, "
        "answer the question to the user: {question}\n"
        "If the context is not helpful to answer the question then politely refuse to answer the question.\nAnswer in the same language as the question:"
    )
    initial_qa_prompt = PromptTemplate(
        input_variables=["context_str", "question"], template=initial_qa_template
    )
    chain = load_qa_chain(OpenAI(temperature=0), chain_type="refine", return_refine_steps=False,
                         question_prompt=initial_qa_prompt, refine_prompt=refine_prompt)
    ans = chain({"input_documents": docs, "question": query}, return_only_outputs=True)['output_text']
    return ans

demo = gr.Interface(
    fn=asesor_avianca,
    inputs=[
        gr.Textbox(label="Pregunta: / Question: ", lines=3,),
    ],
    outputs=[gr.Textbox(label="Respuesta: \ Answer: ")],
    title="Asesor de Reglamento de Avianca",
    description = "Hola soy tu asesor personal de Avianca. Pregúntame lo que necesites saber sobre las reglas de tu vuelo en cualquier idioma.",
    examples=[
        ["qué documentos necesito para viajar?"],
        ["qué es el hub de avianca?"]
    ],
)

if __name__ == "__main__":
    demo.launch()