Embedding 模型是什么:以 Qwen3-Embedding 与 pgvector 为例

本文是概念与接入示例整理,不包含本站设备的性能实测。模型规格以官方仓库说明为准,核验日期:2026-05-25。

Embedding 的用途

Embedding 模型会把文本转换成向量。语义接近的文本,在向量空间中通常更接近,因此可以用于文档语义检索、RAG 知识库的召回阶段、相似问答匹配、聚类或去重。

它不负责直接生成答案,而是帮助系统找到与问题更相关的资料。

Qwen3-Embedding 的型号不能混写

Qwen 官方仓库公布的 Qwen3-Embedding 系列包含多个规格,最大向量维度不同:

型号 参数规模 最大向量维度 最大序列长度
Qwen3-Embedding-0.6B 0.6B 1024 32K
Qwen3-Embedding-4B 4B 2560 32K
Qwen3-Embedding-8B 8B 4096 32K

因此,“qwen3-embedding 输出 1024 维”只有在明确指向 0.6B 规格 时才成立。建表时的向量维度必须和实际使用模型及输出配置一致。

使用 pgvector 保存向量

以下以 1024 维的 Qwen3-Embedding-0.6B 为示例展示 pgvector 表结构;它不代表已经在本站服务器跑过性能测试。

SQL
CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE IF NOT EXISTS documents (
  id BIGSERIAL PRIMARY KEY,
  content TEXT NOT NULL,
  embedding vector(1024),
  metadata JSONB,
  created_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX IF NOT EXISTS documents_embedding_idx
ON documents USING hnsw (embedding vector_cosine_ops);

Python 查询结构示例

PYTHON
from __future__ import annotations

import os
from typing import Sequence

import psycopg2
import requests

OLLAMA_URL = os.environ.get("OLLAMA_URL", "http://localhost:11434")
DB_DSN = os.environ["DB_DSN"]
MODEL_NAME = os.environ.get("EMBED_MODEL", "qwen3-embedding:0.6b")


def get_embedding(text: str) -> Sequence[float]:
    response = requests.post(
        f"{OLLAMA_URL}/api/embed",
        json={"model": MODEL_NAME, "input": text},
        timeout=30,
    )
    response.raise_for_status()
    return response.json()["embeddings"][0]


def search(query: str, top_k: int = 5) -> list[tuple[str, float]]:
    vector = get_embedding(query)
    with psycopg2.connect(DB_DSN) as conn, conn.cursor() as cur:
        cur.execute(
            "SELECT content, 1 - (embedding <=> %s::vector) AS similarity "
            "FROM documents ORDER BY embedding <=> %s::vector LIMIT %s",
            (str(list(vector)), str(list(vector)), top_k),
        )
        return cur.fetchall()


for content, score in search("Docker 容器怎么管理"):
    print(f"[{score:.4f}] {content[:80]}...")

代码仍需在真实模型名称、数据库连接和实际向量维度确定后再运行验证。

参考来源

评论