做的比较好的教育网站,wordpress设置注册页面,企业名录2021版,服务器对应的网站开发语言1 缘起
最近在研究与应用混合搜索#xff0c; 存储介质为ES#xff0c;ES作为大佬牌数据库#xff0c; 非常友好地支持关键词检索和向量检索#xff0c; 当然#xff0c;支持混合检索#xff08;关键词检索向量检索#xff09;#xff0c; 是提升LLM响应质量RAG(Retri…1 缘起
最近在研究与应用混合搜索 存储介质为ESES作为大佬牌数据库 非常友好地支持关键词检索和向量检索 当然支持混合检索关键词检索向量检索 是提升LLM响应质量RAG(Retrieval-augmented Generation)的一种技术手段 那么如何通过ES实现混合搜索呢 请看本篇文章。
本系列分为两大部分实践和理论。 先讲实践应对快速开发迭代可快速上手实践 再讲理论应对优化如归一化。
RAG理论ES混合搜索BM25kNN(cosine)以及归一化https://blog.csdn.net/Xin_101/article/details/140237669 2 实践
2.1 环境准备
2.1.1 部署ES
下载ES镜像8.12.2版本
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2下载ik分词器 https://github.com/infinilabs/analysis-ik/releases 选择与ES版本一致或者可用的版本这里选择8.12.2版本分词器。 添加分词器 将分词器文件添加到目录/home/xindaqi/data/es-8-12-2/plugins 新建分词器文件夹mkdir -p /home/xindaqi/data/es-8-12-2/plugins/ik_analyzer_8.12.2 将zip文件复制到文件夹ik_analyzer_8.12.2 启动ES
docker run -dit \
--restartalways \
--name es01-8-12-2 \
-p 9200:9200 \
-p 9300:9300 \
-v /home/xindaqi/data/es-8-12-2/data:/usr/share/elasticsearch/data \
-v /home/xindaqi/data/es-8-12-2/logs:/usr/share/elasticsearch/logs \
-v /home/xindaqi/data/es-8-12-2/plugins:/usr/share/elasticsearch/plugins \
-e ES_JAVA_OPS-Xms512m -Xmx1g \
-e discovery.typesingle-node \
-e ELASTIC_PASSWORDadmin-es \
-m 1GB \
docker.elastic.co/elasticsearch/elasticsearch:8.12.22.1.2 数据准备
实践之前需要准备数据包括索引和索引中存储的数据。 为了演示混合搜索这里创建两种类型的数据text和dense_vector。
1创建索引
curl -X PUT \http://localhost:9200/vector_5 \-H accept: application/json \-H Content-Type: application/json \-H Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw \-d {settings: {index: {number_of_shards: 1,number_of_replicas: 1,refresh_interval: 3s}},mappings: {properties: {dense_values: {type: dense_vector,dims: 5,index: true,similarity: cosine},id: {type: keyword},ik_text: {type: text,analyzer: ik_max_word},default_text: {type: text},timestamp: {type: long},dimensions: {type: integer}}}
}2新建数据
新建两条数据
curl -X POST http://localhost:9200/vector_5/_doc/1 \
--header Content-Type: application/json \
--header Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw \
--data {dense_values: [0.1, 0.2, 0.3, 0.4, 0.5],id: 1,ik_text: 今天去旅游了,default_text:今天去旅游了,timestamp: 1715659103373,dimensions: 5
}
curl -X POST http://localhost:9200/vector_5/_doc/2 \
--header Content-Type: application/json \
--header Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw \
--data {dense_values: [0.1, 0.2, 0.3, 0.4, 0.5],id: 1,ik_text: 好美的太阳,default_text:好美的太阳,timestamp: 1715659103373,dimensions: 5
}2.2 向量搜索
kNN搜索
ES中向量搜索使用k-Nearest Neighbork最近邻分类算法进行搜索。 输入的请求参数如下
参数参数描述knn向量搜索k-Nearest Neighborfield向量字段名称query_vector向量值k召回结果数量num_candidates召回范围每个分片选取的数量
请求样例如下 由样例可知存储向量数据的字段名称为dense_values填充向量值字段为query_vector为固定属性召回结果k为3个每个分片选择100条数据num_candidates最大值为10000。 实际应用过程中又有向量数据较多依据维度而定为节约内存检索时在结果中排除excludes。
curl -X POST http://localhost:9200/vector_5/_search \
--header Content-Type: application/json \
--header Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw \
--data {knn: {field: dense_values,query_vector: [0.1,0.1,0.1,0.1,0.1],k: 3,num_candidates: 100},_source: {excludes: [dense_values]}
}检索结果如下 由于创建过程中使用的向量数据相同因此计算的结果也是相同的 使用
{took: 2,timed_out: false,_shards: {total: 1,successful: 1,skipped: 0,failed: 0},hits: {total: {value: 2,relation: eq},max_score: 0.8427159,hits: [{_index: vector_5,_id: 1,_score: 0.8427159,_source: {id: 1,ik_text: 今天去旅游了,default_text: 今天去旅游了,timestamp: 1715659103373,dimensions: 5}},{_index: vector_5,_id: 2,_score: 0.8427159,_source: {id: 1,ik_text: 好美的太阳,default_text: 好美的太阳,timestamp: 1715659103373,dimensions: 5}}]}
}2.2 混合搜索
混合搜索即将搜索拆分成多个部分每个部分使用不同的权重实现混合搜索的效果。 ES中使用boost参数来分配不同部分的权重搜索案例如下。 由案例可知混合搜索使用关键词向量搜索关键词b1与向量总权重b2其中b1b21 案例中关键词权重为0.6向量权重0.4 关键词搜索将搜索的内容映射到query上权重映射到boost上 default_text为实际存储的属性名称。
curl -X POST http://localhost:9200/vector_5/_search \
--header Content-Type: application/json \
--header Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw \
--data {query: {bool: {must: [{match: {default_text: {query: 好美的太阳,boost: 0.6}}}]}},knn: {field: dense_values,query_vector: [0.1,0.1,0.1,0.1,0.1],k: 3,num_candidates: 100,boost: 0.4},_source: {excludes: [dense_values]}
}3 小结
1ES混合搜索通过boost配置比例其中关键词计算使用BM25计算分数同时加入boost参数 2关键词搜索boost基础比例为2.2计算过程boost2.2boost 3向量搜索的最终分数为final_scoreboostkNN。
计算过程参见文章RAG理论ES混合搜索BM25kNN(cosine)以及归一化 https://blog.csdn.net/Xin_101/article/details/140237669