还在为RAG检索发愁?手把手教你用ElasticSearch玩转向量存储,建议收藏!

向量化(Vectorization)是一种将数据或操作转换为向量的过程,以便利用并行计算和高效处理。向量化将非数值数据(如文本、图像)转换为数值向量,以便计算机处理。而向量化在AIGC中非常的常见,例如知识库对话等等。如果大家感兴趣,后面专门来聊聊。

向量长什么样?例如:[0.25, -0.1, 0.7],向量化后的数据通常是一个数值数组

那我们如何将文本向量化呢,有很多种方式,这里我们使用Embedding。

Embedding(嵌入)是一种将高维、离散的数据(如单词、类别、图像等)映射到低维、连续的向量空间的技术。这些向量能够捕捉数据的语义或特征信息,广泛应用于自然语言处理(NLP)、推荐系统和机器学习等领域。

例如通过下面的代码我们可以将文本转换为向量化:

from transformers import BertTokenizer, BertModeltokenizer = BertTokenizer.from_pretrained('bert-base-uncased')model = BertModel.from_pretrained('bert-base-uncased')inputs = tokenizer("I love programming", return_tensors="pt")outputs = model(**inputs)embeddings = outputs.last_hidden_state  # 获取单词或句子的向量

向量数据库是一种专门设计用于存储和查询向量数据的数据库,而ElasticSearch就可以用来存储我们的向量

一、定义向量字段

PUT /test2{  "mappings": {    "properties": {      "my_vector": {        "type": "dense_vector",        "dims": 3      },      "my_text" : {        "type" : "keyword"      }    }  }}

这里我们定义test2 文档的内容如下(my_vector 和 my_text):

my_vector 是一个密集向量(dense vector),用于存储多维数据,如嵌入式表示;而 my_text 是一个关键字类型的字段,通常用于精确匹配和聚合。

dims: 3:指定向量的维度为 3。这意味着每个文档的 my_vector 字段将包含 3 个浮点数。

二、添加向量

PUT /test2/_doc/2{  "my_text" : "text1",  "my_vector" : [0.5, 10, 6]}

假设 text1 的向量为 [0.5, 10, 6]

my_text: “text1”:设置 my_text 字段的值为 “text1”。根据之前的映射,my_text 是一个 keyword 类型的字段,适用于精确匹配和聚合。my_vector: [0.5, 10, 6]:设置 my_vector 字段的值为 [0.5, 10, 6],my_vector 是一个 dense_vector 类型的字段,维度为 3。

卅四年、余弦相似度:cosineSimilarity

那么我们存入了向量是不是也要查询,假如我们有一个字符串 test2 向量化之后的数据为 [-0.5, 10, 7]

POST /test2/_search{  "query": {    "script_score": {      "query": {        "match_all": {}      },      "script": {        "source": "cosineSimilarity(params.queryVector, 'my_vector') + 1.0",        "params": {          "queryVector": [-0.5, 10, 7]        }      }    }  }}

这个请求使用了 script_score 查询,结合 cosineSimilarity 函数来计算文档中 my_vector 字段与给定查询向量之间的余弦相似度。为了确保查询结果的分数是非负的,cosineSimilarity 的结果加了 1.0。

cosineSimilarity 函数:cosineSimilarity 是 Elasticsearch 提供的一个内置函数,用于计算两个向量之间的余弦相似度。它适用于 dense_vector 类型的字段。

余弦相似度(Cosine Similarity)

  • 定义:余弦相似度通过计算两个向量的夹角余弦值来衡量它们的相似性。公式为:

    其中,A⋅BAB 是向量的点积,∥A∥∥A∥ 和 ∥B∥∥B∥ 是向量的模。

  • 用途:常用于文本相似度计算、推荐系统等场景,因为它对向量的绝对大小不敏感,只关注方向。

向量维度:确保 queryVector 的维度与索引映射中定义的 my_vector 字段的维度一致,my_vector 的维度是 3,因此 queryVector 也必须是 3 维向量。如果维度不匹配,Elasticsearch 将返回错误。

评分范围:cosineSimilarity 的结果范围是 [-1, 1],其中 1 表示完全相同,-1 表示完全相反。为了确保评分是非负的,通常会将结果加 1.0,这样评分范围变为 [0, 2]。我们可以根据需要调整这个偏移量。

四、计算点积:dotProduct

除了余弦相似度这种算法,我们还可以使用 计算点积:dotProduct 来计算

POST /test2/_search{  "query": {    "script_score": {      "query": {        "match_all": {}      },      "script": {        "source": "dotProduct(params.queryVector, 'my_vector') + 1.0",        "params": {          "queryVector": [-0.5, 10, 7]        }      }    }  }}

点积(Dot Product)

  • 定义:点积是两个向量对应元素相乘后的和。公式为:

  • 用途:点积可以用于衡量两个向量的相似性,尤其是在向量已经归一化的情况下。它也是许多机器学习算法中的基本操作。

五、曼哈顿距离:l1norm

POST /test2/_search{  "query": {    "script_score": {      "query": {        "match_all": {}      },      "script": {        "source":"1 / (1 + l1norm(params.queryVector, 'my_vector'))",        "params": {          "queryVector": [-0.5, 10, 7]        }      }    }  }}

曼哈顿距离(Manhattan Distance, L1 Norm)

  • 定义:曼哈顿距离是两个向量在标准坐标系下的绝对差之和。公式为:

  • 用途:适用于需要衡量向量之间绝对差异的场景,如路径规划、图像处理等。

六、欧几里得距离:l2norm

POST /test2/_search{  "query": {    "script_score": {      "query": {        "match_all": {}      },      "script": {        "source": "1 / (1 + l2norm(params.queryVector, 'my_vector'))",        "params": {          "queryVector": [            -0.5,            10,            7          ]        }      }    }  }}

欧几里得距离(Euclidean Distance, L2 Norm)

  • 定义:欧几里得距离是两个向量之间的直线距离。公式为:

  • 用途:广泛用于聚类分析、图像识别等领域,因为它直观地反映了向量之间的几何距离。

七、自定义函数

除了上面的内置函数,这些算法在信息检索、推荐系统、聚类分析等领域有广泛应用。我们甚至可以自定义函数:

POST /test2/_search{  "query": {    "script_score": {      "query": {        "match_all": {}      },      "script": {        "source": "float[] v = doc['my_vector'].vectorValue; float vm = doc['my_vector'].magnitude; float dotProduct = 0; for (int i = 0; i < v.length; i++) { dotProduct += v[i] * params.queryVector[i]; } return dotProduct / (vm * (float) params.queryVectorMag);",        "params": {          "queryVector": [            -0.5,            10,            7          ],          "queryVectorMag": 5.25357        }      }    }  }}

脚本逻辑

float[] v = doc['my_vector'].vectorValue;  // 获取文档中的向量float vm = doc['my_vector'].magnitude;    // 获取文档向量的模float dotProduct = 0;                     // 初始化点积for (int i = 0; i < v.length; i++) {      // 遍历向量维度  dotProduct += v[i] * params.queryVector[i]; // 计算点积}return dotProduct / (vm * (float) params.queryVectorMag); // 返回余弦相似度
  • POST /test2/_search:在索引 test2 中执行搜索。
  • query:定义查询逻辑。
  • script_score:使用自定义脚本对文档评分。
  • match_all:匹配所有文档。
  • script:定义评分脚本。
  • params:传递给脚本的参数,包括查询向量 queryVector 和它的模 queryVectorMag

向量化作为一种将高维、离散数据转换为低维、连续向量的技术,已经成为现代数据科学和机器学习领域的核心工具之一。通过将文本、图像、类别等复杂数据转化为数值向量,我们不仅能够更高效地处理和分析这些数据,还能捕捉到数据之间的深层次关系和语义信息。

例如我们公司就是在将文本转存为向量化存储到ES中,从而加入更好的算法,例如RAG Reranker重排,确保能检索到最相关的内容。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值