EddyGiusepe's picture
Calculando EMBEDDINGS, exemplos
4b463b1
"""
Data Scientist.: PhD.Eddy Giusepe Chirinos Isidro
main.py
=======
Objetivo: Este script calcula os EMBEDDINGS de qualquer TEXTO usando
a API da OpenAI e o modelo 'text-embedding-ada-002'. Logo
esses Embeddings são armazenado no Banco de Dados 'redis'.
Versão: 1.0.0
Data: 27/06/2023
Autor: Dr.Eddy Giusepe
Método de execução:
$ python main.py
"""
import os
import openai
import numpy as np
import time
from redis_client import RedisClient # Chamo à Classe que crie
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
openai.api_key = os.getenv('OPENAI_API_KEY')
Eddy_RedisHost = os.environ["REDIS_HOST"]
Eddy_RedisPort = os.environ["REDIS_PORT"]
def get_embedding(text):
"""Recupera Embeddings do cache redis, se não existir, crie-a e armazene-a no cache e retorne-a"""
redis_client = RedisClient(host=Eddy_RedisHost, port=Eddy_RedisPort)
key = text
if not redis_client.exists(key): # Chamo ao método da minha Classe 'RedisClient'
time.sleep(1)
print("Criando Embeddings para: " + text)
response = openai.Embedding.create(input=text,
model = "text-embedding-ada-002"
)
embeddings = response['data'][0]['embedding']
redis_client.set(key, embeddings) # Aqui salvamos esses 'embeddings'
else:
embeddings = redis_client.get(key) # Como existe, simplesmente 'get' desse Embedding
return embeddings
def cosine_similarity(a, b):
"""Calcula a similaridade de cosseno entre dois Embeddings."""
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
def similarity(text1, text2):
"""Calcula a similaridade entre dois textos."""
embedding1 = get_embedding(text1)
embedding2 = get_embedding(text2)
return cosine_similarity(embedding1, embedding2)
def similarity_list(text, text_list):
"""Calcula a similaridade entre um texto e uma lista de textos."""
embedding1 = get_embedding(text)
similarities = []
for text2 in text_list:
embedding2 = get_embedding(text2)
similarities.append(cosine_similarity(embedding1, embedding2))
return similarities
def most_similar(text, text_list):
"""Calcula a similaridade entre um texto e uma lista de
textos e retorna o texto mais similar."""
similarities = similarity_list(text, text_list)
return text_list[similarities.index(max(similarities))]
def most_similar_with_similarity(text, text_list):
"""Calcula a similaridade entre um texto e uma lista de textos
e retornar o texto mais similar e sua similaridade."""
similarities = similarity_list(text, text_list)
return text_list[similarities.index(max(similarities))], max(similarities)
def most_similar_with_similarity_threshold(text, text_list, threshold):
"""Calcula a similaridade entre um texto e uma lista de textos e
retornar o texto mais similar e sua similaridade se a similaridade
estiver abaixo de um limite, retornar Nenhum"""
similarities = similarity_list(text, text_list)
max_similarity = max(similarities)
if max_similarity < threshold:
return None, max_similarity
return text_list[similarities.index(max_similarity)], max_similarity
if __name__ == '__main__':
# BÚSQUEDAS INTELIGENTES CON OPENAI
text_list = ['Los felinos dicen', 'Los caninos dicen',\
'Los bovinos dicen', 'Tengo un terreno en ayacucho', 'Tengo una casa en Piura']
text = 'meaw'
print(f'El texto 🧐{text}🧐 es mais similar com: 🤗{most_similar(text, text_list)}🤗')
print("")
text_Eddy = """Eu sou Cientista de Dados e sou casado com a Karina ❤️"""
print("Gerando Embeddings de: ", get_embedding(text_Eddy))