假设性文档嵌入 HyDE:大模型 + 对比学习,从关键词相似度搜索到语义搜索

假设性文档嵌入 HyDE:大模型 + 对比学习,从关键词相似度搜索到语义搜索

    • 提出背景
    • 流程图
    • 解法拆解
      • 类比
        • 1. 单一文档嵌入空间的搜索
        • 2. 指令跟随型语言模型(InstructLM)的引入
        • 3. 生成文档的嵌入编码

 


提出背景

论文:https://arxiv.org/pdf/2212.10496

代码:https://github.com/texttron/hyde

HyDE 特别适合,当需要捕获广泛的语义内容并减少对关键词直接依赖时。

比如医学一个概念有很多术语,比如用户搜索感冒,数据库是风热流感,这俩的相似度很低,相似度匹配解决不了,只能语义匹配。

相似度搜索工作原理

  • 相似度搜索依赖于直接比较查询词与数据库中文档的关键词的匹配度。
  • 使用如TF-IDF(词频-逆文档频率)或余弦相似度等算法来评估查询与每个文档的相似度。
  • 最终的输出是根据相似度分数排序的文档列表,分数最高的文档最相关。

应用场景

  • 医生输入查询:“膝关节炎治疗方法”。
  • 检索系统在医学文档数据库中查找包含“膝关节炎”和“治疗方法”这些关键词的文档。
  • 返回的结果直接反映了关键词的出现频率和文档中的分布情况。

HyDE工作原理

  • HyDE首先通过一个生成性语言模型根据输入的查询“膝关节炎治疗方法”生成一个内容丰富的、假设性的答案或文档,这个文档详细描述了可能的治疗方法,如药物治疗、物理治疗、手术选项等,即使这样的文档在实际数据库中并不存在。
  • 然后,这个生成的假设文档被转换成嵌入向量,使用对比编码器进行编码。
  • 系统使用这个向量与数据库中文档的向量进行相似度比较,寻找与假设文档内容相似的实际文档。

应用场景

  • 通过假设性文档生成和后续的向量比较,HyDE能够捕捉查询的深层意图和复杂内容,不仅限于关键词匹配。
  • 这使得即使医生的查询用词非常专业或非常通俗,系统也能理解并返回最相关的、专业的医疗建议和研究成果。

相似度搜索比作使用地图找到特定地址,而HyDE则像是先绘制一个详尽的旅行指南,然后再在地图上寻找与之最匹配的路径。

相似度搜索直接依赖于现有的、明确的标记和路径,而HyDE通过创造性地解释和拓展查询内容,提供更深层次的匹配和理解。

通过这种方式,HyDE不仅提高了检索的相关性和准确性,还能处理更复杂和多样化的查询,特别适用于需要高度解释性和语义理解的领域,如医疗、法律和科研文献检索。

流程图

在这里插入图片描述
这张图是对Hypothetical Document Embeddings (HyDE) 模型的说明。

这个模型通过以下步骤来处理和检索信息:

  1. 输入指令和查询:HyDE接收一个查询指令,例如“写一个段落来回答这个问题”。

    这个查询可以涵盖各种主题,如图中示例所示,包括“智齿拔除需要多长时间”,“COVID-19大流行如何影响心理健康?”,以及“인간은 언제 피를 사용했나요?”(人类何时开始使用血液?)。

  2. 生成文档:根据查询指令,一个基于GPT的语言模型生成一个假设的文档。

    这个文档不是真实的,但它旨在模拟相关文档的内容。

    例如,对于智齿拔除的查询,生成的文档可能会说“通常需要30分钟到两小时来拔除智齿”。

  3. 文档编码与检索:生成的文档被送入一个对比学习的编码器(如图中的Contriever),该编码器将文档转换成嵌入向量。

    然后,这个向量被用来在语料库中查找最相似的真实文档。

  4. 返回结果:模型根据生成的文档与真实文档之间的语义相似性返回查询结果。

    例如,关于智齿拔除的查询可能返回一些解释智齿拔除过程的真实文档。

这个模型的特点是它不直接计算查询与文档之间的相似度,而是通过生成文档和编码这两个步骤间接地处理查询,使得系统能够以零样本的方式工作,即不依赖于具体的相关性标签进行训练。

这使得HyDE模型能够适应多种语言和任务,即使在没有明确训练数据的情况下也能进行有效的文档检索。

解法拆解

目的:解决零样本密集检索的问题,这是因为在没有相关性判断或评分的情况下,传统的密集检索模型难以学习查询和文档的嵌入表示。

解法:HyDE模型设计

  1. 子解法1:单一文档嵌入空间的搜索

    • 特征:只需学习文档之间的相似性,无需处理查询的嵌入。
    • 原因:这通过使用无监督的对比学习来实现,可以简化学习过程,因为它不依赖于外部的相关性标签。

     
    例如,通过Izacard等人的研究(2021),已经证明无监督对比学习在没有明确监督的情况下有效地学习文档特征。

  2. 子解法2:指令跟随型语言模型(InstructLM)的引入

    • 特征:通过生成“假设文档”来间接捕获查询的相关性。

    • 原因:InstructLM能根据给定的指令生成内容,这种方法将查询相关性的建模负担从传统的表示学习转移到了更容易泛化的自然语言生成模型上。

       
      这使得模型即使在缺乏明确相关性数据的情况下也能有效工作。

    例如,如果指令是“写一个回答问题的段落”,InstructLM生成的文档虽然不是真实的,但能够反映出与查询相关的内容模式。

  3. 子解法3:生成文档的嵌入编码

    • 特征:通过文档编码器将生成的“假设文档”转化为嵌入向量,再进行相似性搜索。

    • 原因:使用文档编码器f作为损失压缩器,可以过滤掉生成文档中的冗余细节,只保留与查询相关的核心内容,从而实现高效的文档检索。

       
      这种方法利用了文档之间的相似性嵌入,进一步将假设向量与实际语料库中的真实文档对齐。

逻辑链:这些子解法形成一个线性逻辑链,每个步骤都是为了解决零样本密集检索中遇到的具体问题。

首先通过无监督学习建立文档嵌入,然后利用指令跟随模型生成与查询相关的假设文档,最后通过文档编码器压缩和过滤信息,执行有效的检索。

这个过程通过结合无监督学习和自然语言生成技术,创新性地解决了无法直接从标注数据学习的难题。

 

类比

想象一下你正在组装一套复杂的家具,但你没有明确的说明书,只有一些基本的工具和一些不标记的零件。

这就是传统密集检索系统在没有相关性标签时面临的挑战:它们需要准确地匹配查询和文档,但缺乏直接指导他们如何完成任务的明确指示。

HyDE模型的设计就像是给你一个能够生成使用说明的智能工具,同时也提供了检测哪些工具和零件最适合当前步骤的能力。

1. 单一文档嵌入空间的搜索

类比:这就像使用一个高级的金属探测器在沙滩上寻找金属物体。

探测器不需要知道每个物体具体是什么,只需要识别出哪些地方有金属物体。

在HyDE模型中,这个过程相当于用对比学习探测文档库中的文档,识别它们之间的相似性,而不是直接寻找与特定查询完全匹配的文档。

2. 指令跟随型语言模型(InstructLM)的引入

类比:想象你有一个能够根据你描述的需要自动生成建议方案的智能助手。

比如你说:“我需要一个可以放杂志的小桌子。”

即使你没有直接说明要用木头制作,智能助手也能生成一个包括材料和设计的建议方案。

在HyDE中,InstructLM正是这样一个智能助手,它能根据查询生成一个假设性的“方案”(即文档),捕捉查询的核心需求。

3. 生成文档的嵌入编码

类比:这就像把一份详细的设计图纸转换成一个更简洁的部件清单。

在建造时,你不需要再次查看复杂的图纸,只需根据这个清单挑选正确的材料和工具即可。

HyDE模型中的编码器就是这样一个工具,它将生成的文档转换为核心特征的集合(即向量),使得检索系统能够快速有效地找到与这些特征匹配的真实文档。

通过这种方式,HyDE模型有效地解决了传统密集检索在无标注数据情况下的局限,通过创新的方法优化了信息检索过程,使其更加智能和适应性强。

这种模型不仅适用于学术和科研领域,也可以广泛应用于医疗、法律、商业等信息密集型行业,提高检索的准确性和效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

保存huggingface缓存中AI模型(从本地加载AI模型数据)

在github下拉项目后,首次运行时会下拉一堆模型数据,默认是保存在缓存的,如果你的系统盘空间快满的时候就会被系统清理掉,每次运行又重新下拉一次,特别麻烦。 默认下载的缓存路径如下:C:\Users\用户名\.cache\huggingf…

【Unity性能消耗】ScriptableObject复用数据节省内存占用

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 专栏交流🧧&…

APP INVENTOR硬件交互学习教程05——自动连接蓝牙实现

每次打开手机APP,需要选择蓝牙,用起来很麻烦。有没有方法实现自动连接上次的地址呢,接下来请看吧!1.界面设计增加了一个微数据库组件,借助它用来存储硬件地址 2.程序设计这里主要用两个方法,存储地址方法…

Python基础语法(与C++对比)(持续更新ing)

代码块 Python在统一缩进体系内,为同一代码块C{...}内部的为同一代码块 注释 Python 单行注释:#... 多行注释:... C 单行注释://... 多行注释: /*...*/ 数据类型 1. Python数据类型 Python中支持数字之间使用下划线 _ 分割…

LVS+Nginx高可用集群--基础篇

1.集群概述 单体部署: 可以将上面内容分别部署在不同的服务器上。 单体架构的优点: 小团队成型就可完成开发,测试,上线 迭代周期短,速度快 打包方便,运维简单 单体架构的挑战:单节点宕机造成…

day03-numpy数据类型

numpy数据类型 名称描述名称描述bool_布尔型数据类型(True 或者 False)float_float64 类型的简写int_默认的整数类型(类似于 C 语言中的 long,int32 或 int64)float16/32/64半精度浮点数:1 个符号位,5 个指…

《ClipCap》论文笔记(上)

原文出处 [2111.09734] ClipCap: CLIP Prefix for Image Captioning (arxiv.org) 原文笔记 What ClipCap: CLIP Prefix for Image Captioning 一言以蔽之:使用 CLIP 编码作为标题的前缀,使用简单的映射网络,然后微调语言模型…

datawhale大模型应用开发夏令营学习笔记一

参考自 基于LangChainLLM的本地知识库问答:从企业单文档问答到批量文档问答datawhale的llm-universe 作者现在在datawhale夏令营的大模型应用开发这个班中,作为一个小白,为了能为团队做出一点贡献,现在就要开始学习怎么使用langch…

第二十条:与抽象类相比,优先选择接口

要定义多种实现的类型:JAVA有两种机制:接口和抽象类。这两种机制都支持为某些实例方法提供实现,但二者有个重要的区别:要实现由抽象类定义的类型,这个类必须是抽象类的子类。因为Java只允许单继承,对抽象类…

UE4_材质_材质节点_Fresnel

学习笔记,不喜勿喷,侵权立删,祝愿生活越来越好! 一、问题导入 在创建电影或过场动画时,你常常需要想办法更好地突显角色或场景的轮廓。这时你需要用到一种光照技术,称为边沿光照或边缘光照,它的…

从硬件角度看Linux的内存管理

1. 分页机制 分段机制的地址映射颗粒度太大,以整个进程地址空间为单位的分配方式导致内存利用率不高。 分页机制把这个分配机制的单位继续细化为固定大小的页(Page),进程的虚拟地址空间也按照页来分割,这样常用的数据和代码就可以以页为单位…

Angluar 实现pdf页面预览以及编辑

之前用过一个pdf预览的lib,并且还支持在线编辑,和直接下载编辑之后的pdf和直接打印,还不错,记录下 PdfShowcase 首先安装依赖 npm install ngx-extended-pdf-viewer 然后引入 import { NgxExtendedPdfViewerModule } from &q…

论文解读StyleGAN系列——StyleGANv1

论文:A Style-Based Generator Architecture for Generative Adversarial Networks(2018.12) 作者:Tero Karras, Samuli Laine, Timo Aila 链接:https://arxiv.org/abs/1812.04948 代码:https://github.com…

四、(3)补充beautifulsoup、re正则表达式、标签解析

四、(3)补充beautifulsoup、re正则表达式、标签解析 beautifulsoupre正则表达式正则提取标签解析 beautifulsoup 补充关于解析的知识 还需要看爬虫课件 如何定位文本或者标签,是整个爬虫中非常重要的能力 无论find_all(&#xff…

AI一键音频转文字工具 速度超快,支持实时转换,无需联网,本地整合包下载

这是 CapsWriter-Offline ,一个 PC 端的语音输入、字幕转录工具。可用实现简单一键将音频文件转换成文字的懒人工具。 两个功能: 1、实时转换,按下键盘上的 大写锁定键,录音开始,当松开 大写锁定键 时,就会…

企商在线出席2024全球数字经济大会城市副中心论坛

2024年7月3日,2024全球数字经济大会城市副中心论坛“数字基础设施绿色创新发展分论坛”在北京市通州区成功举办。企商在线产品及解决方案总监孙杰受邀出席本次会议,并参与圆桌对话环节,分享“绿色”发展思路与经验。 2024全球数字经济大会城市…

一篇文章说清楚Filter(过滤器)、Interceptor(拦截器)和AOP(切面儿)

文章目录 前言一、Filter(过滤器)1.说明2.实现filterChain.doFilter() 3.order优先级4.解决跨域5.拦截返回错误信息JSON 二、Interceptor(拦截器)1.说明2.实现preHandlepostHandleafterCompletion 3.执行顺序图4.排除特定路径拦截…

@react-google-maps/api实现谷歌地图中添加多边围栏,并可编辑,编辑后可获得围栏各个点的经纬度

先上一张效果图 看看是不是大家想要的效果~ ❤️ 由于该功能微微复杂一点,为了让大家精准了解 我精简了一下地图代码 大家根据自己的需求将center值和paths,用setState做活就可以了 1.第一步要加入项目package.json中或者直接yarn install它…

在Linux上查找文件的2个好用的命令

1. locate xx (查找带xx字符的所有文件或目录) 在终端输入命令 locate lua,可以看到,所有带lua字符的文件或目录都会被搜索出来。 2. find / -name xx (查找名为xx的文件或目录) 在终端输入命令 find …

揭开北斗系统和物联网的神秘面纱:探索未来技术的无限可能性

北斗系统和物联网是现代科技领域的两个重要概念。随着科学技术的快速发展和应用的深化,这两个术语逐渐进入人们的视野。本文将深入探讨北斗系统和物联网的原理、应用和未来发展前景,带您充分了解科技革命的幕后故事。北斗系统:引领全球导航新…