Spaces:
Sleeping
Sleeping
import gradio as gr | |
import os | |
from llama_index import ( | |
VectorStoreIndex, | |
SimpleDirectoryReader, | |
StorageContext, | |
ServiceContext, | |
load_index_from_storage, | |
) | |
from llama_index.llms import OpenAI | |
from llama_index.prompts import PromptTemplate | |
from llama_index.embeddings import LangchainEmbedding | |
import tiktoken | |
from llama_index.text_splitter import SentenceSplitter | |
from langchain.embeddings import HuggingFaceEmbeddings | |
# criação do embeding LangChain | |
lc_embed_model = HuggingFaceEmbeddings( | |
model_name="sentence-transformers/all-mpnet-base-v2" | |
) | |
# mapeamento do embeding LangChain para o embeding LlamaIndex | |
embed_model = LangchainEmbedding(lc_embed_model) | |
# max_tokens: o tamanho máximo da resposta a ser dada | |
llm = OpenAI(temperature=0.3, model='gpt-3.5-turbo', max_tokens=1024) | |
# quebra inteligênte das sentenças, combinando separadores, tokenizadores e chunks | |
text_splitter = SentenceSplitter( | |
separator=" ", chunk_size=1000, chunk_overlap=200, | |
paragraph_separator=" \n \n", secondary_chunking_regex="[^,.;。]+[,.;。]?", | |
tokenizer=tiktoken.encoding_for_model("gpt-3.5-turbo").encode | |
) | |
# cria um serviço de contexto para configurar a criação do indice | |
service_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model, text_splitter=text_splitter) | |
# verifica se a pasta storage existe localmente | |
PERSIST_DIR = "./storage" | |
if not os.path.exists(PERSIST_DIR): | |
# caso não exista lê os documentos da pasta e cria um índice | |
documents = SimpleDirectoryReader("./data").load_data() | |
# cria um indice utilizando um contexto de serviços | |
index = VectorStoreIndex.from_documents(documents, service_context=service_context) | |
# depois, armazena o índice na pasta | |
index.storage_context.persist(persist_dir=PERSIST_DIR) | |
else: | |
# caso a pasta exista, lê o índice existente | |
storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR) | |
index = load_index_from_storage(storage_context, service_context=service_context) | |
# define um prompt | |
text_qa_template = PromptTemplate(''' | |
Dado o seguinte contexto de informações: | |
--------- | |
{context_str} | |
--------- | |
Dado o contexto informado e sem o uso de nenhum conhecimento anterior, | |
responda a pergunta: {query_str} | |
''') | |
# cria o query_engine baseado no indice e no contexto | |
query_engine = index.as_query_engine(text_qa_template=text_qa_template) | |
# consulta o índice local | |
def greet(query): | |
return query_engine.query(query) | |
# cria a interface com o gradio | |
iface = gr.Interface(fn=greet, inputs="text", outputs="text") | |
iface.launch(share=True) | |