Usando o SuperDuperDB para acelerar o desenvolvimento de IA no MongoDB Atlas Vector Search
Duncan Blythe6 min read • Published Sep 18, 2024 • Updated Sep 18, 2024
SNIPPET
Avalie esse Artigo
Você está interessado em começar a usar pesquisa vetorial e AI no MongoDB Atlas, mas não sabe por onde começar? A jornada pode ser assustadora; os desenvolvedores são confrontados com questões como:
- Qual modelo devo usar?
- Devo usar uma fonte aberta ou fechada?
- Como aplico corretamente meu modelo aos meus dados no Atlas para criar incorporações vetoriais?
- Como faço para configurar corretamente o índice do Atlas Vector Search?
- Devo dividir meu texto ou aplicar um modelo de vetorização diretamente ao texto?
- Como e onde posso servir meu modelo de forma robusta para estar pronto para novas pesquisas, com base nas consultas de texto recebidas?
O SuperDuperDB é um projeto Python de código aberto projetado para acelerar o desenvolvimento de AI com o banco de dados e ajudar a responder a essas perguntas, permitindo que os desenvolvedores se concentrem no que desejam construir, sem se atolarem nos detalhes de exatamente como a pesquisa vetorial e AI de forma mais geral são implementadas.
O SuperDuperDB inclui computação de saídas de modelos e treinamento de modelos, que trabalham diretamente com dados em seu banco de dados, bem como suporte de primeira classe para pesquisa vetorial. Em particular, o SuperDuperDB oferece suporte à MongoDB Community e a Atlas.
Você pode acompanhar o código abaixo, mas, se preferir, todo o código está disponível no repositório SuperDuperDB do GitHub.
1 python -m pip install -U superduperdb[apis]
Depois de instalar o SuperDuperDB, você está pronto para se conectar ao seu sistema do MongoDB Atlas:
1 from superduperdb import superduper 2 3 db = superduper("mongodb+srv://<user>:<password>@...mongodb.net/documents")
Os caracteres finais após o último "/ " denotam o banco de dados ao qual você deseja se conectar. Nesse caso, o banco de dados é chamado de "documentos". Você deve certificar-se de que o usuário está autorizado a acessar esse banco de dados.
A variável
db
é um connector que é simultâneo:- Um cliente de banco de dados.
- Um armazenamento de artefatos para modelos de AI (armazena objetos de arquivo grandes).
- Um armazenamento de metadados, armazenando informações importantes sobre seus modelos conforme eles se relacionam com o banco de dados.
- Uma interface de query permite que você execute query facilmente, incluindo pesquisa vetorial, sem precisar lidar explicitamente com a lógica de converter as queries em vetores.
Vamos ver isso em ação.
Com o SuperDuperDB, os desenvolvedores podem importar wrappers de modelo que oferecem suporte a uma variedade de projetos de código aberto, bem como fornecedores de API de AI, como o OpenAI. Os desenvolvedores podem até definir e programar seus próprios modelos.
Por exemplo, para criar um modelo de vetorização utilizando a API OpenAI, primeiro defina seu
OPENAI_API_KEY
como uma variável de ambiente:1 export OPENAI_API_KEY="sk-..."
Agora, basta importar o wrapper do modelo OpenAI:
1 from superduperdb.ext.openai.model import OpenAIEmbedding 2 3 model = OpenAIEmbedding( 4 identifier='text-embedding-ada-002', model='text-embedding-ada-002')
Para verificar se isso está funcionando, você pode aplicar esse modelo a um único trecho de texto usando o
predict
método, especificando que este é um único ponto de dados com
one=True
.1 'This is a test', one=True) model.predict(2 [-0.008146246895194054, 3 -0.0036965329200029373, 4 -0.0006024622125551105, 5 -0.005724836140871048, 6 -0.02455105632543564, 7 0.01614714227616787, 8 ...]
Como alternativa, também podemos usar um modelo de código aberto (não atrás de uma API), usando, por exemplo, a
sentence-transformers
biblioteca :1 import sentence_transformers 2 from superduperdb.components.model import Model
1 from superduperdb import vector
1 model = Model( 2 identifier='all-MiniLM-L6-v2', 3 object=sentence_transformers.SentenceTransformer('all-MiniLM-L6-v2'), 4 encoder=vector(shape=(384,)), 5 predict_method='encode', 6 postprocess=lambda x: x.tolist(), 7 batch_predict=True, 8 )
Este trecho de código usa o wrapper de base
Model
, que oferece suporte a instâncias de classe de modelo arbitrárias, usando código aberto e interno. Basta fornecer a instância da classe para o parâmetro objeto, especificando opcionalmente as funçõespreprocess
e/ou postprocess
. O argumentoencoder
informa ao Atlas Vector Search o tamanho dos resultados do modelo, e a opçãobatch_predict=True
torna a computação mais rápida.Como antes, podemos testar o modelo:
1 'This is a test', one=True) model.predict(2 [-0.008146246895194054, 3 -0.0036965329200029373, 4 -0.0006024622125551105, 5 -0.005724836140871048, 6 -0.02455105632543564, 7 0.01614714227616787, 8 ...]
Vamos adicionar alguns dados ao MongoDB usando a conexão
db
. Preparamos alguns dados da API do PyMongo para adicionar uma reviravolta meta a este passo a passo. Você pode baixar esses dados com este comando:1 curl -O https://superduperdb-public.s3.eu-west-1.amazonaws.com/pymongo.json
1 import json 2 from superduperdb.backends.mongodb.query import Collection 3 from superduperdb.base.document import Document as D 4 5 with open('pymongo.json') as f: 6 data = json.load(f) 7 8 db.execute( 9 Collection('documents').insert_many([D(r) for r in data]) 10 )
Você verá nesse comando que, em contraste com
pymongo
, superduperdb
inclui objetos de query (
Além desse fato, o
Collection(...)...
). Isso permite que superduperdb
passe as queries para modelos, cálculos e execuções de treinamento, bem como salve as queries para uso futuro.Além desse fato, o
superduperdb
suporta todos os comandos que são suportados pelo núcleo da APIpymongo
.Aqui está um exemplo de busca de alguns dados com o SuperDuperDB:
1 'documents').find_one()) r = db.execute(Collection(2 r3 Document({ 4 'key': 'pymongo.mongo_client.MongoClient', 5 'parent': None, 6 'value': '\nClient for a MongoDB instance, a replica set, or a set of mongoses.\n\n', 7 'document': 'mongo_client.md', 8 'res': 'pymongo.mongo_client.MongoClient', 9 '_fold': 'train', 10 '_id': ObjectId('652e460f6cc2a5f9cc21db4f') 11 })
Você pode ver que os dados normais do MongoDB são agrupados com a classe
Document
.Você pode recuperar o documento desembrulhado com
unpack
:1 r.unpack()2 {'key': 'pymongo.mongo_client.MongoClient', 3 'parent': None, 4 'value': '\nClient for a MongoDB instance, a replica set, or a set of mongoses.\n\n', 5 'document': 'mongo_client.md', 6 'res': 'pymongo.mongo_client.MongoClient', 7 '_fold': 'train', 8 '_id': ObjectId('652e460f6cc2a5f9cc21db4f')}
O motivo pelo qual
superduperdb
usa a abstraçãoDocument
é que, no SuperDuperDB, você mesmo não precisa gerenciar a conversão de dados em bytes. Temos um sistema de tipos configuráveis e controlados pelo usuário, ou "Codificadores", que permitem aos usuários inserir, por exemplo, imagens diretamente. (Este é o tópico de um próximo tutorial! )Agora que você escolheu e testou um modelo e inseriu alguns dados, você pode configurar a pesquisa vetorial no MongoDB Atlas usando o SuperDuperDB. Para fazer isso, execute este comando:
1 from superduperdb import VectorIndex 2 from superduperdb import Listener 3 4 db.add( 5 VectorIndex( 6 identifier='pymongo-docs', 7 indexing_listener=Listener( 8 model=model, 9 key='value', 10 select=Collection('documents').find(), 11 predict_kwargs={'max_chunk_size': 1000}, 12 ), 13 ) 14 )
Esse comando diz a
superduperdb
para fazer várias coisas:- Pesquise a coleção "documentos"
- Configurar um índice vetorial em nosso cluster Atlas, usando o texto no campo "valor" (Listener)
- Use a variável do modelo para criar incorporações vetoriais
Após receber este comando, SuperDuperDB:
- O Atlas do MongoDB configura um índice knn na coleção "documents".
- Salva o objeto de modelo no armazenamento de modelos SuperDuperDB hospedado no Gridfs.
- Aplica o modelo a todos os dados na collection "documents" e salva os vetores nos documentos.
- Salva o fato de que o modelo está conectado ao índice vetorial "pymongo-docs".
Se quiser "reload" seu modelo em uma sessão posterior, você pode fazer isso com o comando
load
:1 "model", 'all-MiniLM-L6-v2') db.load(
Para ver o que aconteceu durante a criação do VectorIndex, podemos ver que os documentos individuais agora contêm vetores:
1 'documents').find_one()).unpack() db.execute(Collection(2 {'key': 'pymongo.mongo_client.MongoClient', 3 'parent': None, 4 'value': '\nClient for a MongoDB instance, a replica set, or a set of mongoses.\n\n', 5 'document': 'mongo_client.md', 6 'res': 'pymongo.mongo_client.MongoClient', 7 '_fold': 'train', 8 '_id': ObjectId('652e460f6cc2a5f9cc21db4f'), 9 '_outputs': {'value': {'text-embedding-ada-002': [-0.024740776047110558, 10 0.013489063829183578, 11 0.021334229037165642, 12 -0.03423869237303734, 13 ...]}}}
As saídas dos modelos são sempre salvas no caminho
"_outputs.<key>.<model>"
dos documentos. Isto permite que o MongoDB Atlas Vector Search saiba onde procurar para criar o índice de pesquisa vetorial rápida.Você também pode verificar se o MongoDB Atlas criou um índice de pesquisa vetorial
knn
fazendo login na sua conta do Atlas e navegando até a guia de pesquisa. Ela terá a seguinte aparência:O verde
Ativo O status indica que o MongoDB Atlas terminou de compreender e “organizing” os vetores para que eles possam ser pesquisados rapidamente.
Se você navegar até o sinal de ..." " em Ações e clicar em Editar com o editor JSON*,* então você poderá inspecionar a definição de índice explícita que foi configurada automaticamente por
superduperdb
:Você pode confirmar a partir desta definição que o índice analisa o caminho
"_outputs.<key>.<model>"
dos documentos em nossa coleção.Agora que nosso índice está pronto, podemos realizar algumas queries "search-by-meaning " usando a conexão
db
:1 'Query the database' query = 2 result = db.execute(3 'documents') Collection(4 'value': query}), vector_index='pymongo-docs', n=5) .like(D({5 'value': 1, 'key': 1}) .find({}, {6 )7 for r in result: 8 print(r.unpack()) 9 10 {'key': 'find', 'value': '\nQuery the database.\n\nThe filter argument is a query document that all results\nmust match. For example:\n\n`pycon\n>>> db'} 11 {'key': 'database_name', 'value': '\nThe name of the database this command was run against.\n\n'} 12 {'key': 'aggregate', 'value': '\nPerform a database-level aggregation.\n\nSee the [aggregation pipeline](https://mongodb.com/pt-br/docs/manual/reference/operato'} 13 {'key': 'alive', 'value': '\nDoes this cursor have the potential to return more data?\n\n'} 14 {'key': 'pymongo.cursor.CursorType', 'value': '\n'}
🚀 Então é isso! 🚀
Você agora consultou um índice de pesquisa vetorial no MongoDB Atlas Vector Search usando um modelo e uma configuração instalados com o SuperDuperDB. Isso exigiu apenas alguns comandos principais em Python, utilizando bibliotecas de modelo e clientes de API do ecossistema de código aberto Python!
superduperdb
tem muito mais a oferecer:- Os desenvolvedores podem trazer seu próprio modelo ou instalar modelos arbitrários do ecossistema de código aberto.
- As API coere e antróficas também são suportadas, além de openai.
- Os desenvolvedores também podem pesquisar por imagens e vídeos.
- Outros casos de uso, além da pesquisa vetorial básica, são suportados:
- Bate-papo com seus Docs
- aprendizado de máquina clássico
- Transferir aprendizagem
- Vector Search com tipos de dados arbitrários
- Muito, muito mais...
O SuperDuperDB é de código aberto e permissivo sob a Apache 2.0 licença. Gostaríamos de encorajar os desenvolvedores interessados no desenvolvimento de código aberto a contribuir para nossos fóruns de discussão e painéis de questões e fazer suas próprias solicitações pull. Nos vemos no GitHub!
Estamos em busca de organizações visionárias que possamos ajudar a identificar e implementar aplicativos de AI transformativos para seus negócios e produtos. Estamos oferecendo isso totalmente de grátis. Se você quiser saber mais sobre esta oportunidade, entre em contato conosco pelo e-mail: Parcerias@superduperdb.com.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.
Relacionado
Tutorial
Influencie a classificação dos resultados de pesquisa com pontuações de funções no Atlas Search
Feb 03, 2023 | 5 min read
Tutorial
Criar um backend de gerenciamento de mídia escalável: integrando Node.js, Armazenamento de blobs Azure e MongoDB
Nov 05, 2024 | 10 min read