Press "Enter" to skip to content

构建基于NodeJS的文本和图像搜索AI应用程序

向量搜索是将生成式人工智能的魔力带入您的应用程序的强大方法。如果您拥有正确的工具,这并不一定困难。在这里,我将向您展示一种使用DataStax Astra DB(以及向量搜索)支持的stargate-mongoose和JSON API构建NodeJS应用程序的简单方法。

我是DataStax Stargate团队的一名新工程师。在Stargate团队中,开发演示应用程序是一项传统任务。我决定使用Stargate的新JSON API和Mongoose驱动程序Stargate-Mongoose来构建一个nodeJS应用程序,同时利用两者的优势。

计算机和相机是我两个痴迷的领域。无论是一行代码还是构成照片的线条,我都喜欢逻辑和艺术创造力给我的生活带来的丰富多彩。因此,为了将我两个的激情结合起来,我决定构建Photography-Site作为组织我的作品的方式。为了使其成为一个AI应用程序,我还决定利用Astra DB中的向量相似性搜索功能。

Stargate-Mongoose和JSON API

我对JavaScript并不特别精通,但构建这个应用程序仍然相对容易。

Mongoose是一个广泛使用的对象数据映射工具,通常与MongoDB驱动程序配对使用,并拥有活跃的JavaScript开发者社区。开源API框架Stargate提供了一个名为stargate-mongoose的新Mongoose驱动程序。它是Mongoose的另一种驱动程序,基于Stargate的新JSON API,该API是Stargate的一个独立微服务,通过JSON文档接口访问存储在Cassandra集群中的数据。

这种合作为Mongoose开发人员提供了一个开源解决方案,标志着Apache Cassandra发展的一个重要阶段。通过stargate-mongoose与Mongoose和新的JSON API协同工作,JavaScript开发人员可以获得出色的面向JSON的数据模型体验,并能够利用Cassandra的可扩展性和性能进行构建。

Stargate JSON API和Stargate-Mongoose完全支持Astra Vector Search,它赋予了AI模型在集合中查找与指定查询最相关的特定信息的能力。这个过程的一个关键方面是保存嵌入向量的能力,嵌入向量是用于表示不同对象或实体之间相似性的浮点数集合。Astra DB Vector Search将这个特性集成到无服务器的Astra DB数据库中。

架构

演示应用程序是使用Express Web应用程序框架开发的Node.js应用程序。它使用Stargate-Mongoose作为Mongoose驱动程序来存储和获取所有数据(包括向量)从Astra DB中获取数据。Stargate-Mongoose依赖于Stargate JSON API来访问Astra DB。

至于向量搜索部分,该应用程序使用OpenAI嵌入式API生成文本嵌入向量,并使用Google MediaPipe生成图像嵌入向量。这些详细信息将在后面讨论。

Photography-Site应用程序演练

在这里,我将逐步介绍应用程序支持的各种操作,并向您展示一些关键的API调用,使这些操作成为可能。

基本功能

该应用支持基本功能,如按类别浏览图片,浏览最新图片,显示随机图片,添加图片和按名称搜索图片。

应用在主页上按类别呈现图片。为了使用Stargate-Mongoose在Astra DB中存储和获取数据,我们首先需要构建数据模型。然后,一个简单的find方法将为您获取数据。

一旦应用使用photo模型获取到照片列表,它可以填充主屏幕:

点击具体的照片将显示其详细信息,包括照片名称、照片类别和照片描述。

在幕后,这使用Mongoose的findById方法从Astra DB获取目标照片。

const photo = await Photo.findById(photoId);

该应用支持添加照片,包括照片名称、照片描述、类别和照片图像本身作为输入。

当用户点击“添加照片”时,应用程序将创建一个新的照片对象并调用保存方法;数据将保存到Astra DB中。

该应用程序可以通过文本相似度搜索照片。您可以描述您想要的照片或场景,并将其作为输入进行搜索。在幕后,该功能使用文本嵌入和Datastax向量搜索。

请记住,每次添加照片时,都需要将照片描述作为数据模型字段。您需要获取该描述文本,并调用OpenAI文本嵌入API来获取相应的嵌入向量。同样,在进行文本相似度搜索时,您还会为搜索文本获取一个嵌入向量。然后,您可以使用向量搜索并使用查找和排序方法来进行相似度搜索。

const description_embedding = await getTextEmbedding(searchTerm); cosnt photos = await Photo.find({}).sort({ $vector: { $meta: description_embedding } }).limit(3);

在下面的屏幕截图中,您可以看到,我们搜索了“一片供牛吃草的地方”。然后,我们得到了两个照片结果。它们都包含草,并且其中都有一些食草动物。因此,文本相似度搜索的结果是有意义的。

除了文本相似度搜索,我还构建了另一个有趣的功能,即图像相似度搜索。首先需要生成图像嵌入向量。这次,您可以使用Google MediaPipe生成图像嵌入,具体模型是mobilenet_v3_large.tflite。为了执行此操作,您可以依赖python-shell在NodeJS环境中运行Python脚本。在获取图像嵌入向量之后,我们可以进行向量搜索。

在这里,我们有一张“日落中的汽车”图片。我们可以搜索它以获取相似的图片结果。

如您所见,我们有三个结果。它们都具有日落色调,并且它们都遵循一种模式,即上面是明亮的天空,下面是黑暗的大地。

Leave a Reply

Your email address will not be published. Required fields are marked *