基础概念 #

什么是向量? #

向量是 Pinecone 中最基本的数据单元。在数学上,向量是一个有序的数字列表,可以表示数据在多维空间中的位置。

向量的表示 #

text
┌─────────────────────────────────────────────────────────────┐
│                    向量的表示                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  一维向量(标量):                                          │
│  [5]                                                        │
│                                                             │
│  二维向量:                                                  │
│  [3, 4]                                                     │
│                                                             │
│  三维向量:                                                  │
│  [1, 2, 3]                                                  │
│                                                             │
│  高维向量(如 OpenAI embeddings):                          │
│  [0.0023, -0.0156, 0.0089, ..., 0.0012]  // 1536 维        │
│                                                             │
│  在 Pinecone 中:                                           │
│  {                                                          │
│    "id": "doc-1",                                           │
│    "values": [0.1, 0.2, 0.3, ...],                         │
│    "metadata": {"title": "Document 1"}                      │
│  }                                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

向量的维度 #

text
┌─────────────────────────────────────────────────────────────┐
│                    向量维度                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  维度 = 向量中数字的个数                                     │
│                                                             │
│  常见嵌入模型的维度:                                        │
│                                                             │
│  | 模型                | 维度    |                          │
│  |---------------------|---------|                          │
│  | OpenAI text-embedding-ada-002 | 1536   |                 │
│  | OpenAI text-embedding-3-small | 1536   |                 │
│  | OpenAI text-embedding-3-large | 3072   |                 │
│  | Cohere embed-english-v3.0     | 1024   |                 │
│  | Sentence-BERT                 | 768    |                 │
│  | Google Geck                   | 768    |                 │
│                                                             │
│  选择建议:                                                  │
│  - 维度越高,表达能力越强                                    │
│  - 维度越高,存储和计算成本越大                              │
│  - 根据实际需求平衡选择                                      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

什么是嵌入(Embedding)? #

嵌入是将非结构化数据(文本、图像、音频等)转换为向量的过程。嵌入向量能够捕捉数据的语义信息。

嵌入的工作原理 #

text
┌─────────────────────────────────────────────────────────────┐
│                    嵌入过程                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   输入数据          嵌入模型           向量输出              │
│                                                             │
│   "猫是一种        OpenAI          [0.12, -0.34,            │
│    小型哺乳动物"   Embedding         0.56, ..., 0.23]       │
│                                                             │
│   语义相似的内容 → 相似的向量                                │
│                                                             │
│   "猫咪是体型     OpenAI          [0.11, -0.32,            │
│    较小的动物"    Embedding         0.58, ..., 0.21]       │
│                                                             │
│   两向量距离很近,因为语义相似                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

常见的嵌入模型 #

text
┌─────────────────────────────────────────────────────────────┐
│                    嵌入模型选择                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  文本嵌入:                                                  │
│                                                             │
│  1. OpenAI Embeddings                                       │
│     - text-embedding-3-small(性价比高)                    │
│     - text-embedding-3-large(效果最好)                    │
│     - 需要 API Key                                          │
│                                                             │
│  2. Cohere Embeddings                                       │
│     - embed-english-v3.0                                    │
│     - embed-multilingual-v3.0                               │
│     - 支持多语言                                            │
│                                                             │
│  3. 开源模型                                                │
│     - sentence-transformers                                 │
│     - BGE embeddings                                        │
│     - 可本地部署                                            │
│                                                             │
│  图像嵌入:                                                  │
│  - CLIP(OpenAI)                                           │
│  - Vision Transformer                                       │
│  - ResNet                                                   │
│                                                             │
│  音频嵌入:                                                  │
│  - Whisper                                                  │
│  - Wav2Vec                                                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

使用 OpenAI 生成嵌入 #

python
from openai import OpenAI

client = OpenAI(api_key="your-api-key")

response = client.embeddings.create(
    model="text-embedding-3-small",
    input="这是一段需要嵌入的文本"
)

embedding = response.data[0].embedding
print(f"向量维度: {len(embedding)}")
print(f"前5个值: {embedding[:5]}")

什么是相似度度量? #

相似度度量用于计算两个向量之间的相似程度。Pinecone 支持多种相似度度量方式。

余弦相似度(Cosine Similarity) #

text
┌─────────────────────────────────────────────────────────────┐
│                    余弦相似度                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  公式:                                                     │
│                                                             │
│  cos(θ) = (A · B) / (||A|| × ||B||)                        │
│                                                             │
│  其中:                                                     │
│  - A · B = 向量点积                                         │
│  - ||A|| = 向量 A 的模长                                    │
│  - ||B|| = 向量 B 的模长                                    │
│                                                             │
│  特点:                                                     │
│  - 值范围:[-1, 1]                                          │
│  - 1 表示完全相同方向                                       │
│  - 0 表示正交(无关)                                       │
│  - -1 表示完全相反方向                                      │
│                                                             │
│  优点:                                                     │
│  ✅ 不受向量长度影响                                        │
│  ✅ 关注向量方向                                            │
│  ✅ 适合文本相似度                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

欧几里得距离(Euclidean Distance) #

text
┌─────────────────────────────────────────────────────────────┐
│                    欧几里得距离                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  公式:                                                     │
│                                                             │
│  d(A, B) = √(Σ(Ai - Bi)²)                                  │
│                                                             │
│  特点:                                                     │
│  - 值范围:[0, +∞)                                          │
│  - 0 表示完全相同                                           │
│  - 值越大表示越不相似                                       │
│                                                             │
│  优点:                                                     │
│  ✅ 直观理解                                                │
│  ✅ 考虑向量长度                                            │
│  ✅ 适合物理距离计算                                        │
│                                                             │
│  注意:                                                     │
│  Pinecone 返回的是距离的平方                                 │
│                                                             │
└─────────────────────────────────────────────────────────────┘

点积(Dot Product) #

text
┌─────────────────────────────────────────────────────────────┐
│                    点积                                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  公式:                                                     │
│                                                             │
│  A · B = Σ(Ai × Bi)                                        │
│                                                             │
│  特点:                                                     │
│  - 值范围:(-∞, +∞)                                         │
│  - 受向量长度影响                                           │
│  - 计算速度最快                                             │
│                                                             │
│  优点:                                                     │
│  ✅ 计算效率高                                              │
│  ✅ 适合归一化向量                                          │
│                                                             │
│  注意:                                                     │
│  如果向量已归一化,点积 = 余弦相似度                         │
│                                                             │
└─────────────────────────────────────────────────────────────┘

选择建议 #

text
┌─────────────────────────────────────────────────────────────┐
│                    相似度度量选择                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  使用余弦相似度的场景:                                      │
│  ✅ 文本语义相似度(推荐)                                  │
│  ✅ 向量长度不重要                                          │
│  ✅ 大多数 NLP 任务                                         │
│                                                             │
│  使用欧几里得距离的场景:                                    │
│  ✅ 物理距离计算                                            │
│  ✅ 图像相似度                                              │
│  ✅ 需要考虑向量长度                                        │
│                                                             │
│  使用点积的场景:                                            │
│  ✅ 向量已归一化                                            │
│  ✅ 需要最快计算速度                                        │
│  ✅ 推荐系统                                                │
│                                                             │
└─────────────────────────────────────────────────────────────┘

什么是索引(Index)? #

索引是 Pinecone 中存储和搜索向量的基本单元。每个索引都有固定的维度和相似度度量方式。

索引的结构 #

text
┌─────────────────────────────────────────────────────────────┐
│                    索引结构                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Index                                                      │
│  ├── 名称:my-index                                         │
│  ├── 维度:1536                                             │
│  ├── 度量:cosine                                           │
│  ├── 类型:Serverless / Pod-based                           │
│  │                                                          │
│  └── 向量数据                                                │
│      ├── Vector 1                                           │
│      │   ├── id: "doc-1"                                    │
│      │   ├── values: [0.1, 0.2, ...]                       │
│      │   └── metadata: {"title": "Doc 1"}                  │
│      │                                                      │
│      ├── Vector 2                                           │
│      │   ├── id: "doc-2"                                    │
│      │   ├── values: [0.3, 0.4, ...]                       │
│      │   └── metadata: {"title": "Doc 2"}                  │
│      │                                                      │
│      └── ...                                                │
│                                                             │
└─────────────────────────────────────────────────────────────┘

索引类型 #

text
┌─────────────────────────────────────────────────────────────┐
│                    索引类型                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. Serverless 索引(推荐)                                  │
│                                                             │
│  特点:                                                     │
│  - 完全托管,自动扩展                                       │
│  - 按使用量付费                                             │
│  - 无需预配置资源                                           │
│  - 适合大多数场景                                           │
│                                                             │
│  创建:                                                     │
│  pc.create_index(                                           │
│    name="my-index",                                         │
│    dimension=1536,                                          │
│    metric="cosine",                                         │
│    spec=ServerlessSpec(                                     │
│      cloud="aws",                                           │
│      region="us-east-1"                                     │
│    )                                                        │
│  )                                                          │
│                                                             │
│  2. Pod-based 索引                                           │
│                                                             │
│  特点:                                                     │
│  - 预配置资源                                               │
│  - 更高的控制度                                             │
│  - 适合高吞吐量场景                                         │
│                                                             │
│  创建:                                                     │
│  pc.create_index(                                           │
│    name="my-index",                                         │
│    dimension=1536,                                          │
│    metric="cosine",                                         │
│    spec=PodSpec(                                            │
│      environment="production",                              │
│      pod_type="p1.x1"                                       │
│    )                                                        │
│  )                                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

什么是命名空间(Namespace)? #

命名空间是索引内的逻辑分区,用于隔离不同类型的向量数据。

命名空间的作用 #

text
┌─────────────────────────────────────────────────────────────┐
│                    命名空间                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Index: my-index                                            │
│  │                                                          │
│  ├── Namespace: "products"                                  │
│  │   ├── Vector: product-1                                  │
│  │   ├── Vector: product-2                                  │
│  │   └── ...                                                │
│  │                                                          │
│  ├── Namespace: "articles"                                  │
│  │   ├── Vector: article-1                                  │
│  │   ├── Vector: article-2                                  │
│  │   └── ...                                                │
│  │                                                          │
│  └── Namespace: "users"                                     │
│      ├── Vector: user-1                                     │
│      └── ...                                                │
│                                                             │
│  特点:                                                     │
│  ✅ 逻辑隔离,互不影响                                      │
│  ✅ 共享索引资源                                            │
│  ✅ 支持多租户架构                                          │
│  ✅ 无需创建多个索引                                        │
│                                                             │
└─────────────────────────────────────────────────────────────┘

使用命名空间 #

python
index.upsert(
    vectors=[
        ("product-1", [0.1, 0.2, ...], {"name": "Product 1"})
    ],
    namespace="products"
)

results = index.query(
    vector=[0.1, 0.2, ...],
    top_k=10,
    namespace="products"
)

什么是元数据(Metadata)? #

元数据是附加在向量上的结构化信息,用于过滤和丰富搜索结果。

元数据的结构 #

text
┌─────────────────────────────────────────────────────────────┐
│                    元数据结构                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  向量示例:                                                  │
│  {                                                          │
│    "id": "doc-1",                                           │
│    "values": [0.1, 0.2, 0.3, ...],                         │
│    "metadata": {                                            │
│      "title": "Pinecone 入门指南",                          │
│      "category": "技术文档",                                │
│      "author": "张三",                                      │
│      "date": "2024-01-15",                                 │
│      "tags": ["AI", "向量数据库"],                          │
│      "views": 1000,                                         │
│      "rating": 4.5                                          │
│    }                                                        │
│  }                                                          │
│                                                             │
│  支持的数据类型:                                            │
│  - 字符串(String)                                         │
│  - 数字(Number:int, float)                               │
│  - 布尔值(Boolean)                                        │
│  - 字符串列表(List of Strings)                            │
│                                                             │
│  限制:                                                     │
│  - 单个元数据最大 40KB                                      │
│  - 字符串值最大 1000 字符                                   │
│  - 列表最多 1000 个元素                                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

元数据过滤 #

python
results = index.query(
    vector=query_vector,
    top_k=10,
    filter={
        "category": {"$eq": "技术文档"},
        "views": {"$gte": 500},
        "tags": {"$in": ["AI"]}
    }
)

核心概念总结 #

text
┌─────────────────────────────────────────────────────────────┐
│                    核心概念关系图                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    Pinecone Account                  │   │
│  │  ┌───────────────────────────────────────────────┐  │   │
│  │  │                 Index                          │  │   │
│  │  │  - 名称、维度、度量                            │  │   │
│  │  │                                                │  │   │
│  │  │  ┌─────────────┐  ┌─────────────┐            │  │   │
│  │  │  │ Namespace 1 │  │ Namespace 2 │            │  │   │
│  │  │  │             │  │             │            │  │   │
│  │  │  │ ┌─────────┐ │  │ ┌─────────┐ │            │  │   │
│  │  │  │ │ Vector  │ │  │ │ Vector  │ │            │  │   │
│  │  │  │ │ - id    │ │  │ │ - id    │ │            │  │   │
│  │  │  │ │ - values│ │  │ │ - values│ │            │  │   │
│  │  │  │ │ - meta  │ │  │ │ - meta  │ │            │  │   │
│  │  │  │ └─────────┘ │  │ └─────────┘ │            │  │   │
│  │  │  └─────────────┘  └─────────────┘            │  │   │
│  │  └───────────────────────────────────────────────┘  │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

下一步 #

现在你已经了解了 Pinecone 的核心概念,接下来学习 安装与配置,开始动手实践!

最后更新:2026-04-04