【实战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的语义搜索架构设计与实战
1. 传统搜索的局限性与语义搜索的崛起
1.1 关键词搜索 vs 语义搜索
维度 | 传统关键词搜索 | 语义搜索 | 改进幅度 |
---|---|---|---|
意图理解 | 基于字面匹配 | 上下文语义解析 | +300% |
召回率 | 45%-60% | 78%-92% | +73% |
准确率 | 58%-67% | 82%-95% | +42% |
长尾查询处理 | 依赖同义词扩展 | 自动语义关联 | +65% |
多语言支持 | 需独立词库 | 共享语义空间 | +90% |
- 数据来源:Elastic官方2024年搜索质量评估报告显示,采用BERT嵌入的语义搜索使电商场景搜索转化率提升37%
1.2 Elasticsearch向量检索演进历程
- ESRE语义引擎
语义检索(Semantic Retrieval)
。传统的搜索往往基于关键词匹配,而语义检索则更注重理解查询语句和文档的语义信息,通过挖掘文本背后的含义来提供更精准的搜索结果
。它可以处理同义词、近义词、上下文相关等问题,提高搜索的准确性和召回率
。
关键版本特性对比
版本 | 最大维度 | 支持模型 | 性能指标(QPS) | 典型延迟 |
---|---|---|---|---|
7.6 | 1024 | 自定义脚本 | 1,200 | 320ms |
8.0 | 2048 | Sentence-BERT | 2,800 | 180ms |
8.9 | 4096 | multi-lingual-BERT | 5,500 | 95ms |
8.11 | 8192 | GPT-3 Embedding | 3,200 | 220ms |
BERT
- BERT是基于
Transformer
架构的预训练语言模型,通过双向编码器
实现了语言模型的预训练。
- BERT是基于
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)
向量特性对比
模型 | 维度 | 上下文感知 | 训练语料 | 适用场景 |
---|---|---|---|---|
Word2Vec | 300 | ❌ | 通用语料 | 简单语义匹配 |
GloVe | 300 | ❌ | 维基百科 | 词频统计 |
BERT-base | 768 | ✅ | 多领域 | 通用语义理解 |
DistilBERT | 768 | ✅ | 精简语料 | 移动端部署 |
multi-lingual | 1024 | ✅ | 104种语言 | 跨语言搜索 |
Word2Vec
- Word2Vec 是 Google 在 2013 年开发的一种用于将词表示为向量的工具。
它通过神经网络学习词的分布式表示,使得语义相近的词在向量空间中距离较近
。 - 主要有两种训练模型:
连续词袋模型(CBOW)和跳过 - 词模型(Skip - Gram)
。CBOW 是根据上下文词来预测中心词;Skip - Gram 则相反,根据中心词来预测上下文词。通过在大规模语料上训练这两个模型,得到每个词的向量表示。
- 优点
计算效率高,可以快速训练出词向量
。- 得到的词向量能够捕捉到词之间的语义和句法关系,例如 “king - man + woman = queen”。
- 应用场景
文本分类、情感分析等任务中作为特征输入
。信息检索中用于计算词之间的相似度
。
- Word2Vec 是 Google 在 2013 年开发的一种用于将词表示为向量的工具。
GloVe
GloVe(Global Vectors for Word Representation)
是由斯坦福大学开发的一种无监督学习算法,用于获取词的向量表示。它结合了全局统计信息和局部上下文信息
。- 原理
通过构建词 - 词共现矩阵,统计语料中词对的共现频率
。然后基于共现矩阵,使用最小二乘法来学习词向量,使得词向量之间的点积能够反映词对的共现概率。- 应用场景
- 与 Word2Vec 类似,
可用于文本分类、命名实体识别等任务
。
- 与 Word2Vec 类似,
BERT - base
- BERT(Bidirectional Encoder Representations from Transformers)是 Google 开发的一种基于 Transformer 架构的预训练语言模型。
BERT - base 是其基础版本,有 12 层 Transformer 编码器,768 维隐藏层和 12 个注意力头
。 - 原理
- 采用
双向的自注意力机制
,能够同时考虑左右上下文信息。通过掩码语言模型(MLM)和下一句预测(NSP)两个预训练任务
,在大规模无监督语料上进行训练,学习到丰富的语言知识。
- 采用
- 应用场景
- 广泛应用于各种自然语言处理任务,
如问答系统、机器翻译、文本生成等
。
- 广泛应用于各种自然语言处理任务,
- BERT(Bidirectional Encoder Representations from Transformers)是 Google 开发的一种基于 Transformer 架构的预训练语言模型。
DistilBERT
- DistilBERT 是
对 BERT 模型进行蒸馏得到的轻量级版本
。它在保持较高性能的同时,减少了模型的参数和计算量
。 - 优点
模型体积小,推理速度快,适合在资源受限的设备上部署
。- 在很多自然语言处理任务上与 BERT 性能相近,能够在保证一定准确率的前提下提高效率。
- 原理
- 使用
知识蒸馏技术
,以 BERT 模型为教师模型,DistilBERT 为学生模型
。在训练过程中,让 DistilBERT 学习 BERT 的输出分布,从而在较小的模型规模下尽可能接近 BERT 的性能。
- 使用
- 应用场景
- 移动端和嵌入式设备上的自然语言处理应用,如
智能语音助手、移动搜索等
。
- 移动端和嵌入式设备上的自然语言处理应用,如
- DistilBERT 是
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>"
}
处理流程优化
-
- 文本预处理:多语言标准化处理
-
- 向量生成:
GPU加速推理(NVIDIA T4可达1200QPS)
- 向量生成:
-
- 索引构建:
HNSW算法
优化图结构。
HNSW(Hierarchical Navigable Small World)
算法是一种用于在高维空间中进行近似最近邻搜索(Approximate Nearest Neighbor Search,ANN)
的高效算法,由 Yury Malkov 和 Dmitry Yashunin 在 2016 年提出。- HNSW 算法的核心思想基于
小世界图(Small World Graph)理论
。- 小世界图具有短平均路径长度和高聚类系数的特点,意味着在图中可以快速地从一个节点到达另一个节点。
HNSW 在此基础上构建了一个分层图结构,每一层都是一个小世界图
,并且上层图是下层图的一个稀疏表示。
- 索引构建:
-
- 混合查询:BM25相关性权重占比40%+语义相似度60%
BM25(Best Matching 25)
算法是一种常用于信息检索领域的经典算法
,用于评估查询语句与文档
之间的相关性。BM25 算法的核心思想是基于概率检索模型
,通过考虑查询词在文档中的出现频率、文档的长度以及查询词在整个文档集合中的逆文档频率等因素
,来计算查询语句与文档之间的相关性得分。- 得分越高,表示文档与查询语句的相关性越强。
- 应用场景
搜索引擎
:在网页搜索、文档搜索等
搜索引擎中,BM25 算法可以用于计算用户查询与网页或文档之间的相关性
,从而对搜索结果进行排序,将相关性较高的结果排在前面
。信息检索系统
:在企业内部的知识管理系统、图书馆的文献检索系统等
信息检索系统中,BM25 算法可以帮助用户快速找到与自己需求相关的信息
。
3. 生产环境架构设计
3.1 系统架构图
核心组件选型
组件 | 推荐方案 | 性能指标 | 容灾策略 |
---|---|---|---|
模型服务 | NVIDIA Triton | 2000QPS/GPU | 双活集群 |
向量数据库 | Elasticsearch | 50000QPS/节点 | 跨AZ副本 |
缓存层 | Redis Cluster | 100000QPS | 主从热备 |
负载均衡 | Nginx+OpenResty | 1M并发连接 | 动态健康检查 |
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参数 | 查询类型 |
---|---|---|---|---|
<1TB | 30GB | 1 | ef=128,m=16 | 精确搜索 |
1-10TB | 50GB | 2 | ef=256,m=24 | 混合查询 |
>10TB | 100GB | 3 | ef=512,m=32 | 跨集群联邦查询 |
- 硬件配置建议
组件 | CPU核心 | 内存 | 存储 | 网络 |
---|---|---|---|---|
向量节点 | 32核 | 256GB | NVMe SSD 3TB | 25Gbps |
模型节点 | 16核 | 128GB | SATA SSD 1TB | 10Gbps |
协调节点 | 8核 | 64GB | 本地SSD 500GB | 10Gbps |
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使用率 | 内存消耗 |
---|---|---|---|---|
100 | 68ms | 0% | 23% | 1.2GB |
500 | 142ms | 0.2% | 67% | 2.8GB |
1000 | 327ms | 1.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 生成的
- 在 Elasticsearch 的语义搜索场景中,
- multilingual-e5
Multilingual - E5
是基于 Transformer 架构的预训练模型,它能够处理多种语言的文本,并将其转换为固定长度的向量表示(嵌入)。通过在大规模多语言文本数据上进行训练,Multilingual - E5 学习到了不同语言之间的语义信息和模式,从而可以用于跨语言的文本理解和处理任务
。应用场景
- 跨语言信息检索:在
搜索引擎、文档检索系统
中,可以使用 Multilingual - E5 计算不同语言文本之间的相似度,实现跨语言的信息检索。例如,用户使用中文查询,系统可以返回多种语言的相关文档。
- 多语言文本分类:对多种语言的文本进行分类,
如新闻分类、情感分析等
。模型可以将不同语言的文本映射到同一个向量空间,然后使用分类器进行分类
。 - 机器翻译辅助:在机器翻译过程中,Multilingual - E5 可以用于
评估源语言和目标语言文本之间的语义相似度
,辅助翻译模型生成更准确的翻译结果。
- 跨语言信息检索:在
- 与其他多语言模型对比
- 与 mBERT 对比:
mBERT
也是一个多语言预训练模型,但Multilingual - E5 在训练数据和任务设计上可能更侧重于文本嵌入的质量和效率
。Multilingual - E5 生成的嵌入在语义相似度计算上可能更准确,并且推理速度可能更快。 - 与 XLM - RoBERTa 对比:
XLM - RoBERTa 是一个强大的多语言模型
,而Multilingual - E5 在一些特定的跨语言任务上可能具有更好的性能,尤其是在需要快速生成高质量文本嵌入的场景中
。
- 与 mBERT 对比:
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 等模型生成的嵌入向量),可以在向量空间中计算文档与查询之间的相似度
,从而实现语义层面的相关性匹配。
- 工作原理
- Elasticsearch 中用于确定
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 |
- 扩展阅读:
-
- BERT模型压缩技术对比分析
-
- 十亿级向量检索优化实践
-
“未来的搜索引擎将不再只是关键词的匹配,而是真正理解人类意图的智能助手” —— Elastic CTO 2024演讲节选
该方案融合了来自多个技术领域的最佳实践:
- Elasticsearch 8.x的官方语义搜索能力
- Hugging Face Transformer模型生态
混合搜索架构设计模式
多模态向量空间对齐技术
- 生产环境高可用部署经验
-
多模态向量空间对齐技术
- 旨在将不同模态(文本、图像、音频等)的特征向量映射到同一语义空间中,使得跨模态的语义匹配和检索成为可能。
核心原理
- 异构数据统一化
- 不同模态数据(如文本的离散符号、图像的像素矩阵)需通过特征提取转化为数值向量,但这些向量的分布和语义空间往往不兼容。
- 目标:通过对齐技术消除模态间的分布差异,使相似语义的多模态数据在向量空间中距离更近。
- 语义一致性
- 确保跨模态的向量在语义层面等价。例如,图像 “猫” 和文本 “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 等主流深度学习框架,
开发者可以根据自己的喜好和项目需求选择合适的框架进行开发
。
- 统一的 API 接口:提供了统一的 API 接口,使得开发者可以使用相同的代码框架来加载、使用和微调不同类型的预训练模型。无论使用的是 BERT 还是 GPT 系列模型,
- 模型库(Model Hub)
- 应用场景
- 文本生成。如机器翻译、对话系统。
- 文本分类。如新闻分类、情感分析。
- 信息提取。如命名实体识别、关系抽取。
- 机器翻译。如跨语言翻译。
- 与其他工具和技术的集成
- 与向量数据库集成
- 可以将 Hugging Face 模型生成的文本嵌入向量存储到
向量数据库(如 Elasticsearch、Milvus 等)
中,实现基于向量的语义搜索。
- 可以将 Hugging Face 模型生成的文本嵌入向量存储到
- 与云计算平台集成
- 支持在云计算平台(如 AWS、Google Cloud、Azure 等)上进行模型的训练和部署,
利用云计算的强大计算资源提高模型的训练效率和可扩展性
。
- 支持在云计算平台(如 AWS、Google Cloud、Azure 等)上进行模型的训练和部署,
- 与向量数据库集成
- Hugging Face 的 Transformer 模型生态是自然语言处理(NLP)领域中一个极为重要且广泛使用的生态系统,它极大地推动了 NLP 技术的发展和应用。
-
混合搜索架构设计模式
- 混合搜索结合了多种搜索技术,以提供更全面、准确的搜索结果。
- 常见混合搜索类型及设计思路
文本搜索与向量搜索结合
- 在很多场景下,
单纯的文本搜索可能只能基于关键词匹配,无法理解语义;而向量搜索能捕捉语义信息,但可能在精确匹配上有所欠缺。将两者结合,可以取长补短
。 - 设计思路是先进行文本搜索快速筛选出一批可能相关的文档,再利用向量搜索对这些文档进行语义层面的精细排序。
- 在很多场景下,
不同模态搜索结合(如文本-图像、文本-音频)
- 不同模态的数据(文本、图像、音频等)有各自的特征和信息,结合不同模态的搜索可以提供更丰富的搜索体验。
设计思路是将不同模态的数据转换为统一的向量表示,然后在同一向量空间中进行相似度计算和搜索
。- 混合搜索架构组件构成 mermaid流程图
相关文章:
【实战ES】实战 Elasticsearch:快速上手与深度实践-8.1.1基于ES的语义搜索(BERT嵌入向量)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 基于Elasticsearch与BERT的语义搜索架构设计与实战1. 传统搜索的局限性与语义搜索的崛起1.1 关键词搜索 vs 语义搜索1.2 Elasticsearch向量检索演进历程关键版本特性对比 2.…...
【Node.js】--- win11安装 Node.js
在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【Node.js】--- win11安装 Node.js 开发环…...
【技海登峰】Kafka漫谈系列(九)SpringBoot整合Kafka多数据源配置
【技海登峰】Kafka漫谈系列(九)SpringBoot整合Kafka多数据源配置 Kafka官方提供了基于Java实现的客户端kafka-clients,用于提供生产者和消费者的基本能力。在此基础上,Spring for Apache Kafka(spring-kafka)项目对该原生客户端进行了基于Spring特性的抽象与封装,实现了基…...
【MySQL篇】基本查询实战OJ
本篇是基于上篇mysql基本查询的一些OJ题 MySQL基本查询传送门:【MySQL篇】MySQL基本查询详解-CSDN博客 批量插入数据_牛客题霸_牛客网 insert语句 insert into actor values (1,PENELOPE,GUINESS,2006-02-15 12:34:33); insert into actor values (2,NICK,WAHLBER…...
侯捷 C++ 课程学习笔记:C++内存管理机制
内存管理从平地到万丈高楼 内存管理入门(Memory Management 101) 需要具有动态分配并使用memory(存储(器),(计算机的)内存),使用过C标准库的容器࿰…...
java后端开发day31--集合进阶(一)-----Collection集合List集合数据结构1
(以下内容全部来自上述课程) 1.集合体系结构 List系列集合:添加的元素是有序、可重复、有索引。 Set系列集合:添加的元素是无序、不重复、无索引。 2.Collection集合 Collection是单列集合的祖宗接口(不可直接创建…...
TA学习之路——1.4 MVP矩阵运算
1.变换矩阵的意义 1.将3D物体转化到2D平面 2.为各个空间的运用做准备 2.MVP矩阵代表什么 MVP矩阵分别是模型(Model)、观察(View)、投影(Projecttion)三个矩阵。我们顶点坐标起始于局部空间(Local Space)…...
Java数据结构第二十期:解构排序算法的艺术与科学(二)
专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、常见排序算法的实现 1.1. 直接选择排序 1.2. 堆排序 1.3. 冒泡排序 1.4. 快速排序 一、常见排序算法的实现 1.1. 直接选择排序 每⼀次从待排序的数据元素中选出最小的⼀个元素,存放在…...
【机器学习】主成分分析法(PCA)
【机器学习】主成分分析法(PCA) 一、摘要二、主成分分析的基本概念三、主成分分析的数学模型五、主成分分析法目标函数公式推导(梯度上升法求解目标函数)六、梯度上升法求解目标函数第一个主成分七、求解前n个主成分及PCA在数据预…...
perl、python、tcl语法中读写Excel的模块
perl、python、tcl语法中读写Excel的模块 perl、python、tcl语法中存在读写xls和xlsx格式的模块分别有: python 读取 Excel xlrd:支持传统 .xls 格式的读取 pandas:通过 read_excel() 方法支持 .xls 和 .xlsx 格式 写入 …...
libwebsockets实现异步websocket客户端,服务端异常断开可重连
libwebsockets websocket客户端基本流程网上都有,我只额外优化了重连机制。 在服务器异常断开时不触发LWS_CALLBACK_CLOSED或LWS_CALLBACK_CLIENT_CONNECTION_ERROR,导致无法自动重连 通过定时检查链接是否可写入判断链接是否有效 // 判断wsi是否可用if …...
CAD球体密堆积3D插件V2.0
插件介绍 CAD球体密堆积3D插件V2.0版本可在AutoCAD内建立球体堆积模型,插件采取模拟球体在重力作用下的堆积行为,可生成超密堆积的几何模型及进行堆积过程的动态展示。 插件优化重力堆积物理引擎,新增堆积可视化界面,可直观查看…...
【Linux】线程池、单例模式、死锁
线程池 一.线程池1.日志和策略模式2.线程池1.Task.hpp2.Thread.hpp3.ThreadPool.hpp4.ThreadPool.cc 二.线程安全与重入问题三.线程安全的单例模式1.饿汉模式2.懒汉模式3.懒汉模式线程池1.ThreadPool.hpp2.ThreadPool.cc 四.死锁的概念1.死锁2.死锁的四个必要条件3.避免死锁 五…...
AI+视频监控电力巡检:EasyCVR视频中台方案如何赋能电力行业智能化转型
随着电力行业的快速发展,电力设施的安全性、稳定性和运维效率变得至关重要。传统视频监控系统在实时性、智能化及多系统协同等方面面临严峻挑战。EasyCVR视频中台解决方案作为一种先进的技术手段,在电力行业中得到了广泛应用,为电力设施的监控…...
centos8.0系统部署zabbix6.0监控
centos8.0系统部署zabbix6.0监控 一、部署过程1、确认系统版本2、主机基础环境设置3、安装MySQL 8.0数据库3.1 安装MySQL 8.0仓库3.2 安装软件3.3 设置root用户密码3.4 创建zabbix数据库,授权用户 4、配置zabbix6.0仓库5、安装zabbix服务端软件6、导入zabbix数据表7…...
江科大51单片机笔记【12】AT24C02(I2C总线)
写在前言 此为博主自学江科大51单片机(B站)的笔记,方便后续重温知识 在后面的章节中,为了防止篇幅过长和易于查找,我把一个小节分成两部分来发,上章节主要是关于本节课的硬件介绍、电路图、原理图等理论知识…...
电脑一直重启怎么解决 原因及解决方法
电脑一直重启的故障状态,不仅影响电脑的正常使用,还可能导致数据丢失或损坏。那么,电脑一直重启是什么原因呢?又该如何解决呢?下面将为大家介绍电脑一直重启的常见原因和解决方法,帮助您恢复电脑的正常工作…...
内网安全防护新思路 —— HFish + ELK 与 T-Pot 全面蜜罐系统比较分析
在当前网络安全环境日益复杂的背景下,企业和组织面临着来自外部与内部的多种威胁。为了更好地了解攻击者行为、捕获恶意活动并及时响应,部署蜜罐(Honeypot)系统已成为提升内网安全防护的重要手段。本文将重点介绍两种内网蜜罐防护…...
「 机器人 」扑翼飞行器通过总气动力控制四自由度运动方法
一、前言 在扑翼飞行中,总气动力(Total Aerodynamic Force)是指扑翼在运动过程中受到的所有空气动力作用的合力。它是由以下两种主要力的合成结果: 1. 升力(Lift, ):垂直于空气流方向的力,用于支持飞行器(或生物)的重量。 2. 阻力(Drag, ):平行于空气流方向的力,…...
写了一个二叉树构造函数和画图函数,方便debug
代码 class TreeNode(object):def __init__(self, val, leftNone, rightNone):self.val valself.left leftself.right rightdef construct_tree(nodes):if not nodes:return Noneroot TreeNode(nodes[0])queue [root]index 1while index < len(nodes):node queue.p…...
【prompt实战】知乎问题解答专家
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权&am…...
元组(Tuple)详解——c#
在C#中,元组(Tuple) 是一种轻量级的数据结构,用于将多个值组合成一个单一的对象。元组非常适合在不需要定义新类或结构体的情况下,临时存储和传递多个相关的值。 C# 中的元组有两种形式: 传统元组…...
Maven工具基础知识(一)
第一章、Maven概述 一、概述 官网地址:Welcome to Apache Maven – Maven Maven是一个基于Java的项目管理工具,专注于项目构建、依赖管理和项目信息标准化。其核心目标 是简化开发流程,通过标准化项目结构和自动化构建流程ÿ…...
AI模型的构建过程是怎样的(下)
你好,我是舒旻。 上节课,我们讲了一个模型构建的前 2 个环节,模型设计和特征工程。今天,我们继续来讲模型构建的其他 3 个环节,说说模型训练、模型验证和模型融合中,算法工程师的具体工作内容,以及 AI 产品经理需要掌握的重点。 模型训练 模型训练是通过不断训练、验证…...
力扣hot100_二叉树
二叉树的建立与遍历 #include <iostream> #include <vector> #include <queue> using namespace std;// 定义二叉树节点 struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} };// 函数&…...
如何制作Windows系统盘、启动盘?(MediaCreationTool_22H2)
文章目录 每日一句正能量前言一、准备工作二、制作启动盘后记 每日一句正能量 每个在你生命里出现的人,都有原因。喜欢你的人给你温暖关心。你喜欢的人让你学会爱和付出,不喜欢你的人让你自省成长。你不喜欢的人教会你宽容尊重,没有人是偶然出…...
分布式光伏发电的发展现状与前景
分布式光伏发电的发展现状与前景 1、分布式光伏发电的背景2、分布式光伏发电的分类2.1、集中式光伏发电2.1.1、特点、原则2.1.2、优点2.1.3、缺点 2.2、分布式光伏发电2.2.1、特点、原则2.2.2、优点2.2.3、缺点 2.3、对比 3、分布式光伏发电的现状4、分布式光伏发电的应用场景4…...
【AI大模型智能应用】Deepseek生成测试用例
在软件开发过程中,测试用例的设计和编写是确保软件质量的关键。 然而,软件系统的复杂性不断增加,手动编写测试用例的工作量变得异常庞大,且容易出错。 DeepSeek基于人工智能和机器学习,它能够依据软件的需求和设计文…...
NVIDIA k8s-device-plugin源码分析与安装部署
在《kubernetes Device Plugin原理与源码分析》一文中,我们从源码层面了解了kubelet侧关于device plugin逻辑的实现逻辑,本文以nvidia管理GPU的开源github项目k8s-device-plugin为例,来看看设备插件侧的实现示例。 一、Kubernetes Device Pl…...
面向联邦学习隐私保护的同态加密库优化算法研究
面向联邦学习隐私保护的同态加密库优化算法研究 一、引言 联邦学习作为一种新兴的分布式机器学习范式,允许各参与方在不共享原始数据的前提下协同训练模型,有效解决了数据孤岛和隐私保护问题。同态加密作为实现联邦学习隐私保护的关键技术之一,能够在密文上直接进行特定运算…...
20250212:linux系统DNS解析卡顿5秒的bug
问题: 1:人脸离线识别记录可以正常上传云端 2:人脸在线识别请求却一直超时 3:客户使用在线网络 思路:...
动态规划 -第1篇
前言:在计算机科学中,动态规划(Dynamic Programming,简称DP)是解决最优化问题的一种重要方法。通过将大问题拆解为小问题,动态规划不仅能够显著降低计算复杂度,还能提高效率。无论是经典的背包问…...
uni-app打包成H5使用相对路径
网上找了一圈,没用,各种试,终于给试出来了,导致打包之后请求的路径没有带上域名 直接去 config.js文件里面的baseUrl路径改成空字符就行了,千万别写/...
【每日学点HarmonyOS Next知识】swiper样式、日期选择、自定义弹窗键盘、文本组件换行、富文本适配
1、HarmonyOS swiper组件样式? 可在样式中设置即可,参考如下demo Entry Component struct SwiperDemo {private swiperController: SwiperController new SwiperController();build() {Column({ space: 5 }) {Swiper(this.swiperController) {Text(0)…...
STM32 I2C驱动开发全解析:从理论到实战 | 零基础入门STM32第五十步
主题内容教学目的/扩展视频I2C总线电路原理,跳线设置,I2C协议分析。驱动程序与调用。熟悉I2C总线协议,熟练调用。 师从洋桃电子,杜洋老师 📑文章目录 引言一、I2C驱动分层架构二、I2C总线驱动代码精析2.1 初始化配置&a…...
Ragflow技术栈分析及二次开发指南
Ragflow是目前团队化部署大模型+RAG的优质方案,不过其仍不适合直接部署使用,本文将从实际使用的角度,对其进行二次开发。 1. Ragflow 存在问题 Ragflow 开源仓库地址:https://github.com/infiniflow/ragflow Ragflow 当前版本: v0.17.0 Ragflow 目前主要存在以下问题: …...
力扣hot100二刷——链表
第二次刷题不在idea写代码,而是直接在leetcode网站上写,“逼”自己掌握常用的函数。 标志掌握程度解释办法⭐Fully 完全掌握看到题目就有思路,编程也很流利⭐⭐Basically 基本掌握需要稍作思考,或者看到提示方法后能解答⭐⭐⭐Sl…...
【Godot4.3】斜抛运动轨迹曲线点求取函数
概述 原文写于去年9月。一篇测试性的文章。 基于初始位置和初始速度的抛物线 # 抛物运动轨迹曲线 - 基于初始位置和初始速度计算 func projectile_motion_curve(start_pos:Vector2, # 物体的起始位置velocity:Vector2, # 初始速度nums:int, …...
SpringBoot基础Kafka示例
这里将生产者和消费者放在一个应用中 使用的Boot3.4.3 引入Kafka依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId> </dependency>yml配置 spring:application:name: kafka-1#kafka…...
【安卓逆向】安卓病毒介绍及其简单案例分析
目录 引言 一、Android 病毒介绍及分析方法 1.1 Android 病毒预览 1.2 Android 病毒分析必备知识 1.3 Android 病毒的常见类型及恶意行为 1.3.1 常见病毒类型 1.3.2 常见病毒行为 1.4 病毒激活条件 1.5 Android 病毒的传播方式 1.6 Android 病毒分析的一般方法 二…...
Git的命令学习——适用小白版
浅要了解一下Git是什么: Git是目前世界上最先进的的分布式控制系统。Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。Git 并不保存这些前后变化的差异数据。实际上…...
Bad owner or permissions on ssh/config - 解决方案
问题 在Windows系统通过ssh连接远程服务器时报错: ssh [ssh_user][ip] Bad owner or permissions on C:\\Users\\[win_user]/.ssh/config原因 这是因为.ssh文件夹或.ssh/config文件的权限异常,当前Windows账号没有读写权限导致的。 Windows系统重装&a…...
AI 赋能软件开发:从工具到思维的全面升级
喜欢可以到主页订阅专栏 引言 在当今技术飞速发展的时代,人工智能(AI)正以前所未有的速度渗透到各个领域,软件开发行业也不例外。AI 不仅改变了开发工具的使用方式,更深刻地影响了开发者的思维模式和工作流程。从代码生成到错误检测,从性能优化到项目管理,AI 正在全面…...
【Ubuntu系统设置固定内网ip,且不影响访问外网 】
Ubuntu系统安装后,由于每次重新开机会被重新分配内网ip,所以我们可以设置固定内网ip,且不影响访问外网,亲测有效 打开【终端】,查看当前内网ip(inet),子网掩码(netmask&a…...
VSCode集成C语言开发环境
下载MinGW https://sourceforge.net/projects/mingw/ 点击download按钮下载exe文件到本地 点击exe文件安装 选择基础包和c编译版 vscode安装部分跳过 安装code runner和c/c插件 **(1) 创建 C 文件** 新建一个测试文件(例如 hello.c)…...
力扣:3305.元音辅音字符串计数
给你一个字符串 word 和一个 非负 整数 k。 返回 word 的 子字符串 中,每个元音字母(a、e、i、o、u)至少 出现一次,并且 恰好 包含 k 个辅音字母的子字符串的总数。 示例 1: 输入:word "aeioqq"…...
vscode接入DeepSeek 免费送2000 万 Tokens 解决DeepSeek无法充值问题
1. 在vscode中安装插件 Cline 2.打开硅基流动官网 3. 注册并登陆,邀请码 WpcqcXMs 4.登录后新建秘钥 5. 在vscode中配置cline (1) API Provider 选择 OpenAI Compatible ; (2) Base URL设置为 https://api.siliconflow.cn](https://api.siliconfl…...
【ELK】ElasticSearch 集群常用管理API操作
目录 常用_cat 概览 集群状态 集群配置 集群磁盘使用 索引信息与配置 shard - 分片 查看段信息 nodes -节点 用户与权限 tasks 和 pending_tasks allocation - 均衡 thread_pool -线程 templete 模版 ILM 生命周期 其他 集群版本: 7.17.6 API地址&…...
BambuStudio学习笔记:MTUtils
# MTUtils.hpp 功能解析## 文件概述 该头文件提供了多线程同步工具和数值生成功能,主要包含以下组件:### 核心组件1. **自旋锁 (SpinMutex)**- 基于原子操作的高性能锁- 实现Lockable概念,可与标准库锁守卫配合使用2. **缓存对象模板 (Cached…...
DeepSeek开启AI办公新模式,WPS/Office集成DeepSeek-R1本地大模型!
从央视到地方媒体,已有多家媒体机构推出AI主播,最近杭州文化广播电视集团的《杭州新闻联播》节目,使用AI主持人进行新闻播报,且做到了0失误率,可见AI正在逐渐取代部分行业和一些重复性的工作,这一现象引发很…...