【详细内容首发于微信公众号(Hobbes View)】

什么是Embedding?

Embedding是一种多维向量数组,由一系列数字组成,可以代表任何事物,如文本、音乐、视频等。在这里我们将重点关注文本部分。Embedding之所以重要,是因为它让我们可以进行语义搜索,也就是通过文本的含义进行相似性检索。

为什么Embedding在AI中如此重要?

Embedding在AI中的重要性在于,它可以帮助我们解决LLM的tokens长度限制问题。通过使用Embedding,我们可以在与LLM交互时,仅在上下文窗口中包含相关的文本内容,从而不会超过tokens的长度限制。

如何将Embedding与LLM结合?

我们可以利用Embedding,在和LLM交互时,仅包含相关的文本内容。具体操作方法是,首先将文本内容分块并转换为向量数组,然后将其存储在向量数据库中。在回答问题时,我们可以使用相似性搜索将问题向量与文档向量进行比较,找到最相关的文本块,然后将这些文本块与问题一起输入到LLM中,得到准确的回答。

举例来说

我们可以利用Embedding,在和LLM交互时,仅包含相关的文本内容。以一个巨大的书籍PDF文件为例,假设这是一本讲述人类历史的书籍。我们希望从中提取关于某个重要历史人物的信息,但不想阅读整个文件。

具体操作方法是:

  1. 将PDF文件的文本内容分块。
  2. 使用Embedding模型将每个文本块转换为向量数组。
  3. 将这些向量数组存储在向量数据库中,同时保存向量数组与文本块之间的关系。

当我们需要回答关于该PDF文件的问题时,例如:“作者对xxx人物的看法是什么?”我们可以:

  1. 使用Embedding模型将问题转换为向量数组。
  2. 使用相似性搜索(如,chatGPT推荐的余弦相似度)将问题向量与PDF文件的向量进行比较,找到最相关的文本块。
  3. 将找到的最相关文本块与问题一起输入到LLM(如GPT-3)中,得到准确的回答。

通过这种方法,我们可以将Embedding与LLM结合,实现高效的文本搜索和问答功能。目前比较火的类chatPDF、以及文档问答产品都采用类似的技术。

产品案例

开源fireBase解决方案SupBase二月份时就推出了一款基于chatGPT API的,支持问答的文档系统(https://supabase.com/blog/chatgpt-supabase-docs)

其中就对这个文档系统的技术路径进行了相应的描述:

一些值得参考的资料

  1. https://openai.com/blog/introducing-text-and-code-embeddings (主要是关于基于embedding的文本与代码搜索的)
  2. https://github.com/openai/openai-cookbook/blob/main/examples/Question_answering_using_embeddings.ipynb (openAI提供的jupyter基于embedding的QA代码示例)
  3. https://supabase.com/blog/chatgpt-supabase-docs

【AIGC】Embedding与LLM:token长度限制困局下,长文本LLM应用的暂缓之计的更多相关文章

  1. Java整型数组的最大长度到底有多长?

    Java整型数组的最大长度到底有多长? 今天上网查了一下,各种说法都有,这个问题似乎总困扰我们Java初学者,无奈,只好自己试了一下,以下是我的测试代码,如果有错误,还望不吝赐教! 使用eclipse ...

  2. 应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) String.prototype.len=function(){return this.replace(/[^\x00-\xff]/g,"aa").length;}

    应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) String.prototype.len=function(){return this.replace(/[^\x00-\xff] ...

  3. Token:共识的下一个100年,区块链技术是无可阻挡的文明进程

    Token:共识的下一个100年,区块链技术是无可阻挡的文明进程.很少有人意识到,区块链的应用——Token可能是近100年来最伟大的制度创新,超越股份制,并将是『债券』之后最重要最主流的交易品种,没 ...

  4. codevs 1862 最长公共子序列(求最长公共子序列长度并统计最长公共子序列的个数)

    题目描述 Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y ...

  5. httprunner学习3-extract提取token值参数关联(上个接口返回的token,传给下个接口请求参数)

    前言 如何将上个接口的返回token,传给下个接口当做请求参数?这是最常见的一个问题了. 解决这个问题其实很简单,我们只需取出token值,设置为一个中间变量a,下个接口传这个变量a就可以了.那么接下 ...

  6. python发送requests请求时,使用登录的token值,作为下一个接口的请求头信息

    背景介绍: 发送搜索请求时,需要用到登录接口返回值中的token值 代码实现: 登录代码: 搜索接口:

  7. python中的标识符长度能有多长

    在python中,标识符可以还是任意长度.此外,我们在命名标识符时还必须遵守以下规则 1 只能以下划线或者A-Z/a-z中字母开头 2 其余部分可以使用A-Z/a-z/0-9 3 区分大小写 4 关键 ...

  8. Post请求方式长度參数过长导致參数为空

    Post提交方式本身对于參数的长度没有限制,HTTP协议也没有限制. 可是今天在做一个web项目的时候碰到一个问题,当要提交的表单内容达到一定大小时,发现后台代码接收到的參数为空. 查询了一下.发现是 ...

  9. 算法进阶 (LIS变形) 固定长度截取求最长不下降子序列【动态规划】【树状数组】

    先学习下LIS最长上升子序列 ​ 看了大佬的文章OTZ:最长上升子序列 (LIS) 详解+例题模板 (全),其中包含普通O(n)算法*和以LIS长度及末尾元素成立数组的普通O(nlogn)算法,当然还 ...

  10. JS指定音频audio在某个时间点进行播放,获取当前音频audio的长度,音频时长格式转化

    前言: 今天接到一个需求,需要获取某个.mp3音频文件的时间长度和指定音频audio在某个时间点进行播放(比如说这个视频有4分钟,我要让它默认从第2秒的时候开始播放),这里当然想到了H5中的audio ...

随机推荐

  1. java程序设置开机自启

    Linux系统jar包开机自启 第一步:创建service文件 sudo nano etc/systemd/system/myapp.service 第二步:将下面代码复制到刚才创建的文件里面,保存 ...

  2. 工作中的技术总结_JQuery_20210825

    工作中的技术总结_JQuery_20210825 JQuery此前接触不多,所以先把此次接触的一些基本操作 1.DOM节点的取值或者赋值: 语法: $(selector).val(value) 参数 ...

  3. Java面试题中高级进阶(JVM篇Java垃圾回收)

    前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说说Java对象创建过程?知道类的生命周期吗?简述Java的对象结构?如何判断对象可以被回收?JVM的永久代中会发生垃圾回收么?你知道哪些 ...

  4. Docker容器制作DockerFile

    Docker换国内源和简单操作 vim /etc/docker/daemon.json { "registry-mirrors": ["http://hub-mirror ...

  5. .NET操作Excel高效低内存的开源框架 - MiniExcel

    .Net平台上对Excel进行操作主要有两种方式.第一种,把Excel文件看成一个数据库,通过OleDb的方式进行读取与操作:第二种,调用Excel的COM组件.两种方式各有特点. 今天给大家介绍第三 ...

  6. 在PyCharm中打包Python项目并将其运行到服务器上的方法

    在PyCharm中打包Python项目并将其运行到服务器上的方法 在PyCharm中打包Python项目并将其运行到服务器上的过程,可以分解为几个关键步骤:创建项目.设置项目依赖.打包项目.配置服务器 ...

  7. C#/.NET/.NET Core技术前沿周刊 | 第 14 期(2024年11.18-11.24)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  8. Python源码分析2 - 一个简单的Python程序的执行

    本文主要通过跟踪一个非常简单的Python程序的执行,简单讨论Python实现的基本框架和结构. 要执行Python程序如下,功能非常简单:从1加到10再打印出来 # test program sum ...

  9. java中并发包简要分析01

    参考<分布式java应用>一书,简单过一遍并发包(java.util.concurrent) ConcurrentHashMap ConcurrentHashMap是线程安全的HashMa ...

  10. Python模块之functools.partial

    在Python编程中,functools.partial是一个强大的工具,它提供了一种部分应用函数的方式,能够在创建新函数时固定部分参数,从而在后续调用中减少需要传递的参数数量.本文将深入介绍func ...