🌟 LangChain 30 天保姆级教程 · Day 25|向量数据库进阶!Milvus vs PGVector,打造千万级 RAG 引擎!

系列目标 :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(单机版)

bash 复制代码
# 安装 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

ini 复制代码
# 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:高性能检索

ini 复制代码
# 支持标量过滤(如 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

ini 复制代码
# 使用官方镜像(含 pgvector)
docker run -d \
  --name pgvector-demo \
  -e POSTGRES_PASSWORD=mypassword \
  -p 5432:5432 \
  ankane/pgvector:v0.7.4

步骤 2:LangChain 接入 PGVector

ini 复制代码
# 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)

ini 复制代码
# 先向量检索,再用 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 调优

makefile 复制代码
# 创建时指定索引参数(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 调优

sql 复制代码
-- 创建 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)

📦 七、配套代码结构

bash 复制代码
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 系统效果!

相关推荐
Csvn2 小时前
🌟 LangChain 30 天保姆级教程 · Day 26|RAG 评估实战!用 TruLens + 自定义指标,科学衡量你的 AI 回答质量!
langchain
怕浪猫3 小时前
第15章 、LangChain回调机制与可观测性
langchain
不会敲代码17 小时前
手写一个「迷你 Cursor」:从零构建 AI 编程助手(LangChain + Tool Calling 实战)
langchain·node.js·cursor
kyle-fang14 小时前
langchain各类文档加载
windows·python·langchain
donglianyou15 小时前
Agent技术详解与实战
python·langchain·agent·langgraph
凌奕15 小时前
LangChain 接外部工具:MCP 和 CLI 到底该选哪个?
langchain
liu****16 小时前
LangGraph-AI应用开发框架(五)
python·langchain·大模型·langgraph
花千树-01017 小时前
三个 Agent 并行调研:用 concurrent 节点构建并发-汇聚式旅游规划助手
java·langchain·agent·function call·multi agent·mcp·harness
是小蟹呀^17 小时前
【整理】Agent中的ReAct架构
langchain·agent·react