Descrição geral da incorporação
A incorporação é um conceito de aprendizagem automática para mapear dados num espaço de elevada dimensão, onde dados de semântica semelhante são colocados próximos uns dos outros. Sendo normalmente uma Rede Neural Profunda do BERT ou de outras famílias de Transformadores, o modelo de incorporação pode representar eficazmente a semântica de texto, imagens e outros tipos de dados com uma série de números conhecidos como vectores. Uma caraterística fundamental destes modelos é que a distância matemática entre vectores no espaço de elevada dimensão pode indicar a semelhança da semântica do texto ou das imagens originais. Esta propriedade abre muitas aplicações de recuperação de informação, como os motores de pesquisa da Web, como o Google e o Bing, a pesquisa de produtos e as recomendações em sítios de comércio eletrónico, e o paradigma recentemente popular da Geração Aumentada de Recuperação (RAG) na IA generativa.
Existem duas categorias principais de embeddings, cada uma produzindo um tipo diferente de vetor:
Incorporação densa: A maioria dos modelos de incorporação representa a informação como um vetor de vírgula flutuante de centenas a milhares de dimensões. O resultado é designado por vectores "densos", uma vez que a maioria das dimensões tem valores diferentes de zero. Por exemplo, o popular modelo de incorporação de código aberto BAAI/bge-base-en-v1.5 produz vectores de 768 números de vírgula flutuante (vetor flutuante de 768 dimensões).
Incorporação esparsa: Em contrapartida, os vectores de saída das incorporações esparsas têm a maior parte das dimensões igual a zero, nomeadamente os vectores "esparsos". Estes vectores têm frequentemente dimensões muito mais elevadas (dezenas de milhares ou mais), o que é determinado pela dimensão do vocabulário de símbolos. Os vectores esparsos podem ser gerados por redes neurais profundas ou pela análise estatística de corpora de texto. Devido à sua interpretabilidade e às melhores capacidades de generalização observadas fora do domínio, as incorporações esparsas são cada vez mais adoptadas pelos programadores como um complemento às incorporações densas.
Milvus é uma base de dados vetorial concebida para a gestão, armazenamento e recuperação de dados vectoriais. Ao integrar os principais modelos de incorporação e classificação, pode facilmente transformar o texto original em vectores pesquisáveis ou classificar os resultados utilizando modelos poderosos para obter resultados mais precisos para RAG. Esta integração simplifica a transformação de texto e elimina a necessidade de componentes adicionais de incorporação ou classificação, optimizando assim o desenvolvimento e a validação de RAG.
Para criar embeddings em ação, consulte Utilizar o modelo do PyMilvus para gerar embeddings de texto.
Função de incorporação | Tipo de função | API ou código aberto |
---|---|---|
openai | Densa | API |
transformador de frases | Denso | Com código aberto |
bm25 | Esparso | De código aberto |
Splade | Esparso | De fonte aberta |
bge-m3 | Híbrido | De fonte aberta |
voyageai | Densa | API |
jina | Densa | API |
cohere | Densa | API |
Instrutor | Densa | Código aberto |
IA Mistral | Densa | API |
Nomic | Densa | API |
mGTE | Híbrida | De fonte aberta |
Exemplo 1: Utilizar a função de incorporação predefinida para gerar vectores densos
Para usar funções de incorporação com Milvus, primeiro instale a biblioteca cliente PyMilvus com o subpacote model
que envolve todos os utilitários para a geração de incorporação.
pip install "pymilvus[model]"
O subpacote model
suporta vários modelos de incorporação, desde OpenAI, Sentence Transformers, BGE M3, BM25, até modelos pré-treinados SPLADE. Para simplificar, este exemplo utiliza o DefaultEmbeddingFunction
que é um modelo de transformador de frases totalmente MiniLM-L6-v2, o modelo tem cerca de 70MB e será descarregado durante a primeira utilização:
from pymilvus import model
# This will download "all-MiniLM-L6-v2", a light weight model.
ef = model.DefaultEmbeddingFunction()
# Data from which embeddings are to be generated
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
embeddings = ef.encode_documents(docs)
# Print embeddings
print("Embeddings:", embeddings)
# Print dimension and shape of embeddings
print("Dim:", ef.dim, embeddings[0].shape)
O resultado esperado é semelhante ao seguinte:
Embeddings: [array([-3.09392996e-02, -1.80662833e-02, 1.34775648e-02, 2.77156215e-02,
-4.86349640e-03, -3.12581174e-02, -3.55921760e-02, 5.76934684e-03,
2.80773244e-03, 1.35783911e-01, 3.59678417e-02, 6.17732145e-02,
...
-4.61330153e-02, -4.85207550e-02, 3.13997865e-02, 7.82178566e-02,
-4.75336798e-02, 5.21207601e-02, 9.04406682e-02, -5.36676683e-02],
dtype=float32)]
Dim: 384 (384,)
Exemplo 2: Gerar vectores densos e esparsos numa única chamada com o modelo BGE M3
Neste exemplo, utilizamos o modelo híbrido BGE M3 para incorporar texto em vectores densos e esparsos e utilizá-los para obter documentos relevantes. Os passos gerais são os seguintes:
Incorporar o texto como vectores densos e esparsos utilizando o modelo BGE-M3;
Criar uma coleção Milvus para armazenar os vectores densos e esparsos;
Inserir os dados no Milvus;
Pesquisar e inspecionar o resultado.
Primeiro, precisamos de instalar as dependências necessárias.
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
from pymilvus import (
utility,
FieldSchema, CollectionSchema, DataType,
Collection, AnnSearchRequest, RRFRanker, connections,
)
Utilize o BGE M3 para codificar documentos e consultas para recuperação de incorporação.
# 1. prepare a small corpus to search
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
query = "Who started AI research?"
# BGE-M3 model can embed texts as dense and sparse vectors.
# It is included in the optional `model` module in pymilvus, to install it,
# simply run "pip install pymilvus[model]".
bge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
docs_embeddings = bge_m3_ef(docs)
query_embeddings = bge_m3_ef([query])
Exemplo 3: Gerar vectores esparsos utilizando o modelo BM25
O BM25 é um método bem conhecido que utiliza frequências de ocorrência de palavras para determinar a relevância entre consultas e documentos. Neste exemplo, mostraremos como usar BM25EmbeddingFunction
para gerar embeddings esparsos para consultas e documentos.
Primeiro, importe a classe BM25EmbeddingFunction.
from pymilvus.model.sparse import BM25EmbeddingFunction
No BM25, é importante calcular as estatísticas nos seus documentos para obter o IDF (Inverse Document Frequency), que pode representar o padrão nos seus documentos. O IDF é uma medida da quantidade de informação que uma palavra fornece, ou seja, se é comum ou rara em todos os documentos.
# 1. prepare a small corpus to search
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
query = "Where was Turing born?"
bm25_ef = BM25EmbeddingFunction()
# 2. fit the corpus to get BM25 model parameters on your documents.
bm25_ef.fit(docs)
# 3. store the fitted parameters to disk to expedite future processing.
bm25_ef.save("bm25_params.json")
# 4. load the saved params
new_bm25_ef = BM25EmbeddingFunction()
new_bm25_ef.load("bm25_params.json")
docs_embeddings = new_bm25_ef.encode_documents(docs)
query_embeddings = new_bm25_ef.encode_queries([query])
print("Dim:", new_bm25_ef.dim, list(docs_embeddings)[0].shape)
O resultado esperado é semelhante ao seguinte:
Dim: 21 (1, 21)