【Milvus部署&架构&简单示例】
【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. 核心字段理解

数据流动全过程(简化版)
- 用户通过 SDK 发起写入请求 → Load Balancer → Proxy
- Proxy 把写入数据发给 Message Storage(Kafka/Pulsar)
- Data Node 从消息队列消费数据 → 写入 Delta File → 存入 Object Storage
- Index Node 监听新数据 → 构建索引 → 存入 Index File → 存入 Object Storage
- 用户发起查询 → Proxy → Query Node
- Query Node 从 Object Storage 加载索引和数据 → 计算相似度 → 返回结果
5. 索引&距离度量
向量索引算法
- FLAT(暴力搜索): 精确搜索,适合小数据量
- IVF(倒排文件索引): 将向量空间划分成多个区域,先找区域再搜索
- HNSW(分层导航小世界): 构建多层图结构,搜索时从上层开始逐层细化
- SCANN: Google开源的近似搜索算法
- Grouping 搜索【在搜索 vector 的基础上做分组聚合,返回的 TopK 是基于分组后的聚合结果而非简单的以向量为中心的片段信息。聚合搜索结果,有助于RAG 实现文档级召回】
距离计算 - 欧氏距离(L2): 适合空间位置相关的应用
- 余弦相似度: 适合文本语义搜索
- 内积(IP): 适合推荐系统
- 汉明距离: 适合二进制向量

6. 简单示例
- 连接 Milvus 服务
- 创建 Collection Schema 【fields - schema - collection】
- 创建索引(向量)
- 插入数据 【文档解析 - 分块 - 向量化后的】
- 查询相似文本 【问题向量化,构建搜索参数】
- 全文检索、混合检索(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)
更多推荐



所有评论(0)