DashText adalah penyandi vektor jarang yang direkomendasikan untuk DashVector. Pencarian semantik menangkap makna, tetapi dapat melewatkan kecocokan kata kunci eksak—seperti istilah spesifik domain, nama produk, atau kode kesalahan—yang sering kali luput terdeteksi. DashText menjembatani celah ini dengan mengonversi teks menjadi vektor jarang menggunakan algoritma BM25. Gabungkan vektor jarang ini dengan vektor padat di DashVector untuk menjalankan pencarian semantik yang peka kata kunci, yaitu pengambilan yang relevan secara semantik sekaligus presisi berdasarkan kata kunci.
Contoh inti
Cuplikan Python berikut menunjukkan alur minimal end-to-end: membuat koleksi, menyandikan dokumen, memasukkannya, dan menjalankan kueri hibrida.
import dashvector
from dashtext import SparseVectorEncoder
from dashvector import Doc
# Terhubung ke DashVector
client = dashvector.Client(
api_key='YOUR_API_KEY',
endpoint='YOUR_CLUSTER_ENDPOINT'
)
# Buat koleksi dengan metrik dot product (wajib untuk vektor jarang)
client.create('hybrid_collection', dimension=4, metric='dotproduct')
collection = client.get('hybrid_collection')
# Bangun penyandi vektor jarang dan sandikan dokumen
encoder = SparseVectorEncoder.default()
doc_sparse = encoder.encode_documents("Your document text here.")
# Masukkan dokumen dengan vektor padat dan vektor jarang
collection.insert(Doc(
id='doc1',
vector=[0.1, 0.2, 0.3, 0.4],
sparse_vector=doc_sparse
))
# Cari dengan vektor padat dan vektor jarang
query_sparse = encoder.encode_queries("Your search query here.")
results = collection.query(
vector=[0.1, 0.1, 0.1, 0.1],
sparse_vector=query_sparse
)Bagian-bagian berikut menjelaskan setiap langkah secara rinci, dengan contoh dalam Python dan Java.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster DashVector dengan Kunci API dan titik akhir yang tersedia. Untuk informasi lebih lanjut, lihat Pengenalan vektor.
SDK Python atau Java terinstal (paket
dashvectordandashtextuntuk Python).
Semua contoh dalam panduan ini menggunakan vektor padat berdimensi 4 demi kesederhanaan. Di lingkungan produksi, atur dimensi agar sesuai dengan output model penyematan Anda.
Langkah 1: Buat koleksi yang mendukung vektor jarang
Vektor jarang memerlukan metrik jarak dot product. Buat koleksi dengan metric='dotproduct' untuk mengaktifkan dukungan vektor jarang.
Python
import dashvector
client = dashvector.Client(
api_key='YOUR_API_KEY',
endpoint='YOUR_CLUSTER_ENDPOINT'
)
assert client
# Buat koleksi dengan metrik dot product (wajib untuk vektor jarang)
ret = client.create('hybrid_collection', dimension=4, metric='dotproduct')
assert ret
collection = client.get('hybrid_collection')
assert collectionJava
import com.aliyun.dashvector.DashVectorClient;
import com.aliyun.dashvector.DashVectorCollection;
import com.aliyun.dashvector.models.requests.CreateCollectionRequest;
import com.aliyun.dashvector.models.responses.Response;
import com.aliyun.dashvector.proto.CollectionInfo;
DashVectorClient client =
new DashVectorClient("YOUR_API_KEY", "YOUR_CLUSTER_ENDPOINT");
CreateCollectionRequest request = CreateCollectionRequest.builder()
.name("hybrid_collection")
.dimension(4)
.metric(CollectionInfo.Metric.dotproduct)
.dataType(CollectionInfo.DataType.FLOAT)
.build();
Response<Void> response = client.create(request);
System.out.println(response);
DashVectorCollection collection = client.get("hybrid_collection");Hanya koleksi yang menggunakan metrik dot product (metric='dotproduct') yang mendukung vektor jarang.
Ganti YOUR_API_KEY dengan Kunci API Anda dan YOUR_CLUSTER_ENDPOINT dengan titik akhir kluster Anda agar kode dapat berjalan dengan benar.
Langkah 2: Bangun penyandi vektor jarang
DashText menyediakan dua pendekatan untuk membuat SparseVectorEncoder: penyandi bawaan untuk teks tujuan umum, dan penyandi khusus yang dilatih pada korpus Anda sendiri untuk akurasi lebih tinggi pada istilah spesifik domain.
Gunakan penyandi bawaan
Penyandi bawaan telah melalui proses pre-train pada korpus Wikipedia Bahasa Tiongkok dan menggunakan Jieba untuk segmentasi teks Tiongkok. Tidak diperlukan pelatihan tambahan.
Python
from dashtext import SparseVectorEncoder
encoder = SparseVectorEncoder.default()Java
import com.aliyun.dashtext.encoder.SparseVectorEncoder;
SparseVectorEncoder encoder = SparseVectorEncoder.getDefaultInstance();Latih penyandi khusus pada korpus Anda sendiri
Untuk data yang mengandung banyak istilah spesifik domain, latih penyandi pada seluruh korpus Anda guna meningkatkan akurasi. Untuk informasi lebih lanjut, lihat penggunaan lanjutan.
Python
from dashtext import SparseVectorEncoder
encoder = SparseVectorEncoder()
# Korpus Anda sendiri
corpus = [
"向量检索服务DashVector基于阿里云自研的高效向量引擎Proxima内核,提供具备水平拓展能力的云原生、全托管的向量检索服务",
"DashVector将其强大的向量管理、向量查询等多样化能力,通过简洁易用的SDK/API接口透出,方便被上层AI应用迅速集成",
"从而为包括大模型生态、多模态AI搜索、分子结构分析在内的多种应用场景,提供所需的高效向量检索能力",
"简单灵活、开箱即用的SDK,使用极简代码即可实现向量管理",
"自研向量相似性比对算法,快速高效稳定服务",
"Schema-free设计,通过Schema实现任意条件下的组合过滤查询"
]
# Latih penyandi pada seluruh korpus
encoder.train(corpus)Java
import com.aliyun.dashtext.encoder.SparseVectorEncoder;
import java.util.*;
SparseVectorEncoder encoder = new SparseVectorEncoder();
// Korpus Anda sendiri
List<String> corpus = Arrays.asList(
"向量检索服务DashVector基于阿里云自研的高效向量引擎Proxima内核,提供具备水平拓展能力的云原生、全托管的向量检索服务",
"DashVector将其强大的向量管理、向量查询等多样化能力,通过简洁易用的SDK/API接口透出,方便被上层AI应用迅速集成",
"从而为包括大模型生态、多模态AI搜索、分子结构分析在内的多种应用场景,提供所需的高效向量检索能力",
"简单灵活、开箱即用的SDK,使用极简代码即可实现向量管理",
"自研向量相似性比对算法,快速高效稳定服务",
"Schema-free设计,通过Schema实现任意条件下的组合过滤查询"
);
// Latih penyandi pada seluruh korpus
encoder.train(corpus);Pilih penyandi yang tepat
| Penyandi | Keunggulan | Keterbatasan | Paling cocok untuk |
|---|---|---|---|
| Bawaan | Siap pakai, generalisasi baik | Akurasi lebih rendah pada istilah khusus | Teks tujuan umum, prototipe cepat |
| Korpus kustom | Akurasi lebih tinggi untuk kosakata khusus | Memerlukan pelatihan di muka pada seluruh korpus | Data spesifik domain dengan istilah bidang tertentu |
Pilih penyandi berdasarkan kebutuhan bisnis Anda. Kami merekomendasikan Anda membuat penyandi berdasarkan korpus Anda sendiri jika bisnis Anda melibatkan banyak istilah yang spesifik pada bidang tertentu.
Langkah 3: Sandikan dan masukkan dokumen
Sandikan teks dokumen menjadi vektor jarang dengan encode_documents, lalu masukkan bersama vektor padat ke dalam koleksi.
Python
from dashvector import Doc
document = "向量检索服务DashVector基于阿里云自研的高效向量引擎Proxima内核,提供具备水平拓展能力的云原生、全托管的向量检索服务。"
doc_sparse_vector = encoder.encode_documents(document)
print(doc_sparse_vector)
# Output berdasarkan penyandi bawaan:
# {380823393: 0.7262431704356519, 414191989: 0.7262431704356519, 565176162: 0.7262431704356519, 904594806: 0.7262431704356519, 1005505802: 0.7262431704356519, 1169440797: 0.8883757984694465, 1240922502: 0.7262431704356519, 1313971048: 0.7262431704356519, 1317077351: 0.7262431704356519, 1490140460: 0.7262431704356519, 1574737055: 0.7262431704356519, 1760434515: 0.7262431704356519, 2045788977: 0.8414146776926797, 2141666983: 0.7262431704356519, 2509543087: 0.7262431704356519, 3180265193: 0.7262431704356519, 3845702398: 0.7262431704356519, 4106887295: 0.7262431704356519}
collection.insert(Doc(
id='A',
vector=[0.1, 0.2, 0.3, 0.4],
sparse_vector=doc_sparse_vector
))Java
String document = "向量检索服务DashVector基于达摩院自研的高效向量引擎Proxima内核,提供具备水平拓展能力的云原生、全托管的向量检索服务。";
Map<Long, Float> sparseVector = encoder.encodeDocuments(document);
System.out.println(sparseVector);
// Output berdasarkan penyandi bawaan:
// {380823393: 0.7262431704356519, 414191989: 0.7262431704356519, 565176162: 0.7262431704356519, 904594806: 0.7262431704356519, 1005505802: 0.7262431704356519, 1169440797: 0.8883757984694465, 1240922502: 0.7262431704356519, 1313971048: 0.7262431704356519, 1317077351: 0.7262431704356519, 1490140460: 0.7262431704356519, 1574737055: 0.7262431704356519, 1760434515: 0.7262431704356519, 2045788977: 0.8414146776926797, 2141666983: 0.7262431704356519, 2509543087: 0.7262431704356519, 3180265193: 0.7262431704356519, 3845702398: 0.7262431704356519, 4106887295: 0.7262431704356519}
Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
// Bangun Doc dengan vektor padat dan vektor jarang
Doc doc = Doc.builder()
.id("28")
.sparseVector(sparseVector)
.vector(vector)
.build();
// Masukkan dokumen
Response<Void> response = collection.insert(InsertDocRequest.builder().doc(doc).build());Setiap vektor jarang merupakan peta dari ID hash token ke bobot BM25. Bobot yang lebih tinggi menunjukkan istilah yang lebih khas dalam dokumen tersebut.
Langkah 4: Jalankan pencarian semantik yang peka kata kunci
Sandikan kueri pencarian menjadi vektor jarang dengan encode_queries, lalu berikan vektor padat dan vektor jarang ke query.
Python
query = "什么是向量检索服务?"
sparse_vector = encoder.encode_queries(query)
print(sparse_vector)
# Output berdasarkan penyandi bawaan:
# {1169440797: 0.2947158712590364, 2045788977: 0.7052841287409635}
docs = collection.query(
vector=[0.1, 0.1, 0.1, 0.1],
sparse_vector=sparse_vector
)Java
String query = "Apa itu layanan pencarian vektor?";
Map<Long, Float> sparseVector = encoder.encodeQueries(query);
System.out.println(sparseVector);
// Keluaran berdasarkan penyandi bawaan:
// {1169440797: 0.2947158712590364, 2045788977: 0.7052841287409635}
Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
// Membuat kueri dengan vektor padat dan vektor jarang
QueryDocRequest request = QueryDocRequest.builder()
.vector(vector)
.sparse_ector(sparseVector)
.topk(100)
.includeVector(true)
.build();
Response<List<Doc>> response = collection.query(request);
System.out.println(response);Langkah 5: Sesuaikan hasil dengan vektor berbobot
Kendalikan keseimbangan antara kemiripan semantik (vektor padat) dan kecocokan kata kunci (vektor jarang) menggunakan parameter alpha:
| Nilai Alpha | Perilaku |
|---|---|
0.0 | Hanya vektor jarang yang digunakan untuk pengukuran jarak (pencarian kata kunci murni) |
1.0 | Hanya vektor padat yang digunakan untuk pengukuran jarak (pencarian semantik murni) |
Terapkan combine_dense_and_sparse untuk menskalakan kedua vektor sebelum melakukan kueri:
Python
from dashtext import combine_dense_and_sparse
query = "什么是向量检索服务?"
sparse_vector = encoder.encode_queries(query)
# Atur alpha untuk mengontrol keseimbangan: 0.0 = hanya kata kunci, 1.0 = hanya semantik
alpha = 0.7
dense_vector = [0.1, 0.1, 0.1, 0.1]
scaled_dense_vector, scaled_sparse_vector = combine_dense_and_sparse(dense_vector, sparse_vector, alpha)
docs = collection.query(
vector=scaled_dense_vector,
sparse_vector=scaled_sparse_vector
)Java
String query = "什么是向量检索服务?";
Map<Long, Float> sparseVector = encoder.encodeQueries(query);
System.out.println(sparseVector);
// Output berdasarkan penyandi bawaan:
// {1169440797: 0.2947158712590364, 2045788977: 0.7052841287409635}
Vector denseVector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
// Skalakan vektor padat dan vektor jarang berdasarkan faktor bobot alpha
float alpha = 0.1f;
sparseVector.forEach((key, value) -> sparseVector.put(key, value * alpha));
denseVector = Vector.builder().value(
denseVector.getValue().stream().map(number -> number.floatValue() * alpha).collect(Collectors.toList())
).build();
// Kueri dengan vektor berbobot
QueryDocRequest request = QueryDocRequest.builder()
.vector(denseVector)
.sparse_ector(sparseVector)
.topk(100)
.includeVector(true)
.build();
Response<List<Doc>> response = collection.query(request);
System.out.println(response);Referensi API
Untuk referensi lengkap API DashText, lihat DashText SDK untuk Python.