【Milvus部署&架构&简单示例】

在这里插入图片描述

1. milvus部署 - Mac

通过docker-compose.yml部署
milvus-etcd 容器不会向主机公开任何端口,并将其数据映射到当前文件夹中的 volumes/etcd。
milvus-minio 容器使用默认身份验证凭据在本地为端口 9090 和 9091 提供服务,并将其数据映射到当前文件夹中的 volumes/minio。
milvus-standalone 容器使用默认设置在本地为端口 19530 提供服务,并将其数据映射到当前文件夹中的 volumes/milvus。

docker --version
Docker version 28.3.2, build 578ccf6

docker-compose --version
Docker Compose version v2.39.1-desktop.1

mkdir -p ~/milvus/conf
cd ~/milvus
pwd
/Users/xxxx/milvus

------------------  下载 -------------------------------------
wget https://github.com/milvus-io/milvus/releases/download/v2.6.2/milvus-standalone-docker-compose.yml -O docker-compose.yml

zsh: command not found: wget
brew install wget
==> Fetching downloads for: wget
==> Fetching wget
==> Downloading https://mirrors.aliyun.com/homebrew/homebrew-bottles/wget-1.25.0.arm64_sequoia.bottle.tar.gz
#################################################################################################################### 100.0%
==> Pouring wget-1.25.0.arm64_sequoia.bottle.tar.gz
🍺  /opt/homebrew/Cellar/wget/1.25.0: 92 files, 4.5MB
==> Running `brew cleanup wget`...
Disable this behaviour by setting `HOMEBREW_NO_INSTALL_CLEANUP=1`.
Hide these hints with `HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).
==> No outdated dependents to upgrade!
---------------------- 再次下载 ---------------------------------

wget https://github.com/milvus-io/milvus/releases/download/v2.6.2/milvus-standalone-docker-compose.yml -O docker-compose.yml

--2025-09-24 23:34:47--  https://github.com/milvus-io/milvus/releases/download/v2.6.2/milvus-standalone-docker-compose.yml
正在解析主机 github.com (github.com)... 20.205.243.166
正在连接 github.com (github.com)|20.205.243.166|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 没有接收到数据。
重试中。

--2025-09-24 23:34:53--  (尝试次数: 2)  https://github.com/milvus-io/milvus/releases/download/v2.6.2/milvus-standalone-docker-compose.yml
正在连接 github.com (github.com)|20.205.243.166|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 302 Found
位置:https://release-assets.githubusercontent.com/github-production-release-asset/208728772/3e3e3cee-da7f-41dd-b0a1-8ffa74075416?sp=r&sv=2018-11-09&sr=b&spr=https&se=2025-09-24T16%3A12%3A15Z&rscd=attachment%3B+filename%3Dmilvus-standalone-docker-compose.yml&rsct=application%2Foctet-stream&skoid=96c2d410-5711-43a1-aedd-ab1947aa7ab0&sktid=398a6654-997b-47e9-b12b-9515b896b4de&skt=2025-09-24T15%3A11%3A19Z&ske=2025-09-24T16%3A12%3A15Z&sks=b&skv=2018-11-09&sig=eaq4ZE093JomKxMNF5mduTHPuBOSjyXeJIIuEiIG%2FIA%3D&jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmVsZWFzZS1hc3NldHMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwia2V5Ijoia2V5MSIsImV4cCI6MTc1ODcyODQxNSwibmJmIjoxNzU4NzI4MTE1LCJwYXRoIjoicmVsZWFzZWFzc2V0cHJvZHVjdGlvbi5ibG9iLmNvcmUud2luZG93cy5uZXQifQ.UAxPex093WTx-qGaRbCgjxM16fWHwm9TrNnJ0AEK9_0&response-content-disposition=attachment%3B%20filename%3Dmilvus-standalone-docker-compose.yml&response-content-type=application%2Foctet-stream [跟随至新的 URL]
--2025-09-24 23:35:13--  https://release-assets.githubusercontent.com/github-production-release-asset/208728772/3e3e3cee-da7f-41dd-b0a1-8ffa74075416?sp=r&sv=2018-11-09&sr=b&spr=https&se=2025-09-24T16%3A12%3A15Z&rscd=attachment%3B+filename%3Dmilvus-standalone-docker-compose.yml&rsct=application%2Foctet-stream&skoid=96c2d410-5711-43a1-aedd-ab1947aa7ab0&sktid=398a6654-997b-47e9-b12b-9515b896b4de&skt=2025-09-24T15%3A11%3A19Z&ske=2025-09-24T16%3A12%3A15Z&sks=b&skv=2018-11-09&sig=eaq4ZE093JomKxMNF5mduTHPuBOSjyXeJIIuEiIG%2FIA%3D&jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmVsZWFzZS1hc3NldHMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwia2V5Ijoia2V5MSIsImV4cCI6MTc1ODcyODQxNSwibmJmIjoxNzU4NzI4MTE1LCJwYXRoIjoicmVsZWFzZWFzc2V0cHJvZHVjdGlvbi5ibG9iLmNvcmUud2luZG93cy5uZXQifQ.UAxPex093WTx-qGaRbCgjxM16fWHwm9TrNnJ0AEK9_0&response-content-disposition=attachment%3B%20filename%3Dmilvus-standalone-docker-compose.yml&response-content-type=application%2Foctet-stream
正在解析主机 release-assets.githubusercontent.com (release-assets.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.111.133, ...
正在连接 release-assets.githubusercontent.com (release-assets.githubusercontent.com)|185.199.108.133|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1788 (1.7K) [application/octet-stream]
正在保存至: “docker-compose.yml”

docker-compose.yml             100%[===================================================>]   1.75K  --.-KB/s  用时 0s  
2025-09-24 23:35:14 (5.33 MB/s) - 已保存 “docker-compose.yml” [1788/1788])

-------------------------------------------------------
sudo docker compose up -d  # 不要sudo
Password:
WARN[0000] /Users/xxxx/milvus/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
unable to get image 'milvusdb/milvus:v2.6.2': Cannot connect to the Docker daemon at unix:///Users/yangkun/.docker/run/docker.sock. Is the docker daemon running?
-------------------------------------------------------


docker compose up -d
WARN[0000] /Users/xxxx/milvus/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] Running 33/33
 ✔ standalone Pulled                                                                                                162.5s 
   ✔ fb7392b194dc Pull complete                                                                                      32.5s 
   ✔ ec2965796d61 Pull complete                                                                                      38.5s 
   ✔ 9b10a938e284 Pull complete                                                                                      42.9s 
   ✔ 0fd568f83cea Pull complete                                                                                     157.0s 
   ✔ 09afdb836d7e Pull complete                                                                                      43.1s 
   ✔ 2493e17b04c2 Pull complete                                                                                      44.5s 
   ✔ fce218340e52 Pull complete                                                                                      67.1s 
 ✔ etcd Pulled                                                                                                       14.7s 
   ✔ 843119f34803 Pull complete                                                                                       3.9s 
   ✔ d858cbc252ad Pull complete                                                                                       1.7s 
   ✔ 1069fc2daed1 Pull complete                                                                                       1.7s 
   ✔ 6c170d3e2c27 Pull complete                                                                                       2.0s 
   ✔ b40161cd83fc Pull complete                                                                                       1.7s 
   ✔ 2ae710cd8bfe Pull complete                                                                                       2.1s 
   ✔ 307c1adadb60 Pull complete                                                                                       1.9s 
   ✔ d462aa345367 Pull complete                                                                                       2.8s 
   ✔ 0f8b424aa0b9 Pull complete                                                                                       1.7s 
   ✔ 6a4b0c8e9a15 Pull complete                                                                                       5.0s 
   ✔ d557676654e5 Pull complete                                                                                       1.6s 
   ✔ c8022d07192e Pull complete                                                                                       1.8s 
   ✔ 5318d93a3a65 Pull complete                                                                                       1.7s 
   ✔ 67d02d932c5a Pull complete                                                                                       6.1s 
 ✔ minio Pulled                                                                                                      54.8s 
   ✔ 369b69891dda Pull complete                                                                                       0.2s 
   ✔ 173fd1d215b2 Pull complete                                                                                      15.1s 
   ✔ a1100e8b1d6c Pull complete                                                                                      20.8s 
   ✔ 6a47f9e0d7cc Pull complete                                                                                      23.6s 
   ✔ 7c9f98ec78a4 Pull complete                                                                                      49.3s 
   ✔ a27fa9545a79 Pull complete                                                                                      12.8s 
   ✔ 4860021e14ac Pull complete                                                                                      26.8s 
   ✔ 0e05d8d355ba Pull complete                                                                                       5.5s 
   ✔ 3449db8ae906 Pull complete                                                                                       8.6s 
[+] Running 4/4
 ✔ Network milvus               Created                                                                               0.0s 
 ✔ Container milvus-minio       Started                                                                               0.4s 
 ✔ Container milvus-etcd        Started                                                                               0.4s 
 ✔ Container milvus-standalone  Started     

milvus-etcd:分布式键值存储(用于元数据管理)

  • 作用:etcd 是一个高可用、强一致性的分布式键值存储系统,常用于服务发现和配置共享。在 Milvus 中,etcd 主要用于 存储和管理元数据(metadata)。
  • 具体用途包括:
    • 存储集合(Collection)、分区(Partition)、索引(Index)等的元信息;
    • 记录数据段(Segment)的状态和位置;
    • 协调 Milvus 各个服务组件(如 RootCoord、DataCoord、QueryCoord 等)之间的状态同步;
    • 服务注册与发现(例如,节点上线/下线通知)。
  • 为什么需要它?Milvus 是一个分布式系统,多个组件需要共享一致的元数据。etcd 提供了可靠的、事务性的元数据存储,确保系统状态的一致性和可靠性。
    存储元数据需要极高的可用性、强一致性和事务支持,因此 Milvus 选择了 etcd 作为元存储。Milvus 还使用 etcd 进行服务注册和健康检查。

milvus-minio:对象存储(用于原始向量数据和索引文件的持久化)

  • 作用:MinIO 是一个高性能、兼容 Amazon S3 API 的对象存储服务。在 Milvus 中,MinIO 用作 底层数据存储后端,用于持久化存储实际的向量数据、标量字段数据以及构建好的索引文件。
  • 具体用途包括:
    • 存储插入的原始向量数据(以 Segment 为单位);
    • 存储构建的索引文件(如 IVF、HNSW 等);
    • 存储日志快照(如果启用了相关功能);
    • 支持数据的持久化和恢复,即使 Milvus 服务重启,数据也不会丢失。
  • 为什么需要它?Milvus 本身不直接管理磁盘文件,而是将数据写入对象存储(如 MinIO 或 S3)。这样设计使得 Milvus 更容易扩展、解耦计算与存储,并支持云原生部署。

在milvus文件下,查看部署情况

# 在milvus文件下,查看部署情况

 cd ~/milvus (milvus下)
 docker-compose ps
 
 
 WARN[0000] /Users/xxxx/milvus/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
NAME                IMAGE                                      COMMAND                  SERVICE      CREATED          STATUS                    PORTS
milvus-etcd         quay.io/coreos/etcd:v3.5.18                "etcd -advertise-cli…"   etcd         10 minutes ago   Up 10 minutes (healthy)   2379-2380/tcp
milvus-minio        minio/minio:RELEASE.2024-12-18T13-15-44Z   "/usr/bin/docker-ent…"   minio        10 minutes ago   Up 10 minutes (healthy)   0.0.0.0:9000-9001->9000-9001/tcp, [::]:9000-9001->9000-9001/tcp
milvus-standalone   milvusdb/milvus:v2.6.2                     "/tini -- milvus run…"   standalone   10 minutes ago   Up 10 minu

访问http://127.0.0.1:9091/webui/ 出现连接失败情况

"""
访问 Milvus WebUI,

文档:
https://milvus.io/docs/milvus-webui.md
http://127.0.0.1:9091/webui/
"""

访问http://127.0.0.1:9091/webui/  出现连接失败情况
-------- docker 需要重启 -------
# 确保在 milvus 目录
cd ~/milvus

# 停止旧实例(如果存在)
docker compose down

# 启动新实例
docker compose up -d

# 查看状态
docker compose ps

# 等待 30 秒后测试
curl http://127.0.0.1:9091/healthz

2. attu页面安装

https://milvus.io/docs/milvus-webui.md

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下载桌面应用程序

访问 Attu GitHub Releases 页面 下载适合您操作系统的桌面版本并按照安装步骤操作
macOS (M 系列芯片) 注意事项
如果遇到错误:

attu.app is damaged and cannot be opened.

在终端中运行以下命令来解决此【Mac电脑 - attu.app】:

sudo xattr -rd com.apple.quarantine /Applications/attu.app

3. milvus架构设计

Milvus 通过 collection 组织数据,vchannel 分流写入,flowgraph 处理流水线,node 执行任务,schema 定义结构,index_type + metric_type 控制索引和查询精度,最终实现海量向量数据的高性能相似性搜索。

Milvus 是一个为 AI 设计的分布式向量数据库,通过“协调器 + 代理 + 工作节点 + 消息队列 + 对象存储”的架构,实现海量向量数据的高速写入、索引构建和相似性搜索。
✅ 模块化、可扩展:每个组件都可以独立扩缩容,比如查得多就加 Query Node。
✅ 高可用:依赖 etcd + 消息队列 + 对象存储,故障不影响整体。
✅ 分离计算与存储:数据存在对象存储,计算节点无状态,方便弹性伸缩。
✅ 支持多种索引算法:可以根据场景选 HNSW、IVF、ANNOY 等,平衡速度和精度。
✅ 适合 AI 场景:原生支持向量 + 标量混合查询(比如“找和这张图相似的,且价格 < 100 元”)

在这里插入图片描述
在这里插入图片描述

3.1 Coordinator Service(协调服务)

这是整个系统的“大脑”,负责管理和调度。

  • Root / Query / Data / Index:四个子服务,分别管理不同职责:
    • Root:系统入口、集群管理。全局调度,管理DDL操作
    • Query:负责查询任务调度。管理查询节点和负载均衡
    • Data:负责数据写入调度。管理数据分片和持久化
    • Index:负责索引构建调度。管理索引构建任务
  • Meta Storage(元数据存储):
    • 存储所有“配置信息”、“表结构”、“索引状态”等。
    • 使用 etcd(一个分布式键值存储),保证高可用和一致性。

💡 类比:就像 MySQL 的 information_schema,记录“有哪些表、哪些字段、索引在哪”。

3.2 SDK → Load Balancer → Proxy

  • SDK:用户写的代码(Python/Java/Go 等),调用 Milvus API。
  • Load Balancer:负载均衡器,把请求分发给多个 Proxy。
  • Proxy:代理节点,接收客户端请求,转发给后端 Worker Node。
    • 它会把 DML(增删改查)操作发送给 Message Storage;
    • 把 DDL(建表、删表等)操作发给 Coordinator。

💡 类比:Proxy 就像 Nginx,是用户和后端之间的“门卫”。
Proxy组件负责接收请求、验证权限、负载均衡等工作

3.3 Message Storage(消息队列)

  • 用于在各个组件之间传递“数据变更”和“控制信号”。
  • 支持 Kafka 或 Pulsar(两种主流消息中间件)。
  • 数据写入时,先写入消息队列,再由 Worker Node 消费处理。
    💡 类比:像快递站,数据先放这里排队,然后工人去取件处理。

3.4 Worker Node(工作节点)

🔹 Query Node(查询节点)

  • 负责执行“搜索”请求。
  • 从 Object Storage 加载索引和数据,进行向量相似度计算。
  • 返回最相似的 Top-K 结果。

🔹 Data Node(数据节点)

  • 负责接收原始数据(向量 + 标量字段),写入 Delta File(增量文件)。
  • 并将数据推送到 Object Storage。

🔹 Index Node(索引节点)

  • 负责构建索引(比如 IVF_PQ、HNSW 等算法)。
  • 把原始向量转换成高效的索引结构,存入 Index File。

💡 注意:这三个节点可以独立部署、水平扩展,比如你查得多就多开 Query Node,写得多就多开 Data Node。

3.5 Object Storage(对象存储)

这是持久化存储层,存放所有实际数据:

  • Log Snapshot:日志快照,用于恢复或审计。
  • Delta File:增量数据文件,刚写入还没建索引的数据。
  • Index File:建好的索引文件,用于快速查询。

Milvus将存储分为三类:

  • 元数据存储: 使用etcd存储集合schema、索引信息等
  • 消息存储: 使用Pulsar或Kafka处理实时数据流
  • 对象存储: 使用MinIO或S3存储向量数据和索引

💡 类比:就像硬盘,所有数据最终都存在这里,即使服务重启也不会丢。

4. 核心字段理解

在这里插入图片描述
数据流动全过程(简化版)

  1. 用户通过 SDK 发起写入请求 → Load Balancer → Proxy
  2. Proxy 把写入数据发给 Message Storage(Kafka/Pulsar)
  3. Data Node 从消息队列消费数据 → 写入 Delta File → 存入 Object Storage
  4. Index Node 监听新数据 → 构建索引 → 存入 Index File → 存入 Object Storage
  5. 用户发起查询 → Proxy → Query Node
  6. Query Node 从 Object Storage 加载索引和数据 → 计算相似度 → 返回结果

5. 索引&距离度量

向量索引算法

  • FLAT(暴力搜索): 精确搜索,适合小数据量
  • IVF(倒排文件索引): 将向量空间划分成多个区域,先找区域再搜索
  • HNSW(分层导航小世界): 构建多层图结构,搜索时从上层开始逐层细化
  • SCANN: Google开源的近似搜索算法
  • Grouping 搜索【在搜索 vector 的基础上做分组聚合,返回的 TopK 是基于分组后的聚合结果而非简单的以向量为中心的片段信息。聚合搜索结果,有助于RAG 实现文档级召回】
    距离计算
  • 欧氏距离(L2): 适合空间位置相关的应用
  • 余弦相似度: 适合文本语义搜索
  • 内积(IP): 适合推荐系统
  • 汉明距离: 适合二进制向量

在这里插入图片描述

6. 简单示例

  1. 连接 Milvus 服务
  2. 创建 Collection Schema 【fields - schema - collection】
  3. 创建索引(向量)
  4. 插入数据 【文档解析 - 分块 - 向量化后的】
  5. 查询相似文本 【问题向量化,构建搜索参数】
  6. 全文检索、混合检索(RRF)
from pymilvus import (
    connections,
    Collection,
    FieldSchema,
    CollectionSchema,
    DataType,
    utility,
    MilvusException
)
import json
import numpy as np

# ======================
# 1. 连接 Milvus 服务
# ======================
def connect_milvus():
    """
    连接到 Milvus 服务器
    默认端口 19530,本地部署可直接连接
    """
    try:
        connections.connect("default", host="localhost", port="19530")
        print("✅ 成功连接到 Milvus")
    except Exception as e:
        raise RuntimeError(f"❌ 连接 Milvus 失败: {e}")

# ======================
# 2. 创建 Collection Schema
# ======================
def create_rag_collection(collection_name="rag_chunks"):
    """
    创建 RAG 专用集合,包含向量字段和元数据字段
    """
    # 定义字段
    fields = [
        FieldSchema(
            name="id",
            dtype=DataType.INT64,
            is_primary=True,
            auto_id=True,  # 自动递增主键
            description="主键ID"
        ),
        FieldSchema(
            name="embedding",
            dtype=DataType.FLOAT_VECTOR,
            dim=768,  # 向量维度,根据你的 embedding 模型调整
            description="文本向量"
        ),
        FieldSchema(
            name="text",
            dtype=DataType.VARCHAR,
            max_length=65535,  # 支持长文本
            description="原始文本内容"
        ),
        FieldSchema(
            name="source",
            dtype=DataType.VARCHAR,
            max_length=256,
            description="来源文件或URL"
        ),
        FieldSchema(
            name="chunk_id",
            dtype=DataType.VARCHAR,
            max_length=128,
            description="文档分块ID"
        ),
        FieldSchema(
            name="metadata",
            dtype=DataType.JSON,
            description="附加元数据(JSON格式)"
        )
    ]

    # 创建 schema
    schema = CollectionSchema(
        fields=fields,
        description="RAG 检索专用集合",
        enable_dynamic_field=True  # 允许插入未定义的字段(可选)
    )

    # 创建集合
    if utility.has_collection(collection_name):
        print(f"⚠️ 集合 '{collection_name}' 已存在,将删除重建")
        utility.drop_collection(collection_name)

    collection = Collection(name=collection_name, schema=schema)
    print(f"✅ 集合 '{collection_name}' 创建成功")

    return collection

# ======================
# 3. 创建索引(关键!影响查询性能)
# ======================
def create_index(collection):
    """
    为向量字段创建索引
    推荐使用 HNSW,适合高精度+高速查询
    metric_type: IP(内积,等价于余弦相似度)更适合语义检索
    """
    index_params = {
        "index_type": "HNSW",           # 索引类型:HNSW(推荐)
        "metric_type": "IP",            # 距离度量:内积(适合语义相似度)
        "params": {
            "M": 8,                     # 图的每个节点连接数
            "efConstruction": 64        # 建图时的候选列表大小
        }
    }

    # 为 embedding 字段创建索引
    collection.create_index(field_name="embedding", index_params=index_params)
    print("✅ 索引创建成功")

    # 加载集合到内存(查询前必须加载)
    collection.load()
    print("✅ 集合已加载到内存")

# ======================
# 4. 插入数据(模拟 RAG 分块文本)
# ======================
def insert_data(collection, chunks):
    """
    插入分块数据到 Milvus
    chunks: List[dict],每个元素包含 text, source, chunk_id, metadata, embedding
    embedding: np.array 或 list,长度为 768
    """
    # 提取各字段数据
    texts = [c["text"] for c in chunks]
    sources = [c["source"] for c in chunks]
    chunk_ids = [c["chunk_id"] for c in chunks]
    metadatas = [c.get("metadata", {}) for c in chunks]

    # 生成 embedding 向量(这里模拟,实际应调用 embedding 模型)
    # 示例:随机生成 768 维向量(生产环境替换为真实 embedding)
    embeddings = []
    for _ in chunks:
        emb = np.random.rand(768).astype(np.float32).tolist()  # 生产环境替换成真实向量
        embeddings.append(emb)

    # 插入数据
    entities = [
        texts,          # text 字段
        embeddings,     # embedding 字段
        sources,        # source 字段
        chunk_ids,      # chunk_id 字段
        metadatas       # metadata 字段
    ]

    # 插入并返回插入结果
    insert_result = collection.insert(entities)
    print(f"✅ 插入 {len(chunks)} 条数据,插入ID: {insert_result.primary_keys[:5]}...")

    # 刷新使数据立即可见(可选,写入后立即查询需要刷新)
    collection.flush()
    print("✅ 数据已刷新,可立即查询")

# ======================
# 5. 查询相似文本(RAG 核心:召回)
# ======================
def search_similar_texts(collection, query_embedding, top_k=3, filter_expr=None):
    """
    根据查询向量搜索最相似的文本片段
    query_embedding: 768维向量(list 或 np.array)
    top_k: 返回最相似的前 K 个结果
    filter_expr: 可选过滤条件,如 "source == 'employee_handbook.pdf'"
    """
    # 构造搜索参数
    search_params = {
        "metric_type": "IP",          # 使用内积(语义相似度)
        "params": {"ef": 64}          # 查询时的候选列表大小
    }

    # 执行搜索
    results = collection.search(
        data=[query_embedding],       # 查询向量
        anns_field="embedding",       # 在哪个字段上搜索
        param=search_params,
        limit=top_k,                  # 返回 top_k 个结果
        expr=filter_expr,             # 可选过滤条件
        output_fields=["text", "source", "chunk_id", "metadata"]  # 返回哪些字段
    )

    # 解析结果
    hits = []
    for hit in results[0]:  # results 是二维列表,[0] 是第一个查询的结果
        hit_info = {
            "id": hit.id,
            "distance": hit.distance,  # 相似度分数(IP 越大越相似)
            "text": hit.entity.get("text"),
            "source": hit.entity.get("source"),
            "chunk_id": hit.entity.get("chunk_id"),
            "metadata": hit.entity.get("metadata")
        }
        hits.append(hit_info)

    print(f"✅ 搜索到 {len(hits)} 个相似结果,距离范围: {min([h['distance'] for h in hits]):.4f} ~ {max([h['distance'] for h in hits]):.4f}")
    return hits

# ======================
# 6. 完整示例:模拟 RAG 流程
# ======================
def demo_rag_flow():
    """
    完整演示 RAG 流程:
    1. 连接 Milvus
    2. 创建集合
    3. 创建索引
    4. 插入模拟数据
    5. 查询相似文本
    """
    print("🚀 开始 RAG 演示流程...\n")

    # 1. 连接 Milvus
    connect_milvus()

    # 2. 创建集合
    collection = create_rag_collection("rag_demo")

    # 3. 创建索引
    create_index(collection)

    # 4. 准备模拟数据(实际应用中应来自文档分块 + embedding 模型)
    mock_chunks = [
        {
            "text": "员工年假规定:入职满一年可享受5天年假,每增加一年增加1天,上限15天。",
            "source": "employee_handbook.pdf",
            "chunk_id": "handbook_chapter5",
            "metadata": {"author": "HR", "date": "2024-01-01"}
        },
        {
            "text": "请假流程:需提前3天在OA系统提交申请,部门经理审批后生效。",
            "source": "leave_policy.docx",
            "chunk_id": "policy_section3",
            "metadata": {"author": "Admin", "date": "2024-03-15"}
        },
        {
            "text": "加班补偿:工作日加班按1.5倍工资,周末加班按2倍,法定节假日按3倍。",
            "source": "compensation_guide.pdf",
            "chunk_id": "guide_page7",
            "metadata": {"author": "Finance", "date": "2024-02-10"}
        },
        {
            "text": "试用期员工不享受年假,转正后按比例折算。",
            "source": "onboarding_manual.pdf",
            "chunk_id": "manual_section2",
            "metadata": {"author": "Onboarding", "date": "2024-01-20"}
        }
    ]

    # 5. 插入数据
    insert_data(collection, mock_chunks)

    # 6. 模拟用户查询(这里用随机向量代替真实 embedding)
    # 实际应用中,应使用 embedding 模型对用户问题编码
    user_query = "如何申请年假?"
    # 模拟:生成一个与“年假”相关的向量(生产环境应调用模型)
    query_embedding = np.random.rand(768).astype(np.float32).tolist()

    # 7. 搜索相似文本
    similar_chunks = search_similar_texts(collection, query_embedding, top_k=3)

    # 8. 输出结果(可用于喂给 LLM)
    print("\n🔍 检索到的相关文本:")
    for i, chunk in enumerate(similar_chunks, 1):
        print(f"\n{i}. [来源: {chunk['source']}]")
        print(f"   Chunk ID: {chunk['chunk_id']}")
        print(f"   相似度: {chunk['distance']:.4f}")
        print(f"   内容: {chunk['text'][:200]}...")  # 截断显示

    print("\n✅ RAG 检索流程完成!这些文本可作为上下文输入给大模型生成回答。")

# ======================
# 7. 运行演示
# ======================
if __name__ == "__main__":
    try:
        demo_rag_flow()
    except Exception as e:
        print(f"❌ 发生错误: {e}")

⚙️ 索引策略详解(为什么选 HNSW + IP)
在这里插入图片描述

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐