File size: 3,872 Bytes
2079add
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import pinecone
from langchain.vectorstores import Pinecone
from langchain.embeddings import OpenAIEmbeddings
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv(), override=True)

import os
import pinecone
import gradio as gr
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.vectorstores import Pinecone
from langchain.embeddings.openai import OpenAIEmbeddings

from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv(), override=True)

PINECONE_API_KEY = os.environ.get('PINECONE_API_KEY')
PINECONE_ENV = os.environ.get('PINECONE_ENV')

embeddings = OpenAIEmbeddings()

pinecone.init(
    api_key=PINECONE_API_KEY,
    environment=PINECONE_ENV
)

index_name = "okean"
index = pinecone.Index(index_name)

llm = ChatOpenAI(model='gpt-4-1106-preview', temperature=0)

template="""Assistente é uma IA que tira dúvidas de um manual e documentação. Os documentos tem conteudo em ingles e portugues mas responda sempre em português.
    Assistente elabora repostas simplificadas, com base no contexto fornecido.
    Assistente fornece referências extraídas do contexto abaixo. 
    Caso não consiga encontrar no contexto abaixo ou caso a pergunta não esteja relacionada do contexto do manual, 
    diga apenas 'Eu não sei!'
    Pergunta: {query}

    Contexto: {context}
    Referência: [Página: {page}, Fonte: {source}]
"""

prompt = PromptTemplate(
    template=template,
    input_variables=["query", "context", "page", "source"]
)

historico = []

def clear_history():
    global historico
    historico = []
    return "Histórico limpo!", "Histórico de perguntas e respostas aqui..."


def search(query):
    global historico
    # Adiciona a pergunta ao histórico
    historico.append(f"Pergunta: {query}")

    # Realiza a busca por similaridade
    docsearch = Pinecone.from_existing_index(index_name, embeddings)
    docs = docsearch.similarity_search(query, k=3)

    first_doc = docs[0]
    page_ref = first_doc.metadata['page']
    source_ref = first_doc.metadata['source']

    # Concatena o conteúdo das páginas com o histórico e inclui os metadados
    context = ' '.join(historico)
    for doc in docs:
        print(doc)
        context += f" {doc.page_content} [Referência: Página - {doc.metadata['page']}, Fonte - {doc.metadata['source']}]"


    # Chama a cadeia LLM com o novo contexto
    resp = LLMChain(prompt=prompt, llm=llm)    
    answer = resp.run(query=query, context=context, page=page_ref, source=source_ref)

    # Formatar a resposta para incluir as informações de página e fonte
    formatted_answer = f"{answer}\n\nReferência: Página - {page_ref}, Fonte - {source_ref}"


    # Adiciona a resposta ao histórico
    historico.append(f"Resposta: {formatted_answer}")

    # Retorne tanto a resposta quanto o histórico atualizado
    return formatted_answer, "\n".join(historico)



with gr.Blocks(title="Chatbot Inteligente", theme=gr.themes.Soft()) as ui:
    gr.Markdown("# Sou uma IA que tem o manual OKEAN como base de conhecimento")
    query = gr.Textbox(label='Faça a sua pergunta:', placeholder="EX: como funcionam o sistema de propulsão?")
    text_output = gr.Textbox(label="Resposta")
    historico_output = gr.Textbox(label="Histórico", value="Histórico de perguntas e respostas aqui...")
    btn = gr.Button("Perguntar")
    clear_btn = gr.Button("Limpar Histórico")  # Novo botão para limpar o histórico
    btn.click(fn=search, inputs=query, outputs=[text_output, historico_output])
    clear_btn.click(fn=clear_history, inputs=[], outputs=[text_output, historico_output])  # Vincula a nova função ao botão
ui.launch(debug=True, share=True)