EddyGiusepe commited on
Commit
9eabecd
·
1 Parent(s): b5cc5c3

Usando redis e Embeddings 🤖

Browse files
Files changed (1) hide show
  1. main.py +103 -0
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)}🤗')