
Após uma aula de matemática aprofundada, vamos colocar em prática nossos novos conhecimentos e criar um dos melhores bancos de dados baseados em contexto.
Preparem suas lupas e seus chapéus, pois Vector Holmes está de volta.
Operando com Vetores
Para operar com o vetor associado a um texto, imagem ou som, utilizaremos uma biblioteca Python chamada sentence-transformers, que nos permite transformar o conteúdo em um vetor.
Para implementar isso, devemos criar a seguinte função:
ClassMethod Embedding(Text) [ Language = python ]
{
from sentence_transformers import SentenceTransformer
model_name = 'sentence-transformers/all-MiniLM-L6-v2'
# Cache in global variables of the embedded Python module (persistent per process).
global _cached_embedding_model
if '_cached_embedding_model' not in globals():
_cached_embedding_model = SentenceTransformer(model_name)
vector = _cached_embedding_model.encode(
[Text],
normalize_embeddings=True,
convert_to_numpy=True,
show_progress_bar=False
)
return str(vector[0].tolist())
}
Este método "vetoriza" o conteúdo do nosso texto utilizando uma biblioteca pré-treinada chamada "all-MiniLM-L6-v2". No entanto, se desejar, você pode modificá-lo e utilizar sua própria biblioteca treinada.
Primeiros Passos
Nota: Para acessar o terminal da nossa instância Docker, utilize o seguinte comando:
Docker-compose exec iris iris session iris
Vamos usar um exemplo de busca vetorizada. Para isso, utilizaremos uma tabela chamada St.vectorsearch.Feeling, que possui os seguintes campos:
Você pode criar os dados executando o seguinte comando:
Do ##class(St.vectorsearch.Data).Init()
Em seguida, vamos carregar os dados de sentimento do diretório /opt/irisbuild/data/training.csv, utilizando o comando Populate da classe St.vectorsearch.Data.
USER>do ##class(St.vectorsearch.Data).Populate()
Truncating table St_vectorsearch.Feeling
Preparing to load data from file training.csv
Loading data from file training.csv
Total records loaded: 2000
Calculating vectors for records...
Processing 496 of 2000
Seja paciente, pois isso criará um vetor para cada registro e pode levar bastante tempo.
Nota: O comando Populate inicializará um modelo de dados com 2.000 registros. Existe outro arquivo com 5.410 registros, caso você queira mais informações no modelo de dados. Se desejar trabalhar com esse arquivo, utilize o comando PopulateFull() em vez disso.
Os valores dos sentimentos são os seguintes:
Por exemplo:
“Saí com meu buquê de tulipas vermelhas e amarelas debaixo do braço, me sentindo um pouco mais otimista do que quando cheguei.” Tem o valor 1 (Alegria).
“Não consigo entrar em nenhuma loja onde não me sinta confortável.” Tem o valor 4 (Medo).
Se usarmos essa função para criar vetores, o primeiro texto que passarmos retornará o próximo vetor:
.034666668623685836791, .012147962115705013276, .020678628236055374146,
.043785430490970611572, .030321707949042320251, -.0081106657162308692932,
-.028869708999991416931, -.059950094670057296752, .067945346236228942871,
-.070874534547328948974, -.060159780085086822509, .016239311546087265014,
-.034665744751691818237, -.011642633005976676941, .080176420509815216064,
………
.0099751437082886695861, .0098187308758497238159, .00016082286310847848653, .013545278459787368774, -.0049553057178854942321, .054155148565769195556, .025806473568081855773, -.038503900170326232911, .039657127112150192261,
-.073851920664310455322, -.070615962147712707519, .066068030893802642822,
-.082378372550010681152, -.043505564332008361816, -.0054294602014124393463
Nota: O valor do vetor foi reduzido para evitar que o texto ficasse muito longo; na verdade, o vetor possui 384 valores.
Se buscarmos outro texto alegre ao criar o vetor, obteremos o seguinte valor.
Exemplo:
“Hoje, estou muito feliz.”
[-0.007015716750174761, 0.05171322077512741, 0.0045058708637952805, -0.04008815810084343, 0.009171668440103531, -0.04867621883749962, 0.08268272876739502, 0.004975424613803625, -0.062008269131183624,
……
0.036987580358982086, 0.027985544875264168, 0.05382953956723213, 0.031146947294473648, -0.011256292462348938, 0.005441852379590273]
Esses dados não fazem sentido no momento, pois não faremos uma comparação valor a valor. Isso significa que não buscaremos um registro com exatamente o mesmo valor que o vetor, uma vez que cada vetor é diferente. Para isso, utilizaremos as fórmulas explicadas na primeira parte.
Utilizaremos os seguintes comandos SQL para identificar quais vetores estão mais próximos daquele que calculamos.