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 | 通用、多语言 | 32k | 1024 |
voyage-3.5 | 平衡性能 | 32k | 1024 |
voyage-3.5-lite | 低成本、快速 | 32k | 1024 |
voyage-code-3 | 代码检索 | 32k | 1024 |
voyage-finance-2 | 金融文档 | 32k | 1024 |
voyage-law-2 | 法律文档 | 16k | 1024 |
voyage-multimodal-3 | 文本 + 图片 | 32k | 1024 |
量化压缩
# 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"
)最佳实践
- 选对模型:使用领域特定模型获得更好效果
- input_type 参数:指定
"query"或"document"提升检索质量 - 缓存嵌入:对不常变化的文档缓存嵌入结果
- 批量处理:一次嵌入多个文本提高效率
- 相似度度量:Voyage 嵌入已归一化,使用点积即可