
想象一下,一位客户支持代理能够同时分析一张模糊的屏幕截图,解读一条沮丧的语音消息,并交叉引用技术文档,以提供完美的解决方案。
传统的 RAG 系统已经改变了人工智能检索和处理文本的能力。然而,当客户使用图像、音频或视频进行交互时,它们却举步维艰。
多模态 RAG 打破了这一限制,通过创建统一的向量空间,使得单个查询可以从任何数据类型组合中提取见解,从而改变了我们构建智能应用程序的方式。其结果不仅仅是更好的搜索,更是人工智能最终理解人类体验世界的方式。
什么是多模态 RAG?
生活中的信息并非以整洁的单一流形式提供。当您排除复杂机器的故障时,您不仅仅是阅读手册——您还会扫描图表,聆听技术人员的语音笔记,并观看问题的视频。传统的搜索和仅为文本设计的人工智能系统,通常难以应对这种混合信息。
理解多模态检索增强生成
每个信息片段都被转换为一个向量,一个数学指纹。这些向量存在于一个高维空间中,通过捕获不同格式(而不仅仅是匹配单词)的含义来形成连接。
例如,在客户支持中,用户可能会上传一张错误屏幕的模糊照片,在聊天中描述问题,并附上一段奇怪声音的音频片段。多模态 RAG 系统会从包含带注释图像、故障音频样本和文本文档的知识库中检索相关的故障排除步骤。然后,它会利用所有这三种来源来生成响应。
多模态 RAG 与传统 RAG 的主要区别
传统的 RAG 系统就像只阅读书籍的专业图书管理员——擅长处理文本,但无法处理其他格式。多模态 RAG 就像一个侦探:它阅读、聆听、观察,从所有来源拼凑线索。
- 数据类型:传统 RAG 只处理文本。多模态 RAG 同时处理图像、音频、视频和文本。
- 嵌入空间:多模态 RAG 将所有数据类型投射到共享向量空间中,允许文本查询检索图像或音频片段。
- 检索能力:它支持“任意对任意”检索。例如,一个语音查询可以调出图表,或者一张照片可以检索到相关的手册段落。
在医疗保健领域,多模态 RAG 可以同时分析 X 射线、医生笔记和患者口述症状。传统 RAG 只会处理书面报告。
多模态 RAG 的工作原理
多模态 RAG 的工作原理就像一个爵士乐团:每个部分贡献其独特的输入,结合起来创造出比任何单一来源都更丰富的结果。想象一下您自己作为一名开发人员,正在构建一个能够无缝处理文字、图像、音频和视频的搜索系统。
多模态 RAG 的三个阶段:检索、融合和生成
尽管一个纯文本的 RAG 系统可能会遇到困难,但多模态 RAG 管道通过三个阶段有效地处理各种数据
- 嵌入:在检索开始之前,系统通过使用强大的多模态嵌入模型将每个输入(无论是文本、图像、音频还是视频)编码成向量表示来进行预处理。这些嵌入捕获了每个资产的语义和上下文本质,以实现跨数据类型的有意义比较。
- 存储:一旦创建了嵌入,它们就会与文档元数据或原始文件链接一起存储在向量数据库(如 Meilisearch、FAISS、Milvus 或 Pinecone)中。此步骤确保了无论模态如何,多模态数据都可以通过相似性进行高效索引和检索。
- 检索:系统将每个查询转换为一个向量。它将这些向量与一个庞大的编码数据库进行比较。例如,Meilisearch 存储和检索图像、音频和文本的向量。这使得像“一个带闪烁红灯的按钮”这样的搜索能够同时返回文本指南和带注释的照片。
- 融合:检索后,系统会融合来自不同模态的信息。跨模态注意力机制将口述描述的含义与照片中的视觉细节或手册中的技术语言对齐。此阶段匹配细微差别,就像将歌曲的旋律与画作的心情搭配起来一样。
- 生成:LLM 使用融合的上下文合成响应。输出可能是参考用户照片和技术手册的分步故障排除指南,或融合列表照片和销售数据的房产描述。
此过程使多模态 RAG 能够回答纯文本系统无法回答的复杂问题。
探索嵌入在多模态搜索中的作用
嵌入充当通用翻译器,将文本、图像、音频和视频转换为共享数学空间中的点。这允许语音查询检索相关图像,或照片浮现匹配的产品描述。
嵌入在联合搜索场景中也表现出色。查询可以合并来自图像和文本索引的结果,规范化跨模态的相关性得分。
Meilisearch 支持用户提供的嵌入,允许您使用 CLIP 或 LLaVA 等模型在外部生成向量并将其与文档一起索引。
Meilisearch 的混合搜索结合了语义相似性(通过嵌入)和经典关键词匹配。这确保了对“蓝色跑鞋”的搜索既能返回视觉上相似的产品,也能返回描述匹配的产品。这种方法创造了一种直观而精确的搜索体验,提高了召回率和相关性。
构建多模态 RAG 管道
每个强大的系统都始于坚实的基础。构建多模态 RAG 管道更像是指挥爵士乐团,而不是铺砖。每种数据模态都带来其独特的音调。真正的价值在于它们如何互动。
让我们探索数据、模型和搜索的实际编排,其中每一步都取决于权衡和数据的特殊性。
多模态 RAG 的数据准备:预处理和嵌入
想象一家 SaaS 公司拥有庞大的知识库:PDF 格式的产品手册、客户截图、支持电话的音频日志和视频教程。第一个挑战不是技术性的;它是理解这些人工制品讲述的故事,并将其翻译成您的 AI 能够理解的语言。
- 文本:清理文本并将其分解为段落,然后使用 BERT 或句子转换器等模型将文本嵌入为向量。
from sentence_transformers import SentenceTransformer model = SentenceTransformer('all-MiniLM-L6-v2') passages = ["How to reset your dashboard", "Uploading CSV errors"] # if saving to JSON: vectors = model.encode(passages).tolist()
- 图像:使用 CLIP 将图像(截图、图表)转换为 L2 归一化嵌入(请务必将“device”指定为命名参数)。
import clip from PIL import Image import torch device = "cuda" if torch.cuda.is_available() else "cpu" model, preprocess = clip.load("ViT-B/32", device=device) model.eval() # set eval mode img = preprocess(Image.open("error_screenshot.png")).unsqueeze(0).to(device) with torch.no_grad(): emb = model.encode_image(img) emb = emb / emb.norm(dim=-1, keepdim=True) # L2-normalize # emb is a (1, 512) normalized tensor, ready for search/indexing
- 音频:使用 Wav2Vec 转录和嵌入支持电话,确保将数据移动到 GPU(如果可用),并使用均值池化和归一化聚合最终特征。
import torchaudio import torch from transformers import Wav2Vec2Processor, Wav2Vec2Model device = "cuda" if torch.cuda.is_available() else "cpu" processor = Wav2Vec2Processor.from_pretrained("facebook/wav2vec2-base-960h") model = Wav2Vec2Model.from_pretrained("facebook/wav2vec2-base-960h").to(device) model.eval() waveform, rate = torchaudio.load("call.wav") # [channels, samples] inputs = processor(waveform.squeeze().numpy(), sampling_rate=rate, return_tensors="pt") inputs = {k: v.to(device) for k, v in inputs.items()} with torch.no_grad(): hidden_states = model(**inputs).last_hidden_state # (1, seq_len, hidden_size) audio_emb = hidden_states.mean(dim=1) # (1, hidden_size) audio_emb = audio_emb / audio_emb.norm(dim=-1, keepdim=True) # audio_emb is a pooled, normalized vector for each utterance
- 视频:提取信息帧,使用 CLIP(如上)嵌入每个帧。对于摘要级检索,使用 ASR 引擎生成转录并将其嵌入为文本。
在管道中尽早自动化内容丰富(如标记、时间戳、将图像链接到段落)。
设置检索系统:使用 Meilisearch 进行索引和搜索优化
嵌入后,利用 Meilisearch 进行统一索引和快速混合查询
1. 上传带有用户生成嵌入的文档:每个向量都应与其各自的文档一起存储。
curl -X POST 'https://:7700/indexes/support_docs/documents' -H 'Content-Type: application/json' --data-binary @support_docs_with_embeddings.json
support_docs_with_embeddings.json
中的每个文档都应包含一个字段,例如
{ "id": "IMG_0474", "type": "image", "metadata": { "description": "error screenshot" }, "vector": [0.348, 0.123, 0.582, ...] }
2. 在 Meilisearch 中配置向量字段在 vectorIndexes
中定义您的向量字段(Meilisearch ≥ v1.2 通常如此)
curl -X PATCH 'https://:7700/indexes/support_docs/settings' -H 'Content-Type: application/json' --data-binary '{ "vectorIndexes": { "vector": { "type": "hnsw", "params": { "M": 8, "efConstruction": 64 } } } }'
3. 准备混合搜索请求
curl -X POST 'https://:7700/indexes/support_docs/search' -H 'Content-Type: application/json' --data-binary '{ "q": "dashboard spinning wheel", "vector": [0.032, 0.89, ...], "limit": 10 }'
对于纯向量搜索(无关键词文本),将 q
传递为空字符串
curl -X POST 'https://:7700/indexes/support_docs/search' -H 'Content-Type: application/json' --data-binary '{ "q": "", "vector": [0.032, 0.89, ...], "limit": 10 }'
对于使用 Meilisearch 内部嵌入器的混合搜索
curl -X POST 'https://:7700/indexes/support_docs/search' -H 'Content-Type: application/json' --data-binary '{ "q": "dashboard spinning wheel", "hybrid": { "embedder": "your-embedder-name", "semanticRatio": 0.5 }, "limit": 10 }'
Meilisearch 为大多数主要编程语言和框架提供官方 SDK 和客户端库。
集成生成组件:提示工程和模型选择
有了最相关的(多模态)证据后,为您的 LLM 准备一个连贯的提示。这里有一个图示示例
# 1) retrieve (using SDK to make code shorter) query_emb = embed_query(user_question) results = meili.index("support_docs").search({ "vector": query_emb, "limit": 5 }) # 2) build the context context = "nn".join([hit["text"] for hit in results["hits"]]) # 3) call the LLM prompt = f"""You are a helpful assistant. Use ONLY the following context to answer. Context: {context} Question: {user_question} Answer:""" response = openai.ChatCompletion.create( model="gpt-4", messages=[{"role":"user","content":prompt}] ) print(response.choices[0].message.content)
按清晰度排序证据(文本 → 图像 → 其他媒体),修剪任何不相关的细节,并迭代优化您的提示模板以获得最佳结果。
准备好为您的搜索体验注入活力了吗?提供闪电般的搜索结果,让您的用户保持参与并提高您的转化率。
为您的多模态应用选择合适的向量数据库
选择向量数据库就像为长途旅行选择合适的交通工具。地形——您的数据、查询和延迟需求——决定了最佳选择。以下是一个快速比较
- Meilisearch:结合全文和向量搜索。非常适合电子商务、网络应用、企业搜索和混合用户体验。
- FAISS:速度极快,高度可定制,支持 C++/Python。适用于研究和大规模检索。
- Milvus:可扩展,云原生,支持混合搜索。适用于企业、物联网和视频搜索。
- Pinecone:托管服务,易于扩展,元数据过滤。适用于 SaaS 和生产部署。
构建实时产品搜索的 SaaS 团队可能会选择 Meilisearch,因为它具有混合功能和开发者友好的 API。处理 PB 级科学图像的研究实验室可以依靠 FAISS 的速度和灵活性。这个决定决定了您的用户能够实现什么。
多模态 RAG:开启智能、类人搜索的未来
多模态 RAG 不仅仅代表着技术上的进步。它是人工智能系统向人类理解信息方式的根本转变,涵盖所有格式和语境。
凭借 Meilisearch 的向量搜索功能和低于 20 毫秒的响应时间,您今天就可以开始构建这些复杂的多模态体验。
搜索的未来不仅仅是寻找信息;它关乎彻底理解信息,而这个未来已近在咫尺。