Milvus

📚 文档链接: 快速入门 | Milvus 文档

什么是向量嵌入?

向量嵌入是从机器学习模型中提取的数值表示,捕捉非结构化数据的语义含义。这些嵌入通过神经网络或变压器架构对数据中的复杂相关性进行分析,创建一个密集的向量空间,其中每个点对应于数据对象(如文档中的词)的“含义”。

这个过程将文本或其他非结构化数据转换为反映语义相似性的向量——在这个多维空间中,意义相关的词被放置得更近,从而实现一种称为“密集向量搜索”的搜索方式。这与依赖精确匹配和使用稀疏向量的传统关键词搜索形成对比。向量嵌入的发展,通常源于大型科技公司广泛训练的基础模型,使得搜索能够捕捉数据的本质,超越词汇或稀疏向量搜索方法的局限性。

向量:可以理解为在多维空间中的一个点,它由一组数字(坐标)表示。在 AI 中,无论是文本、图像还是声音,都可以通过特定的模型(如 qwen3-embedding-4b-torch)转换为一个向量。这个向量捕捉了原始数据的深层特征。
维度:就是指这个向量有多少个数字。例如,一个 [0.12, 0.45, -0.23, …, 0.78]的向量,如果它有 1024 个数字,我们就说它是一个 1024 维​ 的向量。维度的选择通常由您选用的嵌入模型决定,并且在创建 Milvus 集合时必须正确定义,因为所有存入的向量都必须有相同的维度。

非结构化数据、Embeddings 和 Milvus

非结构化数据(如文本、图像和音频)格式各异,蕴含丰富的潜在语义,因此分析起来极具挑战性。Embeddings 被用来将非结构化数据转换成能够捕捉其基本特征的数字向量。然后将这些向量存储在向量数据库中,从而实现快速、可扩展的搜索和分析。

Milvus 提供强大的数据建模功能,使您能够将非结构化或多模式数据组织成结构化的 Collections。它支持多种数据类型,适用于不同的属性模型,包括常见的数字和字符类型、各种向量类型、数组、集合和 JSON,为您节省了维护多个数据库系统的精力。
与处理结构化数据并执行精确搜索操作的传统关系数据库不同,向量数据库擅长使用 Approximate Nearest Neighbor(ANN)算法等技术进行语义相似性搜索。这种能力对于开发推荐系统、聊天机器人和多媒体内容搜索工具等各种领域的应用程序,以及解决 ChatGPT 等大型语言模型和 AI 带来的挑战(如理解上下文和细微差别以及 AI 幻觉)至关重要。

Milvus 概念 类比关系型数据库概念 说明
Collection(集合) Table(表) 存储向量和关联元数据(如文本内容、来源)的基本单位。
Entity(实体) Row(行) 一条完整的记录,包含主键、向量字段和标量字段(元数据)。
Field(字段) Column(列) 包括向量字段(存储向量)和标量字段(存储 ID、标签等结构化数据)。
Index(索引) Index(索引) 为向量字段建立的索引(如 HNSW、IVF_FLAT),是高速检索的关键。
  1. 写入数据(以 Python 为例)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType

    # 1. 连接到您的 Milvus 服务
    connections.connect("default", host='localhost', port='19530')

    # 2. 定义集合结构(假设向量维度为1024)
    fields = [
    FieldSchema(name="id", dtype=DataType.VARCHAR, is_primary=True, max_length=100),
    FieldSchema(name="text_content", dtype=DataType.VARCHAR, max_length=65535),
    FieldSchema(name="embedding_vector", dtype=DataType.FLOAT_VECTOR, dim=1024)
    ]
    schema = CollectionSchema(fields, description="问答助手知识库")
    collection = Collection("qa_knowledge_base", schema)

    # 3. 插入数据(假设您已使用 embedding 模型将文本转换为向量)
    data = [
    ["doc_001", "CMDB是配置管理数据库,用于...", [0.12, 0.34, ...]], # 1024维向量
    ["doc_002", "MongoDB的聚合管道用于...", [0.56, 0.78, ...]],
    ]
    collection.insert(data)
    collection.flush() # 确保数据持久化

    # 4. 创建索引(以HNSW为例)
    index_params = {
    "index_type": "HNSW",
    "metric_type": "COSINE", # 使用余弦相似度
    "params": {"M": 16, "efConstruction": 200}
    }
    collection.create_index("embedding_vector", index_params)
    collection.load() # 将集合加载到内存以提供服务
  2. 读取与搜索

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 用户提出问题,并转换为向量
    question = "如何查询CMDB中的主机信息?"
    question_vector = embed(question) # 使用相同的模型生成1024维向量

    # 在 Milvus 中搜索最相似的 Top K 个向量
    search_params = {"metric_type": "COSINE", "params": {"ef": 50}}
    results = collection.search(
    data=[question_vector],
    anns_field="embedding_vector",
    param=search_params,
    limit=3, # 返回最相似的3条结果
    output_fields=["id", "text_content"] # 指定需要返回的元数据字段
    )

    # 处理结果
    for hits in results:
    for hit in hits:
    print(f"相似度得分: {hit.score}, 关联知识: {hit.entity.get('text_content')}")
  3. Milvus 支持的搜索类型
    ANN 搜索:查找最接近查询向量的前 K 个向量。
    过滤搜索:在指定的过滤条件下执行 ANN 搜索。
    范围搜索:查找查询向量指定半径范围内的向量。
    混合搜索:基于多个向量场进行 ANN 搜索。
    全文搜索:基于 BM25 的全文搜索。
    Rerankers:根据附加标准或辅助算法调整搜索结果顺序,完善初始 ANN 搜索结果。
    获取:根据主键检索数据。
    查询使用特定表达式检索数据。

Milvus 在 RAG

在 RAG 流程中,Milvus 扮演着 知识库与高速检索引擎 的角色。

  1. 检索(Retrieval):当用户提问时,系统首先使用嵌入模型将问题转换为查询向量。随后,Milvus 在该查询向量与知识库中所有文档向量之间进行高速的相似性比较,找出最相关的几个知识片段。
  2. 增强(Augmentation):将这些检索到的知识片段(元数据中的原始文本)作为上下文,与用户的问题一起组合成一个更丰富的提示词(Prompt)。
  3. 生成(Generation):将这个富含上下文的提示词发送给您的大语言模型(如 qwen3-235b-a22b),由它来生成精准、有据可依的最终答案。

什么是 Agentic RAG?基础的 RAG 中,检索-增强-生成是一次性完成的。而 Agentic RAG(智能体驱动的 RAG) 则引入了“智能体”的概念,使得检索过程变得更智能、更动态。
智能体可以根据对大模型初步生成内容的理解,主动地、多次地 与向量数据库(Milvus)进行交互。这使 RAG 系统从静态的“文档查找”升级为动态的、具有决策能力的“研究助手”。例如:

  • 判断是否需要进一步检索:如果首次检索到的信息不足以回答问题,智能体可以重新生成搜索 query,进行多轮检索,直到信息足够。
  • 分解复杂问题:对于复杂问题,智能体可以将其拆解成多个子问题,然后针对每个子问题去 Milvus 中检索相关信息,最后综合所有信息生成答案。
  • 工具调用(Tool Use):智能体可以将 Milvus 的检索功能视为一个可调用的工具,根据对话进程决定何时以及如何调用这个工具。

人工智能集成

  1. Embeddings 模型集成 Embedding 模型将非结构化数据转换为其在高维数据空间中的数字表示,以便您可以将其存储在 Milvus 中。目前,PyMilvus(Python SDK)集成了多个嵌入模型,因此您可以快速将数据准备成向量嵌入。有关详情,请参阅嵌入概述。
  2. Reranker 模型集成 在信息检索和生成式人工智能领域,Reranker 是优化初始搜索结果顺序的重要工具。PyMilvus 也集成了几种 Rerankers 模型,以优化初始搜索返回结果的顺序。详情请参考Rerankers 概述。
  3. LangChain 和其他人工智能工具集成 在 GenAI 时代,LangChain 等工具受到了应用程序开发人员的广泛关注。作为核心组件,Milvus 通常在此类工具中充当向量存储。要了解如何将 Milvus 集成到您喜爱的人工智能工具中,请参阅我们的集成和教程。