EddyGiusepe's picture
QA do PDF retriever
3323643
"""
Data Scientist.: PhD.Eddy Giusepe Chirinos Isidro
CHROMA
======
Chroma é um banco de dados para criar aplicativos de IA com Embeddings.
Aqui vou estudar e analisar certos parâmetros relevantes na hora de realizar a pesqusia
por similaridade em texto.
"""
# 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']
from langchain.chains import RetrievalQA # Tem que atualizar --> pip install langchai==0.0.137
from langchain.llms import OpenAI
from langchain.document_loaders import TextLoader
from langchain.document_loaders import PyPDFLoader
from langchain.indexes import VectorstoreIndexCreator
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
# As seguinte biblioteca é para usar os Embeddings do HuggingFace:
from langchain.embeddings import HuggingFaceEmbeddings
# Definimos a variável de ambiente CUDA_VISIBLE_DEVICES como um valor inválido para a GPU ou seja CPU:
os.environ["CUDA_VISIBLE_DEVICES"] = "-1" # "0" para usar GPU "-1" para CPU
# Carregando meu documento em PDF:
# loader = PyPDFLoader("/home/and_other_stuff_too/docs/carta-de-servicos-ao-cidadao-seedf-agosto23.pdf")
# #documents = loader.load()
# documents = loader.load_and_split()
loader = TextLoader("/home/eddygiusepe/1_Eddy_Giusepe/6_REPO_HuggingFace/12_LangChain_Router_Chains_and_other_stuff_too/docs/carta01.txt")
documents = loader.load()
# Dividir os documentos em chunks:
#text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000,
chunk_overlap=50,
separators="\n\n"
)
texts = text_splitter.split_documents(documents=documents) # Para .pdf e .txt
persist_directory = './chromadb'
# Selecione que EMBEDDINGS quer usar:
embeddings = OpenAIEmbeddings()
# embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") # Default --> "sentence-transformers/all-mpnet-base-v2" "neuralmind/bert-large-portuguese-cased"
# from transformers import AutoModel
# model_name="sentence-transformers/all-mpnet-base-v2"
# model = AutoModel.from_pretrained(model_name)
# print("O tamanho do Embedding é: ", model.config.hidden_size)
# # Crie o vectorestore para usar como índice (index):
# db = Chroma(collection_name='eddy_1',
# embedding_function=embeddings,
# persist_directory=persist_directory)
# db.add_documents(documents=texts, embeddings=embeddings)
# db.persist()
# Crie o vectorestore para usar como índice (index):
db = Chroma.from_documents(texts, embeddings, persist_directory=persist_directory)
# Exponha este índice em uma interface de recuperação:
retriever = db.as_retriever(search_type="similarity", search_kwargs={"k":3})
# Crie uma cadeia para responder perguntas:
qa = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=retriever,
return_source_documents=True)
# query = "Qual é a descrição da EMMP?"
# result = qa({"query": query})
# print(result['result'])
""""
Lembrar que o SCORE na hora de realizar a Pesquisa por Similaridade é um float que está
relacionado com a Distância. Default é DISTÂNCIA EUCLIDIANA 🧐
"""
# #query = """A McDonald’s tem algum colaborador infetado?"""
# query = """Como são criados os frangos?"""
# docs_score = db.similarity_search_with_score(query=query, distance_metric="cos", k = 4)
# #docs_score = db.similarity_search(query=query)
# print(docs_score[0][0].page_content)
# print("")
# print(docs_score)
# print("Os scores de distância: ")
# print(docs_score[0][1])
# print(docs_score[1][1])
# print(docs_score[2][1])
# print(docs_score[3][1])
print("\033[033mDigite a sua pergunta para similarity search:🤓\033[m ")
print("")
while True:
query = input("\033[033mPergunta do usuário:🤓\033[m ")
#docs_score = db.similarity_search_with_score(query=query, distance_metric="cos", k=2)
#print(docs_score)
print("")
resposta = qa({"query": query})
print("\033[033mA resposta mais SIMILAR é: \033[m", resposta['result'])
print("")
if not query:
break