【RAG】【vector_stores040】Hnswlib向量存储示例

张开发
2026/5/4 1:42:05 15 分钟阅读
【RAG】【vector_stores040】Hnswlib向量存储示例
案例目标本案例展示如何使用Hnswlib作为向量存储与LlamaIndex集成实现高效的文档索引和相似性搜索功能。Hnswlib是一个轻量级、仅头文件的C HNSWHierarchical Navigable Small World实现除了C11外没有其他依赖并提供了Python绑定。通过本示例您将学习如何安装和配置Hnswlib向量存储如何使用HnswlibVectorStore创建向量索引如何从文档构建向量索引如何执行高效的向量相似性搜索技术栈与核心依赖核心依赖依赖包用途llama-index-vector-stores-hnswlibLlamaIndex与Hnswlib的集成包llama-index-embeddings-huggingfaceHuggingFace嵌入模型集成hnswlibHNSW算法的Python实现llama-indexLlamaIndex核心框架技术栈Hnswlib HNSW轻量级、高性能的近似最近邻搜索库基于HNSW算法HuggingFace嵌入使用sentence-transformers/all-MiniLM-L6-v2模型生成文本向量文档处理LlamaIndex的SimpleDirectoryReader用于加载文档向量索引LlamaIndex的VectorStoreIndex用于构建索引和查询环境配置安装依赖%pip install llama-index %pip install llama-index-vector-stores-hnswlib %pip install llama-index-embeddings-huggingface %pip install hnswlibHNSW算法简介HNSWHierarchical Navigable Small World是一种用于近似最近邻搜索的高效算法它构建了一个多层级的图结构使得搜索过程既快速又准确。Hnswlib是该算法的一个轻量级实现具有以下特点高性能支持大规模数据集的快速搜索内存高效内存占用低适合资源受限的环境易于集成仅头文件实现无外部依赖支持多种距离度量包括内积(ip)、欧氏距离(l2)等提示Hnswlib支持多种空间类型spacel2- 欧氏距离ip- 内积cosine- 余弦相似度案例实现1. 导入必要的库from llama_index.vector_stores.hnswlib import HnswlibVectorStore from llama_index.core import ( VectorStoreIndex, StorageContext, SimpleDirectoryReader, ) from llama_index.embeddings.huggingface import HuggingFaceEmbedding2. 加载示例数据# 创建数据目录并下载示例文件 !mkdir -p data/paul_graham/ !wget https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt -O data/paul_graham/paul_graham_essay.txt # 加载文档 documents SimpleDirectoryReader(./data/paul_graham/).load_data() print(fTotal documents: {len(documents)}) print(fFirst document, id: {documents[0].doc_id}) print(fFirst document, hash: {documents[0].hash}) print( First document, text f ({len(documents[0].text)} characters):\n{*20}\n{documents[0].text[:360]} ... )3. 加载嵌入模型embed_model HuggingFaceEmbedding( model_namesentence-transformers/all-MiniLM-L6-v2, normalizeTrue, )4. 创建Hnswlib向量存储有两种方法可以创建Hnswlib向量存储方法一使用参数创建hnswlib_vector_store HnswlibVectorStore.from_params( spaceip, dimensionembed_model._model.get_sentence_embedding_dimension(), max_elements1000, )方法二使用现有的Hnswlib.Index对象创建import hnswlib index hnswlib.Index( ip, embed_model._model.get_sentence_embedding_dimension() ) index.init_index(max_elements1000) hnswlib_vector_store HnswlibVectorStore(index)5. 构建向量索引hnswlib_storage_context StorageContext.from_defaults( vector_storehnswlib_vector_store ) hnswlib_index VectorStoreIndex.from_documents( documents, storage_contexthnswlib_storage_context, embed_modelembed_model, show_progressTrue, )6. 执行查询k 5 query Before college I wrote what begginers should write. hnswlib_vector_retriever hnswlib_index.as_retriever(similarity_top_kk) nodes_with_scores hnswlib_vector_retriever.retrieve(query) for node in nodes_with_scores: print(fNode {node.id_} | Score: {node.score:.3f} - {node.text[:120]}...)Hnswlib特性高效搜索基于HNSW算法提供快速的近似最近邻搜索内存效率优化的数据结构内存占用低可扩展性支持大规模数据集可动态添加新元素多种距离度量支持内积、欧氏距离、余弦相似度等案例效果本示例展示了Hnswlib向量存储的完整工作流程包括安装必要的依赖包加载Paul Graham的文章数据使用HuggingFace嵌入模型将文档转换为向量创建Hnswlib向量存储并构建索引执行向量相似性搜索查询获取相关文档片段预期输出示例Node 8d8c9c0c-5c5e-4b9f-9b9e-5c5e4b9f9b9e | Score: 0.856 - Before college the two main things I worked on, outside of school, were writing and programming... Node 1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d | Score: 0.832 - I didnt write essays. I wrote what beginning writers were supposed to write then... Node 7f8e9d0c-1b2a-3c4d-5e6f-7a8b9c0d1e2f | Score: 0.815 - My stories were awful. They had hardly any plot, just characters with strong feelings... Node 3c4d5e6f-7a8b-9c0d-1e2f-3a4b5c6d7e8f | Score: 0.798 - The first programs I tried writing were on the IBM 1401 that our school district used... Node 9a0b1c2d-3e4f-5a6b-7c8d-9e0f1a2b3c4d | Score: 0.785 - This was in 9th grade, so I was 13 or 14. The school districts 1401 happened to be...查询结果将显示与查询语句Before college I wrote what begginers should write.最相似的文档片段以及它们的相似度分数。案例实现思路核心实现步骤环境准备安装必要的Python包包括Hnswlib和LlamaIndex集成数据准备下载并加载示例文档数据嵌入模型配置设置HuggingFace嵌入模型用于将文本转换为向量向量存储初始化创建HnswlibVectorStore实例指定空间类型和维度索引构建使用加载的文档和配置的上下文创建VectorStoreIndex查询执行通过检索器执行向量相似性搜索关键技术点HNSW算法使用多层级的图结构实现高效的近似最近邻搜索平衡搜索速度和准确性向量存储通过HnswlibVectorStore类将HNSW索引与LlamaIndex集成嵌入模型使用sentence-transformers/all-MiniLM-L6-v2模型生成高质量的文本向量表示相似性搜索通过向量相似性计算找到与查询最相关的文档片段HNSW算法原理HNSWHierarchical Navigable Small World算法通过构建多层级的图结构来实现高效的近似最近邻搜索多层结构底层包含所有数据点上层是底层的子集搜索过程从最顶层开始逐层向下搜索直到找到最近邻构建过程通过贪心算法构建图确保每个节点都有适当的连接动态更新支持动态添加新元素无需重建整个索引HNSW算法的多层级图结构示意图扩展建议功能扩展实现索引持久化将Hnswlib索引保存到磁盘添加批量操作支持提高大规模数据处理效率集成元数据过滤功能实现更精确的搜索实现动态索引更新支持实时数据添加和删除性能优化调整HNSW参数ef、M等优化搜索性能使用量化技术减少内存占用实现并行搜索提高查询吞吐量优化向量维度平衡准确性和性能应用场景扩展语义搜索构建理解语义的搜索引擎提供更精准的搜索结果推荐系统基于向量相似性实现个性化内容推荐异常检测通过向量相似性检测异常数据点集成建议与Faiss集成比较Hnswlib和Faiss的性能选择适合场景的方案与数据库集成将Hnswlib与PostgreSQL等数据库结合实现混合搜索与Web框架集成构建基于Hnswlib的RESTful API服务与流处理集成实现实时向量索引更新和查询总结本示例展示了如何使用Hnswlib作为向量存储与LlamaIndex集成实现高效的文档索引和相似性搜索功能。Hnswlib基于HNSW算法提供了高性能的近似最近邻搜索能力特别适合需要快速搜索大规模向量数据的应用场景。通过本示例我们学习了如何安装和配置Hnswlib向量存储如何使用HnswlibVectorStore创建向量索引如何从文档构建向量索引如何执行高效的向量相似性搜索Hnswlib向量存储的主要优势包括高性能基于HNSW算法提供快速的近似最近邻搜索内存效率优化的数据结构内存占用低可扩展性支持大规模数据集可动态添加新元素易于集成轻量级实现无外部依赖易于集成到现有系统灵活性支持多种距离度量和参数配置可根据需求调整这个示例为构建基于Hnswlib的向量搜索应用提供了基础可以根据具体需求扩展功能实现更复杂的AI应用场景如语义搜索、推荐系统、异常检测等。

更多文章