系列目标:30 天从 LangChain 入门到企业级部署
今日任务:理解生产级向量库需求 → 部署 Milvus/PGVector → 实现高性能、可扩展的语义检索!
🚀 一、为什么需要升级向量数据库?
在 Day 17–19 中,我们使用 Chroma 快速构建了本地 RAG。
但它不适合生产环境:
表格
| 问题 | Chroma | 生产级方案 |
|---|---|---|
| 数据规模 | <10万条 | ✅ 千万+ |
| 并发支持 | 单机、无连接池 | ✅ 高并发 API |
| 持久化 | 文件系统 | ✅ 分布式存储 |
| 扩展性 | 无法水平扩展 | ✅ 分片 + 副本 |
| 运维 | 无监控/备份 | ✅ Prometheus + 备份策略 |
💡 今天,我们就实战两大主流方案:
- Milvus:专为向量设计的云原生数据库(Zilliz 出品)
- PGVector:PostgreSQL 插件,适合已有 PG 生态的企业
🧱 二、方案选型对比
表格
| 特性 | Milvus | PGVector |
|---|---|---|
| 类型 | 专用向量数据库 | PostgreSQL 扩展 |
| 规模 | 亿级向量 | 千万级(受限于 PG) |
| 查询性能 | ⚡ 极快(GPU 加速) | 快(HNSW 索引) |
| 易用性 | 需独立部署 | 复用现有 PG |
| 功能 | 标量过滤、TTL、动态 Schema | 支持 JOIN、事务、权限 |
| 适用场景 | 纯向量检索(推荐) | 向量+结构化混合查询 |
✅ 建议:
- 新建系统 → Milvus
- 已有 PostgreSQL → PGVector
🛠️ 三、实战 1:部署并接入 Milvus(Docker 一键启动)
步骤 1:启动 Milvus(单机版)
# 安装 Milvus standalone(含 etcd/minio)
wget https://github.com/milvus-io/milvus/releases/download/v2.4.6/milvus-standalone-docker-compose.yml -O docker-compose.yml
docker-compose up -d
✅ 访问
http://localhost:9000(Attu UI)查看状态
步骤 2:LangChain 接入 Milvus
# day25_milvus_rag.py
from langchain_ollama import OllamaEmbeddings
from langchain_milvus import Milvus
# 初始化 Embedding
embeddings = OllamaEmbeddings(model="nomic-embed-text")
# 创建/加载 Milvus 集合
vectorstore = Milvus(
embedding_function=embeddings,
connection_args={"host": "localhost", "port": "19530"},
collection_name="company_knowledge",
drop_old=False # 若已存在则复用
)
# 添加文档(首次运行)
if vectorstore.num_entities == 0:
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("docs/company_policy.pdf")
docs = loader.load()
vectorstore.add_documents(docs)
print(f"✅ 已入库 {len(docs)} 个片段")
⚠️ 首次插入会自动创建 HNSW 索引(约 1 分钟)
步骤 3:高性能检索
# 支持标量过滤(如 category="hr")
results = vectorstore.similarity_search(
"年假政策",
k=3,
expr='category == "hr_policy"' # Milvus 表达式语法
)
for doc in results:
print(doc.page_content[:100])
✅ 优势:
- 百万级数据 <100ms 返回
- 支持复杂元数据过滤
- 自动索引优化
🛠️ 四、实战 2:部署并接入 PGVector(PostgreSQL 扩展)
步骤 1:启动带 PGVector 的 PostgreSQL
# 使用官方镜像(含 pgvector)
docker run -d \
--name pgvector-demo \
-e POSTGRES_PASSWORD=mypassword \
-p 5432:5432 \
ankane/pgvector:v0.7.4
步骤 2:LangChain 接入 PGVector
# day25_pgvector_rag.py
from langchain_postgres import PGVector
from langchain_ollama import OllamaEmbeddings
CONNECTION_STRING = "postgresql+psycopg2://postgres:mypassword@localhost:5432/postgres"
COLLECTION_NAME = "company_knowledge"
embeddings = OllamaEmbeddings(model="nomic-embed-text")
# 创建向量库
vectorstore = PGVector(
embeddings=embeddings,
collection_name=COLLECTION_NAME,
connection=CONNECTION_STRING,
use_jsonb=True # 元数据存为 JSONB,支持查询
)
# 首次入库
if not vectorstore.collection_exists():
# 加载文档...
vectorstore.add_documents(docs)
步骤 3:混合查询(向量 + SQL)
# 先向量检索,再用 SQL 过滤
results = vectorstore.similarity_search_with_score(
"如何申请病假?",
k=5
)
# 或直接执行混合查询(需自定义)
from sqlalchemy import text
with vectorstore._conn.connect() as conn:
res = conn.execute(text("""
SELECT content, metadata
FROM langchain_pg_embedding
WHERE metadata->>'department' = 'hr'
ORDER BY embedding <-> :query_emb
LIMIT 3
"""), {"query_emb": embeddings.embed_query("病假")})
✅ 优势:
- 复用现有 DBA/备份/权限体系
- 支持 JOIN 其他业务表(如用户信息)
- ACID 事务保障
⚙️ 五、性能调优关键参数
Milvus 调优
# 创建时指定索引参数(HNSW)
index_params = {
"metric_type": "COSINE",
"index_type": "HNSW",
"params": {"M": 16, "efConstruction": 200}
}
# efSearch 控制查询精度/速度(默认 10)
search_params = {"metric_type": "COSINE", "params": {"ef": 64}}
PGVector 调优
-- 创建 HNSW 索引(比 IVFFlat 更快)
CREATE INDEX ON langchain_pg_embedding
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
💡 经验法则:
efConstruction/ef越大,精度越高,速度越慢- 生产环境建议:
ef=64~128
🔒 六、安全与运维最佳实践
表格
| 事项 | Milvus | PGVector |
|---|---|---|
| 认证 | RBAC + TLS | PostgreSQL 用户/角色 |
| 备份 | MinIO 快照 + Milvus Backup | pg_dump + WAL 归档 |
| 监控 | Prometheus + Grafana | pg_stat_statements |
| 扩容 | 水平分片(Sharding) | 读写分离 + 分区表 |
💡 通用建议:
- 向量维度统一(如 nomic-embed-text 输出 768 维)
- 定期重建索引(数据更新频繁时)
- 对高频查询加缓存(Redis)
📦 七、配套代码结构
langchain-30-days/
└── day25/
├── milvus_rag_demo.py # Milvus 接入示例
└── pgvector_rag_demo.py # PGVector 接入示例
📝 八、今日小结
- ✅ 理解了 Chroma 与生产级向量库的差距
- ✅ 学会了 Milvus 的 Docker 部署与 LangChain 接入
- ✅ 掌握了 PGVector 的混合查询能力
- ✅ 知道了 HNSW 索引的关键调优参数
- ✅ 了解了安全、备份、监控等运维要点
🎯 明日预告:Day 26 —— RAG 评估!用 TruLens + 自定义指标量化你的 RAG 系统效果!