首页/新闻资讯/正文详情

向量搜索实现原理详解

发布时间:2026/9/24 15:14:20 来源:云帆数科 栏目:资讯中心
向量搜索实现原理详解
概述本文档详细分析了VectorServiceImpl.searchQuestion方法的实现原理重点讲述文档过滤策略、内容截断问题的处理方案以及如何保证检索结果的连贯性和准确性。1. 整体架构流程用户问题向量化编码Milvus向量搜索相似度计算topK筛选阈值过滤多策略内容提取内容去重与合并返回最终结果2. 文档过滤机制详解2.1 多层过滤策略我们的向量搜索采用了多层渐进式过滤机制第一层相似度阈值过滤.similarityThreshold(0.3)// 只保留相似度 ≥ 0.3 的文档设计原理0.3 阈值选择经过实际测试0.3 是一个平衡点太高如0.7可能过滤掉语义相关但表达方式不同的文档太低如0.1会引入大量噪音文档向量相似度计算使用余弦相似度公式similarity (A · B) / (||A|| × ||B||)第二层topK 数量控制.topK(5)// 最多返回5个最相似的文档为什么选择5个性能考虑避免处理过多文档影响响应速度质量保证前5个文档通常包含最相关的信息上下文限制LLM 的 context window 有限制第三层内容有效性过滤.filter(content-content!null!content.trim().isEmpty())过滤条件非空检查content ! null空白字符检查!content.trim().isEmpty()确保每个返回的内容都是有意义的文本2.2 文档排序与优先级搜索结果按以下优先级排序相似度得分主要排序依据文档完整性优先选择完整文档内容长度适中长度的文档更有价值3. 内容截断问题的解决方案3.1 截断问题的产生原因在向量化过程中长文档会被切分成多个 chunk原始文档: 董事长寄语我们公司秉承创新、精细、品牌、诚信的理念致力于为客户提供优质服务... 切分后: Chunk1: 董事长寄语我们公司秉承创新、精细、品牌、诚信的理念 Chunk2: 致力于为客户提供优质服务不断追求卓越 Chunk3: 在未来的发展中我们将继续坚持这一理念3.2 多策略内容提取机制我们实现了渐进式内容提取策略// 策略1优先使用 Spring AI 标准方法Stringcontentdoc.getText();// 策略2尝试 metadata 中的 content 字段if(contentnull||content.trim().isEmpty()){contentdoc.getMetadata().getOrDefault(content,).toString();}// 策略3尝试 metadata 中的 text 字段if(contentnull||content.trim().isEmpty()){contentdoc.getMetadata().getOrDefault(text,).toString();}// 策略4尝试 metadata 中的 data 字段if(contentnull||content.trim().isEmpty()){contentdoc.getMetadata().getOrDefault(data,).toString();}每种策略的适用场景策略方法适用场景优势1doc.getText()标准 Spring AI 文档性能最优API 标准2metadata.content自定义存储格式灵活性高支持自定义字段3metadata.text文本类文档兼容性好通用性强4metadata.data结构化数据支持复杂数据结构3.3 内容连贯性保证机制方案一上下文窗口扩展推荐实现publicListStringsearchQuestionWithContext(Stringquestion){// 1. 执行向量搜索ListDocumentdocumentsvectorStore.similaritySearch(searchRequest);// 2. 为每个文档查找相邻的 chunkListStringenhancedResultsnewArrayList();for(Documentdoc:documents){StringchunkIddoc.getMetadata().get(chunk_id).toString();StringdocIddoc.getMetadata().get(document_id).toString();// 查找相邻的 chunkListDocumentcontextChunksfindAdjacentChunks(docId,chunkId);// 合并内容StringmergedContentmergeChunks(contextChunks);enhancedResults.add(mergedContent);}returnenhancedResults;}privateListDocumentfindAdjacentChunks(StringdocId,StringchunkId){// 查找 chunk_id-1, chunk_id, chunk_id1SearchRequestcontextRequestSearchRequest.builder().filter(newFilter.Expression(Filter.ExpressionType.AND,List.of(newFilter.Expression(Filter.ExpressionType.EQ,document_id,docId),newFilter.Expression(Filter.ExpressionType.IN,chunk_id,Arrays.asList(chunkId-1,chunkId,chunkId1))))).build();returnvectorStore.similaritySearch(contextRequest);}方案二重叠窗口策略在文档切分时就考虑连贯性// 文档切分时使用重叠窗口publicListStringsplitDocumentWithOverlap(Stringdocument,intchunkSize,intoverlapSize){ListStringchunksnewArrayList();intstart0;while(startdocument.length()){intendMath.min(startchunkSize,document.length());Stringchunkdocument.substring(start,end);// 确保在句子边界切分if(enddocument.length()){intlastPeriodchunk.lastIndexOf(。);intlastExclamationchunk.lastIndexOf();intlastQuestionchunk.lastIndexOf();intsentenceEndMath.max(Math.max(lastPeriod,lastExclamation),lastQuestion);if(sentenceEndchunk.length()*0.7){// 如果句子边界在后70%位置endstartsentenceEnd1;chunkdocument.substring(start,end);}}chunks.add(chunk);startend-overlapSize;// 重叠部分}returnchunks;}4. 高级优化策略4.1 智能去重机制privateListStringdeduplicateResults(ListStringresults){SetStringseennewHashSet();ListStringdeduplicatednewArrayList();for(Stringcontent:results){// 计算内容的哈希值或使用编辑距离StringsignaturecalculateContentSignature(content);if(!seen.contains(signature)){seen.add(signature);deduplicated.add(content);}}returndeduplicated;}privateStringcalculateContentSignature(Stringcontent){// 移除标点符号和空格计算核心内容的哈希Stringnormalizedcontent.replaceAll([\\p{Punct}\\s],);returnInteger.toString(normalized.hashCode());}4.2 语义相关性增强privateListStringenhanceSemanticRelevance(Stringquestion,ListStringresults){returnresults.stream().map(content-{// 计算与问题的语义相关度doublerelevanceScorecalculateSemanticRelevance(question,content);returnnewScoredContent(content,relevanceScore);}).filter(scored-scored.score0.5)// 过滤低相关度内容.sorted((a,b)-Double.compare(b.score,a.score))// 按相关度排序.map(scored-scored.content).collect(Collectors.toList());}4.3 动态阈值调整privatedoublecalculateDynamicThreshold(Stringquestion){// 根据问题的复杂度和长度动态调整阈值intquestionLengthquestion.length();intcomplexityScorecalculateQuestionComplexity(question);doublebaseThreshold0.3;// 问题越复杂阈值越低更宽松if(complexityScore5){baseThreshold-0.1;}// 问题越短阈值越高更严格if(questionLength10){baseThreshold0.1;}returnMath.max(0.1,Math.min(0.8,baseThreshold));}5. 性能优化与监控5.1 缓存策略Cacheable(valuevectorSearch,key#question)publicListStringsearchQuestion(Stringquestion){// 实际搜索逻辑}5.2 异步处理AsyncpublicCompletableFutureListStringsearchQuestionAsync(Stringquestion){returnCompletableFuture.completedFuture(searchQuestion(question));}5.3 监控指标// 记录关键性能指标log.info(向量搜索性能指标 - 问题长度: {}, 返回文档数: {}, 耗时: {}ms,question.length(),documents.size(),duration);// 记录搜索质量指标log.info(搜索质量指标 - 平均相似度: {}, 内容完整率: {}%,averageSimilarity,contentCompletenessRate);6. 实际应用场景6.1 董事长寄语查询示例用户问题: “董事长寄语是什么”处理流程:问题向量化:[0.1, 0.8, -0.3, 0.5, ...]向量搜索: 在 Milvus 中查找相似文档结果筛选:文档1: 相似度 0.85 - 董事长寄语我们公司秉承... 文档2: 相似度 0.72 - 创新、精细、品牌、诚信是我们的核心理念... 文档3: 相似度 0.45 - 公司发展历程中董事长多次强调...内容提取与合并返回完整答案6.2 技术问题查询示例用户问题: “如何实现 Spring Boot 自动配置”处理策略:使用更严格的阈值 (0.4) 确保技术准确性优先返回代码示例和配置文件合并相关的多个技术文档片段7. 总结我们的向量搜索实现通过以下机制保证了高质量的检索结果多层过滤: 相似度阈值 topK限制 内容有效性检查容错机制: 多策略内容提取适应不同数据格式连贯性保证: 上下文窗口扩展 重叠切分策略智能优化: 去重、语义增强、动态阈值调整性能监控: 缓存、异步处理、关键指标记录这种设计确保了即使在复杂的企业知识库环境中也能准确、快速地检索到用户需要的信息为后续的 LLM 生成提供高质量的上下文支持。

相关推荐

OHOS上Flutter内存与GPU问题排查实战
OHOS上Flutter内存与GPU问题排查实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:14:14

航空复杂结构件高精度CNC加工采购指南:避开工艺误区,提升零件合格率
航空复杂结构件高精度CNC加工采购指南:避开工艺误区,提升零件合格率

在航空航天、高端智能装备制造领域,内部精密结构件往往是整机研发与量产的核心难点。不同于常规机械零件,航空器内置结构件受舱体空间限制,普遍采用轻量化、集成化、复杂化的一体成型设计,也是很多研发、采购、工艺团队在外协加工… · 2026/9/24 15:14:14

国内有什么适合 AI 新手练手的云 GPU 平台?
国内有什么适合 AI 新手练手的云 GPU 平台?

第一次跑 AI,最怕的不是慢,是看不懂 你跟着教程敲完代码,按下运行。电脑沉默了几秒,风扇开始认真工作。再一看,进度条仿佛在练瑜伽,动得很慢,也很有自己的想法。 这就是很多人找云 GPU 的起点。… · 2026/9/24 15:14:07

TVM Relay DataFlow Pattern 模式匹配语言:从图重写到算子融合的声明式框架
TVM Relay DataFlow Pattern 模式匹配语言:从图重写到算子融合的声明式框架

编译器深度学习模型优化 【免费下载链接】tvm Open deep learning compiler stack for cpu, gpu and specialized accelerators 项目地址: https://gitcode.com/gh_mirrors/tvm7/tvm 点击查看 免费下载 本文围绕 TVM 中 Relay 数据流图的模式匹配语言(D… · 2026/9/24 15:36:30

SeaORM 迁移器 CLI 完整命令指南:以 tonic_example 的 migration 模块为例
SeaORM 迁移器 CLI 完整命令指南:以 tonic_example 的 migration 模块为例

后端数据库ORM 【免费下载链接】sea-orm 🐚 A powerful relational ORM for Rust 项目地址: https://gitcode.com/gh_mirrors/se/sea-orm 点击查看 免费下载 导读 本文基于 examples/tonic_example/migration/README.md 展开,系统讲解 SeaO… · 2026/9/24 15:36:30

visual-explainer /diff-review 视觉化 Diff 审查指南:把 git 变更渲染成自包含 HTML 审查报告
visual-explainer /diff-review 视觉化 Diff 审查指南:把 git 变更渲染成自包含 HTML 审查报告

【免费下载链接】visual-explainer Agent skill that generates rich HTML pages or slide decks for diagrams, diff reviews, plan audits, data tables, and project recaps 项目地址: https://gitcode.com/gh_mirrors/vi/visual-explainer 点击查看 免费下载 /… · 2026/9/24 15:36:24

【信息科学与工程学】【解决方案体系】第三十篇 在线游戏及游戏云系统模型与方程式01
【信息科学与工程学】【解决方案体系】第三十篇 在线游戏及游戏云系统模型与方程式01

在线游戏及游戏云系统模型与方程式 说明:本表格旨在系统化地描述在线游戏及其云系统所涉及的各类数学模型、算法和定理。以下为前8个核心模型的详细示例,展示了从用户请求建模到资源规划的完整链条。编号规则为 Cloud-[类别]-[序号],其中类别包括:D(设计)、P(性能)、R… · 2026/9/24 15:36:11

aad4cj解码7类AAC音频元素:SCE、CPE、LFE等元素类型常量完整清单
aad4cj解码7类AAC音频元素:SCE、CPE、LFE等元素类型常量完整清单

aad4cj解码7类AAC音频元素:SCE、CPE、LFE等元素类型常量完整清单 【免费下载链接】aad4cj aad4cj 是一个基于仓颉(Cangjie)语言实现的 AAC 音频码流解析与处理组件库。 项目地址: https://gitcode.com/Cangjie-SIG/aad4cj aad4cj 是一… · 2026/9/24 15:36:11

HMCL(Hello Minecraft! Launcher)跨平台开源 Minecraft 启动器:功能架构、平台支持与源码构建全解析
HMCL(Hello Minecraft! Launcher)跨平台开源 Minecraft 启动器:功能架构、平台支持与源码构建全解析

HMCL(Hello Minecraft! Launcher)跨平台开源 Minecraft 启动器:功能架构、平台支持与源码构建全解析 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/g… · 2026/9/24 15:36:11

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码