照片由 Christian Lue 在 Unsplash 提供
介绍检索增强生成(RAG)是一种强大的技术,可以提高大型语言模型(LLMs)生成答案的准确性和可靠性。它还提供了检查模型在特定生成过程中使用的来源的可能性,从而使得人类用户更容易进行事实核查。此外,RAG使得保持模型知识的时效性和融入特定主题的信息成为可能,而无需进行微调。总体而言,RAG提供了许多好处和很少的缺点,其工作流程也易于实现。因此,它已成为许多需要最新和/或专门知识的LLM应用场景的首选解决方案。
近年来,生成式AI领域的一些最新进展集中在将流行的Transformer架构扩展到处理多种输入和/或输出模态上,试图复制大规模语言模型(LLMs)的巨大成功。已经有一些开源和闭源的模型展示了处理多种模态的出色能力。其中一种流行的多模态设置,也是最早被攻克的之一,是视觉语言模型(VLMs),该领域已经有一些有趣的开源贡献,例如发布了小而强大的模型,如LLaVA、Idefics和Phi-vision。如果你想开始了解VLMs,并学习如何使用LLaVA构建视觉语言聊天助手,可以参考我的先前文章《使用LLaVA创建你的视觉聊天助手》Create your Vision Chat Assistant with LLaVA。
设计适用于多模态模型的RAG系统比仅处理文本的情况更具挑战性。实际上,为LLM设计RAG系统已经相当成熟,并且在通用工作流程方面已经达成了一些共识,因为许多最近的发展都集中在提高准确性、可靠性和可扩展性上,而不是从根本上改变RAG架构。另一方面,多模态性为检索相关信息提供了多种方式,因此可以做出多种不同的架构选择,每种选择都有其优缺点。例如,可以使用多模态嵌入模型为不同的模态创建共享的向量空间,或者选择仅在一个模态中锚定信息。
在这篇博客文章中,我将讨论一个简单的框架,用于将检索增强生成(RAG)扩展到视觉语言模型(VLM),重点是视觉问答任务。该方法的核心思想是利用VLM理解和处理文本及图像的能力,生成一个合适的搜索查询,以便在回答用户提示之前检索外部信息。
我还将提供一个关于如何实现该框架以赋予 Phi-3.5-vision 访问维基百科信息能力的实用教程,讨论实现的主要要点并展示一些示例。我会将详细内容留到我之前在以下 Git Hub 仓库 中分享的完整代码中。
基于RAG的视觉问答在本节中,我将描述在介绍中提到的框架的一般工作流程。为了便于说明,我将讨论只有一个用户关于一张图片的提示的情况。例如,这种情况适用于简单的视觉问答(VQA)任务。该方法可以轻松地扩展到多个提示和图片,但管道将变得更加复杂并引入进一步的复杂性。此外,我将仅考虑外部数据仅由文本文档组成的情况。通过使用多模态嵌入模型进行检索,或更一般地使用多模态搜索引擎,可以将图片也包含在外部数据中。
关于常见的RAG工作流程,框架的工作流程可以分为两部分:检索相关的外部信息和基于提供的外部数据进行生成。
在检索阶段,目标是从外部文本文档中检索出一些可以提供有用信息来回答用户提示的段落。为了有效地做到这一点,我们必须确保检索到的段落与提供的图像、提示以及两者之间的关系相关。实际上,即使检索到的文档包含有关图像的信息,它们可能并不包括回答用户提示所需的具体信息。另一方面,提示可能只有在与它所指的图像结合时才能被正确理解。为了解决这些挑战,本文讨论的框架利用多模态模型生成适当的搜索查询,以捕捉在提供的图像上下文中回答用户提示所需的信息。搜索引擎将使用生成的查询从外部数据中检索相关信息。
更详细地说,多模态模型接收用户提示和图像作为输入,并被要求生成一个与两者整体相关的搜索查询。这一过程可以被视为查询转换的一种特殊情况,旨在考虑问题的多模态性质。实际上,该模型在生成搜索查询时,同时考虑了用户提示和其对应的图像。
这种方法相比其他单独处理每种输入模态的方法(例如,使用多模态嵌入模型进行检索或使用生成的图像字幕/描述来计算语义相似度)的优势在于,它可以更有效地捕捉提示与图像之间的关系。
下面简要绘制了检索阶段的流程图。
在检索过程中,模型的任务是生成一个查询,该查询将被搜索引擎用来检索相关段落。图片由作者提供。
生成阶段与标准的仅文本RAG工作流非常相似,唯一的区别是模型除了接收到提示和检索到的段落外,还会接收到图像的上下文。这个过程如下所示。
在生成过程中,模型接收检索到的段落、提示和图像作为输入。作者的图片。
基于Wikipedia增强Phi-3.5-vision在本节中,我将提供一个实用指南,介绍如何应用所讨论的框架来增强一个多模态模型,使其能够访问维基百科。我选择了模型Phi-3.5-vision,因为它是一个非常强大且轻量级的开源视觉语言模型。
在本节中,我将只讨论实现的一般方面,具体细节请参见提供的 GitHub 仓库 中的代码。
检索检索阶段的目标是从Wikipedia中收集一些段落,这些段落可以提供有用的信息来回答用户关于图像的问题。在代码实现中,我使用了Python包wikipedia来搜索和检索Wikipedia的内容。
这里是一些实施的步骤来检索相关段落:
- 使用多模态模型生成能够捕捉图像问题含义的关键词。
- 使用生成的关键词在维基百科上搜索相关页面。
- 将每个检索到的页面内容分割成段落。
- 通过语义文本相似度选择与问题和关键词最相关的段落。
第一步利用Phi-3.5-vision生成一个合适的搜索查询,用于检索相关的维基百科页面。为此,我让Phi-3.5-vision生成与用户问题和图片相关的关键词。然后,我使用wikipedia包的内置搜索功能检索与生成的关键词相关的页面。
Phi-vision-3.5 的一般单轮单图聊天模板具有以下结构:
\n
\n
{prompt}\n
\n
为了生成关键词,我使用了以下提示:
你的任务是编写几个搜索关键词来查找包含回答所提供图片问题相关信息的Wikipedia页面。关键词必须尽可能具体,并且必须代表回答问题所需的信息。不要写超过3个搜索关键词。
问题:{question}
在推理之前,标签 {question} 会被替换成用户的问题。
在生成关键词后,使用wikipedia包内置的搜索功能来检索与生成的关键词相关的页面。最后,将选定的页面分割成段落,然后使用嵌入模型和LangChain实现的FAISS向量存储来选择最相关的段落。我使用嵌入模型snowflake-arctic-embed-l将问题和关键词的拼接以及检索到的页面片段进行嵌入。实际上,检索阶段实际上是一种“混合搜索”的形式,包括两个连续的步骤:使用wikipedia包内置的搜索功能进行关键词搜索,以及使用嵌入模型进行嵌入相似性检索。这样,检索在使用关键词搜索选择的最相关页面的段落空间中进行,避免了需要构建包含维基百科所有内容嵌入的巨大向量存储。在不同的设置中,检索阶段可以重新设计为在整个外部语料库上使用相似性检索,或使用不同的检索方法组合。
从多个页面检索段落可以帮助减少选错页面的几率,当需要从多个页面获取信息以生成答案时也非常有用。
生成在生成阶段,用户的问题、检索到的段落和原始图像被用作输入,供Phi-3.5-vision生成答案。
我在 Phi-3.5-vision 的通用聊天模板中使用了以下提示:
你是一个乐于助人的助手,任务是回答关于提供的图像的问题。
请回答以下问题:{question}
你可以使用从Wikipedia检索到的以下段落来回答问题:
{passages}
在生成时,标签 {question} 被用户的问题替换,而标签 {passages} 则被检索到的段落及其对应页面的名称替换,格式如下:
从 Wikipedia 页面 {page_name} :"{passage1}"\n\n
从 Wikipedia 页面 {page_name} :"{passage2}"\n\n
从 Wikipedia 页面 {page_name} :"{passage3}"\n\n
...
提供页面的名称可以有助于解决当内容不足以唯一确定其主题或话题时产生的歧义。
示例在本节中,我将展示一些使用上一节中讨论的实现所获得的答案示例,并比较增强 RAG 的视觉语言模型与基础版本的输出。
对于下面的每个示例,我将展示提供给模型的图像,一个包含问题以及增强版RAG和基础VLM的回答的区块,一个包含模型生成的搜索查询的区块,以及一个包含从Wikipedia检索到的段落的区块。
示例1照片由 engin akyurt 在 Unsplash 提供
问题:这种水果的植株有多高?
基础VLM:番茄通常生长在高度可达2到4英尺的植株上,具体高度取决于品种和生长条件。
RAG VLM:生产这种水果的番茄植株通常可以长到1-3米(3-10英尺)高。
VLM 生成了以下搜索关键词:
搜索关键词:番茄植株,番茄植株高度
并检索到了以下段落:
从页面 Tomato (https://en.wikipedia.org/wiki/Tomato):
“整年都可以生长。番茄植株通常会长到1-3米(3-10英尺)的高度。它们是藤蔓植物,茎较弱,通常需要支撑。在原生环境中,不定型番茄植株是多年生植物,但在栽培中通常被当作一年生植物。(定型,或”。
从页面 Tomato (https://en.wikipedia.org/wiki/Tomato):
“世界各地的温带气候中广泛种植了多种番茄植株,温室使得整年都可以生产番茄。番茄植株通常会长到1-3米(3-10英尺)的高度。它们是藤蔓植物,茎较弱。”
从页面 Early Girl (https://en.wikipedia.org/wiki/Early_Girl):
== 参考资料 ==
番茄品种列表
== 参考文献 ==
从页面 Black Krim (https://en.wikipedia.org/wiki/Black_Krim):
== 参考文献 ==
== 参考资料 ==
番茄品种列表
传家宝番茄
从页面 Celebrity tomato (https://en.wikipedia.org/wiki/Celebrity_tomato):
== 参考资料 ==
番茄品种列表
佛罗里达州的番茄生产
== 参考文献 ==
从页面 Fourth of July tomato (https://en.wikipedia.org/wiki/Fourth_of_July_tomato):
== 参考资料 ==
番茄品种列表
== 参考文献 ==
== 外部链接 ==
Google 图片画廊
从页面 Mortgage Lifter (https://en.wikipedia.org/wiki/Mortgage_Lifter):
== 参考资料 ==
番茄品种列表
== 参考文献 ==
== 外部链接 ==
Google 图片画廊
增强后的模型使用RAG正确报告了维基百科页面“番茄”上所述的高度范围,而基础模型回答了一个较低的范围。
示例2照片由 Hans-Jurgen Mager 在 Unsplash 提供
查询:这种物种的体重是多少?
基础VLM:北极熊的体重在900到1,600磅(408到727公斤)之间。
RAG VLM:这种物种,北极熊,雄性体重在300-800公斤(660-1,760磅)之间,雌性体重在150-300公斤(330-660磅)之间。
搜索关键词:北极熊,体重
从页面北极熊(https://en.wikipedia.org/wiki/Polar_bear):
"雄性北极熊通常长200–250厘米(6.6–8.2英尺),体重300–800公斤(660–1,760磅)。雌性较小,长180–200厘米(5.9–6.6英尺),体重150–300公斤(330–660磅)。该物种的性别二态性与其他大多数哺乳动物相比特别高。雄性北极熊还有"。
从页面北极熊(https://en.wikipedia.org/wiki/Polar_bear):
"== 注意事项 ==
== 参考文献 ==
== 参考书目 ==
== 外部链接 ==
北极熊国际网站
ARKive—北极熊(Ursus maritimus)的图片和视频"。
从页面北极熊(https://en.wikipedia.org/wiki/Polar_bear):
"雌性北极熊的体重为150–300公斤(330–660磅)。该物种的性别二态性与其他大多数哺乳动物相比特别高。雄性北极熊的头部也比雌性大。北极熊的体重在一年中会波动,因为它们可以增加脂肪并增加体重"。
从页面熊科列表(https://en.wikipedia.org/wiki/List_of_ursids):
"长,加上3–20厘米(1–8英寸)的尾巴,尽管北极熊的长度为2.2–2.44米(7–8英尺),一些棕熊亚种的长度可达2.8米(9英尺)。体重范围从太阳熊的35公斤(77磅)到北极熊的726公斤(1,600磅)不等"。
从页面Knut(北极熊)(https://en.wikipedia.org/wiki/Knut_(polar_bear)):
"== 参见 ==
Binky(北极熊)
熊的个体列表
== 参考文献 ==
== 外部链接 =="。
从页面北极熊(https://en.wikipedia.org/wiki/Polar_bear):
"北极熊是现存最大的熊和陆地食肉动物,尽管一些棕熊亚种如 Kodiak 熊可以与之媲美。雄性通常长200–250厘米(6.6–8.2英尺),体重300–800公斤(660–1,760磅)。雌性较小,长180–200厘米(5.9–6.6英尺),体重"。
从页面棕熊亚种(https://en.wikipedia.org/wiki/Subspecies_of_brown_bear):
"雄性,可能在三年内将其平均体重增加三倍,平均体重在360至545公斤(794至1,202磅)之间。已报告的北极熊两性成年体重与半岛巨熊和 Kodiak 熊非常相似。由于它们的体型大致"。
再次,RAG 模型正确地使用了 Wikipedia 页面“北极熊”中报告的权重作答,而基础模型则给出了略有不同的权重范围。
示例3在我的上一篇博客文章《使用LLaVA创建你的视觉聊天助手》中,我展示了当用户的提示对图像提出误导性问题时,LLaVA-1.5模型会如何产生幻觉。让我们来看看使用Phi-3.5-vision模型在有和没有RAG增强的情况下,这个例子会发生什么。特别是,如果检索到任何误导性的段落,模型现在可能会更容易产生幻觉。
照片由 Wolfgang Hasselmann 在 Unsplash 提供
问题:告诉我这张图片中的鱼的种类
基础VLM:这张图片中没有鱼或水生环境,所以我无法提供鱼的种类。
RAG VLM:这张图片中没有鱼或水生环境,它是一张有沙丘的沙漠景观的照片。因此,我无法根据这张图片提供鱼的种类。
基础模型和RAG模型都没有因为误导性的提示而产生幻觉,这表明Phi-3.5-vision相比LLaVA-1.5可能具有更好的鲁棒性。特别是,RAG VLM没有从Wikipedia检索任何页面。实际上,当被要求生成关键词时,模型回答了
提供的图片中没有看到鱼。图片展示的是一个有沙丘的沙漠景观。因此,与图片内容相关的搜索关键词更适合用于与沙漠或沙丘相关的主题。
这个搜索查询没有产生任何结果,使用的是wikipedia包的搜索功能。
注意:在后面的示例中,在早期使用 Idefics 2 进行的实验中,基础 VLM 和 RAG VLM 模型都受到了幻觉的影响,回答时提到了图像中不存在的鱼类名称。特别是,RAG 模型检索到了与各种鱼类相关的误导性段落。幻觉现象与模型相关,RAG 框架可能无法在所有情况下消除这种现象。
限制该框架的主要限制是,它要求模型至少对提供的图像和问题有一般的了解(虽然确切的细节将通过RAG检索出来),以便生成有用的搜索查询。在某些特定领域的设置中,可能需要对模型进行微调以生成搜索查询。
本文讨论的框架也存在传统纯文本RAG系统常见的局限性。生成错误的一个常见原因是外部信息检索不正确。在某些情况下,模型无法正确识别检索阶段的失败,从而基于错误的、不相关的或误导性的信息生成答案。特别是,不相关的段落有时会导致模型产生本不会出现的幻觉。
另一个常见的错误来源是忽略检索到的段落或错误引用它们。这有时会导致检索到的段落和生成的答案之间存在细微差异,这些差异可能一开始难以察觉。
示例在这个例子中,我将展示一个模型错误引用检索到的段落的实例。
搜索关键词:狮子,体重,平均体重
照片由 Luke Tanis 在 Unsplash 提供
查询:这种动物的平均体重是多少?
基础VLM:雄狮的平均体重在160到310公斤之间,而雌狮的体重通常在120到180公斤之间。
RAG VLM:根据提供的文章信息,南非雄狮的平均体重为187.5公斤(386磅),而东非雄狮的平均体重为174.9公斤(386磅)。
搜索关键词:狮子,体重,平均体重
从页面 American lion (https://en.wikipedia.org/wiki/American_lion):
"(518磅-1153磅)对于雄性,175公斤到365公斤(385磅-805磅)对于雌性。2008年,美国狮的体重估计可达420公斤(930磅)。2009年的一项研究表明,雄性平均体重为256公斤(564磅),雌性最大样本的平均体重为351公斤(774磅)"。
从页面 Lion (https://en.wikipedia.org/wiki/Lion):
"=== 大小 ===
在猫科动物中,狮子仅次于老虎。成年狮子的大小和重量因分布和栖息地而异。非洲和印度存在一些比平均值更大的个体的记录。
=== 茸毛 ==="。
从页面 Panthera leo leo (https://en.wikipedia.org/wiki/Panthera_leo_leo):
"狮子的毛色从浅黄到深棕色不等。它有圆形的耳朵和黑色的尾巴簇。雄性狮子的平均头体长度为2.47-2.84米(8英尺1英寸-9英尺4英寸),体重为148.2-190.9公斤(327-421磅)。雌性较小且较轻。动物园中的狮子标本"。
从页面 Panthera leo melanochaita (https://en.wikipedia.org/wiki/Panthera_leo_melanochaita):
"雄性狮子的平均头体长度为2.47-2.84米(8英尺1英寸-9英尺4英寸),体重范围为150-225公斤(331-496磅),平均为187.5公斤(413磅)在南非,145.4-204.7公斤(321-451磅),平均为174.9公斤(386磅)在东非。雌性平均体重为83-165公斤(183-364磅)"。
从页面 Asiatic lion (https://en.wikipedia.org/wiki/Asiatic_lion):
"成年雄性亚洲狮平均体重为160.1公斤(353磅),最大可达190公斤(420磅);野生雌性体重为100至130公斤(220至285磅)"。
从页面 List of largest mammals (https://en.wikipedia.org/wiki/List_of_largest_mammals):
"== 参见 ==
最大陆地食肉动物列表
最大生物
最大史前动物
最大鸟类列表
最大猫科动物列表
最大鱼类列表
最大植物列表
最大爬行动物列表
最大昆虫列表
最重陆地哺乳动物列表
最小生物列表
== 备注 =="。
从页面 Ancient Mesopotamian units of measurement (https://en.wikipedia.org/wiki/Ancient_Mesopotamian_units_of_measurement):
"== 参见 ==
亚述狮子重量
巴比伦数学
历史度量衡
度量衡
== 参考文献 ==
=== 引文 ==="。
虽然用千克表示的重量是正确的,但模型给出的南非南部雄狮平均体重转换为磅的数值是错误的,尽管从维基百科提取的相关段落中报告了正确的数值。
结论在这篇文章中,我介绍了一个简单的框架,可以用于增强视觉问答(Visual Question Answering)的能力,使其具备检索增强生成(Retrieval Augmented Generation)的功能。该方法的核心思想是利用视觉语言模型生成查询,然后使用标准的RAG管道从外部语料库中检索信息。我还展示了一个框架的实现,使Phi-3.5-vision能够访问维基百科。该实现的完整代码可以在GitHub仓库中找到。
虽然讨论的方法简单且有效,但它并非免疫于所有检索增强生成(RAG)系统常见的限制,以及多模态设置带来的新挑战。一方面,对于某些特定问题,检索相关信息可能会很困难。由于搜索查询是由视觉语言模型生成的,检索的准确性进一步受限于模型识别图像和理解问题所指细节的能力。另一方面,即使检索到了正确的信息,也无法保证模型在生成答案时不会出现幻觉。在多模态设置中,这种情况可能会因模型需要将正确的含义关联到文本和图像,并理解它们之间的交互而加剧。
在这篇文章中讨论的框架是普通RAG管道对视觉问答任务的一个简单扩展。标准的高级RAG技术,如查询转换、重新排序检索到的段落以及Hypothetical Document Embeddings (HyDE),可以轻松地包含进来以提高性能。此外,使用多模态嵌入模型(如CLIP),新的机会出现了:图像嵌入可以在通过相似性搜索相关文本文档时使用,也可以检索与原始图像和问题相似和/或相关的图像。后者在需要从不同角度查看图像以回答提示时可能会很有用。另一个改进的方向是进行微调以获得更专业和有效的模型。鉴于多模态模型在检索和生成过程中的作用,可以执行两个不同的微调过程:一个是获得专门用于编写搜索查询的模型,另一个是提高模型在基于事实生成任务上的性能。最后,该框架可以被集成到一个专门的代理系统中,以进一步提高其性能和鲁棒性。例如,代理系统可以通过对检索到的段落提供反馈并提出后续问题或仅在需要时搜索图像的特定细节来迭代地改进生成的查询。它还可以处理多跳问答任务,以回答更复杂的问题,并决定何时需要检索额外的外部信息来回答用户的查询。
我很乐意在评论区进一步讨论多模态RAG的改进和/或不同方法!
共同学习,写下你的评论
评论加载中...
作者其他优质文章