EddyGiusepe commited on
Commit
3323643
1 Parent(s): 84621f1

QA do PDF retriever

Browse files
Files changed (1) hide show
  1. QA_PDF_teste.py +124 -0
QA_PDF_teste.py ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Data Scientist.: PhD.Eddy Giusepe Chirinos Isidro
3
+
4
+ CHROMA
5
+ ======
6
+
7
+ Chroma é um banco de dados para criar aplicativos de IA com Embeddings.
8
+
9
+ Aqui vou estudar e analisar certos parâmetros relevantes na hora de realizar a pesqusia
10
+ por similaridade em texto.
11
+ """
12
+ # Substitua sua chave de API OpenAI:
13
+ import openai
14
+ import os
15
+ from dotenv import load_dotenv, find_dotenv
16
+ _ = load_dotenv(find_dotenv()) # read local .env file
17
+ openai.api_key = os.environ['OPENAI_API_KEY']
18
+
19
+
20
+ from langchain.chains import RetrievalQA # Tem que atualizar --> pip install langchai==0.0.137
21
+ from langchain.llms import OpenAI
22
+ from langchain.document_loaders import TextLoader
23
+ from langchain.document_loaders import PyPDFLoader
24
+ from langchain.indexes import VectorstoreIndexCreator
25
+ from langchain.text_splitter import CharacterTextSplitter
26
+ from langchain.embeddings import OpenAIEmbeddings
27
+ from langchain.vectorstores import Chroma
28
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
29
+ # As seguinte biblioteca é para usar os Embeddings do HuggingFace:
30
+ from langchain.embeddings import HuggingFaceEmbeddings
31
+
32
+
33
+ # Definimos a variável de ambiente CUDA_VISIBLE_DEVICES como um valor inválido para a GPU ou seja CPU:
34
+ os.environ["CUDA_VISIBLE_DEVICES"] = "-1" # "0" para usar GPU "-1" para CPU
35
+
36
+
37
+ # Carregando meu documento em PDF:
38
+ # loader = PyPDFLoader("/home/and_other_stuff_too/docs/carta-de-servicos-ao-cidadao-seedf-agosto23.pdf")
39
+ # #documents = loader.load()
40
+ # documents = loader.load_and_split()
41
+
42
+
43
+ loader = TextLoader("/home/eddygiusepe/1_Eddy_Giusepe/6_REPO_HuggingFace/12_LangChain_Router_Chains_and_other_stuff_too/docs/carta01.txt")
44
+ documents = loader.load()
45
+
46
+
47
+ # Dividir os documentos em chunks:
48
+ #text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
49
+ text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000,
50
+ chunk_overlap=50,
51
+ separators="\n\n"
52
+ )
53
+ texts = text_splitter.split_documents(documents=documents) # Para .pdf e .txt
54
+
55
+
56
+ persist_directory = './chromadb'
57
+
58
+ # Selecione que EMBEDDINGS quer usar:
59
+ embeddings = OpenAIEmbeddings()
60
+ # embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") # Default --> "sentence-transformers/all-mpnet-base-v2" "neuralmind/bert-large-portuguese-cased"
61
+ # from transformers import AutoModel
62
+ # model_name="sentence-transformers/all-mpnet-base-v2"
63
+ # model = AutoModel.from_pretrained(model_name)
64
+ # print("O tamanho do Embedding é: ", model.config.hidden_size)
65
+
66
+
67
+ # # Crie o vectorestore para usar como índice (index):
68
+ # db = Chroma(collection_name='eddy_1',
69
+ # embedding_function=embeddings,
70
+ # persist_directory=persist_directory)
71
+
72
+
73
+ # db.add_documents(documents=texts, embeddings=embeddings)
74
+ # db.persist()
75
+ # Crie o vectorestore para usar como índice (index):
76
+ db = Chroma.from_documents(texts, embeddings, persist_directory=persist_directory)
77
+
78
+ # Exponha este índice em uma interface de recuperação:
79
+ retriever = db.as_retriever(search_type="similarity", search_kwargs={"k":3})
80
+
81
+
82
+ # Crie uma cadeia para responder perguntas:
83
+ qa = RetrievalQA.from_chain_type(
84
+ llm=OpenAI(),
85
+ chain_type="stuff",
86
+ retriever=retriever,
87
+ return_source_documents=True)
88
+
89
+ # query = "Qual é a descrição da EMMP?"
90
+ # result = qa({"query": query})
91
+ # print(result['result'])
92
+
93
+ """"
94
+ Lembrar que o SCORE na hora de realizar a Pesquisa por Similaridade é um float que está
95
+ relacionado com a Distância. Default é DISTÂNCIA EUCLIDIANA 🧐
96
+ """
97
+ # #query = """A McDonald’s tem algum colaborador infetado?"""
98
+ # query = """Como são criados os frangos?"""
99
+ # docs_score = db.similarity_search_with_score(query=query, distance_metric="cos", k = 4)
100
+ # #docs_score = db.similarity_search(query=query)
101
+
102
+ # print(docs_score[0][0].page_content)
103
+ # print("")
104
+ # print(docs_score)
105
+ # print("Os scores de distância: ")
106
+ # print(docs_score[0][1])
107
+ # print(docs_score[1][1])
108
+ # print(docs_score[2][1])
109
+ # print(docs_score[3][1])
110
+
111
+ print("\033[033mDigite a sua pergunta para similarity search:🤓\033[m ")
112
+ print("")
113
+ while True:
114
+ query = input("\033[033mPergunta do usuário:🤓\033[m ")
115
+ #docs_score = db.similarity_search_with_score(query=query, distance_metric="cos", k=2)
116
+ #print(docs_score)
117
+ print("")
118
+ resposta = qa({"query": query})
119
+ print("\033[033mA resposta mais SIMILAR é: \033[m", resposta['result'])
120
+ print("")
121
+ if not query:
122
+ break
123
+
124
+