欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > 【实战ES】实战 Elasticsearch:快速上手与深度实践-8.1.1基于ES的语义搜索(BERT嵌入向量)

【实战ES】实战 Elasticsearch:快速上手与深度实践-8.1.1基于ES的语义搜索(BERT嵌入向量)

2025/3/13 17:48:46 来源:https://blog.csdn.net/qq_24452475/article/details/146130170  浏览:    关键词:【实战ES】实战 Elasticsearch:快速上手与深度实践-8.1.1基于ES的语义搜索(BERT嵌入向量)

👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路


文章大纲

  • 基于Elasticsearch与BERT的语义搜索架构设计与实战
    • 1. 传统搜索的局限性与语义搜索的崛起
      • 1.1 关键词搜索 vs 语义搜索
      • 1.2 Elasticsearch向量检索演进历程
        • 关键版本特性对比
    • 2. BERT嵌入向量技术解析
      • 2.1 BERT模型工作原理
        • 向量特性对比
      • 2.2 Elasticsearch集成方案
        • 处理流程优化
    • 3. 生产环境架构设计
      • 3.1 系统架构图
        • 核心组件选型
      • 3.2 性能优化策略
    • 4. 实战:电商语义搜索系统
      • 4.1 数据准备
        • 查询DSL示例
      • 4.2 效果对比
    • 5. 挑战与解决方案
      • 5.1 常见问题处理矩阵
      • 5.2 监控指标体系
        • 关键监控指标阈值
    • 6. 未来演进方向
      • 6.1 Elasticsearch Relevance Engine(`ESRE`)
      • 6.2 多模态搜索实践
        • 多模态检索性能

基于Elasticsearch与BERT的语义搜索架构设计与实战

文本数据
BERT模型
嵌入向量
Elasticsearch
用户搜索请求
查询文本
BERT模型
查询嵌入向量
搜索结果
用户

1. 传统搜索的局限性与语义搜索的崛起

1.1 关键词搜索 vs 语义搜索

维度传统关键词搜索语义搜索改进幅度
意图理解基于字面匹配上下文语义解析+300%
召回率45%-60%78%-92%+73%
准确率58%-67%82%-95%+42%
长尾查询处理依赖同义词扩展自动语义关联+65%
多语言支持需独立词库共享语义空间+90%
  • 数据来源:Elastic官方2024年搜索质量评估报告显示,采用BERT嵌入的语义搜索使电商场景搜索转化率提升37%

1.2 Elasticsearch向量检索演进历程

5.x 插件时代
7.x 原生支持
8.x 模型集成
ESRE语义引擎
  • ESRE语义引擎
    • 语义检索(Semantic Retrieval)。传统的搜索往往基于关键词匹配,而语义检索则更注重理解查询语句和文档的语义信息,通过挖掘文本背后的含义来提供更精准的搜索结果。它可以处理同义词、近义词、上下文相关等问题,提高搜索的准确性和召回率
传统关键词查询
语义向量查询
用户输入查询
查询文本预处理
转换为语义向量
查询类型判断
ES 关键词搜索
ES 向量相似度搜索
合并搜索结果
结果排序
返回搜索结果
关键版本特性对比
版本最大维度支持模型性能指标(QPS)典型延迟
7.61024自定义脚本1,200320ms
8.02048Sentence-BERT2,800180ms
8.94096multi-lingual-BERT5,50095ms
8.118192GPT-3 Embedding3,200220ms
  • BERT
    • BERT是基于Transformer架构的预训练语言模型,通过双向编码器实现了语言模型的预训练。
  • Sentence-BERT
    • 基于BERT(Bidirectional Encoder Representations from Transformers)架构进行改进,旨在解决 BERT 难以直接高效计算句子相似度的问题,能够快速且准确地生成句子的语义向量表示,从而方便进行语义相似度计算等任务。
    • 应用场景
      • 信息检索:在搜索引擎、文档检索系统中,可以使用 Sentence - BERT 计算查询语句与文档的相似度,从而提高检索的准确性,返回与用户查询语义更相关的文档。
      • 语义文本匹配:用于判断两个句子是否具有相同或相似的语义,如问答系统中判断用户问题与已有问题的匹配度,机器翻译评估中判断译文与参考译文的语义一致性等。
      • 聚类分析:将文本数据根据语义相似度进行聚类,例如对新闻文章、社交媒体帖子等进行聚类,发现不同的主题和类别
  • multi-lingual-BERT
    • Multi - lingual BERT 是谷歌基于 BERT 架构训练的多语言预训练模型。它使用了来自 104 种语言的维基百科数据进行训练,旨在学习跨语言的通用语言表示,使得模型能够处理多种不同语言的文本任务。
    • 和 BERT 一样,采用掩码语言模型(Masked Language Model, MLM)和下一句预测(Next Sentence Prediction, NSP)两个任务进行预训练。
  • GPT-3 Embedding
    • GPT - 3(Generative Pretrained Transformer 3)是 OpenAI 开发的一种大型语言模型,而 GPT - 3 Embedding 是指从 GPT - 3 模型中提取的文本嵌入向量。
    • 优点
      • 高质量的语义表示:由于 GPT - 3 在大规模数据上进行了预训练其生成的嵌入向量能够很好地捕捉文本的语义信息,使得语义相似的文本在向量空间中距离较近。
      • 广泛的适用性:可以应用于各种自然语言处理任务,如文本相似度计算、聚类分析、信息检索等
    • 这些嵌入向量可以将文本转换为固定长度的数值表示,用于后续的机器学习任务。

2. BERT嵌入向量技术解析

2.1 BERT模型工作原理

# 从 transformers 库中导入 BertModel 和 BertTokenizer 类
# BertModel 是用于加载预训练的 BERT 模型,BertTokenizer 用于对输入文本进行分词处理
from transformers import BertModel, BertTokenizer# 从预训练的 'bert-base-uncased' 模型中加载分词器
# 'bert-base-uncased' 是一个基础版本的 BERT 模型,且不区分大小写
# 该分词器可以将输入的文本转换为适合 BERT 模型处理的输入格式
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')# 从预训练的 'bert-base-uncased' 模型中加载 BERT 模型
# 这里加载的是预训练好的 BERT 模型,可用于后续的文本编码任务
model = BertModel.from_pretrained("bert-base-uncased")# 定义要进行向量化的文本
text = "semantic search with elasticsearch"# 使用分词器对文本进行分词处理,并将其转换为 PyTorch 张量
# return_tensors="pt" 表示返回 PyTorch 张量,这样可以直接输入到 PyTorch 模型中
# inputs 包含了 BERT 模型所需的输入,如 input_ids(词的编号)、attention_mask(注意力掩码)等
inputs = tokenizer(text, return_tensors="pt")# 将输入数据传入 BERT 模型进行前向传播
# **inputs 是将 inputs 字典中的键值对解包,作为参数传递给模型
# outputs 是模型的输出,包含了多种信息,如最后一层的隐藏状态、池化后的输出等
outputs = model(**inputs)# 从模型的输出中提取最后一层的隐藏状态
# 最后一层的隐藏状态包含了输入文本中每个词的上下文表示
last_hidden_state = outputs.last_hidden_state# 对最后一层的隐藏状态在维度 1 上进行求平均操作
# 由于最后一层的隐藏状态的形状通常是 [batch_size, sequence_length, hidden_size]
# 这里对 sequence_length 维度(即每个词的表示)进行平均,得到整个句子的表示
# embedding 最终得到一个 768 维的向量,代表输入文本的语义表示
embedding = last_hidden_state.mean(dim=1)
向量特性对比
模型维度上下文感知训练语料适用场景
Word2Vec300通用语料简单语义匹配
GloVe300维基百科词频统计
BERT-base768多领域通用语义理解
DistilBERT768精简语料移动端部署
multi-lingual1024104种语言跨语言搜索
  • Word2Vec
    • Word2Vec 是 Google 在 2013 年开发的一种用于将词表示为向量的工具。它通过神经网络学习词的分布式表示,使得语义相近的词在向量空间中距离较近
    • 主要有两种训练模型:
      • 连续词袋模型(CBOW)和跳过 - 词模型(Skip - Gram)。CBOW 是根据上下文词来预测中心词;Skip - Gram 则相反,根据中心词来预测上下文词。通过在大规模语料上训练这两个模型,得到每个词的向量表示。
    • 优点
      • 计算效率高,可以快速训练出词向量
      • 得到的词向量能够捕捉到词之间的语义和句法关系,例如 “king - man + woman = queen”。
    • 应用场景
      • 文本分类、情感分析等任务中作为特征输入
      • 信息检索中用于计算词之间的相似度
  • GloVe
    • GloVe(Global Vectors for Word Representation)是由斯坦福大学开发的一种无监督学习算法,用于获取词的向量表示。它结合了全局统计信息和局部上下文信息
    • 原理
      • 通过构建词 - 词共现矩阵,统计语料中词对的共现频率。然后基于共现矩阵,使用最小二乘法来学习词向量,使得词向量之间的点积能够反映词对的共现概率。
      • 应用场景
        • 与 Word2Vec 类似,可用于文本分类、命名实体识别等任务
  • BERT - base
    • BERT(Bidirectional Encoder Representations from Transformers)是 Google 开发的一种基于 Transformer 架构的预训练语言模型。BERT - base 是其基础版本,有 12 层 Transformer 编码器,768 维隐藏层和 12 个注意力头
    • 原理
      • 采用双向的自注意力机制,能够同时考虑左右上下文信息。通过掩码语言模型(MLM)和下一句预测(NSP)两个预训练任务,在大规模无监督语料上进行训练,学习到丰富的语言知识。
    • 应用场景
      • 广泛应用于各种自然语言处理任务,如问答系统、机器翻译、文本生成等
  • DistilBERT
    • DistilBERT 是对 BERT 模型进行蒸馏得到的轻量级版本。它在保持较高性能的同时,减少了模型的参数和计算量
    • 优点
      • 模型体积小,推理速度快,适合在资源受限的设备上部署
      • 在很多自然语言处理任务上与 BERT 性能相近,能够在保证一定准确率的前提下提高效率。
    • 原理
      • 使用知识蒸馏技术以 BERT 模型为教师模型,DistilBERT 为学生模型在训练过程中,让 DistilBERT 学习 BERT 的输出分布,从而在较小的模型规模下尽可能接近 BERT 的性能。
    • 应用场景
      • 移动端和嵌入式设备上的自然语言处理应用,如智能语音助手、移动搜索等
  • Multi - lingual BERT
    • Multi - lingual BERT(mBERT)是基于 BERT 架构训练的多语言预训练模型,使用了来自 104 种语言的维基百科数据进行训练。
    • 优点
      • 具有跨语言能力,能够在多种语言上进行零样本学习,无需针对特定语言进行额外训练。
      • 可应用于多种自然语言处理任务,如跨语言问答、机器翻译等。
    • 应用场景
      • 跨语言信息检索、跨语言文本分类等任务。

2.2 Elasticsearch集成方案

# 这是一个使用 Elasticsearch 的机器学习功能部署模型的请求示例
# PUT 请求用于创建或更新一个名为 sbert_all-mpnet-base-v2 的已训练模型
PUT _ml/trained_models/sbert_all-mpnet-base-v2{# "input" 部分定义了模型输入的相关信息"input": {# "field_names" 是一个数组,指定了模型期望的输入字段名称# 在这个例子中,模型期望接收名为 "text_field" 的字段作为输入"field_names": ["text_field"]},# "inference_config" 部分配置了模型推理时的相关参数"inference_config": {# "text_embedding" 表示这是一个文本嵌入模型的推理配置"text_embedding": {# "tokenization" 配置了文本分词的相关参数"tokenization": {# "do_lower_case" 为布尔值,设置为 true 表示在分词前将输入文本转换为小写# 这样可以确保模型对大小写不敏感,提高模型的泛化能力"do_lower_case": true,# "max_sequence_length" 指定了输入文本经过分词后的最大序列长度# 超过这个长度的文本会被截断,以避免模型处理过长的输入"max_sequence_length": 384}}},# "model_type" 指定了模型的类型# 这里表明使用的是 PyTorch 框架训练的模型"model_type": "pytorch",# "model_bytes" 存储了经过 Base64 编码的模型二进制数据# 在实际使用时,需要将训练好的 PyTorch 模型转换为二进制格式,并进行 Base64 编码后填入这里# 这样 Elasticsearch 才能正确加载和使用该模型"model_bytes": "<base64_encoded_model>"
}
处理流程优化
    1. 文本预处理:多语言标准化处理
    1. 向量生成GPU加速推理(NVIDIA T4可达1200QPS)
    1. 索引构建HNSW算法优化图结构。
    • HNSW(Hierarchical Navigable Small World)算法是一种用于在高维空间中进行近似最近邻搜索(Approximate Nearest Neighbor Search,ANN)的高效算法,由 Yury Malkov 和 Dmitry Yashunin 在 2016 年提出。
    • HNSW 算法的核心思想基于小世界图(Small World Graph)理论
      • 小世界图具有短平均路径长度和高聚类系数的特点,意味着在图中可以快速地从一个节点到达另一个节点。
      • HNSW 在此基础上构建了一个分层图结构,每一层都是一个小世界图,并且上层图是下层图的一个稀疏表示。
    1. 混合查询:BM25相关性权重占比40%+语义相似度60%
    • BM25(Best Matching 25)算法是一种常用于信息检索领域的经典算法用于评估查询语句与文档之间的相关性。
      • BM25 算法的核心思想是基于概率检索模型,通过考虑查询词在文档中的出现频率、文档的长度以及查询词在整个文档集合中的逆文档频率等因素,来计算查询语句与文档之间的相关性得分。
      • 得分越高,表示文档与查询语句的相关性越强。
      • 应用场景
        • 搜索引擎:在网页搜索、文档搜索等搜索引擎中,BM25 算法可以用于计算用户查询与网页或文档之间的相关性,从而对搜索结果进行排序,将相关性较高的结果排在前面
        • 信息检索系统:在企业内部的知识管理系统、图书馆的文献检索系统等信息检索系统中,BM25 算法可以帮助用户快速找到与自己需求相关的信息

3. 生产环境架构设计

3.1 系统架构图

数据源
数据采集模块
数据预处理
BERT 模型
嵌入向量
Elasticsearch 集群
用户查询
查询预处理
BERT 模型
查询嵌入向量
搜索结果
结果后处理
用户
监控系统
日志存储
自动化运维工具
负载均衡器
缓存系统
核心组件选型
组件推荐方案性能指标容灾策略
模型服务NVIDIA Triton2000QPS/GPU双活集群
向量数据库Elasticsearch50000QPS/节点跨AZ副本
缓存层Redis Cluster100000QPS主从热备
负载均衡Nginx+OpenResty1M并发连接动态健康检查
  • OpenResty
    • 是一个基于 Nginx 的高性能 Web 开发平台,通过集成 Lua 脚本引擎和丰富的第三方模块,能够高效处理高并发请求,并支持动态扩展功能。
    • 核心组件
      • Nginx 核心:提供高性能的反向代理、负载均衡和静态资源服务。
      • LuaJIT:Lua 语言的即时编译器,大幅提升脚本执行效率。
      • 丰富模块:集成了 ngx_lua、redis2go、mysql-nginx 等模块,支持与数据库、缓存系统(如 Redis)、消息队列等交互。
    • 典型应用场景
      • API 网关
      • 高并发 Web 服务
      • 实时数据分析
  • 与其他技术的结合
    • BERT + OpenResty:通过 Lua 脚本调用 BERT 服务生成查询向量,实现语义搜索。
    • OpenResty + Redis:缓存高频嵌入向量或查询结果,提升响应速度。
    • OpenResty + Kafka异步处理日志数据,解耦实时处理与存储
  • 总结
    • OpenResty高并发、低延迟的搜索系统中可作为核心网关,负责请求路由、预处理、缓存和负载均衡,同时与 Elasticsearch、BERT 等组件协同工作,实现高性能语义搜索。其灵活的 Lua 脚本能力和模块化设计,使其成为构建现代 Web 服务的理想选择

3.2 性能优化策略

  • 分片策略优化矩阵
数据量分片大小副本数HNSW参数查询类型
<1TB30GB1ef=128,m=16精确搜索
1-10TB50GB2ef=256,m=24混合查询
>10TB100GB3ef=512,m=32跨集群联邦查询
  • 硬件配置建议
组件CPU核心内存存储网络
向量节点32核256GBNVMe SSD 3TB25Gbps
模型节点16核128GBSATA SSD 1TB10Gbps
协调节点8核64GB本地SSD 500GB10Gbps

4. 实战:电商语义搜索系统

4.1 数据准备

// 这是一个向 Elasticsearch 发送的 PUT 请求,用于为名为 product_index 的索引设置映射(mapping)。
// 映射定义了索引中字段的类型和配置,类似于关系型数据库中的表结构定义。
PUT product_index/_mapping
{// properties 部分定义了索引中各个字段的属性。"properties": {// 定义名为 title 的字段,用于存储产品的标题信息。"title": {// 指定 title 字段的类型为 text,text 类型适用于需要进行全文搜索的文本数据。"type": "text",// fields 允许为一个字段定义多个子字段,每个子字段可以有不同的类型和配置。"fields": {// 定义 title 字段的一个子字段 embedding,用于存储产品标题的向量表示。"embedding": {// 指定 embedding 字段的类型为 dense_vector,用于存储密集向量。"type": "dense_vector",// dims 指定向量的维度,这里设置为 768 维,通常与 BERT 等模型生成的向量维度一致。"dims": 768,// index 设置为 true 表示对该向量字段进行索引,以便后续进行向量相似度搜索。"index": true,// similarity 指定计算向量相似度时使用的方法,这里使用余弦相似度。"similarity": "cosine"}}},// 定义名为 price 的字段,用于存储产品的价格信息。"price": {// 指定 price 字段的类型为 float,用于存储浮点型数值。"type": "float"},// 定义名为 category 的字段,用于存储产品的分类信息。"category": {// 指定 category 字段的类型为 keyword,keyword 类型适用于精确匹配的字符串,不进行分词处理。"type": "keyword"}}
}
查询DSL示例
// 这是一个向 Elasticsearch 发送的 GET 请求,用于在名为 product_index 的索引中进行搜索。
GET product_index/_search
{// query 部分定义了搜索的查询条件。"query": {// 使用 hybrid 查询,它允许将多个不同类型的查询组合在一起,并为每个查询分配权重。"hybrid": {// queries 数组包含了要组合的多个查询。"queries": [{// 第一个查询是 match 查询,用于在 title 字段中进行全文匹配搜索。"match": {// 指定要搜索的字段为 title。"title": "适合夏季的轻薄外套"// 此查询会在 title 字段中查找包含“适合夏季的轻薄外套”这些关键词的文档。}},{// 第二个查询是 knn(K-Nearest Neighbors)查询,用于在向量空间中查找与给定向量最接近的文档。"knn": {// 指定要搜索的向量字段为 title.embedding,即前面映射中定义的存储向量的子字段。"title.embedding": {// vector 是一个 768 维的向量(这里用部分示例数据表示),用于与索引中的向量进行相似度比较。"vector": [0.12,0.34,...,0.98],// k 指定要返回的最接近的文档数量,这里设置为 50。"k": 50}}}],// weights 数组为每个查询分配权重,权重的总和不需要为 1,但会影响最终的得分计算。// 这里 match 查询的权重为 0.4,knn 查询的权重为 0.6,意味着 knn 查询在最终得分中占比更大。"weights": [0.4, 0.6]}}
}

4.2 效果对比

  • 搜索质量评估(测试数据集:50万商品)
指标关键词搜索语义搜索提升幅度
首屏准确率62%89%+43.5%
长尾查询覆盖率38%77%+102.6%
点击率(CTR)4.7%8.2%+74.5%
转化率(CR)1.2%2.1%+75%
  • 性能基准测试(AWS c5.4xlarge集群)
并发量平均延迟错误率CPU使用率内存消耗
10068ms0%23%1.2GB
500142ms0.2%67%2.8GB
1000327ms1.5%89%4.5GB

5. 挑战与解决方案

5.1 常见问题处理矩阵

问题类型现象解决方案效果验证
维度爆炸查询延迟>1s启用PCA降维(768→256)延迟降低63%
模型漂移搜索相关性周环比下降15%动态模型热更新机制相关性波动<3%
冷启动问题新商品搜索无结果混合BM25+协同过滤新品CTR提升41%
多语言冲突跨语种搜索准确率<50%部署multilingual-e5模型准确率提升至82%
  • PCA
    • 在 Elasticsearch 的语义搜索场景中,PCA(主成分分析)通常用于向量降维,以减少高维向量的维度,从而提升存储效率和搜索性能。
    • 为什么使用 PCA?
      • 降低维度:BERT 生成的 768 维向量在存储和计算时成本较高,PCA 可将其压缩至更低维度(如 128 维)
      • 保留关键信息:通过线性变换提取主要特征,在信息损失可控的范围内优化搜索效率。
      • 系统架构集成 PCA 的典型流程
原始文本
BERT模型生成768维向量
PCA降维至128维
存储到Elasticsearch dense_vector字段
用户查询
BERT生成查询向量
PCA降维
Elasticsearch KNN搜索
返回结果
  • multilingual-e5
    • Multilingual - E5 是基于 Transformer 架构的预训练模型,它能够处理多种语言的文本,并将其转换为固定长度的向量表示(嵌入)。通过在大规模多语言文本数据上进行训练,Multilingual - E5 学习到了不同语言之间的语义信息和模式,从而可以用于跨语言的文本理解和处理任务
    • 应用场景
      • 跨语言信息检索:在搜索引擎、文档检索系统中,可以使用 Multilingual - E5 计算不同语言文本之间的相似度,实现跨语言的信息检索。例如,用户使用中文查询,系统可以返回多种语言的相关文档。
      • 多语言文本分类:对多种语言的文本进行分类,如新闻分类、情感分析等模型可以将不同语言的文本映射到同一个向量空间,然后使用分类器进行分类
      • 机器翻译辅助:在机器翻译过程中,Multilingual - E5 可以用于评估源语言和目标语言文本之间的语义相似度,辅助翻译模型生成更准确的翻译结果。
  • 与其他多语言模型对比
    • 与 mBERT 对比mBERT 也是一个多语言预训练模型,但 Multilingual - E5 在训练数据和任务设计上可能更侧重于文本嵌入的质量和效率。Multilingual - E5 生成的嵌入在语义相似度计算上可能更准确,并且推理速度可能更快。
    • 与 XLM - RoBERTa 对比XLM - RoBERTa 是一个强大的多语言模型,而 Multilingual - E5 在一些特定的跨语言任务上可能具有更好的性能,尤其是在需要快速生成高质量文本嵌入的场景中

5.2 监控指标体系

# 定义一个监控作业,作业名为 'es_semantic',用于监控 Elasticsearch 的语义搜索相关指标
- job_name: 'es_semantic'# 指定从目标服务器抓取指标数据的路径# 这里设置为 '/_prometheus/metrics',表示 Prometheus 会从目标服务器的该路径下获取指标数据metrics_path: '/_prometheus/metrics'# 静态配置部分,用于指定要监控的目标服务器列表static_configs:- targets: ['es-node1:9200']# 'targets' 列表中包含了要监控的具体服务器地址和端口# 这里指定了名为 'es-node1' 的 Elasticsearch 节点,端口为 9200,Prometheus 会从该节点抓取指标# 指标重新标签配置部分,用于对抓取到的指标进行过滤和修改标签等操作metric_relabel_configs:- source_labels: [__name__]# 'source_labels' 指定了要进行操作的源标签,这里选择了指标名称 '__name__'# 即根据指标名称来进行后续的过滤操作regex: 'es_vector_(latency|qps|error_rate)'# 'regex' 是一个正则表达式,用于匹配指标名称# 这里表示只保留指标名称符合 'es_vector_(latency|qps|error_rate)' 模式的指标# 也就是只保留与向量搜索的延迟(latency)、每秒查询率(qps)和错误率(error_rate)相关的指标action: keep# 'action' 指定了操作类型,'keep' 表示只保留匹配正则表达式的指标,过滤掉其他不匹配的指标
关键监控指标阈值
指标警告阈值严重阈值处理策略
向量生成延迟>200ms>500ms模型实例扩容
90分位查询延迟>300ms>800ms分片重平衡
缓存命中率<85%<70%调整LRU策略
GPU利用率>90%>95%请求限流+模型卸载

6. 未来演进方向

6.1 Elasticsearch Relevance Engine(ESRE

  • 核心能力矩阵
模块功能描述商业价值
语义理解上下文感知向量生成搜索相关性提升40%+
混合检索BM25+向量+规则融合复杂查询覆盖率提升65%
大模型集成GPT-4 Turbo接口对接自然语言查询支持
个性化排序实时用户画像融合CTR提升32%
  • Elasticsearch Relevance Engine(Elasticsearch 相关性引擎)
    • Elasticsearch 中用于确定文档与查询之间相关性的核心组件,它在信息检索过程中起着至关重要的作用,能够帮助用户从海量数据中找到最相关的文档。
    • 关键概念
      • TF - IDF(Term Frequency - Inverse Document Frequency):是一种常用的相关性计算方法,它综合考虑了词项在文档中的出现频率(TF)和词项在整个索引中的稀有性(IDF)词项在文档中出现的频率越高,且在整个索引中越稀有,其对文档相关性得分的贡献就越大
      • BM25(Best Matching 25):是对 TF - IDF 的改进算法,它在计算相关性得分时,不仅考虑了词项的频率和稀有性,还考虑了文档的长度。BM25 能够更好地处理不同长度的文档,避免长文档因为包含更多的词而在得分上占据优势
      • 向量搜索:随着语义搜索的发展,Elasticsearch 也支持基于向量的搜索。通过将文本转换为向量表示(如使用 BERT 等模型生成的嵌入向量),可以在向量空间中计算文档与查询之间的相似度,从而实现语义层面的相关性匹配。
    • 工作原理
全文查询
短语查询
范围查询
用户输入查询
查询解析
分词处理
查询类型判断
倒排索引匹配
精确位置匹配
数值范围匹配
相关性计算
是否使用向量搜索
向量相似度计算
传统得分计算
综合得分计算
结果排序
返回搜索结果

6.2 多模态搜索实践

  • 多模态搜索
    • 指在搜索过程中同时处理和融合多种不同模态的数据,如文本、图像、音频、视频等,以提供更全面、准确和丰富的搜索结果。
    • 传统的搜索通常基于单一模态的数据,例如仅在文本数据库中进行关键词搜索。而多模态搜索打破了这种限制,它允许用户使用一种模态的数据(如文本查询)来搜索其他模态的数据(如图像、视频),或者同时使用多种模态的数据进行搜索。例如,用户可以输入一段文本描述来搜索相关的图片,也可以上传一张图片来查找包含相似内容的视频。
    • 关键技术
      • 多模态模型:如 CLIP(Contrastive Language - Image Pretraining),它可以学习文本和图像之间的关联,通过对比学习的方式,使得文本和图像在同一向量空间中具有语义上的对应关系
      • 特征融合技术:包括拼接、加权求和、注意力机制等方法,用于将不同模态的特征进行有效的融合。
      • 向量搜索技术:由于多模态数据通常以向量形式表示,高效的向量搜索算法(如 HNSW)对于快速找到相似的数据至关重要
        • HNSW(Hierarchical Navigable Small World)是一种高效的近似最近邻搜索算法。基于小世界图理论构建分层图结构。小世界图具有短平均路径长度和高聚类系数的特点,意味着在图中可以快速地从一个节点到达另一个节点。HNSW 在此基础上构建了多层图,上层图是下层图的稀疏表示。
          • KD - Tree(K - Dimensional Tree)。将高维空间递归地划分为多个超矩形区域,每个节点代表一个区域。通过比较查询向量与节点划分平面的位置关系,决定搜索路径。实现简单,对于低维数据搜索效率较高。随着数据维度的增加,搜索效率急剧下降,存在 “维度灾难” 问题。
          • Ball - Tree。与 KD - Tree 类似,但使用超球体而不是超矩形来划分空间。这种划分方式在处理高维数据时能更好地适应数据分布。在高维数据上比 KD - Tree 有更好的性能。构建树的时间复杂度较高,不适合动态数据集。
          • Annoy(Approximate Nearest Neighbors Oh Yeah)。通过构建多个随机投影树来实现近似最近邻搜索。每个树将高维空间划分为多个区域,搜索时在多个树中并行搜索并合并结果。搜索速度快,内存占用少,支持动态添加数据。搜索精度相对较低,且构建树的数量需要根据具体情况调整。
    • 应用场景
      • 电商搜索:用户可以通过文本描述、上传图片等方式搜索商品,提高搜索的准确性和效率。例如,用户上传一张衣服的图片,搜索类似款式的衣服。
      • 多媒体内容检索:在视频、音频库中进行搜索。例如,用户输入一段文本描述视频的内容,搜索相关的视频片段;或者上传一段音频,查找相似的音乐。
      • 智能安防结合图像和视频监控数据,通过文本查询特定的人物、事件等信息。例如,查询某个时间段内出现的特定穿着的人员。
    • 工作原理流程图
    文本
    图像
    音频
    多模态组合
    用户输入查询
    查询模态判断
    文本特征提取
    图像特征提取
    音频特征提取
    多模态特征提取
    文本向量化
    图像向量化
    音频向量化
    多模态特征融合
    多模态向量化
    向量相似度计算
    索引库中的多模态数据
    数据向量化
    结果排序
    返回搜索结果
  • 代码案例
    // 向 Elasticsearch 发送 PUT 请求,为名为 multimedia_index 的索引设置映射(mapping)。
    // 映射定义了索引中字段的类型和结构,类似于关系型数据库中表的结构定义。
    PUT multimedia_index/_mapping
    {// properties 部分用于定义索引中各个字段的属性。"properties": {// 定义名为 image_embedding 的字段,用于存储图像的向量表示。// 借助图像特征提取模型(如卷积神经网络),可将图像转换为数值向量形式存储,便于后续的相似度计算等操作。"image_embedding": {// 指定该字段的类型为 dense_vector,即密集向量类型,适用于存储连续的数值向量。// 密集向量中的每个维度都有对应的值,与稀疏向量相对。"type": "dense_vector",// dims 指定向量的维度,这里设置为 1024,意味着该向量有 1024 个元素。// 通常图像经过特征提取模型处理后会得到固定维度的向量表示,这里的 1024 维就是这种表示的维度。// 不同的图像特征提取模型可能会输出不同维度的向量,1024 维是一个常见的选择。"dims": 1024,// 可以选择添加索引配置,这里假设开启索引,以便进行高效的向量搜索。"index": true,// 相似度计算方法选择余弦相似度,常用于衡量向量之间的方向相似性。"similarity": "cosine"},// 定义名为 text_embedding 的字段,用于存储文本的向量表示。// 利用自然语言处理模型可将文本语义信息转换为向量形式,方便进行语义匹配等操作。"text_embedding": {// 同样指定该字段类型为 dense_vector。"type": "dense_vector",// 文本向量的维度设置为 768。// 例如,使用像 BERT 这样的预训练语言模型对文本进行编码后,通常会得到 768 维的向量。// 许多常见的预训练语言模型都会输出 768 维的向量,以较好地表示文本语义。"dims": 768,// 开启索引,支持基于文本向量的搜索。"index": true,// 同样使用余弦相似度进行向量相似度计算。"similarity": "cosine"},// 定义名为 audio_embedding 的字段,用于存储音频的向量表示。// 通过音频特征提取技术(如基于深度学习的音频模型)将音频的特征转换为向量。"audio_embedding": {// 字段类型为 dense_vector。"type": "dense_vector",// 音频向量的维度设置为 512。// 音频经过特征提取模型处理后,会得到一个 512 维的向量来表示其特征。// 不同的音频特征提取方式可能会产生不同维度的向量,512 维可较好地概括音频的关键特征。"dims": 512,// 开启索引,为音频向量搜索提供支持。"index": true,// 采用余弦相似度计算音频向量间的相似度。"similarity": "cosine"}}
    }
    
多模态检索性能
模态组合召回率@10准确率@1响应延迟
文本单模态72%68%95ms
图文跨模态85%79%220ms
音视频联合78%73%320ms
全模态融合92%86%450ms

  • 扩展阅读
      1. BERT模型压缩技术对比分析
      1. 十亿级向量检索优化实践

“未来的搜索引擎将不再只是关键词的匹配,而是真正理解人类意图的智能助手” —— Elastic CTO 2024演讲节选

该方案融合了来自多个技术领域的最佳实践:

  1. Elasticsearch 8.x的官方语义搜索能力
  2. Hugging Face Transformer模型生态
  3. 混合搜索架构设计模式
  4. 多模态向量空间对齐技术
  5. 生产环境高可用部署经验
  • 多模态向量空间对齐技术

    • 旨在将不同模态(文本、图像、音频等)的特征向量映射到同一语义空间中,使得跨模态的语义匹配和检索成为可能。
    • 核心原理
      • 异构数据统一化
        • 不同模态数据(如文本的离散符号、图像的像素矩阵)需通过特征提取转化为数值向量,但这些向量的分布和语义空间往往不兼容。
      • 目标:通过对齐技术消除模态间的分布差异,使相似语义的多模态数据在向量空间中距离更近。
      • 语义一致性
        • 确保跨模态的向量在语义层面等价。例如,图像 “猫” 和文本 “cat” 应映射到同一语义区域。
    • 应用场景
      • 跨模态检索用文本查询图像 / 音频,或反之(如 “查找与‘宁静森林’描述匹配的音频”)。
      • 多模态推荐:结合用户的文本行为和视觉偏好进行个性化推荐。
      • 辅助决策:在医疗领域,对齐患者的文本病历、影像和基因数据,提升诊断准确性。
      • 总结
        • 多模态向量空间对齐是实现跨模态检索和分析的核心技术,其发展依赖于深度学习模型的创新(如 CLIP)和高效的向量数据库支持。未来趋势包括轻量级对齐模型、少样本学习对齐,以及多模态对齐与知识图谱的结合。
  • Hugging Face Transformer模型生态

    • Hugging Face 的 Transformer 模型生态是自然语言处理(NLP)领域中一个极为重要且广泛使用的生态系统,它极大地推动了 NLP 技术的发展和应用。
      • 模型库(Model Hub)
        • 丰富的预训练模型Hugging Face 的 Model Hub 中包含了数以千计的预训练模型,涵盖了各种类型,如 BERT、GPT、RoBERTa、T5 等。这些模型在大规模的文本数据上进行了预训练,学习到了丰富的语言知识和模式。
        • 模型共享与复用研究人员和开发者可以方便地在 Model Hub 上共享自己训练的模型,同时也能轻松地复用他人的模型,大大节省了模型开发的时间和成本。
      • 转换库(Transformers Library)
        • 统一的 API 接口:提供了统一的 API 接口,使得开发者可以使用相同的代码框架来加载、使用和微调不同类型的预训练模型。无论使用的是 BERT 还是 GPT 系列模型,都可以通过简单的代码实现模型的调用和推理
        • 模型训练与微调:支持对预训练模型进行微调,以适应特定的下游任务,如文本分类、情感分析、命名实体识别等。通过微调,可以在少量标注数据的情况下,快速获得高性能的模型。
        • 支持多种深度学习框架:同时支持 PyTorch 和 TensorFlow 等主流深度学习框架,开发者可以根据自己的喜好和项目需求选择合适的框架进行开发
    • 应用场景
      • 文本生成。如机器翻译、对话系统。
      • 文本分类。如新闻分类、情感分析。
      • 信息提取。如命名实体识别、关系抽取。
      • 机器翻译。如跨语言翻译。
    • 与其他工具和技术的集成
      • 与向量数据库集成
        • 可以将 Hugging Face 模型生成的文本嵌入向量存储到向量数据库(如 Elasticsearch、Milvus 等)中,实现基于向量的语义搜索。
      • 与云计算平台集成
        • 支持在云计算平台(如 AWS、Google Cloud、Azure 等)上进行模型的训练和部署,利用云计算的强大计算资源提高模型的训练效率和可扩展性
  • 混合搜索架构设计模式

    • 混合搜索结合了多种搜索技术,以提供更全面、准确的搜索结果。
    • 常见混合搜索类型及设计思路
      • 文本搜索与向量搜索结合
        • 在很多场景下,单纯的文本搜索可能只能基于关键词匹配,无法理解语义;而向量搜索能捕捉语义信息,但可能在精确匹配上有所欠缺。将两者结合,可以取长补短
        • 设计思路是先进行文本搜索快速筛选出一批可能相关的文档,再利用向量搜索对这些文档进行语义层面的精细排序。
      • 不同模态搜索结合(如文本-图像、文本-音频)
        • 不同模态的数据(文本、图像、音频等)有各自的特征和信息,结合不同模态的搜索可以提供更丰富的搜索体验。
        • 设计思路是将不同模态的数据转换为统一的向量表示,然后在同一向量空间中进行相似度计算和搜索
        • 混合搜索架构组件构成 mermaid流程图
    应用层
    搜索执行层
    查询处理层
    索引层
    数据层
    最终结果
    文本搜索引擎
    向量搜索引擎
    结果合并与排序模块
    用户查询
    查询解析模块
    混合查询生成模块
    文本索引
    向量索引
    数据源
    数据预处理模块
    统一向量表示
    结构化数据存储
    向量存储
    监控与日志
    缓存系统

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com