| | import os |
| | import time |
| | import pinecone |
| | import tempfile |
| | 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 langchain.document_loaders import PyPDFLoader |
| | from langchain.text_splitter import RecursiveCharacterTextSplitter |
| |
|
| | from dotenv import load_dotenv, find_dotenv |
| | load_dotenv(find_dotenv(), override=True) |
| |
|
| |
|
| | print('iniciando...') |
| | 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 = "joinsy" |
| | index = pinecone.Index(index_name) |
| |
|
| | llm = ChatOpenAI(model='gpt-4-turbo', temperature=0) |
| |
|
| | template = """Assistente é uma IA de licitação que busca informações em edital. |
| | Assistente elabora repostas simplificadas, com base no contexto fornecido. |
| | Caso não consiga encontrar no contexto abaixo ou caso a pergunta não esteja relacionada do contexto do edital, |
| | diga apenas 'Não foi possível encontrar essa informação no documento!' |
| | |
| | Pergunta: {query} |
| | |
| | Contexto: {context} |
| | """ |
| |
|
| | prompt = PromptTemplate( |
| | template=template, |
| | input_variables=["query", "context"] |
| | ) |
| |
|
| |
|
| | def search(query): |
| | docsearch = Pinecone.from_existing_index(index_name, embeddings) |
| | docs = docsearch.similarity_search(query, k=3) |
| | context = docs[0].page_content + docs[1].page_content + docs[2].page_content |
| | resp = LLMChain(prompt=prompt, llm=llm) |
| | return resp.run(query=query, context=context) |
| |
|
| | def delete_index(index_name='all'): |
| | pinecone.init(api_key=os.environ.get('PINECONE_API_KEY'), environment=os.environ.get('PINECONE_ENV')) |
| | if index_name == 'all': |
| | indexes = pinecone.list_indexes() |
| | print('Deletando todos os índices...') |
| | for index in indexes: |
| | pinecone.delete_index(index) |
| | else: |
| | print(f'Deletando índice {index_name}...') |
| | pinecone.delete_index(index_name) |
| |
|
| | def handle_upload(uploaded_file): |
| | if uploaded_file is None: |
| | return "Nenhum arquivo foi carregado." |
| | |
| | |
| | temp_dir = tempfile.mkdtemp() |
| | temp_file_path = os.path.join(temp_dir, "uploaded_file.pdf") |
| | print(temp_dir) |
| | print('Arquivo Carregado') |
| | gr.Textbox(label="Objeto do Edital", value='Arquivo Carregado') |
| | |
| | with open(temp_file_path, 'wb') as temp_file: |
| | temp_file.write(uploaded_file) |
| | delete_index() |
| |
|
| | print('Lendo Arquivo') |
| | gr.Textbox(label="Objeto do Edital", value='Lendo Arquivo') |
| | loader = PyPDFLoader(temp_file_path) |
| | data = loader.load() |
| | |
| | text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0) |
| | texts = text_splitter.split_documents(data) |
| | |
| | index_name = "joinsy" |
| | print('Acessando banco de dados') |
| | gr.Textbox(label="Objeto do Edital", value='Acessando dados') |
| | pinecone.create_index(index_name, dimension=1536) |
| | index = pinecone.Index(index_name) |
| | docsearch = Pinecone.from_texts([t.page_content for t in texts], embeddings, index_name=index_name) |
| | time.sleep(50) |
| | print('Buscando informações') |
| | gr.Textbox(label="Objeto do Edital", value='Buscando informações') |
| |
|
| | objeto = search('Qual o objeto da licitação ? ') |
| | sistema_registro = search('Esse edita faz parte do Sistema de registro de preço (SRE) ? Se fizer parte apenas resposnda: Sistema de Registro de preço. Caso não faça parte responda: Sem Sistema de reistro de preço') |
| | criterio_julgamento = search('Sabendo que existe os seguintes critérios de julgamento: (i) Menor Preço; (ii) Maior Desconto; (iii) Melhor Técnica ou Conteúdo Artístico; (iv) Técnica e Preço; (v) Maior lance em Leilões; e (vi) Maior Retorno Econômico. Qual o critério de julgamento deste edital ?') |
| | itens = search('O edital de licitação possui itens que vão ser licitados. Itens de licitação são os produtos, serviços ou obras que uma entidade pública ou privada deseja adquirir ou contratar por meio de um processo de licitação. Os itens tem relação com o objeto do edital: {objeto} Mostre quais são os itens desse edital. Geralmente os itens são mostrados no edital em uma tabela com referência, descriçãp, unidade, quantidade (qtd), valor unitário, valor total, etc. Mostre em formato de lista. Vou mostrar um exemplo, em uma tabela que possui como colunas: (Item, Material, Quantidade (qtd), Justificativa), e na próxima linha temeos como número do item: 1, Material: Água Oxigenada, Quantidde 150, Justificatvia: Essencial para a desinfecção de ferimentos, descontaminação de superfície. Veja que esse foi um exemplo de item do edital, em um edital existem vários. Procure os itens desse edital e mostre em uma lista. Toda vez que tiver um número e um substantivo então é um item de edital, exemplo: 1. Água oxigenada, 2. Alcool Etílico. 10. Atadura de crepom. Reanimador manual infantil R$ 356,48. Soro fisiológico R$ 5,50. Veja que nesse exemplo sempre temos um objeto seguido de um número então meus itens são: Água oxigenada, Alcool Etílico, Atadura de crepom, Soro fisiológico. Procure os itens no edital e mostre em formato de lista') |
| | |
| | text_objeto = gr.Textbox(label="Objeto do Edital", value=objeto) |
| | print(objeto) |
| | text_sistema_registo = gr.Textbox(label="Sistema de Registro", value=sistema_registro) |
| | print(sistema_registro) |
| | text_criterio_julgamento = gr.Textbox(label="Critério de julgamento", value=criterio_julgamento) |
| | print(criterio_julgamento) |
| | text_itens = gr.Textbox(label="Itens", value=itens) |
| | print(itens) |
| | text_upload_response = gr.Textbox(label="Objeto do Edital", value='Arquivo Carregado') |
| | btn.click(reload, None, outputs=[objeto_tb, sistema_registro_tb, criterio_julgamento_tb, itens_tb ]) |
| | return 'Arquivo carregado' |
| |
|
| | def atualiza_valores(): |
| | objeto = search('Qual o objeto da licitação ? ') |
| | sistema_registro = search('Esse edita faz parte do Sistema de registro de preço (SRE) ? Se fizer parte apenas resposnda: Sistema de Registro de preço. Caso não faça parte responda: Sem Sistema de reistro de preço') |
| | criterio_julgamento = search('Sabendo que existe os seguintes critérios de julgamento: (i) Menor Preço; (ii) Maior Desconto; (iii) Melhor Técnica ou Conteúdo Artístico; (iv) Técnica e Preço; (v) Maior lance em Leilões; e (vi) Maior Retorno Econômico. Qual o critério de julgamento deste edital ?') |
| | itens = search('O edital de licitações tem itens que serão licitados. Mostre a lista de itens licitados desse edital') |
| | return objeto, sistema_registro, criterio_julgamento, itens |
| |
|
| | def reload(): |
| | objeto = search('Qual o objeto da licitação ? ') |
| | sistema_registro = search('Esse edita faz parte do Sistema de registro de preço (SRE) ? Se fizer parte apenas resposnda: Sistema de Registro de preço. Caso não faça parte responda: Sem Sistema de reistro de preço') |
| | criterio_julgamento = search('Sabendo que existe os seguintes critérios de julgamento: (i) Menor Preço; (ii) Maior Desconto; (iii) Melhor Técnica ou Conteúdo Artístico; (iv) Técnica e Preço; (v) Maior lance em Leilões; e (vi) Maior Retorno Econômico. Qual o critério de julgamento deste edital ?') |
| | print('Objeto desse edital --------->>>>> '+objeto) |
| | itens = search('O edital de licitação possui itens que vão ser licitados. Itens de licitação são os produtos, serviços ou obras que uma entidade pública ou privada deseja adquirir ou contratar por meio de um processo de licitação. Os itens tem relação com o objeto do edital: {objeto} Mostre quais são os itens desse edital. Geralmente os itens são mostrados no edital em uma tabela com referência, descriçãp, unidade, quantidade (qtd), valor unitário, valor total, etc. Mostre em formato de lista. Vou mostrar um exemplo, em uma tabela que possui como colunas: (Item, Material, Quantidade (qtd), Justificativa), e na próxima linha temeos como número do item: 1, Material: Água Oxigenada, Quantidde 150, Justificatvia: Essencial para a desinfecção de ferimentos, descontaminação de superfície. Veja que esse foi um exemplo de item do edital, em um edital existem vários. Procure os itens desse edital e mostre em uma lista. Toda vez que tiver um número e um substantivo então é um item de edital, exemplo: 1. Água oxigenada, 2. Alcool Etílico. 10. Atadura de crepom. Reanimador manual infantil R$ 356,48. Soro fisiológico R$ 5,50. Veja que nesse exemplo sempre temos um objeto seguido de um número então meus itens são: Água oxigenada, Alcool Etílico, Atadura de crepom, Soro fisiológico. Procure os itens no edital e mostre em formato de lista') |
| | |
| | return objeto, sistema_registro, criterio_julgamento, itens |
| |
|
| | with gr.Blocks(title="IA de Licitação - Joinsy", theme=gr.themes.Soft()) as ui: |
| | gr.Markdown("# Sou uma IA que analisa informações de Licitações") |
| | |
| | file_uploader = gr.File(label="Carregue um arquivo PDF", type="binary") |
| | upload_response = gr.Textbox(label="Status do upload") |
| | file_uploader.change(fn=handle_upload, inputs=file_uploader, outputs=upload_response) |
| |
|
| |
|
| | objeto = search('Qual o objeto da licitação ? ') |
| | sistema_registro = search('Esse edita faz parte do Sistema de registro de preço (SRE) ? Se fizer parte apenas resposnda: Sistema de Registro de preço. Caso não faça parte responda: Sem Sistema de reistro de preço') |
| | criterio_julgamento = search('Sabendo que existe os seguintes critérios de julgamento: (i) Menor Preço; (ii) Maior Desconto; (iii) Melhor Técnica ou Conteúdo Artístico; (iv) Técnica e Preço; (v) Maior lance em Leilões; e (vi) Maior Retorno Econômico. Qual o critério de julgamento deste edital ?') |
| | print('Objeto desse edital --------->>>>> '+objeto) |
| | itens = search('O edital de licitação possui itens que vão ser licitados. Itens de licitação são os produtos, serviços ou obras que uma entidade pública ou privada deseja adquirir ou contratar por meio de um processo de licitação. Os itens tem relação com o objeto do edital: {objeto} Mostre quais são os itens desse edital. Geralmente os itens são mostrados no edital em uma tabela com referência, descriçãp, unidade, quantidade (qtd), valor unitário, valor total, etc. Mostre em formato de lista. Vou mostrar um exemplo, em uma tabela que possui como colunas: (Item, Material, Quantidade (qtd), Justificativa), e na próxima linha temeos como número do item: 1, Material: Água Oxigenada, Quantidde 150, Justificatvia: Essencial para a desinfecção de ferimentos, descontaminação de superfície. Veja que esse foi um exemplo de item do edital, em um edital existem vários. Procure os itens desse edital e mostre em uma lista. Toda vez que tiver um número e um substantivo então é um item de edital, exemplo: 1. Água oxigenada, 2. Alcool Etílico. 10. Atadura de crepom. Reanimador manual infantil R$ 356,48. Soro fisiológico R$ 5,50. Veja que nesse exemplo sempre temos um objeto seguido de um número então meus itens são: Água oxigenada, Alcool Etílico, Atadura de crepom, Soro fisiológico. Procure os itens no edital e mostre em formato de lista') |
| | |
| | upload_response_tb =gr.Textbox(label="Status do upload", value = upload_response) |
| | objeto_tb = gr.Textbox(label="Objeto do Edital", value=objeto) |
| | sistema_registro_tb = gr.Textbox(label="Sistema de Registro", value=sistema_registro) |
| | criterio_julgamento_tb = gr.Textbox(label="Critério de julgamento", value=criterio_julgamento) |
| | itens_tb = gr.Textbox(label="Itens", value=itens) |
| | btn = gr.Button(value='Atualizar dados') |
| | btn.click(reload, None, outputs=[objeto_tb, sistema_registro_tb, criterio_julgamento_tb, itens_tb ]) |
| |
|
| |
|
| |
|
| | ui.launch(debug=True, share=True) |