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 | |