Spaces:
No application file
No application file
EddyGiusepe
commited on
Commit
•
3323643
1
Parent(s):
84621f1
QA do PDF retriever
Browse files- 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 |
+
|