Spaces:
No application file
No application file
Commit ·
9eabecd
1
Parent(s): b5cc5c3
Usando redis e Embeddings 🤖
Browse files
main.py
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Data Scientist.: PhD.Eddy Giusepe Chirinos Isidro
|
| 3 |
+
|
| 4 |
+
main.py
|
| 5 |
+
=======
|
| 6 |
+
Objetivo: Este script calcula os EMBEDDINGS de qualquer TEXTO usando
|
| 7 |
+
a API da OpenAI e o modelo 'text-embedding-ada-002'. Logo
|
| 8 |
+
esses Embeddings são armazenado no Banco de Dados 'redis'.
|
| 9 |
+
|
| 10 |
+
Versão: 1.0.0
|
| 11 |
+
Data: 27/06/2023
|
| 12 |
+
Autor: Dr.Eddy Giusepe
|
| 13 |
+
|
| 14 |
+
Método de execução:
|
| 15 |
+
$ python main.py
|
| 16 |
+
"""
|
| 17 |
+
import os
|
| 18 |
+
import openai
|
| 19 |
+
import numpy as np
|
| 20 |
+
import time
|
| 21 |
+
from redis_client import RedisClient # Chamo à Classe que crie
|
| 22 |
+
|
| 23 |
+
from dotenv import load_dotenv, find_dotenv
|
| 24 |
+
_ = load_dotenv(find_dotenv()) # read local .env file
|
| 25 |
+
openai.api_key = os.getenv('OPENAI_API_KEY')
|
| 26 |
+
|
| 27 |
+
Eddy_RedisHost = os.environ["REDIS_HOST"]
|
| 28 |
+
Eddy_RedisPort = os.environ["REDIS_PORT"]
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
def get_embedding(text):
|
| 32 |
+
"""Recupera Embeddings do cache redis, se não existir, crie-a e armazene-a no cache e retorne-a"""
|
| 33 |
+
redis_client = RedisClient(host=Eddy_RedisHost, port=Eddy_RedisPort)
|
| 34 |
+
key = text
|
| 35 |
+
if not redis_client.exists(key): # Chamo ao método da minha Classe 'RedisClient'
|
| 36 |
+
time.sleep(1)
|
| 37 |
+
print("Criando Embeddings para: " + text)
|
| 38 |
+
response = openai.Embedding.create(input=text,
|
| 39 |
+
model = "text-embedding-ada-002"
|
| 40 |
+
)
|
| 41 |
+
embeddings = response['data'][0]['embedding']
|
| 42 |
+
redis_client.set(key, embeddings) # Aqui salvamos esses 'embeddings'
|
| 43 |
+
else:
|
| 44 |
+
embeddings = redis_client.get(key) # Como existe, simplesmente 'get' desse Embedding
|
| 45 |
+
return embeddings
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
def cosine_similarity(a, b):
|
| 49 |
+
"""Calcula a similaridade de cosseno entre dois Embeddings."""
|
| 50 |
+
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
|
| 51 |
+
|
| 52 |
+
|
| 53 |
+
def similarity(text1, text2):
|
| 54 |
+
"""Calcula a similaridade entre dois textos."""
|
| 55 |
+
embedding1 = get_embedding(text1)
|
| 56 |
+
embedding2 = get_embedding(text2)
|
| 57 |
+
return cosine_similarity(embedding1, embedding2)
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
def similarity_list(text, text_list):
|
| 61 |
+
"""Calcula a similaridade entre um texto e uma lista de textos."""
|
| 62 |
+
embedding1 = get_embedding(text)
|
| 63 |
+
similarities = []
|
| 64 |
+
for text2 in text_list:
|
| 65 |
+
embedding2 = get_embedding(text2)
|
| 66 |
+
similarities.append(cosine_similarity(embedding1, embedding2))
|
| 67 |
+
return similarities
|
| 68 |
+
|
| 69 |
+
|
| 70 |
+
def most_similar(text, text_list):
|
| 71 |
+
"""Calcula a similaridade entre um texto e uma lista de
|
| 72 |
+
textos e retorna o texto mais similar."""
|
| 73 |
+
similarities = similarity_list(text, text_list)
|
| 74 |
+
return text_list[similarities.index(max(similarities))]
|
| 75 |
+
|
| 76 |
+
|
| 77 |
+
def most_similar_with_similarity(text, text_list):
|
| 78 |
+
"""Calcula a similaridade entre um texto e uma lista de textos
|
| 79 |
+
e retornar o texto mais similar e sua similaridade."""
|
| 80 |
+
similarities = similarity_list(text, text_list)
|
| 81 |
+
return text_list[similarities.index(max(similarities))], max(similarities)
|
| 82 |
+
|
| 83 |
+
|
| 84 |
+
def most_similar_with_similarity_threshold(text, text_list, threshold):
|
| 85 |
+
"""Calcula a similaridade entre um texto e uma lista de textos e
|
| 86 |
+
retornar o texto mais similar e sua similaridade se a similaridade
|
| 87 |
+
estiver abaixo de um limite, retornar Nenhum"""
|
| 88 |
+
similarities = similarity_list(text, text_list)
|
| 89 |
+
max_similarity = max(similarities)
|
| 90 |
+
if max_similarity < threshold:
|
| 91 |
+
return None, max_similarity
|
| 92 |
+
return text_list[similarities.index(max_similarity)], max_similarity
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
|
| 96 |
+
if __name__ == '__main__':
|
| 97 |
+
# BÚSQUEDAS INTELIGENTES CON OPENAI
|
| 98 |
+
text_list = ['Los felinos dicen', 'Los caninos dicen',\
|
| 99 |
+
'Los bovinos dicen', 'Tengo un terreno en ayacucho', 'Tengo una casa en Piura']
|
| 100 |
+
|
| 101 |
+
text = 'meaw'
|
| 102 |
+
|
| 103 |
+
print(f'El texto 🧐{text}🧐 es mais similar com: 🤗{most_similar(text, text_list)}🤗')
|