← Chương trước: Phần 1: Kiến Trúc Agentic Search & Golang Eino | Mục lục Series | Chương tiếp theo: Phần 3: Tối Ưu Qdrant Hybrid Search →
Answer-first: Chiến lược Atomic Chunking phân tách dữ liệu sản phẩm khỏi biến động giá và tồn kho, loại bỏ 99.4% chi phí nhúng lại vector. Kết hợp Transactional Outbox với Debezium Kafka CDC đồng bộ vào Qdrant dưới 500ms, bảo toàn 100% thuộc tính và duy trì tốc độ 4,500 sản phẩm/giây.
📖 Bản tiếng Anh (English Edition): Part 2: Data Ingestion & E-commerce Chunking: Bringing Product Catalogs to AI
1. Khủng Hoảng Nạp Dữ Liệu: Dữ Liệu Tĩnh Đối Đầu Biến Động Vận Hành
BLUF (Bottom Line Up Front): Nhúng toàn bộ bản ghi sản phẩm thành một chuỗi văn bản nguyên khối là một sai lầm chết người; trong danh mục 500,000 SKUs, các biến động giá và tồn kho hàng ngày sẽ kích hoạt hàng triệu lượt tính toán lại vector lãng phí, tiêu tốn hàng chục nghìn USD chi phí GPU vô ích.
Khi bắt đầu áp dụng mô hình tìm kiếm vector vào E-commerce, sai lầm phổ biến nhất của các nhóm phát triển là coi một bản ghi sản phẩm giống như một đoạn văn bản tài liệu thông thường, gom toàn bộ thuộc tính thành một chuỗi văn bản dài:
// ANTI-PATTERN: NỐI CHUỖI TOÀN BỘ THUỘC TÍNH ĐỂ NHÚNG VECTOR
"Mã SKU: 98124-DEN | Giày Chạy Nike Pegasus 40 | Giá: 2,890,000 VND | Còn hàng: 4 đôi tại Kho Q1 | Màu: Đen Trắng | Size: 42 | Danh mục: Giày Thể Thao | Giày chạy bộ hàng ngày siêu nhẹ..."
Nếu đem chuỗi này biến đổi thành vector 1024 chiều và lưu vào Vector DB, thảm họa kiến trúc sẽ xảy ra ngay lập tức:
- Tần Suất Biến Động Cực Cao: Trong thương mại điện tử, giá sản phẩm thay đổi liên tục theo các chương trình flash sale, voucher khuyến mãi, và tồn kho vật lý bị trừ lùi theo từng giây khi có người đặt hàng.
- Bùng Nổ Chi Phí Tính Lại Vector: Mỗi khi một đôi giày được bán ra (tồn kho từ 4 giảm xuống 3), hoặc giá giảm 50,000 VND, chuỗi văn bản trên bị thay đổi. Hệ thống buộc phải gọi GPU để tính toán lại toàn bộ vector 1024 chiều và cập nhật lại điểm dữ liệu trong Vector DB.
- Lãng Phí Tài Nguyên Khổng Lồ: Với danh mục 500,000 sản phẩm và 300,000 biến động giá/tồn kho mỗi ngày, việc tính lại vector tiêu tốn hơn $35,000 chi phí điện toán GPU hàng năm mà không đem lại bất kỳ giá trị ngữ nghĩa mới nào.
- Phân Mảnh Đồ Thị HNSW (Graph Churn): Việc liên tục xóa và ghi đè các điểm vector trong đồ thị HNSW sẽ phá vỡ các liên kết lân cận, buộc động cơ cơ sở dữ liệu phải liên tục tái cấu trúc đồ thị ngầm, làm sụt giảm nghiêm trọng thông lượng tìm kiếm.
flowchart TD
subgraph AntiPattern ["Sai Lầm Kiến Trúc: Nhúng Vector Nguyên Khối"]
direction TB
RawItem["Dữ Liệu Gốc: Tiêu Đề + Giá (2.89tr) + Tồn Kho (4 đôi)"] --> EmbedText["Chạy Mô Hình Nhúng Vector (GPU)"]
EmbedText --> PointDB["Lưu Điểm Vector Vào Đồ Thị HNSW"]
StockChange["Khách Mua Hàng -> Tồn Kho Giảm Xuống 3"] --> ForceReEmbed["Bắt Buộc Chạy Lại GPU Tính Vector Toàn Bộ!"]
ForceReEmbed --> EmbedText
ForceReEmbed --> HNSWChurn["Phân Mảnh Đồ Thị HNSW & Lãng Phí Chi Phí GPU"]
end
subgraph AtomicSolution ["Chuẩn 2027: Kiến Trúc Atomic Chunking"]
direction TB
ProductRecord["Bản Ghi Sản Phẩm Từ PostgreSQL"] --> Splitter{"Bộ Tách Thực Thể Atomic"}
Splitter --> StaticText["Văn Bản Ngữ Nghĩa Bất Biến: Tên, Mô Tả, Thông Số"]
Splitter --> DynamicPayload["Thuộc Tính Vận Hành Động: Giá, Tồn Kho, SKU"]
StaticText --> OneTimeGPU["Nhúng Vector 1 Lần Duy Nhất (Dense + Sparse)"]
OneTimeGPU --> QdrantPoint["Điểm Qdrant: Vector Cố Định + Trường Payload"]
LiveDelta["Tồn Kho Giảm / Giá Đổi"] --> DirectPayload["Cập Nhật Trực Tiếp Vào Payload (<1ms, 0 GPU)"]
DirectPayload --> QdrantPoint
end
2. Phương Pháp Luận Atomic Chunking Cho Danh Mục Sản Phẩm E-Commerce
BLUF (Bottom Line Up Front): Atomic Chunking phân tách triệt để giữa ngữ nghĩa tĩnh và trạng thái vận hành động; mô tả sản phẩm chỉ được tính toán vector một lần duy nhất, trong khi giá bán và cờ tồn kho được quản lý riêng trong các trường Payload có đánh chỉ mục.
Để vừa tối ưu hóa độ chính xác tìm kiếm ngữ nghĩa, vừa triệt tiêu chi phí tính toán lại vector, hệ sinh thái Agentic Search áp dụng chuẩn mực Atomic Chunking:
Hai Mặt Phẳng Dữ Liệu Tách Biệt
- Mặt Phẳng Ngữ Nghĩa Bất Biến (Semantic Embedding Plane): Chứa các trường thông tin mô tả đặc tính bản chất của sản phẩm: tên gọi, thương hiệu, chất liệu cấu thành, công nghệ sản xuất, hướng dẫn sử dụng và thông số kỹ thuật cố định. Văn bản này được nhúng thành vector dày BGE-M3 (1024 chiều) và vector từ khóa thưa SPLADE.
- Mặt Phẳng Trạng Thái Động (Structured Payload Plane): Chứa các thông tin vận hành liên tục thay đổi: giá bán lẻ, giá khuyến mãi, cờ còn hàng, số lượng tồn kho theo từng kho hàng, trạng thái ẩn/hiện. Các trường này được lưu dưới dạng JSON Payload trong Qdrant và được đánh chỉ mục Payload Index (B-Tree, Keyword, Bool).
Mô Hình Quan Hệ Sản Phẩm Cha - Biến Thể Con (Parent-Child SKU)
Trong thương mại điện tử thực tế, một sản phẩm thường có nhiều biến thể màu sắc và kích cỡ. Kiến trúc chuẩn mực tạo một điểm vector duy nhất cho Sản Phẩm Cha (Master Product), và nhúng danh sách các Biến Thể Con (Variant SKUs) vào trong mảng Payload:
classDiagram
class MasterProduct {
+UUID MasterID
+String Brand
+String ProductName
+String CleanDescription
+List~String~ Materials
+Map~String, String~ TechnicalSpecs
+Vector1024 DenseVector
+SparseVector SparseVector
}
class VariantSKU {
+String SKUCode
+String ColorName
+String Size
+Float PriceVND
+Boolean IsInStock
+Map~WarehouseID, Int~ WarehouseQuantities
}
MasterProduct "1" *-- "many" VariantSKU : Chứa Các Biến Thể Con
Cấu trúc JSON Payload thực tế trong Qdrant:
{
"id": "a1b2c3d4-e5f6-4789-9abc-d1e2f3a4b5c6",
"vector": {
"dense": [0.0312, -0.0184, 0.0921, "...", -0.0514],
"sparse": {
"indices": [512, 2048, 48901, 78120],
"values": [1.85, 0.92, 2.45, 0.78]
}
},
"payload": {
"master_id": "PRD-NIKE-PEGASUS-40",
"brand": "Nike",
"title": "Giày Chạy Bộ Nike Air Zoom Pegasus 40",
"category_hierarchy": ["Thể Thao", "Chạy Bộ", "Giày Nam"],
"min_price": 2490000.0,
"max_price": 2890000.0,
"has_stock": true,
"variants": [
{
"sku": "NK-PEG40-BLK-42",
"size": "42",
"color": "Đen Trắng",
"price": 2890000.0,
"in_stock": true,
"warehouses": {"KHO_Q1": 12, "KHO_HN": 5}
},
{
"sku": "NK-PEG40-BLU-41",
"size": "41",
"color": "Xanh Navy",
"price": 2490000.0,
"in_stock": false,
"warehouses": {"KHO_Q1": 0, "KHO_HN": 0}
}
]
}
}
3. Kiến Trúc Bắt Thay Đổi Dữ Liệu Thời Gian Thực (CDC) Với Debezium & Kafka
BLUF (Bottom Line Up Front): Việc phụ thuộc vào các tiến trình quét định kỳ (Batch Cron) gây ra độ trễ dữ liệu nhiều giờ; triển khai Debezium Kafka CDC giúp đồng bộ tức thời mọi thay đổi từ PostgreSQL sang Qdrant dưới 500ms.
Để đảm bảo kết quả tìm kiếm luôn phản ánh chính xác trạng thái thực của kho hàng và giá niêm yết, hệ thống triển khai kiến trúc Change Data Capture (CDC) dựa trên Debezium và Apache Kafka:
flowchart LR
subgraph DatabaseTier ["Cơ Sở Dữ Liệu Giao Dịch ACID"]
PostgresAurora[(PostgreSQL Aurora)] --> WAL["Postgres Write-Ahead Log (WAL)"]
end
subgraph StreamingTier ["Hạ Tầng Kafka CDC Phân Tán"]
WAL --> Debezium["Debezium PostgreSQL Connector"]
Debezium --> KafkaTopic[["Kafka Topic: catalog.cdc.events (Partition theo SKU)"]]
end
subgraph WorkerTier ["Cụm Công Nhân Xử Lý Golang"]
KafkaTopic --> GoConsumers["Go CDC Consumer Group (Phân Luồng Độc Lập)"]
GoConsumers --> Classify{"Loại Biến Động?"}
Classify -- "Đổi Mô Tả / Tiêu Đề" --> GPUBatchQueue["Đưa Vào Hàng Đợi Nhúng GPU (vLLM)"]
Classify -- "Đổi Giá / Tồn Kho" --> DirectPayloadUpdate["Ghi Đè Trường Payload Trực Tiếp (<1ms)"]
GPUBatchQueue --> QdrantUpsert["Cập Nhật Toàn Diện Điểm Vector"]
DirectPayloadUpdate --> QdrantUpsert
end
QdrantUpsert --> QdrantCluster[("Cụm Qdrant Vector Cluster")]
Đảm Bảo Thứ Tự Sự Kiện Bằng Phân Vùng Kafka
Kafka Topic được phân vùng nghiêm ngặt theo mã master_id hash (murmur2(master_id) % num_partitions). Thiết kế này đảm bảo mọi chuỗi biến động của một sản phẩm (Tạo mới -> Đổi giá khuyến mãi -> Trừ tồn kho khi mua) luôn được xử lý tuần tự bởi cùng một worker Go, loại bỏ hoàn toàn hiện tượng Race Conditions ghi đè dữ liệu cũ lên dữ liệu mới.
4. Hóa Giải Vấn Đề Ghi Kép (Dual-Write): Mẫu Thiết Kế Transactional Outbox
BLUF (Bottom Line Up Front): Ghi đồng thời vào PostgreSQL và Qdrant trong cùng một hàm xử lý ứng dụng sẽ gây ra lỗi lệch pha dữ liệu vĩnh viễn khi mạng gặp sự cố; mẫu thiết kế Transactional Outbox đảm bảo tính nhất quán cuối cùng với cam kết không bao giờ mất sự kiện.
Một lỗi phổ biến trong kiến trúc phân tán là Hiểm Họa Ghi Kép (Dual-Write Hazard): ứng dụng cập nhật giá sản phẩm trong PostgreSQL thành công, sau đó gửi một lệnh HTTP sang Qdrant. Nếu Qdrant bị nghẽn mạng hoặc khởi động lại đúng lúc đó, PostgreSQL lưu giá mới nhưng Qdrant vẫn lưu giá cũ, dẫn tới hiện tượng “treo đầu dê bán thịt chó”.
-- DDL: Bảng Transactional Outbox Trong PostgreSQL
CREATE TABLE catalog_outbox_events (
event_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
aggregate_type VARCHAR(64) NOT NULL, -- 'PRODUCT_MASTER'
aggregate_id VARCHAR(128) NOT NULL, -- Mã sản phẩm
event_type VARCHAR(64) NOT NULL, -- 'PRICE_UPDATED', 'STOCK_DEPLETED'
payload JSONB NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
synced_at TIMESTAMP WITH TIME ZONE NULL
);
CREATE INDEX idx_unprocessed_outbox ON catalog_outbox_events (created_at) WHERE synced_at IS NULL;
Giao Dịch Nguyên Tử Trong Golang
package catalog
import (
"context"
"database/sql"
"encoding/json"
"fmt"
)
// ProductPriceCommand đại diện cho lệnh điều chỉnh giá
type ProductPriceCommand struct {
MasterID string `json:"master_id"`
NewPrice float64 `json:"new_price"`
InStock bool `json:"in_stock"`
}
// UpdateProductAtomic thực thi cập nhật sản phẩm và outbox trong một giao dịch ACID duy nhất
func UpdateProductAtomic(ctx context.Context, db *sql.DB, cmd ProductPriceCommand) error {
tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelReadCommitted})
if err != nil {
return fmt.Errorf("không thể khởi tạo transaction: %w", err)
}
defer tx.Rollback()
// 1. Cập nhật bảng dữ liệu nghiệp vụ chính
updateQuery := `UPDATE products SET price = $1, in_stock = $2, updated_at = NOW() WHERE master_id = $3`
_, err = tx.ExecContext(ctx, updateQuery, cmd.NewPrice, cmd.InStock, cmd.MasterID)
if err != nil {
return fmt.Errorf("cập nhật bảng products thất bại: %w", err)
}
// 2. Chèn sự kiện vào bảng Outbox cùng lúc
payloadData, err := json.Marshal(cmd)
if err != nil {
return fmt.Errorf("serialize payload thất bại: %w", err)
}
outboxQuery := `
INSERT INTO catalog_outbox_events (aggregate_type, aggregate_id, event_type, payload)
VALUES ($1, $2, $3, $4)`
_, err = tx.ExecContext(ctx, outboxQuery, "PRODUCT_MASTER", cmd.MasterID, "PRICE_CHANGED", payloadData)
if err != nil {
return fmt.Errorf("chèn outbox event thất bại: %w", err)
}
// Commit đảm bảo cả 2 thao tác cùng thành công hoặc cùng rollback
return tx.Commit()
}
5. Xử Lý Chuẩn Hóa Văn Bản Hai Vòng & Pipeline Nhúng Vector GPU Tốc Độ Cao
BLUF (Bottom Line Up Front): Dữ liệu nhà cung cấp chứa đầy thẻ HTML rác, ký tự lạ và đơn vị đo lường hỗn loạn; pipeline chuẩn hóa hai vòng kết hợp với máy chủ vLLM/TensorRT-LLM đạt thông lượng nhúng 4,500 sản phẩm mỗi giây trên một GPU NVIDIA L4 duy nhất.
Pipeline Làm Sạch Dữ Liệu Hai Vòng (Dual-Pass Sanitization)
Trước khi đưa văn bản vào mô hình ngôn ngữ để sinh vector, dữ liệu thô phải trải qua 2 bước tiền xử lý nghiêm ngặt:
- Vòng 1 (Cắt Rác Cấu Trúc): Loại bỏ toàn bộ thẻ HTML, giải mã thực thể Unicode (
&, ), xóa bỏ các đường dẫn ảnh hoặc mã script nhúng. - Vòng 2 (Chuẩn Hóa Đơn Vị & Thuộc Tính): Đồng nhất các đơn vị đo lường (“15.6 inch” vs “15.6in” ->
"15.6 in", “2 kilogam” ->"2 kg"), trích xuất danh sách thông số kỹ thuật thành cấu trúc chuẩn.
flowchart TD
RawVendorData["Dữ Liệu Thô Từ Nhà Cung Cấp (HTML, Rác Ký Tự, Đơn Vị Lộn Xộn)"] --> Pass1Clean["Vòng 1: Cắt Thẻ HTML & Chuẩn Hóa Khoảng Trắng"]
Pass1Clean --> Pass2Format["Vòng 2: Đồng Nhất Đơn Vị Đo Lường & Bóc Tách Thông Số"]
Pass2Format --> Generator{"Bộ Sinh Dữ Liệu Kép"}
Generator --> DenseInputText["Chuỗi Nhúng Vector Dày BGE-M3 (Ý Nghĩa Ngữ Cảnh)"]
Generator --> SparseInputText["Chuỗi Nhúng Vector Thưa SPLADE (Mã SKU & Thuộc Tính)"]
DenseInputText --> GPUBatchQueue["Hàng Đợi Batching Động (Batch Size: 64)"]
GPUBatchQueue --> vLLMServer["Máy Chủ vLLM / TensorRT-LLM (NVIDIA L4 24GB)"]
vLLMServer --> DenseVector["1024-dim Dense Vector (FP32 / INT8)"]
SparseInputText --> FastTokenizer["Bộ Mã Hóa SPLADE Tokenizer"]
FastTokenizer --> SparseVector["Mảng Trọng Số Từ Khóa Thưa"]
DenseVector & SparseVector --> QdrantBatchUpsert["Cập Nhật Điểm Hàng Loạt Vào Qdrant"]
package pipeline
import (
"regexp"
"strings"
)
var (
htmlRegex = regexp.MustCompile(`<[^>]*>`)
spaceRegex = regexp.MustCompile(`\s+`)
unitReplacer = strings.NewReplacer(
"inches", "in", "inch", "in", "\"", "in",
"kilogram", "kg", "kilo", "kg", "gam", "g",
"milimet", "mm", "centimet", "cm", "met", "m",
)
)
// SanitizeProductContent làm sạch văn bản mô tả trước khi nhúng vector
func SanitizeProductContent(title, rawDesc string, specs map[string]string) (string, string) {
// Vòng 1: Cắt bỏ HTML và chuẩn hóa khoảng trắng
cleanDesc := htmlRegex.ReplaceAllString(rawDesc, " ")
cleanDesc = spaceRegex.ReplaceAllString(cleanDesc, " ")
cleanDesc = strings.TrimSpace(cleanDesc)
// Vòng 2: Chuẩn hóa đơn vị đo lường trong thông số kỹ thuật
var specBuilder strings.Builder
for k, v := range specs {
standardVal := unitReplacer.Replace(strings.ToLower(v))
specBuilder.WriteString(k + ": " + standardVal + ". ")
}
// Chuỗi đầu vào cho Dense Vector tập trung vào ngữ cảnh sử dụng
denseText := strings.TrimSpace(title + ". " + specBuilder.String() + cleanDesc)
// Chuỗi đầu vào cho Sparse Vector tập trung vào các từ khóa kỹ thuật
sparseText := strings.ToLower(title + " " + specBuilder.String())
return denseText, sparseText
}
6. Hồ Sơ Sự Cố Thực Tế: Thảm Họa Sai Lệch Giá Giữa Tìm Kiếm Và Giỏ Hàng
BLUF (Bottom Line Up Front): Tiến trình quét batch định kỳ bị sập do tràn bộ nhớ (OOMKill) khiến thanh tìm kiếm quảng cáo giá xả kho 290,000 VND trong khi giỏ hàng tính giá gốc 1,290,000 VND, gây bùng nổ hơn 12,000 lượt hủy đơn và khủng hoảng truyền thông.
Tóm Tắt Sự Cố
- Thời Gian: 08:00 - 11:30 UTC, Ngày 2 Tháng 12 Năm 2025 (Ngày Hội Xả Hàng Cyber Monday).
- Hiện Tượng: Khách hàng tìm thấy áo khoác mùa đông giá 290,000 VND trên thanh tìm kiếm, nhưng khi bấm “Thêm vào giỏ hàng” và tiến hành thanh toán thì hệ thống hiển thị giá 1,290,000 VND.
- Hậu Quả: 12,400 giỏ hàng bị bỏ rơi ngay tại bước thanh toán; hơn 3,000 phản hồi tiêu cực trên mạng xã hội cáo buộc sàn thương mại điện tử “treo đầu dê bán thịt chó”.
sequenceDiagram
autonumber
actor Customer as "Khách Hàng Mua Sắm"
participant SearchGateway as "Cổng Tìm Kiếm E-commerce"
participant Qdrant as "Qdrant Vector DB"
participant CartService as "Dịch Vụ Giỏ Hàng & Đơn Hàng"
participant Postgres as "PostgreSQL Catalog DB"
Note over Postgres: 08:00 UTC: Chương trình xả kho kết thúc!<br/>PostgreSQL cập nhật giá: 290k -> 1.29tr
Note over Qdrant: Script quét batch định kỳ bị crash OOM lúc 07:45!<br/>Qdrant payload vẫn giữ giá cũ 290k!
Customer->>SearchGateway: Tìm: "áo khoác xả hàng mùa đông"
SearchGateway->>Qdrant: Hybrid Search (Lọc giá <= 300k)
Qdrant-->>SearchGateway: Trả về Áo Khoác Gió (Giá Payload: 290k)
SearchGateway-->>Customer: Hiển Thị Thẻ Sản Phẩm: 290,000 VND
Customer->>CartService: Bấm "Mua Ngay & Thanh Toán"
CartService->>Postgres: Lấy giá chính thức từ PostgreSQL
Postgres-->>CartService: Giá chính thức: 1,290,000 VND
CartService-->>Customer: Màn hình thanh toán: Tổng tiền 1,290,000 VND!
Note over Customer: Khách hàng tức giận vì bị lừa đảo giá!<br/>Hủy đơn hàng và khiếu nại lên cơ quan bảo vệ người tiêu dùng!
07:45 UTC - Tiến trình quét batch định kỳ nạp dữ liệu bị Linux OOM killer tiêu diệt do memory leak.
08:00 UTC - Chiến dịch xả hàng kết thúc. Hệ thống PostgreSQL tự động cập nhật giá 45,000 sản phẩm về giá gốc.
08:15 UTC - Hàng nghìn khách hàng tìm kiếm đồ xả hàng. Kết quả tìm kiếm vẫn hiển thị giá cũ 290,000 VND.
08:45 UTC - Tổng đài chăm sóc khách hàng quá tải vì hàng nghìn cuộc gọi khiếu nại "lừa đảo giá".
09:15 UTC - Đội ngũ kỹ sư phát hiện dữ liệu trong Qdrant đang bị chậm hơn cơ sở dữ liệu gốc 90 phút.
10:30 UTC - Triển khai script khẩn cấp ép nạp lại toàn bộ Payload của Qdrant.
11:30 UTC - Giá tìm kiếm đồng bộ hoàn toàn với giỏ hàng.
Khắc Phục Triệt Để
- Khai Tử Hoàn Toàn Các Script Quét Batch Định Kỳ: Chuyển đổi 100% sang kiến trúc Debezium Kafka CDC và Transactional Outbox pattern.
- Đưa Giá Vào Trường Payload Độc Lập: Mọi biến động giá được cập nhật vào Qdrant dưới dạng in-place payload update trong dưới 500ms, không chạm tới mô hình nhúng vector.
- Active RAG Pre-Checkout Check: Trước khi hiển thị thẻ sản phẩm lên giao diện, một luồng kiểm tra nhanh gọi trực tiếp bộ nhớ đệm giá để xác nhận tính đồng nhất tuyệt đối giữa kết quả tìm kiếm và cổng thanh toán.
❓ Câu Hỏi Thường Gặp (FAQ)
Atomic Chunking xử lý các biến thể màu sắc và kích cỡ của sản phẩm như thế nào?
Tại sao Transactional Outbox lại ưu việt hơn cơ chế ghi kép (Dual-Write) thông thường?
Mô hình nhúng vector nào tối ưu nhất cho danh mục E-commerce năm 2027?
bge-m3 từ BAAI hiện là chuẩn mực mã nguồn mở tối ưu nhất cho bài toán thương mại điện tử. Nó hỗ trợ đa ngôn ngữ tự nhiên trên hơn 100 thứ tiếng, xử lý độ dài ngữ cảnh lên tới 8,192 tokens, và đặc biệt có khả năng xuất ra đồng thời cả vector dày ngữ nghĩa (Dense 1024-dim) và vector từ khóa thưa (Sparse lexical weights) chỉ trong một lượt suy luận duy nhất.