Pinecone Namespaces (命名空间)
命名空间是 Pinecone 索引内部的一种逻辑隔离机制。它允许你在同一个索引中存储多组互不干扰的数据。
#1. 为什么使用命名空间?
- 多租户 (Multi-tenancy):如果你的应用有多个用户,你可以为每个用户创建一个命名空间(
user_id),确保搜索时用户只能看到自己的数据。 - 数据分类:在同一个索引中区分“新闻”、“技术博客”、“内部文档”等不同类别。
- 提高查询效率:查询特定命名空间时,Pinecone 只会扫描该空间内的数据,速度更快。
#2. 使用方法
#插入数据时指定
pythonindex.upsert( vectors=[...], namespace="user-123" )
#查询时指定
pythonresults = index.query( vector=[...], top_k=5, namespace="user-123" )
#3. 命名空间的管理特性
- 默认命名空间:如果你不指定
namespace参数,Pinecone 会使用默认的空字符串("")命名空间。 - 动态创建:你不需要预先定义命名空间。只要在
upsert时指定一个新名字,它就会被自动创建。 - 批量删除:你可以一键删除整个命名空间内的所有数据。
python
index.delete(delete_all=True, namespace="user-123")
#4. 命名空间与过滤 (Namespace vs Metadata Filter)
| 维度 | 命名空间 (Namespace) | 元数据过滤 (Metadata Filter) |
|---|---|---|
| 性能 | 极高性能(物理隔离感) | 较高(在大规模索引中可能略慢) |
| 灵活性 | 一个向量只能属于一个空间 | 一个向量可以有多个元数据标签 |
| 管理 | 支持一键清空 | 需要按条件删除 |
建议:对于硬隔离需求(如用户数据隔离),优先使用 Namespace。对于软分类需求(如给文档打标签),使用 Metadata Filter。
#5. 局限性
- 无法跨命名空间进行一次性查询。如果你需要搜索“所有用户”的内容,你需要查询多次或将数据存入一个统一的空间。
总结:命名空间是构建安全、可扩展的多用户 AI 应用的基石。在设计 RAG 系统之初,就应该考虑好命名空间的划分逻辑。