引言
图像搜索有何价值?
- 帮你找身份证:在海量相册里搜索身份证
- 电商神器:淘宝"拍立淘"让你拍照变订单
- 设计师救星:3秒找到可商用的高清素材图
老搜索vs新搜索的区别
老搜索:像查字典,必须输入正确关键词
新搜索:像跟人聊天,图片/语音都能搜,还能理解表情包
为什么选BGE-VL+Milvus这个王炸组合?
- 就像给搜索引擎装了"人脑"(BGE-VL理解图片内涵)
- 加上"闪电手"Milvus(毫秒级匹配海量图片)
- 效果:既懂你要什么,又能光速给出结果
阅读文本你将学会:
- 如何搭建自己的多模态搜索引擎(以文搜图、以图搜图、以图搜文)
- 了解多模态搜索的基本原理
像做菜一样搭建AI搜图系统(简易五步法)
技术名词 | 生活化比喻 |
---|---|
向量 | 图片的"指纹" |
相似度计算 | “口味对比” |
索引 | 冰箱的"智能标签" |
准备食材(技术配料表)
🔧 你需要:
1. 电脑(带显卡更佳,像 RTX3060"炒菜锅")
2. Python 3.8+("厨房刀具")
3. 两个核心调料包:
- BGE-VL-Base模型(图像特征"提取器")
- Milvus数据库(向量"保鲜柜")
第一步:洗菜切菜(搭建环境)
安装python
下载对应版本的miniconda: https://repo.anaconda.com/miniconda/
下载BGE-VL-Base
模型
https://huggingface.co/BAAI/BGE-VL-base这个模型比较小,速度快,有更高需求的可以下载大语言模型:https://huggingface.co/BAAI/BGE-VL-MLLM-S1
第二步:炒菜(提取图像特征)
一句话解释:让AI模型"品尝"图片并记住味道特征
from modelscope import AutoModel
MODEL_NAME = "BAAI/BGE-VL-base" # 可以指定本地路径,就不用去网上下载了
model = AutoModel.from_pretrained(MODEL_NAME, trust_remote_code=True)
model.set_processor(MODEL_NAME)
model.eval()
model = model.to("cuda")
def cal_vector(img_path):
with torch.no_grad():
vector = model.encode(
images = [img_path]
)
features = vector[0].cpu()
return features
❗ 常见翻车:不同的模型输入的图像特征长度使不一样的,如
BGE-VL-base
维度使512
第三步:保鲜存储(存入Milvus)
生活类比:把菜分装贴标签放冰箱(向量数据库)
创建一个"智能冰箱分区"
# pip install -U pymilvus
from pymilvus import MilvusClient
# 创建一个"智能冰箱分区"
collection_name = "milvus_demo.db"
client = MilvusClient(collection_name)
# 1. Create a schema
schema = MilvusClient.create_schema(
auto_id=False,
enable_dynamic_field=False,
)
# 2. 添加需要的字段,我这里id用来存放32为文件的md5哈希
schema.add_field(field_name="id", max_length=32, datatype=DataType.VARCHAR, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=512)
schema.add_field(field_name="file_path", datatype=DataType.VARCHAR, max_length=512)
# 3. 创建数据库
client.create_collection(
collection_name=collection_name,
schema=schema,
dimension=512, # 指定特征的维度,我们的模型是512
)
把特征向量和图片ID一起冷藏
# 把特征向量和图片ID一起冷藏
client.insert(
collection_name=collection_name,
data={
"id": str(index),
"vector": vector.tolist(),
"file_path": f"file_{index}.jpg",
}
)
第四步:快速翻找(搜索逻辑)
工作流程:
- 用户上传图片 → 提取"味道特征"
- 在冰箱里找"相似味道"的菜 → 返回结果TOP5
res = client.search(
collection_name=collection_name,
anns_field="vector",
data=[query_vector.tolist()],
limit=5, # top5
output_fields=["id", "file_path"] # 指定需要返回的字段
)
print(res)
第五步:摆盘上菜(展示结果)
可以直接打印,也可以写交互界面如html
、Gradio
for hits in res:
for hit in hits:
print(hit)
✅ 恭喜! 你现在已经拥有了一个Pinterest级别的搜图核心引擎!
原理解析继续往下看:
🛵 用"外卖小哥"的故事理解Milvus
场景设定
假设你开了一家万能超市:
- 商品 = 图片的向量特征(每张图对应一个"味道指纹")
- 顾客 = 用户上传的搜索图片
- 外卖小哥 = Milvus的搜索算法
1. 原始情况(暴力搜索)
❌ 方法:每次新订单来了,让小哥从超市门口开始,挨个货架对比所有商品的味道
🚫 问题:超市有100万商品时,小哥跑到腿断也送不完
(对应技术:线性搜索时间复杂度O(n))
2. 初级优化——分区域配送(IVF_FLAT索引)
🛒 超市改造:
- 把商品按口味相似度分到不同区域(比如"甜食区"、“辣味区”)
- 每个区域配一个口味雷达(聚类中心)
📦 配送流程:
-
顾客下单后,先用雷达快速确定最匹配的3个区域
# 类似Milvus的nprobe参数 search_params = {"nprobe": 3} # 只检查3个最像的区域
-
小哥只在这3个区域内精细对比
✅ 效果:配送时间从2小时→15分钟
(对应技术:倒排索引,牺牲少量精度换速度)
3. 高级优化——建立小路网(HNSW索引)
🛣️ 超市升级:
-
在所有商品之间建立多层快捷小路
-
- 上层路网:连接距离远的商品(高速公路)
- 下层路网:连接距离近的商品(小区道路)
🚴 配送玄机:
- 小哥从顶层开始,像玩跳棋一样快速接近目标区域
- 到底层后,通过密集小路精确找到最近邻居
🔍 名词解释:
索引类型 | 类比 | 适合场景 |
---|---|---|
IVF_FLAT | 分区域配送 | 商品口味差异大时 |
HNSW | 多层小路网 | 商品口味细分类时 |
(对应技术:近邻图算法,适合高维向量)
4. 极端情况处理
🍔 场景1:顾客非要找"微辣但带点甜"的奇葩商品
👉 解决方案:调整ef
参数,让小哥多跑几条路仔细找
search_params = {"ef": 32} # 搜索范围扩大
🛑 场景2:超市突然停电(服务重启)
👉 应急预案:
- 提前让小哥记住主干道路线(预加载索引)
- 准备备用发电机(WAL日志机制)
💡 用户能直接复用的代码彩蛋
# 像选择外卖软件配送方案一样选索引
def choose_index(total_images):
if total_images < 100_000:
return "HNSW" # 小超市用复杂路网
else:
return "IVF_FLAT" # 大仓库用区域划分
哈哈,接下来我们用「奶茶店分装」来破解Faiss的PQ量化技术,保证让你笑着学会最难的优化算法!
🧋 用奶茶店操作台理解Faiss-PQ量化(含完整可运行代码)
场景设定
假设你的AI搜图系统突然爆火,每天要处理1000万张图片,Milvus服务器开始冒烟… 这时候就需要像奶茶店那样搞「分装预制」!
🧊 第一步:原料标准化(向量切分)
▌现实问题
每张图的特征向量有512维(相当于奶茶要用512种原料调配),太复杂了!
▌奶茶店妙招:
-
把512维向量切分成8段(每段64维)
# 像把奶茶原料按种类分装 sub_vectors = np.split(big_vector, 8)
-
每段单独处理,相当于:
-
- • 第1段:茶基底(0-63维)
- • 第2段:糖分(64-127维)
- • …
- • 第8段:小料(448-511维)
❗ 关键点:每个工人只需要记住自己那段的配方,不用管全部512种原料
🏷️ 第二步:建立原料代码本(训练聚类)
▌操作台秘密:
每个工段准备256种标准配方(用K-Means聚类生成):
# 类似奶茶店糖分预制:无糖/3分/5分/全糖...
kmeans = faiss.Kmeans(64, 256) # 每段64维,聚成256类
kmeans.train(sub_vectors[0])
🎯 效果:
当新图片进来时,把它的每个分段匹配到最接近的标准配方:
# 像判断顾客要的糖度接近哪档
codes = [kmeans.index.search(sub_vec,1)[1] for sub_vec in sub_vectors]
# 得到类似 [253, 182, 7, ...] 的8个编码
💸 第三步:极速出品(量化搜索)
▌省时秘诀:
- 预处理:把所有图片特征都转换成8个编码(比如
[253,182,7,...]
) - 搜索时:只需要比对这些编码的距离,不用算完整向量
# 建立量化索引(类似奶茶店条码系统)
quantizer = faiss.IndexFlatL2(512)
index = faiss.IndexIVFPQ(quantizer, 512, 100, 8, 8)
# 参数解释:100=分区数,8=分段数,8=每段比特数
🚀 速度对比:
搜索方式 | 计算量 | 类比 |
---|---|---|
原始搜索 | 512维全量计算 | 现萃茶(等20分钟) |
PQ量化 | 8个编码比对 | 用预制料摇杯(30秒出货) |
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。