toMedia
Claude API

Embeddings 与语义搜索

使用 Voyage AI 实现文本嵌入、语义搜索与 RAG 检索增强生成

概述

Anthropic 推荐使用 Voyage AI 作为嵌入模型提供商,它提供针对各领域优化的最先进嵌入模型。

安装

pip install voyageai
export VOYAGE_API_KEY="your-api-key"

生成 Embeddings

import voyageai

client = voyageai.Client()

texts = ["示例文本 1", "示例文本 2"]
result = client.embed(
    texts,
    model="voyage-3.5",
    input_type="document"
)

embeddings = result.embeddings
print(f"嵌入维度: {len(embeddings[0])}")
print(f"前 5 个值: {embeddings[0][:5]}")

语义搜索

import voyageai
import numpy as np

client = voyageai.Client()

# 文档库
documents = [
    "地中海饮食强调鱼、橄榄油和蔬菜。",
    "光合作用将光能转化为葡萄糖并产生氧气。",
    "20世纪的创新以电子技术进步为核心。",
    "河流提供水源、灌溉和水生物种栖息地。",
    "苹果 Q4 财报电话会议定于11月2日下午2点。",
    "莎士比亚的《哈姆雷特》在现代文学中仍然有意义。",
]

# 嵌入文档
doc_embeddings = client.embed(
    documents, model="voyage-3.5", input_type="document"
).embeddings

# 查询
query = "苹果的电话会议什么时候?"
query_embedding = client.embed(
    [query], model="voyage-3.5", input_type="query"
).embeddings[0]

# 找到最相似的文档
similarities = np.dot(doc_embeddings, query_embedding)
top_index = np.argmax(similarities)

print(f"查询: {query}")
print(f"最相关文档: {documents[top_index]}")
print(f"相似度: {similarities[top_index]:.4f}")

RAG:Embeddings + Claude

先用嵌入检索相关文档,再用 Claude 生成回答:

import voyageai
import numpy as np
import anthropic

voyage_client = voyageai.Client()
claude_client = anthropic.Anthropic()

documents = [
    "React 是一个用于构建用户界面的 JavaScript 库。",
    "Vue.js 是一个渐进式 JavaScript 框架。",
    "Angular 是一个面向企业的全功能 TypeScript 框架。",
    "Svelte 是一个编译器,创建高度优化的原生 JavaScript。",
]

# 嵌入文档
doc_embeddings = voyage_client.embed(
    documents, model="voyage-3.5", input_type="document"
).embeddings

# 用户查询
query = "哪个框架最适合初学者?"
query_embedding = voyage_client.embed(
    [query], model="voyage-3.5", input_type="query"
).embeddings[0]

# 检索 Top-3 相关文档
similarities = np.dot(doc_embeddings, query_embedding)
top_indices = np.argsort(similarities)[-3:][::-1]
relevant_docs = [documents[i] for i in top_indices]

# 用 Claude 综合回答
response = claude_client.messages.create(
    model="claude-opus-4-6",
    max_tokens=1024,
    system="你是一个 JavaScript 框架专家。",
    messages=[{
        "role": "user",
        "content": f"""基于以下文档:
{chr(10).join(f'- {doc}' for doc in relevant_docs)}

回答:{query}"""
    }]
)
print(response.content[0].text)

可用模型

模型适用场景上下文维度
voyage-3-large通用、多语言32k1024
voyage-3.5平衡性能32k1024
voyage-3.5-lite低成本、快速32k1024
voyage-code-3代码检索32k1024
voyage-finance-2金融文档32k1024
voyage-law-2法律文档16k1024
voyage-multimodal-3文本 + 图片32k1024

量化压缩

# int8 量化(体积缩小 4 倍)
result = client.embed(
    ["示例文本"],
    model="voyage-3.5",
    input_type="document",
    output_dtype="int8"
)

# 二进制量化(体积缩小 32 倍!)
result_binary = client.embed(
    ["示例文本"],
    model="voyage-3.5",
    input_type="document",
    output_dtype="ubinary"
)

最佳实践

  1. 选对模型:使用领域特定模型获得更好效果
  2. input_type 参数:指定 "query""document" 提升检索质量
  3. 缓存嵌入:对不常变化的文档缓存嵌入结果
  4. 批量处理:一次嵌入多个文本提高效率
  5. 相似度度量:Voyage 嵌入已归一化,使用点积即可

On this page