Вложения Jina#
Platform V Vector DB (далее - Vector DB) совместим с вложениями от Jina AI. Можно получить бесплатный пробный ключ от Jina Embeddings.
Техническое резюме#
Модель |
Размерность |
Язык |
MRL |
Контекст |
|---|---|---|---|---|
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-v3 для задач только с текстом и jina-clip-v2 для мультимодальных задач или когда требуется улучшенное визуальное извлечение данных.
На основе базовой модели jina-embeddings-v3 была обучена с использованием пяти специализированных адаптеров для различных целей использования вложений. Включите task в запрос, чтобы оптимизировать приложение:
retrieval.query: используется для кодирования запросов пользователей или вопросов при выполнении задач поиска информации.
retrieval.passage: используется для кодирования больших документов во время индексирования при выполнении задач поиска информации.
classification: используется для кодирования текста в задачах классификации текстов.
text-matching: используется для кодирования текста для сопоставления по сходству, например, измерения сходства между двумя предложениями.
separation: используется для кластеризации или ранжирования результатов.
jina-embeddings-v3 и jina-clip-v2 поддерживают обучение представлению Matryoshka, позволяя пользователям контролировать размерность вложений с минимальными потерями производительности. Добавьте dimensions в запрос, чтобы выбрать желаемую размерность.
По умолчанию значение параметра размерности установлено равным 1024, рекомендуется выбирать число от 256 до 1024. Можно обратиться к таблице ниже за подсказками о соотношении размерности и производительности:
Размерность |
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-v3 поддерживает технологию позднего разбиения на части, позволяющую воспользоваться возможностями модели обработки длинных контекстов для создания контекстных вложений частей. Добавьте late_chunking=True в запрос, чтобы включить представление контекстно-зависимых частей. При установке значения true API-интерфейс Jina AI объединит все предложения в поле ввода и передаст их модели в виде одной строки. Внутри модель встраивает эту длинную конкатенированную строку, а затем выполняет позднее разбиение на части, возвращая список вложений, соответствующий размеру входного списка.
Пример#
Jina Embeddings v3#
Приведенный ниже код демонстрирует, как использовать jina-embeddings-v3 с Vector DB:
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-v3"
DIMENSIONS = 1024 # 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 {{prod_name}}
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 CLIP v2#
Приведенный ниже код демонстрирует, как использовать jina-clip-v2 с Vector DB:
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-clip-v2"
DIMENSIONS = 1024 # 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="http://localhost: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}")