Spaces:
No application file
No application file
| """ | |
| Data Scientist.: Dr.Eddy Giusepe Chirinos Isidro | |
| Neste script podemos fazer perguntas a diversos documentos. Onde a pergunta | |
| do usuário sempre deverá mencionar à "Entidade" (o nome do documento) para assim | |
| conseguir interagir com dito documento. | |
| É um bom começo usar a recuperação de documentos.... mas estaria faltando levar | |
| em conta o contexto (o hisórico de bate-papo) para assim ter uma melhor resposta | |
| para o usuário. | |
| Nota: | |
| * Ao executar o script será criado 4 diretórios com os nomes do arquivos, os quais | |
| são armazenado no DB Chroma (cada nome é um índice). | |
| """ | |
| import os | |
| from langchain.text_splitter import RecursiveCharacterTextSplitter | |
| from langchain.vectorstores import Chroma | |
| from langchain.embeddings import OpenAIEmbeddings | |
| from langchain.chains.router import MultiRetrievalQAChain | |
| from langchain.llms import OpenAI | |
| from langchain.document_loaders import PyPDFLoader | |
| # Substitua sua chave de API OpenAI: | |
| import openai | |
| import os | |
| from dotenv import load_dotenv, find_dotenv | |
| _ = load_dotenv(find_dotenv()) # read local .env file | |
| openai.api_key = os.environ['OPENAI_API_KEY'] | |
| # Diretório onde os arquivos .txt estão armazenados | |
| docs_dir = 'docs' | |
| # Inicialize os embeddings OpenAI: | |
| embedding = OpenAIEmbeddings() | |
| retrievers = [] | |
| retriever_descriptions = [] | |
| retriever_names = [] | |
| # Inicialize o splitter de texto: | |
| text_splitter = RecursiveCharacterTextSplitter( | |
| chunk_size = 500, | |
| chunk_overlap = 20, | |
| length_function = len, | |
| ) | |
| # Iterar todos os arquivos .txt e .pdf no diretório: | |
| for filename in os.listdir(docs_dir): | |
| doc = None | |
| # Verifique se já existe um Chroma VectorStore persistente para este documento: | |
| if os.path.exists(filename[:-4]): # "slicing" em Python. Cortando os últimos 4 caracteres do nome do arquivo (".txt", ".jpg" ou ".doc"), para obter o nome do arquivo sem a extensão. | |
| # Se existir, carregue-o do disco: | |
| retriever = Chroma(persist_directory=filename[:-4], embedding_function=embedding).as_retriever() | |
| else: | |
| # Carregue o documento e divida-o: | |
| if filename.endswith('.txt'): | |
| try: | |
| with open(os.path.join(docs_dir, filename), 'r', encoding='utf-8') as f: | |
| doc = f.read() | |
| except UnicodeDecodeError: | |
| # Tratar possíveis erros de codificação | |
| print(f"Ignorando arquivo {filename} devido a erros de codificação.") | |
| continue | |
| # Se for um .txt, dividimos o documento: | |
| doc = text_splitter.create_documents([doc]) | |
| elif filename.endswith('.pdf'): | |
| loader = PyPDFLoader(os.path.join(docs_dir, filename)) | |
| doc = loader.load_and_split() | |
| #print(doc) | |
| if doc is not None: | |
| # Crie um novo Chroma VectorStore e salve-o no disco: | |
| retriever = Chroma.from_documents(documents=doc, embedding=embedding, persist_directory=filename[:-4]) | |
| retriever.persist() | |
| retriever = retriever.as_retriever() | |
| # Adicione o retriever, seu nome e sua descrição às respectivas listas: | |
| retrievers.append(retriever) | |
| retriever_names.append(filename[:-4]) | |
| # PRESTE ATENÇÃO AOS NOMES DOS ARQUIVOS COMO ESTARÃO NAS DESCRIÇÕES: | |
| retriever_descriptions.append(f"Bom para responder perguntas sobre {filename[:-4]}") | |
| # Inicialize o MultiRetrievalQAChain 🤗: | |
| chain = MultiRetrievalQAChain.from_retrievers(OpenAI(), retriever_names, retriever_descriptions, retrievers, verbose=False) | |
| # Teste-o: | |
| # print(chain.run("Quais são as diferenças entre Newton e Feynman?")) | |
| while True: | |
| #print(chain.run(input("\033[033mO que você gostaria de saber? 🤓\033[m "))) | |
| query = input("\033[033mUsuário:\033[m ") | |
| print("") | |
| response = chain.run(query) | |
| print("\033[032mA resposta mais SIMILAR é: \033[m", response) | |
| print("") | |
| if not query: | |
| break | |