marcelo-castro-cardoso commited on
Commit
2df300a
1 Parent(s): 655399f
app.py CHANGED
@@ -1,8 +1,74 @@
1
  import gradio as gr
2
  import os
3
 
4
- def greet(name):
5
- return "Hello " + name + "!!"
 
 
 
 
 
 
 
 
 
 
6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  iface = gr.Interface(fn=greet, inputs="text", outputs="text")
8
  iface.launch(share=True)
 
1
  import gradio as gr
2
  import os
3
 
4
+ from llama_index import (
5
+ VectorStoreIndex,
6
+ SimpleDirectoryReader,
7
+ StorageContext,
8
+ ServiceContext,
9
+ load_index_from_storage,
10
+ )
11
+ from llama_index.llms import OpenAI
12
+ from llama_index.prompts import PromptTemplate
13
+ from llama_index.embeddings import LangchainEmbedding
14
+ import tiktoken
15
+ from llama_index.text_splitter import SentenceSplitter
16
 
17
+ from langchain.embeddings import HuggingFaceEmbeddings
18
+
19
+ # criação do embeding LangChain
20
+ lc_embed_model = HuggingFaceEmbeddings(
21
+ model_name="sentence-transformers/all-mpnet-base-v2"
22
+ )
23
+ # mapeamento do embeding LangChain para o embeding LlamaIndex
24
+ embed_model = LangchainEmbedding(lc_embed_model)
25
+
26
+ # max_tokens: o tamanho máximo da resposta a ser dada
27
+ llm = OpenAI(temperature=0.3, model='gpt-3.5-turbo', max_tokens=1024)
28
+
29
+ # quebra inteligênte das sentenças, combinando separadores, tokenizadores e chunks
30
+ text_splitter = SentenceSplitter(
31
+ separator=" ", chunk_size=1000, chunk_overlap=200,
32
+ paragraph_separator=" \n \n", secondary_chunking_regex="[^,.;。]+[,.;。]?",
33
+ tokenizer=tiktoken.encoding_for_model("gpt-3.5-turbo").encode
34
+ )
35
+
36
+ # verifica se a pasta storage existe localmente
37
+ PERSIST_DIR = "./storage"
38
+ if not os.path.exists(PERSIST_DIR):
39
+ # caso não exista lê os documentos da pasta e cria um índice
40
+ documents = SimpleDirectoryReader("./data").load_data()
41
+
42
+ # cria um serviço de contexto para configurar a criação do indice
43
+ service_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model, text_splitter=text_splitter)
44
+
45
+ # cria um indice utilizando um contexto de serviços
46
+ index = VectorStoreIndex.from_documents(documents, service_context=service_context)
47
+
48
+ # depois, armazena o índice na pasta
49
+ index.storage_context.persist(persist_dir=PERSIST_DIR)
50
+ else:
51
+ # caso a pasta exista, lê o índice existente
52
+ storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR)
53
+ index = load_index_from_storage(storage_context)
54
+
55
+ # define um prompt
56
+ text_qa_template = PromptTemplate('''
57
+ Dado o seguinte contexto de informações:
58
+ ---------
59
+ {context_str}
60
+ ---------
61
+ Dado o contexto informado e sem o uso de nenhum conhecimento anterior,
62
+ responda a pergunta: {query_str}
63
+ ''')
64
+
65
+ # cria o query_engine baseado no indice e no contexto
66
+ query_engine = index.as_query_engine(text_qa_template=text_qa_template)
67
+
68
+ # consulta o índice local
69
+ def greet(query):
70
+ return query_engine.query(query)
71
+
72
+ # cria a interface com o gradio
73
  iface = gr.Interface(fn=greet, inputs="text", outputs="text")
74
  iface.launch(share=True)
data/276376-convite-menor_preco_por_lote-false-obras.pdf ADDED
Binary file (779 kB). View file
 
requirements.txt CHANGED
@@ -1,3 +1,5 @@
1
-
2
  gradio
3
  llama-index==0.9.26
 
 
 
 
 
1
  gradio
2
  llama-index==0.9.26
3
+ langchain==0.0.348
4
+ pypdf
5
+ sentence_transformers