案例目标本案例展示了如何使用VoyageAI多模态嵌入模型和MongoDB Atlas向量搜索构建一个高效的图像检索系统。该系统能够通过文本查询检索相关图像实现了跨模态检索功能。具体目标包括从HuggingFace数据集加载图像数据使用VoyageAI多模态嵌入模型生成图像嵌入向量将图像嵌入存储在MongoDB Atlas向量数据库中实现基于文本查询的图像检索功能展示检索结果并评估系统性能技术栈与核心依赖本案例使用了以下技术栈和核心依赖# 核心依赖 pip install datasets pip install llama-index-embeddings-voyageai pip install llama-index-vector-stores-mongodb pip install llama-index-indices-multi-modal pip install pymongo pip install matplotlib pip install pillowdatasets: 用于从HuggingFace加载数据集llama-index-embeddings-voyageai: 提供VoyageAI多模态嵌入模型llama-index-vector-stores-mongodb: 提供MongoDB Atlas向量搜索集成llama-index-indices-multi-modal: 提供多模态索引功能pymongo: MongoDB Python客户端matplotlib: 用于图像可视化pillow: 用于图像处理环境配置在运行本案例之前需要配置以下环境变量# 设置环境变量 export MONGO_URIyour_mongodb_atlas_connection_string export VOYAGE_API_KEYyour_voyageai_api_key注意请确保您已经创建了MongoDB Atlas账户并设置了向量搜索索引。同时您需要从VoyageAI获取API密钥。案例实现1导入必要的库import os import base64 from io import BytesIO from PIL import Image import matplotlib.pyplot as plt from datasets import load_dataset from llama_index.core import SimpleDirectoryReader, Settings, StorageContext from llama_index.core.schema import ImageDocument from llama_index.multi_modal_llms.openai import OpenAIMultiModal from llama_index.embeddings.voyageai import VoyageEmbedding from llama_index.vector_stores.mongodb import MongoDBAtlasVectorSearch from llama_index.indices.multi_modal import MultiModalVectorStoreIndex from pymongo import MongoClient2定义图像显示函数def plot_images(image_data_list, image_indicesNone): 显示图像列表 参数: image_data_list: 图像数据列表 image_indices: 要显示的图像索引列表 if image_indices is None: image_indices range(len(image_data_list)) num_images len(image_indices) fig, axes plt.subplots(1, num_images, figsize(15, 5)) if num_images 1: axes [axes] for i, idx in enumerate(image_indices): image_bytes image_data_list[idx] image Image.open(BytesIO(image_bytes)) axes[i].imshow(image) axes[i].set_title(fImage {idx}) axes[i].axis(off) plt.tight_layout() plt.show()3从HuggingFace加载数据集# 从HuggingFace加载数据集 print(Loading dataset...) dataset load_dataset(princeton-nlp/CharXiv, splitvalidation) print(fDataset loaded with {len(dataset)} examples) # 只取前50张图像作为示例 image_bytes [] for i in range(min(50, len(dataset))): image_data dataset[i][image_bytes] image_bytes.append(image_data)4显示加载的图像# 显示图像 print(Showing images...) plot_images(image_bytes, [x for x in range(len(image_bytes))])5创建图像文档print(Creating documents...) documents [ ImageDocument(imagebase64.b64encode(img), metadata{index: ndx}) for ndx, img in enumerate(image_bytes) ]6设置MongoDB Atlas和VoyageAI# 连接到MongoDB Atlas print(Setup...) # 使用环境变量存储敏感凭据 MONGO_URI os.environ.get(MONGO_URI, ) VOYAGE_API_KEY os.environ.get(VOYAGE_API_KEY, ) db_name multimodal_test collection_name test client MongoClient(MONGO_URI) # 设置图像存储用于图像嵌入 image_store MongoDBAtlasVectorSearch( client, db_namedb_name, collection_namef{collection_name}_image, vector_index_nameimage_vector_index, ) image_store.create_vector_search_index( dimensions1024, pathembedding, similaritycosine ) # 设置文本存储用于文本嵌入如果将来需要 text_store MongoDBAtlasVectorSearch( client, db_namedb_name, collection_namef{collection_name}_text, vector_index_nametext_vector_index, ) text_store.create_vector_search_index( dimensions1024, pathembedding, similaritycosine ) # 创建存储上下文 storage_context StorageContext.from_defaults( vector_storetext_store, image_storeimage_store ) # 初始化Voyage AI嵌入模型 Settings.embed_model VoyageEmbedding( voyage_api_keyVOYAGE_API_KEY, model_namevoyage-multimodal-3, truncationFalse, ) Settings.chunk_size 100 Settings.chunk_overlap 107将图像存储到MongoDB Atlas# 将文档存储到MongoDB Atlas向量搜索 print(Storing documents in MongoDB Atlas Vector Search...) # 创建一个知道如何路由不同文档类型的多模态索引 index MultiModalVectorStoreIndex.from_documents( documents, storage_contextstorage_context, show_progressTrue, image_embed_modelSettings.embed_model, ) print(Finished storing images.)8测试图像检索# 创建一个专门使用图像存储的检索器 retriever index.as_retriever(similarity_top_k2) # 执行查询 print(Performing query...) nodes retriever.text_to_image_retrieve( 3D loss landscapes for different training strategies )9显示检索结果# 显示结果 print(fFound {len(nodes)} results:) result_images [] for i, node in enumerate(nodes): ndx node.metadata[index] result_images.append(ndx) plot_images(image_bytes, result_images) print(Querying finished)10关闭MongoDB连接client.close() print(MongoDB connection closed)案例效果本案例实现了一个高效的跨模态图像检索系统具有以下效果跨模态检索能够使用文本查询检索相关图像实现了文本到图像的跨模态检索功能高效存储使用MongoDB Atlas向量搜索存储和检索图像嵌入支持大规模图像数据高质量嵌入使用VoyageAI多模态嵌入模型生成高质量的图像嵌入向量易于扩展系统架构支持轻松添加更多图像和扩展功能案例实现思路本案例的实现思路可以概括为以下几个步骤数据准备从HuggingFace数据集加载图像数据并将其转换为适合处理的格式嵌入生成使用VoyageAI多模态嵌入模型为每张图像生成嵌入向量向量存储将图像嵌入向量存储在MongoDB Atlas向量数据库中并创建适当的索引查询处理接收文本查询使用相同的嵌入模型生成查询向量相似度搜索在MongoDB Atlas中执行向量相似度搜索找到最相关的图像结果展示将检索结果可视化展示给用户扩展建议基于本案例的实现可以考虑以下扩展方向多模态查询支持图像文本的混合查询提供更精确的检索结果图像标注添加自动图像标注功能丰富图像元数据高级过滤实现基于元数据的高级过滤功能如按类别、日期等过滤性能优化优化嵌入生成和向量搜索性能支持更大规模的数据集用户界面开发直观的用户界面提供更好的用户体验实时更新支持实时添加新图像并更新索引多语言支持支持多语言文本查询扩大应用范围总结本案例展示了如何使用VoyageAI多模态嵌入模型和MongoDB Atlas向量搜索构建一个高效的图像检索系统。该系统实现了文本到图像的跨模态检索功能能够根据文本查询找到相关图像。通过结合VoyageAI的高质量多模态嵌入和MongoDB Atlas的强大向量搜索能力我们构建了一个可扩展、高效的图像检索解决方案。这种跨模态检索技术在许多实际应用场景中都非常有用例如电子商务产品搜索、数字资产管理、内容推荐系统等。通过本案例的学习您可以了解如何构建类似的系统并根据实际需求进行定制和扩展。