EddyGiusepe's picture
Scripts sobre LangChain
d50b019
"""
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