使用Milvus搭配Ollama搭建RAG知识库

📅 发布时间:2026/7/3 19:07:05 👁️ 浏览次数:
使用Milvus搭配Ollama搭建RAG知识库
1、RAG介绍RAGRetrieval-Augmented Generation检索增强生成是一种结合信息检索与文本生成的先进AI架构其核心在于让大语言模型在回答问题前先从外部知识库中“查找资料”再基于查到的信息生成准确、有依据的回答。这种方法有效缓解了大模型常见的知识过时、幻觉等问题。1.1、RAG基本原理RAG的工作流程可分为三个关键阶段数据准备 → 检索 → 生成形成一个“先查后答”的闭环机制。数据准备索引阶段将企业文档、网页、PDF等非结构化数据加载并切分为小块chunking例如每段300–800字符。 使用嵌入模型如text-embedding-3-small将文本块转化为向量并存储于向量数据库中便于后续语义检索。检索阶段Retrieval 当用户提问时系统将问题也转化为向量。 在向量数据库中通过相似度匹配如余弦相似度检索出最相关的若干个文本片段。 可结合关键词检索BM25与语义检索DPR进行多路召回提升召回率与精准度。生成阶段Generation 将检索到的相关片段与原始问题拼接成提示词Prompt输入大语言模型。 模型基于这些“参考资料”生成最终回答确保内容有据可依减少虚构风险。RAG的准确率瓶颈本质上是“检索上下文质量”的瓶颈。如果检索不到正确信息再强的生成模型也无法给出正确答案。1.2、RAG应用场景RAG因其灵活性和高准确性已在多个领域实现落地应用尤其适合需要专业性、实时性、可解释性的场景。企业知识库问答员工可通过自然语言查询内部制度、产品手册、项目文档。 无需人工整理系统自动检索并生成摘要提升信息获取效率。智能客服与售后服务客户咨询产品功能、退换货政策时RAG可实时检索最新服务条款避免因信息滞后导致误答。 支持个性化回复如结合用户历史订单生成定制化建议。医疗与法律辅助决策医生可输入患者症状系统检索最新诊疗指南或临床研究辅助诊断。律师查询合同条款时RAG能从历史案例或法规库中提取相关判例提升合规性。学术研究与文献综述研究者提出研究问题后RAG可快速检索大量论文摘要并生成初步综述框架。节省查阅资料时间提高科研效率。动态内容生成与新闻撰写结合实时数据如股市行情、体育赛事结果RAG可生成带最新信息的报告或新闻稿。适用于财经、体育、舆情监控等对时效性要求高的领域。1.3、RAG核心技术RAG的核心技术组成主要包括以下几个关键部分信息检索模块Retrieval Module负责从大规模文档库中检索与用户查询最相关的文档片段。通常使用向量数据库如Faiss、Pinecone、Milvus存储文档的向量表示通过计算查询向量与文档向量的相似度来实现快速检索。检索算法可以是基于关键词的如BM25或基于语义的如DPR、Sentence-BERT。嵌入模型Embedding Model用于将文本文档和查询转换为固定长度的向量表示以便进行语义相似度计算。常用的嵌入模型包括Sentence-BERTSBERT、OpenAI的text-embedding模型、通义千问的QwenEmbedding等。嵌入模型的质量直接影响检索效果。生成模型Generation Model通常基于大语言模型LLM如GPT系列、通义千问、Llama等。接收检索到的相关文档片段和原始查询作为输入生成最终的回答。生成模型需要具备良好的上下文理解和语言生成能力。检索-生成融合机制Retrieval-Generation Fusion将检索到的文档片段与原始查询组合成提示Prompt输入到生成模型中。这个过程可以是简单的拼接也可以是更复杂的融合策略如注意力机制。向量数据库Vector Database用于高效存储和检索高维向量数据。支持快速的近似最近邻ANN搜索是实现大规模文档检索的关键。常见的向量数据库包括Faiss、Pinecone、Milvus、Weaviate等。数据预处理与后处理数据预处理包括文档清洗、分块、去除无关内容等以提高检索效率和质量。后处理可能包括答案过滤、格式化输出、引用标注等以提升最终回答的可读性和可信度。这些组件协同工作使得RAG能够在保持大语言模型强大生成能力的同时通过外部知识库提供更准确、更可靠的问答结果。上述组件协同工作使得RAG能够在保持大语言模型强大生成能力的同时通过外部知识库提供更准确、更可靠的问答结果。本文选型 “Milvus向量数据库、Qwen生成模型、Qwen-embedding嵌入模型及SpringAI” 讲述及实践。2、向量数据库向量数据库是专门用于存储、管理和高效检索高维向量数据的新型数据库系统它能将文本、图像、音频等非结构化数据通过AI模型转化为蕴含语义特征的向量序列再基于向量间的相似度实现“语义级检索”解决传统数据库在非结构化数据处理上的局限性为RAG智能问答、多模态搜索、智能推荐等AI应用提供底层支撑。2.1、核心工作步骤数据向量化生成“特征指纹”。这是向量数据库的前置核心环节需借助Embedding模型将原始非结构化数据转化为高维向量同时要平衡向量维度维度越高特征表达越精细、检索精度越高但存储和计算成本会指数级增长维度越低效率越高但可能丢失关键特征导致精度下降工业级常规选择文本768-1536维、图像512-2048维。文本数据可选用OpenAI的text-embedding-ada-002通用场景最优1536维、国产开源的BGE性价比之选768维、微调后的BERT细分领域首选等模型。图像数据CLIP支持文本搜图的多模态适配模型、ResNet纯图像特征提取模型是常用工具。音频数据Wav2Vec2语音转向量、VGGish音频场景特征提取可满足需求。存储与索引构建加速相似性计算。向量数据库会将生成的高维向量存储起来并构建特殊索引结构来提升检索效率常见索引算法有IVF倒排文件、HNSW分层可导航小世界图等它们能大幅降低相似性计算的耗时。相似性检索找“最近邻”。当用户发起查询时系统先将查询内容转为向量再在数据库中寻找与其“距离最近”的Top-K个向量常用的距离度量方式有三种余弦相似度最常用只关注向量方向、忽略长度适合语义级对比如文本检索计算结果取值范围[-1,1]越接近1相似度越高。欧氏距离计算两个向量的直线距离同时考虑方向与长度适合关注绝对特征差异的场景如图像检索值越小相似度越高需提前对向量进行归一化处理。点积相似度计算速度最快但受向量长度影响大对向量进行L2归一化后结果等价于余弦相似度适合高并发低延迟场景如实时推荐。3、Milvus介绍Milvus 是一款专为高维向量数据设计的云原生向量数据库广泛应用于人工智能、机器学习和相似性搜索场景。它采用存储与计算分离的架构具备高可用性、高性能和弹性扩展能力。3.1、核心架构层次Milvus 的系统架构分为四个主要层次接入层Access Layer作为系统的入口由一组无状态的 Proxy 组件构成负责请求路由和负载均衡。协调服务Coordinator Service管理元数据、任务调度和状态同步包括 Root Coordinator、Data Coordinator 和 Index Coordinator 等。执行节点Worker Node处理实际的数据插入、查询和索引构建等操作包含 Query Node、Index Node 和 Data Node。存储层Storage Layer负责持久化存储使用对象存储如 S3、MinIO来保存向量数据和索引文件同时通过 etcd 和 Pulsar/Kafka 管理元数据和日志。3.2、数据模型与存储机制:维度Milvus关系型数据库说明数据组织结构Database → Collection → Partition → Segment → EntityDatabase → Table → RowMilvus 以 Segment 为最小存储单元支持分片关系库以页或块为单位存储介质对象存储S3/MinIO 元数据存储etcd 消息队列Pulsar/Kafka磁盘文件 日志Redo LogMilvus 使用对象存储持久化数据元数据由 etcd 管理关系库依赖本地存储索引机制支持多种 ANN 索引HNSW、IVF、FLAT 等B-tree、Hash、Bitmap 等Milvus 为高维向量优化索引支持近似搜索关系库为低维结构化字段设计3.3、术语映射关系:Milvus 术语关系型数据库术语说明DatabaseDatabase数据库是组织和管理数据的逻辑单元。为了提高数据安全性并实现多租户你可以创建多个数据库为不同的应用程序或租户从逻辑上隔离数据。Milvus 在集合之上引入了数据库层为管理和组织数据提供了更有效的方式同时支持多租户CollectionTable数据集合定义字段结构。用于存储和管理实体的主要逻辑对象。PartitionPartition集合内的物理分区SegmentPage / Block定义数据类型和数据属性的元信息。每个 Collections 都有自己的 Collections Schema该 Schema 定义了 Collections 的所有字段、自动 ID主键分配启用和 Collection 说明FieldColumn字段类型支持标量与向量EntityRow单条数据记录IndexIndex向量索引类型多样4、Milvus本地部署4.1、Docker Compose 部署Milvus 提供了 Docker Compose 配置文件wgethttps://github.com/milvus-io/milvus/releases/download/v2.6.11/milvus-standalone-docker-compose.yml-Odocker-compose.ymlsudodockercompose up-dCreating milvus-etcd...doneCreating milvus-minio...doneCreating milvus-standalone...done启动完成后可以访问 Milvus WebUI网址 http://127.0.0.1:9091/webui/ 了解有关 Milvus 实例的更多信息。4.2、Attu可视化工具安装Attu是 Milvus 官方推出的图形化管理工具提供直观的可视化界面方便用户查看和管理向量数据库。通过 Attu用户可以轻松完成数据库架构设计、数据操作、向量搜索等复杂任务大大降低 Milvus 的使用门槛。dockerrun-d--namemilvus-attu\-p8000:3000\-eMILVUS_URLlocalhost:19530\zilliz/attu:v2.6Attu 启动完成后可以访问 http://localhost:8000 以图形化方式查看和管理Milvus 实例。5、模型本地安装RAG系统依赖Embedding与Generation两类模型嵌入模型Embedding Model用于将文本文档和查询转换为固定长度的向量表示以便进行语义相似度计算。常用的嵌入模型包括Sentence-BERTSBERT、OpenAI的text-embedding模型、通义千问的QwenEmbedding等。嵌入模型的质量直接影响检索效果。生成模型Generation Model通常基于大语言模型LLM如GPT系列、通义千问、Llama等。接收检索到的相关文档片段和原始查询作为输入生成最终的回答。生成模型需要具备良好的上下文理解和语言生成能力。本文分别选择 “qwen3-embedding” 与 “qwen3.5” 作为嵌入模型与生成模型Ollama本地安装如下adminMac-miniM4 milvus % ollama list NAME ID SIZE MODIFIED qwen3.5:2b 324d162be6ca 2.7 GB 3 hours ago qwen3-embedding:0.6b ac6da0dfba84 639 MB 4 hours ago6、RAG系统设计RAG 知识库的核心价值在于「结构化检索关系型 语义检索向量」的融合实体模型设计需同时兼顾关系型数据的结构化关联能力和向量数据的语义匹配能力既要保证实体间的逻辑关联清晰又要实现基于语义的精准检索。以下聚焦「关系型 向量数据融合」的实体模型设计包含核心实体定义、数据存储分工、关联逻辑、落地实现四大核心模块。6.1、核心设计原则融合版分工明确关系型数据库MySQL存储「实体元数据、关联关系、检索过滤条件」向量数据库Milvus存储「文本语义向量」避免单库承载所有压力双向关联关系型数据与向量数据通过唯一 IDchunk_id绑定支持「从关系型维度筛选→向量语义检索」「从向量检索结果→回溯关系型元数据」轻量化融合向量数据仅存储核心检索单元Chunk的向量不冗余存储文档 / 实体的全量向量关系型数据补充向量无法表达的结构化信息如实体类型、文档来源。6.2、核心实体模型关系型 向量融合实体分工总览数据类型存储载体存储内容核心作用关系型数据MySQL/PostgreSQL文档 / Chunk / 业务实体的元数据、实体间关联关系、检索过滤字段状态 / 租户 / 类型结构化筛选、实体关联、结果回溯向量数据Milvus/PGVector/FAISSChunk 的 Embedding 向量、向量索引IVF_FLAT/HNSW语义相似度检索关系型实体表设计核心元数据 关联Knowledge知识库实体关系型存储知识库定义元数据维护知识库Embedding模型、向量数据库设置信息。Document文档实体关系型存储文档级结构化元数据是所有子实体的根节点不存储完整内容和向量。Chunk文本块实体关系型存储 Chunk 的元数据仅保留向量 ID与向量库绑定不存储原始向量是关系型与向量数据的核心桥梁。向量数据模型设计语义检索核心Milvus 中创建「knowledge_vector_collection」集合与关系型 Chunk 表的vector_id一一对应7、RAG关键代码7.1、Maven依赖引入使用SpringAI进行模型与向量数据库集成需要添加如下依赖!-- milvus -- dependency groupIdio.milvus/groupId artifactIdmilvus-sdk-java/artifactId /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-ollama/artifactId /dependency7.2、知识数据向量化入库核心流程为「文档分块 → 向量化 → Milvus 入库」// 1、初始化Embedding模型 EmbeddingModel embeddingModel OllamaEmbeddingModel .builder() .defaultOptions(OllamaEmbeddingOptions .builder() .model(EMBEDDING_MODEL_NAME) .dimensions(VECTOR_DIMENSION) .build()) .ollamaApi(ollamaApi) .build(); // 2、知识文档正文分块 ListString chunks splitDocument(doc.getContent()); // 3、Chunk文档向量化处理 Listfloat[] vectors embeddingModel.embed(texts); // 4、知识数据向量化入库 ListJsonObject vectorData process(vectors); UpsertResp upsertResp client.upsert(UpsertReq.builder() .collectionName(collectionName) .data(vectorData) .build());7.3、知识相似度检索核心流程为「问题向量化 → Milvus 检索」// 1、问题向量化 float[] keywordVector embed(List.of(keyword)).get(0); // 2、向量 检索 SearchReq searchReq SearchReq.builder() .collectionName(buildCollectionName(kbId)) .data(Collections.singletonList(new FloatVec(keywordVector))) .annsField(contentVector) .outputFields(Arrays.asList(id, chunkId, contentVector)) .limit(TOP_K_COUNT) .searchParams(Map.of(radius, SIMILARITY_THRESHOLD)) // 相似度阈值 .build(); SearchResp searchResp client.search(searchReq);7.4、知识库系统交互知识库系统交互见下文支持针对文档进行新建、管理、向量化/Embedding、相似度检索等操作。为RAG、部分截图如下知识库管理知识相似度检索