简要: 了解 Manticore Search 如何通过文本描述搜索图像,将自然语言处理与向量表示的搜索相结合。我们将讨论不同的路径——从传统方法到基于向量搜索的现代解决方案。如果您想实时查看所有内容,请访问 我们的演示 。
引言
想象一下,可以只用文字描述所需的图像,例如:“海滩上的日落”。现在这不是幻想,而是现实。基于文本的图像搜索将语言与视觉内容结合在一起。
传统的方法(基于关键字搜索或手动标记)往往不够准确且难以扩展。现代方法,如 Manticore Search 的解决方案,利用语义理解和向量表示,以提供更准确且上下文相关的结果。这对于在线商店、媒体库或创意任务服务尤为方便,帮助简化内容处理。
想看看它是如何工作的?试试 我们的演示!
基于文本的图像搜索方法
1. 基于关键字的搜索
最简单的方法。首先创建一个表:
CREATE TABLE images (
title text,
description text,
tags text,
path string stored
);
然后手动为每个图像添加标签。之后可以执行查询:
SELECT * FROM images WHERE MATCH('@tags 红色裙子');
或者按标题和描述进行搜索:
SELECT * FROM images WHERE MATCH('@(title,description) 红色裙子');
这里的搜索是基于文本元数据和查询的比较。这个方法简单,但需要手动标记并且限制较大。它无法理解单词之间的广泛关系或其上下文,并且依赖于精确匹配,而不是语义。
2. 使用分类的搜索
为了改善商品或其他对象的搜索,可以添加类别。这样用户就可以根据所选类别过滤图像,同时使用全文搜索。这简化了那些寻找特定内容的用户的体验。
一个表的示例可能看起来如下:
CREATE TABLE images (
category_id int,
subcategory_id int,
attributes json,
path string stored
);
采用这种方法,所有图像都被分配到预定的类别中。这提供了一种比单纯的关键字更明确的结构,但限制了灵活性,因为一切都严格绑定于预先定义的组。此外,还需要手动决定每张图片的分类。
3. 使用图像说明的搜索
存在各种 AI 模型,可以自动生成图像的简短描述(说明)。虽然这些自动生成的说明并不总是适合公开展示,但它们非常好地补充了基于关键字的搜索。
无论您如何结构化数据——通过类别或手动标记——都需要利用全文搜索工具,以便从所需字段提取信息。
假设您希望手动添加说明。那么过程可以这样进行:
- 添加带有正确格式的说明的数据:
INSERT INTO images (id, auto_caption, indexed_caption, path) VALUES (1, '一个人走在海滩上看日落', '海滩 日落 人', '/images/sunset_beach.jpg'), (2, '街上的红车', '车 红色 城市', '/images/red_car.jpg');
- 对 indexed_caption 字段进行简单的文本搜索:
SELECT * FROM images WHERE MATCH('@indexed_caption 海滩 日落');
- 使用扩展运算符进行更精确的搜索:
-- 短语搜索 SELECT * FROM images WHERE MATCH('"红车"'); -- 复杂查询 SELECT * FROM images WHERE MATCH('@indexed_caption (海滩 | 日落) -夜晚');
如何改善结果?
- 从说明中删除停用词。
- 调整词干提取,以涵盖不同形式的单词。
- 为流行术语添加同义词。
- 调整相关性系数,以提供更精确的结果。
可以将全文搜索与过滤器结合:
SELECT path, WEIGHT() as relevance
FROM images
WHERE MATCH('@indexed_caption 日落')
AND category_id = 1
ORDER BY relevance DESC
LIMIT 10;
4. 向量搜索(推荐方法)
在此之前,我们讨论了传统方法:基于关键字的搜索、分类搜索和使用说明的搜索。所有这些方法都解决了相似问题,但在处理更复杂或模糊的查询时可能无能为力。
为了绕过这些限制,Manticore Search 提供了向量搜索。它依赖于数据的向量表示,并允许根据意义匹配文本和图像。下面我们将探讨它是如何工作的,以及设置它所需的内容。
向量搜索是如何工作的?
向量搜索使用嵌入——数值向量,反映数据的语义特征。多模态模型为文本和图像生成嵌入,然后根据值的相似性,而非相同的关键字进行匹配。
总体步骤如下:
- 使用机器学习模型为文本和图像创建向量表示(嵌入)。
- 这些向量存储在可以快速进行相似性搜索的数据库中。
- 查询与数据库中的向量进行比较,最终获得语义上最接近的结果。
以下是一个简化的示意图,展示了如何将文本和图像转换为嵌入并通过 Manticore Search 进行搜索:
使用 Manticore 设置向量搜索
让我们来看看需要进行哪些步骤:
选择多模态模型
例如,TinyCLIP(CLIP的简化版本),它可以为文本和图像构建嵌入。连接模型和处理器:from transformers import CLIPProcessor, CLIPModel clip_model = CLIPModel.from_pretrained("wkcn/TinyCLIP-ViT-61M-32-Text-29M-LAION400M") clip_processor = CLIPProcessor.from_pretrained("wkcn/TinyCLIP-ViT-61M-32-Text-29M-LAION400M")
创建数据库中的表
准备存储向量的结构:CREATE TABLE images ( id bigint, image_path text, embeddings float_vector knn_type='hnsw' knn_dims='512' hnsw_similarity='COSINE' );
生成并加载嵌入
使用模型处理图像,获取它们的嵌入并插入数据库。作为示例,可以查看 GitHub上的load-dataset脚本 。向数据库发起查询
$embeddings = $Embed->getImageEmbeddings($image->getPath()); $query = new Manticoresearch\Query\KnnQuery('embeddings', $embeddings, 10); $docs = $client->index('image')->search($query)->get();
向量搜索的优势
如果您使用Manticore实现图像搜索,利用向量嵌入,将获得一系列显著的优点:
- 语义理解:根据整体意义而非精确的单词匹配,将查询与图像对应。
- 对视觉概念的灵活性:能够很好地捕捉到微妙的视觉细节,并将其与描述相关联。
- 自然语言的便利性:允许使用普通短语和问题。
- 高准确性:适用于抽象或复杂查询。
- 可扩展性:不需要持续的手动标注,并能够轻松处理大规模集合。
方法比较
以下是不同方法在实际条件下表现的简要总结:
方法 | 描述 | 准确性 | 配置难度 | 维护 | 查询速度 |
---|---|---|---|---|---|
关键词搜索 | 将查询与手动标记的标签进行匹配。最简单,但无法理解语义。 | 较低 | 较低 | 较高 | 快速 |
分类搜索 | 根据预先设定的组明确组织图像,提供结构化搜索。 | 中等 | 中等 | 较高 | 快速 |
使用标签的搜索 | 自动或手动描述,补充关键词。 | 中等 | 较高 | 中等 | 快速 |
向量搜索 | 构建嵌入并根据语义进行比较,而非形式上的匹配。 | 较高 | 较高 | 较低 | 中等 |
每种选择都有其优缺点。选择最适合您的任务和资源的选项。
尝试Demo
想亲自看看一切吗?我们有一个开源的Demo项目。您可以查看GitHub上的仓库,并根据自己的需求进行设置: Manticore图像搜索Demo。
在仓库中,有详细的说明和脚本示例,方便您快速启动或修改应用程序。这是测试和实际生产的一个良好起点。
结论
基于文本的Manticore搜索的图像向量搜索相较于经典方法具有显著优势。它提供:
- 非常精确的查询与相关图像的匹配。
- 最小的手动工作(不需要到处标记标签)。
- 考虑词语与图像之间的语义关系。
- 良好的可扩展性,随着图像数量的增加而增长。
尽管关键词搜索或分类在某些情况下也会有用,但目前向量方法被认为是图像文本搜索中最现代、最有效的方式。
不信?请访问我们的Demo image.manticoresearch.com 或查看GitHub上的源代码: Manticore图像搜索Demo.