杠精派
派聪明
0/512

热门评论

喝酒届最摇的老头 2025年10月20日 23:25
面试问这个算法“HNSW 算法”不会怎么办啊
1
回复1 取消回复
喵不可言· 2025年12月20日 15:08
你不用会 你提及的时候就说只是了解过 他要是继续追问 你就得想一下你应聘的是java还是大模型算法工程师了
3
回复 取消回复

4 条评论

Yuxy 2026年02月09日 18:19
引用原文:HNSW
@派聪明
点赞
回复1 取消回复
派聪明 2026年02月09日 18:20
根据参考资料,HNSW(Hierarchical Navigable Small World)是一种用于**近似最近邻搜索(ANN)**的高效算法,广泛应用于Elasticsearch等向量数据库中。其核心特点和实现逻辑如下: --- ### **1. 核心原理** - **分层图结构**: HNSW 构建一个多层图结构(类似金字塔),顶层图节点稀疏(连接少),底层图稠密(连接多)。 - **搜索时**:从顶层开始快速定位目标区域(顶层节点少,跳跃距离大),再逐层向下细化搜索(底层节点多,精度高)。 - ****时**:新节点从顶层开始随机连接,再逐层向下优化连接关系。 - **贪心****: 在每一层中,算法沿连接边向查询向量方向“贪心”移动,逐步*近最近邻目标。 --- ### **2. 在 Elasticsearch 中的应用** - **向量索引基础**: 当 ES 索引中定义 `dense_vector` 字段并启用 `index: true` 时,默认使用 HNSW 算法构建 ANN 索引(如示例配置): ```json "vector": { "type": "dense_vector", "dims": 2048, "index": true, // 启用 HNSW 索引 "similarity": "cosine" // 使用余弦相似度 } ``` - **优势**: - **平衡精度与速度**:通过分层结构,在保证高召回率的同时实现亚线性时间复杂度(远优于**搜索的 O(N))。 - **支持大规模数据**:适合处理高维向量(如 2048 维)和海量文档(成千上万份)。 --- ### **3. 关键参数与性能影响** | **参数** | **作用** | **影响** | |-------------------|--------------------------------------------------------------------------|--------------------------------------------------------------------------| | **`dims`** | 向量维度(需与 Embedding 模型匹配,如豆包模型为 2048 维) | 维度越高,内存消耗越大,计算越慢。 | | **`similarity`** | 相似度算法(`cosine`/`dot_product`/`l2`) | 余弦相似度(`cosine`)适合语义搜索,忽略向量长度,聚焦方向一致性。 | | **内存占用** | HNSW 图结构需加载到 JVM 堆内存 | 向量数量/维度增加时,内存消耗急剧上升(成为主要瓶颈)。 | | **CPU 计算量** | 查询时需大量距离计算 | 高并发场景下,CPU 负载高,可能导致延迟增加。 | --- ### **4. 局限性与优化方向** - **内存瓶颈**: HNSW 图需完全加载到内存,大规模场景下需通过 **分片(Sharding)** 或 **冷热数据分离** 缓解。 - **CPU 密集型**: 高并发查询时,可考虑 **异步查询** 或 **引入 FAISS**(纯向量引擎,性能更优)替代部分 ES 查询。 - **精度权衡**: 通过调整连接参数(如 `ef` 搜索候选数)平衡精度与速度,但需通过 A/B 测试验证效果。 --- ### **总结** HNSW 是 Elasticsearch 实现高效语义检索的核心算法,其分层图结构在**速度、精度、内存消耗**间取得平衡。但在超大规模场景下,需结合分片、缓存或引入专用向量引擎(如 FAISS)进一步优化。
点赞
回复 取消回复
Yuxy 2026年02月09日 17:46
引用原文:那些跟用户关键词完全匹配的结果
用户查询文本的关键词是如何得到的?@派聪明
点赞
回复1 取消回复
派聪明 2026年02月09日 17:46
用户查询文本的关键词是通过**自然语言分词**直接从原始查询**中提取的,具体流程如下: ### 1. **原始查询文本作为关键词来源** - 用户在前端输入的完整查询**(如“如何提升工作效率”)会被直接传递到后端。 - 系统无需额外提取“关键词”,而是将整个查询文本作为BM25算法的输入。BM25会自动对查询文本进行分词处理,生成词元(Terms)用于匹配。 ### 2. **分词处理(Tokenization)** - Elasticsearch的`textContent`字段(类型为`text`)配置了**中文分词器**(如IK分词器)。 - 当执行BM25查询时,系统会: - 对用户查询**进行分词(例如“如何提升工作效率” → `["如何", "提升", "工作", "效率"]`)。 - 对文档中的`textContent`字段同样分词,确保词元匹配的一致性。 ### 3. **BM25算法的关键词匹配逻辑** - BM25通过以下机制评估文档与查询的相关性: - **词频(TF)**:文档中查询词元出现的次数越多,得分越高。 - **逆文档频率(IDF)**:词元在所有文档中越稀有(如“量子计算机” vs “的”),含金量越高,得分越高。 - **文档长度归一化**:避免长文档因词频高而**(如“区块链”在10页报告**现5次比100页教材出现5次更可信)。 - **示例**: 用户查询“**手机” → 分词为`["**", "手机"]` → BM25优先匹配同时包含这两个词元的文档,且主题聚焦的短文得分更高。 ### 4. **与语义检索的协同** - 关键词匹配是混合检索的第二阶段(Rescore): - 第一阶段通过KNN召回语义相关的文档(如“如何提升工作效率”匹配“时间管理技巧”)。 - 第二阶段对召回结果用BM25重排,**优先提升“关键词完全匹配”的文档排名**(如同时包含“提升”和“效率”的文档)。 ### 总结 用户查询的“关键词”本质是**原始查询**经过分词后的词元集合**,由BM25算法直接用于文档匹配。这种设计既保留了传统关键词搜索的精确性(如专有名词匹配),又通过分词器支持自然语言查询,与语义检索形成互补。
点赞
回复 取消回复
阿白 2026年01月25日 22:33
引用原文:的逻辑是:一个文档,只要满足以下任意一个条件,就被认为用户是有权访问的: 该文档是公开的 ( isPublic: true )。 该文档的创建者是当前用户 ( userId: "王二的 userId" )。 该文档的权限标签(orgTag)与用户的权限标签有交集。 我们在查询时会把这三个条件都加进去,ES 就会自动进行过滤。
@派聪明 好像项目里没有下面的代码?
点赞
回复1 取消回复
派聪明 2026年01月25日 22:34
您提到的权限过滤逻辑在项目中确实存在,但可能以不同形式实现。以下是关键说明: ### 1. **逻辑实现位置** 该权限过滤逻辑**必然存在于代码中**,但可能未以您引用的完整Java代码形式出现。常见实现方式包括: - **Elasticsearch查询构建器**:通过`BoolQuery.Builder`动态构造权限条件(如参考资料中的Java示例) - **框架自动注入**:若使用Spring Data Elasticsearch等框架,可能通过注解或***自动添加权限过滤 - **数据库视图层**:在查询接口层直接拼接权限条件 ### 2. **核心逻辑验证** 无论代码形式如何,以下三个权限条件**必须被实现**: ```plaintext 1. isPublic = true(公开文档) 2. userId = 当前用户ID(自有文档) 3. orgTag 与用户权限标签有交集(**共享文档) ``` ### 3. **排查建议** 若未找到显式代码,请**: - **ES查询****:使用Kibana查看实际发送到ES的查询,应包含类似: ```json "bool": { "filter": [ {"term": {"isPublic": true}}, {"term": {"userId": "王二的userId"}}, {"terms_set": {"orgTag": ["用户标签列表"]}} ] } ``` - **权限中间件**:**是否有全局权限***(如Spring的`HandlerInterceptor`) - **JWT解析**:确认用户权限标签(`orgTags`)是否在认证流程中正确提取并传递给查询层 ### 4. **为什么必须实现?** - **安全要求**:避免越权访问(如用户查到他人私有文档) - **性能优化**:在ES层过滤而非应用层过滤,减少数据传输量 - **数据一致性**:确保多租户场景下的数据隔离 > ⚠️ 若实际代码中完全缺失此逻辑,属于严重安全漏洞,需立即补充。建议通过日志追踪ES查询**验证权限条件是否生效。
点赞
回复 取消回复
喝酒届最摇的老头 2025年10月20日 23:25
面试问这个算法“HNSW 算法”不会怎么办啊
1
回复1 取消回复
喵不可言· 2025年12月20日 15:08
你不用会 你提及的时候就说只是了解过 他要是继续追问 你就得想一下你应聘的是java还是大模型算法工程师了
3
回复 取消回复

目录