Jina Embeddings
Qdrant 与 Jina AI 嵌入兼容。您可以从 Jina Embeddings 获取免费试用密钥以获取嵌入。
Qdrant 用户可以使用代码 QDRANT 获得 Jina AI API 10% 的折扣。
技术摘要
| 模型 | 维度 | 语言 | MRL (matryoshka) | 上下文 |
|---|---|---|---|---|
| jina-embeddings-v4 | 2048(单向量),128(多向量) | 多语言(30+) | 是 | 32768 + 文本/图像 |
| jina-clip-v2 | 1024 | 多语言(100+,重点关注 30+) | 是 | 文本/图像 |
| jina-embeddings-v3 | 1024 | 多语言(89 种语言) | 是 | 8192 |
| jina-embeddings-v2-base-en | 768 | 英语 | 否 | 8192 |
| jina-embeddings-v2-base-de | 768 | 德语 & 英语 | 否 | 8192 |
| jina-embeddings-v2-base-es | 768 | 西班牙语 & 英语 | 否 | 8192 |
| jina-embeddings-v2-base-zh | 768 | 中文 & 英语 | 否 | 8192 |
Jina 建议对所有任务使用
jina-embeddings-v4。
除了主干模型,jina-embeddings-v4 还使用 5 个针对不同嵌入用途的任务特定适配器进行了训练。在请求中包含 task 以优化您的下游应用程序
- retrieval.query:用于在检索任务中编码用户查询或问题。
- retrieval.passage:用于在索引时编码检索任务中的大型文档。
- code.query:用于在代码相关检索任务中编码用户查询或问题。
- code.passage:用于在索引时编码代码相关检索任务中的大型文档。
- text-matching:用于编码文本以进行相似性匹配,例如测量两个句子之间的相似性。
同样,jina-embeddings-v3 也使用 5 个针对不同嵌入用途的任务特定适配器进行了训练。在请求中包含 task 以优化您的下游应用程序
- retrieval.query:用于在检索任务中编码用户查询或问题。
- retrieval.passage:用于在索引时编码检索任务中的大型文档。
- classification:用于编码文本以进行文本分类任务。
- text-matching:用于编码文本以进行相似性匹配,例如测量两个句子之间的相似性。
- separation:用于聚类或重排序任务。
jina-embeddings-v4、jina-embeddings-v3 和 jina-clip-v2 支持 Matryoshka Representation Learning,允许用户在性能损失最小的情况下控制嵌入维度。在请求中包含 dimensions 以选择所需的维度。默认情况下,dimensions 设置为 2048(jina-embeddings-v4)或 1024(jina-embeddings-v3 和 jina-clip-v2),建议选择 256 到 2048 之间的数字。您可以参考下表获取 jina-embeddings-v3 模型的维度与性能提示。其他模型也有类似的结果。
| 维度 | 32 | 64 | 128 | 256 | 512 | 768 | 1024 |
|---|---|---|---|---|---|---|---|
| 平均检索性能 (nDCG@10) | 52.54 | 58.54 | 61.64 | 62.72 | 63.16 | 63.3 | 63.35 |
jina-embeddings-v4 和 jina-embeddings-v3 支持 Late Chunking,该技术利用模型的长上下文能力生成上下文块嵌入。在请求中包含 late_chunking=True 以启用上下文分块表示。当设置为 true 时,Jina AI API 将连接输入字段中的所有句子并将其作为单个字符串提供给模型。在内部,模型嵌入这个长连接字符串,然后执行后期分块,返回一个与输入列表大小匹配的嵌入列表。
示例
文本到文本检索
下面的代码演示了如何将 jina-embeddings-v4 与 Qdrant 结合使用
import requests
import qdrant_client
from qdrant_client.models import Distance, VectorParams, Batch
# Provide Jina API key and choose one of the available models.
JINA_API_KEY = "jina_xxxxxxxxxxx"
MODEL = "jina-embeddings-v4"
DIMENSIONS = 2048 # Or choose your desired output vector dimensionality.
TASK = 'retrieval.passage' # For indexing, or set to retrieval.query for querying
# Get embeddings from the API
url = "https://api.jina.ai/v1/embeddings"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {JINA_API_KEY}",
}
data = {
"input": ["Your text string goes here", "You can send multiple texts"],
"model": MODEL,
"dimensions": DIMENSIONS,
"task": TASK,
"late_chunking": True,
}
response = requests.post(url, headers=headers, json=data)
embeddings = [d["embedding"] for d in response.json()["data"]]
# Index the embeddings into Qdrant
client = qdrant_client.QdrantClient(":memory:")
client.create_collection(
collection_name="MyCollection",
vectors_config=VectorParams(size= DIMENSIONS, distance=Distance.DOT),
)
qdrant_client.upsert(
collection_name="MyCollection",
points=Batch(
ids=list(range(len(embeddings))),
vectors=embeddings,
),
)
文本到图像检索
下面的代码演示了如何将 jina-embeddings-v4 与 Qdrant 结合使用
import requests
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
# Provide your Jina API key and choose the model.
JINA_API_KEY = "jina_xxxxxxxxxxx"
MODEL = "jina-embeddings-v4"
DIMENSIONS = 2048 # Set the desired output vector dimensionality.
# Define the inputs
text_input = "A blue cat"
image_url = "https://i.pinimg.com/600x315/21/48/7e/21487e8e0970dd366dafaed6ab25d8d8.jpg"
# Get embeddings from the Jina API
url = "https://api.jina.ai/v1/embeddings"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {JINA_API_KEY}",
}
data = {
"input": [
{"text": text_input},
{"image": image_url},
],
"model": MODEL,
"dimensions": DIMENSIONS,
}
response = requests.post(url, headers=headers, json=data)
response_data = response.json()["data"]
# The model doesn't differentiate between images and text, so we extract output based on the input order.
text_embedding = response_data[0]["embedding"]
image_embedding = response_data[1]["embedding"]
# Initialize Qdrant client
client = QdrantClient(url="https://:6333/")
# Create a collection with named vectors
collection_name = "MyCollection"
client.recreate_collection(
collection_name=collection_name,
vectors_config={
"text_vector": VectorParams(size=DIMENSIONS, distance=Distance.DOT),
"image_vector": VectorParams(size=DIMENSIONS, distance=Distance.DOT),
},
)
client.upsert(
collection_name=collection_name,
points=[
PointStruct(
id=0,
vector={
"text_vector": text_embedding,
"image_vector": image_embedding,
}
)
],
)
# Now let's query the collection
search_query = "A purple cat"
# Get the embedding for the search query from the Jina API
url = "https://api.jina.ai/v1/embeddings"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {JINA_API_KEY}",
}
data = {
"input": [{"text": search_query}],
"model": MODEL,
"dimensions": DIMENSIONS,
# "task": "retrieval.query" # Uncomment this line for text-to-text retrieval tasks
}
response = requests.post(url, headers=headers, json=data)
query_embedding = response.json()["data"][0]["embedding"]
search_results = client.query_points(
collection_name=collection_name,
query=query_embedding,
using="image_vector",
limit=5
).points
for result in search_results:
print(f"ID: {result.id}, Score: {result.score}")