【多模态】19-基于Nomic Embed和Anthropic的多模态RAG系统
案例目标本案例展示如何使用LlamaIndex、Nomic Embed和Anthropic构建一个多模态RAG检索增强生成系统。该系统能够同时处理文本和图像数据实现跨模态的信息检索和生成为用户提供更全面、更准确的答案。技术栈与核心依赖LlamaIndex: 用于构建多模态索引和检索系统Nomic Embed Text v1.5: 用于文本嵌入的模型Nomic Embed Vision v1.5: 用于图像嵌入的模型Anthropic Claude 3: 用于多模态推理和生成Qdrant: 向量数据库用于存储文本和图像嵌入Wikipedia API: 用于获取维基百科文章和图像环境配置%pip install llama-index-vector-stores-qdrant llama-index-multi-modal-llms-anthropic llama-index-embeddings-nomic %pip install llama-index ftfy regex tqdm %pip install matplotlib scikit-image %pip install -U qdrant_client %pip install wikipedia需要设置以下环境变量import os os.environ[NOMIC_API_KEY] your_nomic_api_key os.environ[ANTHROPIC_API_KEY] your_anthropic_api_key案例实现步骤1: 下载维基百科文章文本从维基百科API获取指定主题的文章文本并保存到本地文件夹。from pathlib import Path import requests wiki_titles [ batman, Vincent van Gogh, San Francisco, iPhone, Tesla Model S, BTS, ] data_path Path(data_wiki) for title in wiki_titles: response requests.get( https://en.wikipedia.org/w/api.php, params{ action: query, format: json, titles: title, prop: extracts, explaintext: True, }, ).json() page next(iter(response[query][pages].values())) wiki_text page[extract] if not data_path.exists(): Path.mkdir(data_path) with open(data_path / f{title}.txt, w) as fp: fp.write(wiki_text)步骤2: 下载维基百科图像从维基百科页面下载相关图像并为每个图像分配唯一ID。import wikipedia import urllib.request from pathlib import Path import time image_path Path(data_wiki) image_uuid 0 image_metadata_dict {} MAX_IMAGES_PER_WIKI 30 wiki_titles [ San Francisco, Batman, Vincent van Gogh, iPhone, Tesla Model S, BTS band, ] if not image_path.exists(): Path.mkdir(image_path) for title in wiki_titles: images_per_wiki 0 print(title) try: page_py wikipedia.page(title) list_img_urls page_py.images for url in list_img_urls: if url.endswith(.jpg) or url.endswith(.png): image_uuid 1 image_file_name title _ url.split(/)[-1] image_metadata_dict[image_uuid] { filename: image_file_name, img_path: ./ str(image_path / f{image_uuid}.jpg), } req urllib.request.Request( url, dataNone, headers{ User-Agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36 }, ) with urllib.request.urlopen(req) as response, open( image_path / f{image_uuid}.jpg, wb ) as out_file: out_file.write(response.read()) images_per_wiki 1 if images_per_wiki MAX_IMAGES_PER_WIKI: break time.sleep(1) except Exception as e: print(e) print(f{images_per_wiki}) continue步骤3: 构建多模态向量存储使用Qdrant创建向量数据库并分别存储文本和图像嵌入。import qdrant_client from llama_index.core import SimpleDirectoryReader from llama_index.vector_stores.qdrant import QdrantVectorStore from llama_index.core import VectorStoreIndex, StorageContext from llama_index.core.indices import MultiModalVectorStoreIndex from llama_index.embeddings.nomic import NomicEmbedding # Create a local Qdrant vector store client qdrant_client.QdrantClient(pathqdrant_db) text_store QdrantVectorStore( clientclient, collection_nametext_collection ) image_store QdrantVectorStore( clientclient, collection_nameimage_collection ) storage_context StorageContext.from_defaults( vector_storetext_store, image_storeimage_store ) embedding_model NomicEmbedding( model_namenomic-embed-text-v1.5, vision_model_namenomic-embed-vision-v1.5, ) # Create the MultiModal index documents SimpleDirectoryReader(./data_wiki/).load_data() index MultiModalVectorStoreIndex.from_documents( documents, storage_contextstorage_context, embed_modelembedding_model, image_embed_modelembedding_model, )步骤4: 创建图像显示函数定义一个函数来显示检索到的图像。import matplotlib.pyplot as plt import os from PIL import Image def plot_images(image_paths): images_shown 0 plt.figure(figsize(16, 9)) for img_path in image_paths: if os.path.isfile(img_path): image Image.open(img_path) plt.subplot(2, 3, images_shown 1) plt.imshow(image) plt.xticks([]) plt.yticks([]) images_shown 1 if images_shown 9: break步骤5: 执行多模态检索使用查询检索相关文本和图像。test_query Who are the band members in BTS? # generate retrieval results retriever index.as_retriever(similarity_top_k3, image_similarity_top_k5) retrieval_results retriever.retrieve(test_query)步骤6: 显示检索结果显示检索到的文本和图像。retrieved_image [] for res_node in retrieval_results: if isinstance(res_node.node, ImageNode): retrieved_image.append(res_node.node.metadata[file_path]) else: display_source_node(res_node, source_length200) plot_images(retrieved_image)步骤7: 初始化多模态查询引擎使用Anthropic的多模态模型创建查询引擎。from llama_index.multi_modal_llms.anthropic import AnthropicMultiModal query_engine index.as_query_engine( llmAnthropicMultiModal(), similarity_top_k2, image_similarity_top_k1 )步骤8: 执行多模态查询使用查询引擎执行查询并获取结果。response query_engine.query( What are Vincent van Goghs famous paintings and popular subjects? ) print(str(response))案例效果系统能够根据用户查询同时检索相关文本和图像并使用Claude 3进行多模态推理。例如当查询梵高的著名画作和流行主题时系统能够检索到相关文本和图像并生成以下回答根据提供的上下文文森特·梵高的一些最著名的画作和流行主题包括- 以大胆的颜色和戏剧性的笔触为特色的风景画、静物画、肖像画和自画像。这促进了现代艺术中表现主义的兴起。- 在他的早期作品中他主要描绘静物和农民劳动者。- 1888年搬到法国南部的阿尔勒后他的画作变得更加明亮他开始关注描绘自然世界包括当地的橄榄林、麦田和向日葵。- 他一些售价超过1亿美元按当今等价价格计算的最昂贵的画作包括《加歇医生的肖像》、《约瑟夫·鲁林的肖像》和《鸢尾花》。- 大都会艺术博物馆于1993年以5700万美元收购了他的画作《麦田与柏树》。总而言之梵高尤其以他居住过的地方如阿尔勒的充满活力、表现力强的风景画、肖像画以及向日葵、橄榄林和麦田等主题的静物画而闻名。他对色彩的大胆运用和厚重、戏剧性的笔触对后来的艺术运动产生了深远影响。案例实现思路数据准备: 从维基百科获取多个主题的文本和图像数据构建多模态数据集。嵌入模型: 使用Nomic Embed的文本和视觉模型分别对文本和图像进行嵌入将它们转换为向量表示。向量存储: 使用Qdrant向量数据库分别存储文本和图像嵌入创建两个不同的集合collection。多模态索引: 使用LlamaIndex的MultiModalVectorStoreIndex创建多模态索引将文本和图像关联起来。检索机制: 根据查询同时检索相关文本和图像使用不同的嵌入模型对查询进行编码。多模态推理: 将检索到的文本和图像传递给Claude 3进行多模态推理和生成。扩展建议更多数据源: 扩展到其他数据源如新闻文章、科学论文、产品目录等。高级检索策略: 实现更复杂的检索策略如重排序、混合检索等。多语言支持: 添加对多语言文本和图像的支持。实时更新: 实现索引的实时更新机制支持动态添加新数据。用户界面: 开发友好的用户界面支持图像上传和交互式查询。性能优化: 优化嵌入和检索过程提高系统响应速度。评估指标: 开发专门的评估指标来衡量多模态RAG系统的性能。总结本案例展示了如何使用LlamaIndex、Nomic Embed和Anthropic构建一个高效的多模态RAG系统。该系统能够同时处理文本和图像数据实现跨模态的信息检索和生成。通过将文本和图像嵌入存储在Qdrant向量数据库中并使用Claude 3进行多模态推理系统能够提供更全面、更准确的答案。这种多模态RAG方法在知识检索、内容分析和智能问答等领域具有广泛的应用前景。

相关新闻

储水式电热水器选购与使用全攻略:从防电墙技术到一级能效解析

储水式电热水器选购与使用全攻略:从防电墙技术到一级能效解析

最近在帮朋友家装修选家电,热水器这块真是让人纠结——既要考虑容量够不够用,又要看加热快不快、省不省电,安全更是头等大事。朋友家四口人,点名要大容量,还要速热,预算还得控制。市面上型号眼花缭乱&#…

2026/10/18 10:17:04 阅读更多 →
LLM智能体分层架构:从任务规划到无人机自主巡检的工程实践

LLM智能体分层架构:从任务规划到无人机自主巡检的工程实践

1. 项目概述:当智能体从代码走向天空最近在工业自动化和AI领域,一个趋势越来越明显:大型语言模型(LLM)驱动的智能体(Agent)不再满足于在数字世界里处理文本、生成代码或分析数据,它们…

2026/10/18 10:17:23 阅读更多 →
Unlock-Music 免费实测:不装软件不传文件,3 分钟把加密歌单解锁成 MP3

Unlock-Music 免费实测:不装软件不传文件,3 分钟把加密歌单解锁成 MP3

Unlock-Music 免费实测:不装软件不传文件,3 分钟把加密歌单解锁成 MP3 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.de…

2026/10/18 10:17:24 阅读更多 →

最新新闻

高德交通态势爬取实战:Python采集道路级速度与拥堵等级数据

高德交通态势爬取实战:Python采集道路级速度与拥堵等级数据

简介:面向交通数据分析、城市规划与GIS应用开发者,这份高德交通态势爬取资源使用脚本调用高德地图接口,获取实时路况、拥堵指数等态势信息,并兼顾请求限速与反爬策略,可直接用于后续交通流分析及ArcGIS空间数据预处理。…

2026/10/18 12:37:31 阅读更多 →
库存表只放数量是事故起点:流水+余额双表设计防超卖

库存表只放数量是事故起点:流水+余额双表设计防超卖

简介:面向仓库管理系统设计与开发人员,提供一套完整的数据库设计资料。内容围绕仓库、物资、库存、采购订单、入库记录与出库记录六大核心实体展开,逐一给出字段定义与外键关联,完整覆盖入库、出库、库存监控和采购等业务场景&…

2026/10/18 12:37:31 阅读更多 →
Linux运维核心命令:文件权限、进程排查与日志分析

Linux运维核心命令:文件权限、进程排查与日志分析

拿一份Linux操作指南来背,是很多刚接触服务器的人最先做的事。我常被问到:Linux到底怎么学?有没有一份命令大全?我一般会反问:你现在最想干的事是什么?架个网站,还是处理一台跑得很慢的机器&…

2026/10/18 12:37:31 阅读更多 →
SpringBoot+Uniapp小文件上传接口实战:MultipartFile与安全存储全解析

SpringBoot+Uniapp小文件上传接口实战:MultipartFile与安全存储全解析

大家在做这类“智能视频推荐小程序”的系列教程时,往往会先把目光集中在 AI 模型调用、推荐算法、视频流处理这些亮点功能上。但实际项目开发中,很多基础能力反而会卡住不少人,文件上传就是其中一个很典型的环节。无论用户换头像、上传视频封…

2026/10/18 12:37:31 阅读更多 →
VxWorks在ARM9上的BSP移植:从启动流程到常见坑

VxWorks在ARM9上的BSP移植:从启动流程到常见坑

简介:面向嵌入式开发者的VxWorks基于ARM9(S3C2410X)的板级支持包(BSP)资源,适用于工业控制、航空电子等嵌入式系统开发者,重点解决硬件平台启动、驱动适配与内核移植过程中的关键问题。压缩包共…

2026/10/18 12:37:31 阅读更多 →
三机九节点潮流计算MATLAB实战:从Y矩阵到牛顿-拉夫逊迭代

三机九节点潮流计算MATLAB实战:从Y矩阵到牛顿-拉夫逊迭代

简介:面向电力系统学习与研究,这份MATLAB程序实现了经典IEEE三机九节点系统的潮流计算,适合电气专业学生、研究生以及电网分析工程师用作教学演示、课程作业或科研算例。压缩包体积仅2KB,共含3个文件:2个txt数据文件分…

2026/10/18 12:36:30 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →