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.memory import ChatMemoryBuffer | |
from llama_index.prompts import ChatPromptTemplate, ChatMessage, MessageRole | |
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 para o chat | |
message_templates = [ | |
ChatMessage(role=MessageRole.SYSTEM, | |
content='''Você é um sistema especialista que sabe responder perguntas relacionadas ao contexto abaixo. | |
------------------ | |
{context_str} | |
------------------''' | |
), | |
ChatMessage(role=MessageRole.SYSTEM, | |
context='''Para responder leve em consideração as perguntas e respostas dadas anteriormente.''' | |
), | |
ChatMessage(role=MessageRole.USER, | |
content='''Utilizando o histórico de conversação e o contexto armazenado iteraja e ajude o usuário.''' | |
), | |
] | |
chat_template = ChatPromptTemplate(message_templates=message_templates) | |
# Definir uma memória de mensagens anteriores | |
memory = ChatMemoryBuffer.from_defaults(token_limit=3900) | |
chat_engine = index.as_chat_engine( | |
chat_mode="condense_plus_context", | |
memory=memory, | |
context_prompt=chat_template, | |
) | |
# consulta o índice local | |
def slow_echo(message, history): | |
response_gen = chat_engine.stream_chat(message) | |
response = "" | |
for token in response_gen.response_gen: | |
response = response + token | |
yield response | |
# cria a interface com o gradio | |
demo = gr.ChatInterface(slow_echo).queue() | |
if __name__ == "__main__": | |
demo.launch(share=True) | |