LLM之RAG实战(八)| 使用Neo4j和LlamaIndex实现多模态RAG

       人工智能和大型语言模型领域正在迅速发展。一年前,没有人使用LLM来提高生产力。时至今日,很难想象我们大多数人或多或少都在使用LLM提供服务,从个人助手到文生图场景。由于大量的研究和兴趣,LLM每天都在变得越来越好、越来越聪明。不仅如此,他们的理解也开始跨越多种模态。随着GPT-4-Vision和随后的其他LLM的引入,今天的LLM似乎可以很好地处理和理解图像。以下是ChatGPT描述图像中内容的一个示例。

       正如所观察到的,ChatGPT非常善于理解和描述图像。我们可以在RAG应用程序中使用其理解图像的能力,在该应用程序中,我们现在可以将文本和图片中的信息结合起来,生成比以往任何时候都更准确的答案,而不仅仅依靠文本来生成准确和最新的答案。使用LlamaIndex,实现多模态RAG pipeline非常容易。受(https://github.com/run-llama/llama_index/blob/main/docs/examples/multi_modal/gpt4v_multi_modal_retrieval.ipynb)的启发,来测试是否可以使用Neo4j作为数据库来实现多模态RAG应用程序。

       要使用LlamaIndex实现多模态RAG管道,只需实例化两个矢量存储,一个用于图像,另一个用于文本,然后查询这两个矢量,以便检索相关信息以生成最终答案。

       多模态RAG首先需要将数据分为图像和文本,然后分别进行embedding并单独构建索引。对于文本,我们将使用ada-002文本嵌入模型;而对于图像,我们将采用[双编码器模型CLIP](https://github.com/openai/CLIP),CLIP可以将文本和图像嵌入到同一嵌入空间中。当最终用户提出问题时,执行两个向量的相似性搜索:一个用于查找相关图像,另一个用于文档。结果被输入到多模态LLM中,该LLM为用户生成答案,展示了处理和利用混合媒体进行信息检索和响应生成的综合方法。

数据预处理

        我们将使用[Medium](https://github.com/tomasonjo/blog-datasets/blob/main/articles.zip)作为RAG应用程序的基础数据集。这些文章包含了关于Neo4j图形数据科学库以及将Neo4j与LLM框架相结合的大量信息。从Medium下载的文章是HTML格式。因此,我们需要使用一些编码来分别提取文本和图像。

def process_html_file(file_path):    with open(file_path, "r", encoding="utf-8") as file:        soup = BeautifulSoup(file, "html.parser")    # Find the required section    content_section = soup.find("section", {"data-field": "body", "class": "e-content"})    if not content_section:        return "Section not found."    sections = []    current_section = {"header": "", "content": "", "source": file_path.split("/")[-1]}    images = []    header_found = False    for element in content_section.find_all(recursive=True):        if element.name in ["h1", "h2", "h3", "h4"]:            if header_found and (current_section["content"].strip()):                sections.append(current_section)            current_section = {                "header": element.get_text(),                "content": "",                "source": file_path.split("/")[-1],            }            header_found = True        elif header_found:            if element.name == "pre":                current_section["content"] += f"```{element.get_text().strip()}```\n"            elif element.name == "img":                img_src = element.get("src")                img_caption = element.find_next("figcaption")                caption_text = img_caption.get_text().strip() if img_caption else ""                images.append(ImageDocument(image_url=img_src))            elif element.name in ["p", "span", "a"]:                current_section["content"] += element.get_text().strip() + "\n"    if current_section["content"].strip():        sections.append(current_section)    return images, sections

       不会详细介绍解析代码,但我们根据标题h1–h4分割文本并提取图像链接。然后,我们只需通过此函数运行所有文章,即可提取所有相关信息。

all_documents = []all_images = []# Directory to search in (current working directory)directory = os.getcwd()# Walking through the directoryfor root, dirs, files in os.walk(directory):    for file in files:        if file.endswith(".html"):            # Update the file path to be relative to the current directory            images, documents = process_html_file(os.path.join(root, file))            all_documents.extend(documents)            all_images.extend(images)text_docs = [Document(text=el.pop("content"), metadata=el) for el in all_documents]print(f"Text document count: {len(text_docs)}") # Text document count: 252print(f"Image document count: {len(all_images)}") # Image document count: 328

       总共得到252个文本块和328个图像。

对数据创建索引

       如前所述,我们必须实例化两个矢量存储,一个用于图像,另一个用于文本。CLIP嵌入模型的尺寸为512,而ada-002的尺寸为1536。

text_store = Neo4jVectorStore(    url=NEO4J_URI,    username=NEO4J_USERNAME,    password=NEO4J_PASSWORD,    index_name="text_collection",    node_label="Chunk",    embedding_dimension=1536)image_store = Neo4jVectorStore(    url=NEO4J_URI,    username=NEO4J_USERNAME,    password=NEO4J_PASSWORD,    index_name="image_collection",    node_label="Image",    embedding_dimension=512)storage_context = StorageContext.from_defaults(vector_store=text_store)

      现在向量索引已经创建好了,我们使用MultiModalVectorStoreIndex来索引这两种模态的信息。

# Takes 10 min without GPU / 1 min with GPU on Google collabindex = MultiModalVectorStoreIndex.from_documents(    text_docs + all_images, storage_context=storage_context, image_vector_store=image_store)

       MultiModalVectorStoreIndex使用文本和图像嵌入模型来计算嵌入,并在Neo4j中存储和索引结果。仅为图像存储URL,而不是实际的base64或图像的其他表示。

多模态RAG pipeline

       这段代码是直接从LlamaIndex多模式烹饪书中复制的。我们首先定义一个多模态LLM和prompt template,然后将所有内容组合为一个查询引擎。

openai_mm_llm = OpenAIMultiModal(    model="gpt-4-vision-preview", max_new_tokens=1500)qa_tmpl_str = (    "Context information is below.\n"    "---------------------\n"    "{context_str}\n"    "---------------------\n"    "Given the context information and not prior knowledge, "    "answer the query.\n"    "Query: {query_str}\n"    "Answer: ")qa_tmpl = PromptTemplate(qa_tmpl_str)query_engine = index.as_query_engine(    multi_modal_llm=openai_mm_llm, text_qa_template=qa_tmpl)

       现在我们可以继续测试它的性能了。

query_str = "How do vector RAG application work?"response = query_engine.query(query_str)print(response)

        我们还可以可视化检索提取的图像以及用于帮助提供最终答案的图像。

       LLM得到了两个相同的图像作为输入,说明数据集中有重复的图。然而,我对CLIP嵌入感到惊喜,因为他们能够检索到该系列中最相关的图像。在生产环境中,一般需要对数据做预处理,去除重复数据,本文不做此介绍。

结论

       LLM的发展速度比我们历史上习惯的要快,并且跨越了多种模态。我坚信,到明年年底,LLM将很快能够理解视频,因此能够在与你交谈时获得非语言提示。另一方面,我们可以使用图像作为RAG管道的输入,并增强传递给LLM的各种信息,使响应更好、更准确。使用LlamaIndex和Neo4j实现多模式RAG管道非常简单。

参考文献:

[1] https://blog.llamaindex.ai/multimodal-rag-pipeline-with-llamaindex-and-neo4j-a2c542eb0206

[2] https://github.com/tomasonjo/blogs/blob/master/llm/neo4j_llama_multimodal.ipynb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/224940.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

客户跟进没效果?这三招请收好!!

在现代商业环境中,与客户进行有效的跟进至关重要。但是,有时候不论我们多么努力地跟进,却依然无法获得预期的结果。 今天就给大家分享三个高效跟进客户的方法,帮助大家提高效率! 首先,了解客户需求是关键…

ubuntu 安装apisix -亲测可用

官方未提供在ubuntu系统中安装apisix的方式,似乎只能通过源码方式安装,但是并不推荐,非常容易失败, 具体操作方式如下: ubuntu和Debian其实类似的,可使用DEB方式安装,如下截图 注意&#xff1…

精品Nodejs实现的微信小程序的运动减肥管理系统设计与实现菜谱美食健康

《[含文档PPT源码等]精品Nodejs实现的微信小程序的运动减肥管理系统设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 软件开发环境及开发工具: 操作系统:Windows 10、Windows …

数据资产入表,这泼天的富贵大数据团队怎样才能接住?

​“ 大数据团队是成本中心还是价值中心? 数据资产入表,国家是怎么说的? 数据平台应具备哪些能力,才能助力企业最大化数据资产价值?” 2022年12月,国务院发文关于发挥数据要素作用的指导意见(…

Java基础回顾——JDBC

文章目录 介绍使用JDBC事务JDBC BatchJDBC连接池 介绍 Java为关系数据库定义了一套标准的访问接口:JDBC(Java Database Connectivity) JDBC是Java程序访问数据库的标准接口 好处: 各数据库厂商使用相同的接口,Java…

动物分类识别教程+分类释义+界面展示

1.项目简介 动物分类教程分类释义界面展示 动物分类是生物学中的一个基础知识,它是对动物进行分类、命名和描述的科学方法。本教程将向您介绍动物分类的基本原则和方法,并提供一些常见的动物分类释义。 动物分类的基本原则 动物分类根据动物的形态、…

分布式事务是什么

分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在微服务架构中,几乎可以说是无法避免,本文就分布式事务来简单聊一下。 数据库事务 我们先从数据库事务说起。数据库事务可能大家…

(001)Unit 编译 UTF8JSON

文章目录 编译 Dll编译报错附录 编译 Dll 新建工程: 注意 UnityEngineDll 的选择!2022 版本的太高了!!! 下载包,导入unity : 3. 将 unf8json 的源码拷贝到新建的工程。 4. 编译发布版本: 编译…

ggkegg玩转KEGG数据 | 富集 | 可视化

本期内容 写在前面 今天分享一个关于KEGG通路图绘制的R包,也许在你后面的分析中可以使用得到。 在KEGG富集分析中,若我们要绘制某一个富集通路,一般回到KEGG官网中寻找该通路的富集图。然后,通过AI,PPT等等一系列手段…

【MySQL】数据库之小题练习(完全备份和增量备份的数据恢复,以及断点恢复)

目录 先创建库,创建表,完成三次数据的录入以及第一次的完全备份,第二次和第三次的增量备份; 第一次完全备份操作 第二次插入后做增量备份操作 第三次 插入后做增量备份操作 1、完全备份恢复,获取一班的人的成绩 …

内网穿透中微子代理搭建使用

内网穿透中微子代理搭建使用 环境准备服务器端部署客户端安装服务器开启端口 环境准备 中微子代理项目地址 最新版是2.0.1版本,需要java21的环境,考虑到现在项目大多数环境都是java8,稳重使用1.9版本搭建,jar下载地址: 准备一台有公网ip的服务器(或云服务器),本文中使用阿里…

【教程】从gitee或者github,下载单个文件或文件夹命令

1.打开git 2.初始化 git init 3.设置允许下载子目录 (不需要修改任何,只要原样复制,需要按照个人状况修改的话我会标注) git config core.sparseCheckout true 4. 选择要下载的单个文件夹的路径 这里单引号内部需要修改&…

redis基本用法学习(C#调用FreeRedis操作redis)

FreeRedis属于常用的基于.net的redis客户端,EasyCaching中也提供适配FreeRedis的包。根据参考文献4中的说法,FreeRedis和CsRedis算是近亲(都是GitHub中账号为2881099下的开源项目),因此其用法特别相似。FreeRedis的主要…

论文阅读<CF-YOLO: Cross Fusion YOLO for Object Detection in Adverse Weather.....>

论文链接:https://arxiv.org/pdf/2309.08152.pdfhttps://arxiv.org/pdf/2206.01381.pdfhttps://arxiv.org/pdf/2309.08152.pdf 代码链接:https://github.com/DiffPrompter/diff-prompter 目前没有完整代码放出。 恶劣天气下的目标检测主要有以下三种解…

docker笔记1-安装与基础命令

docker的用途: 可以把应用程序代码及运行依赖环境打包成镜像,作为交付介质,在各种环境部署。可以将镜像(image)启动成容器(container),并提供多容器的生命周期进行管理(…

iPad绘画之旅:从小白到文创手账设计的萌系简笔画探索

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 iPad的出现,不仅改变了我们对电子设…

孔夫子二手书采集

文章目录 项目演示软件采集单本数据网页搜索数据对比 使用场景概述部分核心逻辑Vb工程图数据导入与读取下拉框选择参数设置线程 使用方法下载软件授权导入文件预览处理后的数据 项目结构附件说明 项目演示 操作视频详见演示视频,以下为图文演示 软件采集单本数据 …

mac传输文件到windows

前言 由于mac系统与windows系统文件格式不同,通过U盘进行文件拷贝时,导致无法拷贝。 几种文件格式说明: NTFS 文件格式:只适用于 windows 系统,不适用于 mac 系统; APFS 文件格式:mac 系统格式…

云HIS源码 云HIS解决方案 支持医保功能

云HIS系统重建统一的信息架构体系,重构管理服务流程,重造病人服务环境,向不同类型的医疗机构提供SaaS化HIS服务解决方案。 云HIS作为基于云计算的B/S构架的HIS系统,为基层医疗机构(包括诊所、社区卫生服务中心、乡镇卫…

Anylogic Pro 8.8.x for Mac / for Linux Crack

Digital twins – a step towards a digital enterprise AnyLogic是唯一一个支持创建模拟模型的方法的模拟建模工具:面向过程(离散事件)、系统动态和代理,以及它们的任何组合。AnyLogic提供的建模语言的独特性、灵活性和强大性使…