跳转到主要内容
本文档说明向量嵌入(Embeddings)与重排序(Rerank)的使用。两者是构建语义检索、知识库及 RAG(检索增强生成)系统的核心组件。

向量嵌入(Embeddings)

概念

向量嵌入将文本转为高维向量(一串浮点数)。语义相近的文本对应的向量在空间中距离更近。这使得计算机能够「理解」文本的语义相似度,而非仅进行字面匹配。

应用场景

  • 语义检索:在知识库或文档集中搜索与用户问题语义相关的内容。
  • 文本聚类与分类:根据语义对文本分组。
  • 推荐系统:找到与用户兴趣相似的内容。
  • RAG(检索增强生成):先检索相关文档,再将文档交给对话模型生成回答。

调用接口

使用 /v1/embeddings 将文本转为向量。
{
  "model": "text-embedding-3-small",
  "input": "Moxus AI是一个统一的 LLM API 网关"
}
参数说明
model嵌入模型名称,如 text-embedding-3-smallbge-large-zh-v1.5
input单条文本或文本数组
encoding_format(可选)float(默认)或 base64

响应

{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "index": 0,
      "embedding": [0.023, -0.015, 0.042, ..., -0.008]
    }
  ],
  "model": "text-embedding-3-small",
  "usage": {
    "prompt_tokens": 12,
    "total_tokens": 12
  }
}
embedding 数组即为文本的向量表示,长度取决于模型(通常为几百至几千维)。

Python 示例(单条文本)

from openai import OpenAI

client = OpenAI(api_key="sk-你的密钥", base_url="https://moxus.ai/v1")

resp = client.embeddings.create(
    model="text-embedding-3-small",
    input="Moxus AI是一个统一的 LLM API 网关",
)
vec = resp.data[0].embedding
print(f"向量维度: {len(vec)}")
print(f"向量前5维: {vec[:5]}")

批量嵌入(多条文本)

texts = [
    "Moxus AI支持多家供应商",
    "OpenAI 提供 GPT 系列模型",
    "Claude 由 Anthropic 开发",
]

resp = client.embeddings.create(
    model="text-embedding-3-small",
    input=texts,
)

for i, item in enumerate(resp.data):
    print(f"文本 {i}: 向量维度 {len(item.embedding)}")

计算相似度

获得两段文本的向量后,可通过余弦相似度判断语义相似性。余弦相似度范围为 -1 至 1,值越接近 1 表示越相似。
import numpy as np

def cosine_similarity(vec_a, vec_b):
    return np.dot(vec_a, vec_b) / (np.linalg.norm(vec_a) * np.linalg.norm(vec_b))

# 假设已获得两个向量
sim = cosine_similarity(vec1, vec2)
print(f"相似度: {sim}")
在实际应用中,通常使用向量数据库(如 Pinecone、Milvus、Qdrant、ChromaDB)存储与检索向量。

重排序(Rerank)

概念

重排序模型接受一个查询(query)与多个候选文档(documents),对候选文档按与查询的相关度排序并返回评分。 重排序通常用于两阶段检索的第二阶段:先用向量检索召回候选文档,再用重排序模型精排,以提升相关度。

调用接口

使用 /v1/rerank(具体路径可能因供应商而异,以模型能力为准)。
{
  "model": "rerank-model",
  "query": "Moxus AI的计费方式",
  "documents": [
    "Moxus AI按 Token 用量计费",
    "Moxus AI支持多种模型",
    "Python 是一种编程语言"
  ],
  "top_n": 2
}
参数说明
model重排序模型名称
query用户查询
documents候选文档数组
top_n(可选)返回前 N 个最相关的文档

响应

{
  "results": [
    {
      "index": 0,
      "relevance_score": 0.92,
      "document": "Moxus AI按 Token 用量计费"
    },
    {
      "index": 1,
      "relevance_score": 0.65,
      "document": "Moxus AI支持多种模型"
    }
  ]
}
返回按相关度从高到低排序,relevance_score 为评分(值越大越相关)。

Python 示例

假设平台提供重排序能力(以实际 API 为准):
import requests

resp = requests.post(
    "https://moxus.ai/v1/rerank",
    headers={"Authorization": "Bearer sk-你的密钥"},
    json={
        "model": "rerank-model",
        "query": "Moxus AI的计费方式",
        "documents": [
            "Moxus AI按 Token 用量计费",
            "Moxus AI支持多种模型",
            "Python 是一种编程语言",
        ],
        "top_n": 2,
    },
)
data = resp.json()
for item in data["results"]:
    print(f"{item['relevance_score']:.2f} - {item['document']}")

典型 RAG 流程

RAG(Retrieval-Augmented Generation)结合检索与生成,是知识库问答的主流方案:
  1. 离线:将知识库文档转为向量,存入向量数据库。
  2. 在线:用户提问 → 将问题转为向量 → 检索最相关的文档 → (可选)重排序精排 → 将文档与问题拼接成提示词 → 交给对话模型生成答案。
简化流程示例(伪代码):
# 1. 用户提问
question = "Moxus AI支持哪些模型?"

# 2. 向量检索
q_vec = client.embeddings.create(model="text-embedding-3-small", input=question).data[0].embedding
candidates = vector_db.search(q_vec, top_k=10)  # 召回 10 个候选

# 3. 重排序(可选)
ranked = rerank(query=question, documents=candidates, top_n=3)

# 4. 生成答案
context = "\n".join([doc["text"] for doc in ranked])
prompt = f"根据以下内容回答用户问题:\n{context}\n\n用户问题: {question}"
answer = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": prompt}],
).choices[0].message.content
print(answer)

计费说明

  • Embeddings:通常按输入 Token 数计费。
  • Rerank:按文档数量、文档长度或调用次数计费,具体以模型定价为准。
详见 模型与定价

注意事项

  • 不同嵌入模型的向量维度与性能不同,应按任务选择。中文任务建议选用中文优化的模型。
  • 嵌入模型通常有最大输入长度限制,超长文本需分段处理。
  • 向量检索的效果受文档切分策略、嵌入模型质量及检索参数影响,需根据实际场景调优。

后续步骤