Bỏ qua để đến nội dung
getnextpdf.com

Enterprise phiên bản

Accelerator — Tài liệu tham chiếu chuyên sâu (GPU sidecar, KMS provider factory)

Trang này là tài liệu tham chiếu sâu cho bề mặt tăng tốc công khai của NextPDF\Enterprise\Accelerator. Nó bao quát ngăn xếp KMS provider — factory, contract của provider, provider cục bộ, và key-metadata result — cùng các dịch vụ GPU sidecar cho embedding và vector search. Nó nêu các tham số, giá trị mặc định, các chế độ thất bại, và lập trường về việc giám hộ khóa. Hãy đọc trang khả năng Accelerator trước để có hướng dẫn quy trình. Các ký hiệu khác trong cùng namespace thuộc về các khả năng khác và nằm ngoài phạm vi của trang này.

Khả năng này được phát hành trong NextPDF Enterprise (nextpdf/enterprise) và kích hoạt bằng một license envelope bậc Enterprise. Một triển khai không có quyền đó sẽ không nạp các class của khả năng này. So sánh các phiên bản và lấy giấy phép.

KMS provider được chọn tại runtime; mã gọi phụ thuộc vào contract của provider, không phải provider cụ thể. Các dịch vụ embedding và vector-index hiện thực các contract EmbeddingServiceInterfaceVectorIndexInterface của Core.

Terminal window
composer require nextpdf/enterprise:^3
Ký hiệuTham sốHành vi mặc địnhTrả vềNém ra hoặc thất bại vớiGhi chú
KmsProviderFactory::fromEnvironmentkhông cóDựng provider được đặt tên bởi biến selector; chưa đặt hoặc rỗng sẽ chọn localKmsProviderInterfaceRuntimeException khi thiếu root key, cloud provider không khả dụng, hoặc tên không xác địnhĐiểm vào tĩnh
KmsProviderFactory::createstring $providerType, array $config = []Dựng provider được đặt tên từ cấu hình tường minhKmsProviderInterfaceRuntimeException khi local thiếu encryption_key không rỗng, hoặc khi tên không xác địnhlocal là tên duy nhất có thể dựng trong bản phát hành này
KmsProviderInterface::getEncryptionKeystring $collectionIdTrả về key metadata hiện tại cho collectionEncryptionKeyResultRuntimeException khi provider không thể tiếp cận hoặc cấu hình sai (contract)Chỉ metadata; không bao giờ có byte khóa thô
KmsProviderInterface::rotateKeystring $collectionIdNâng phiên bản khóaEncryptionKeyResultRuntimeException khi xoay khóa thất bại (contract)Xoay khóa là một tín hiệu mã hóa lại gửi tới người gọi
KmsProviderInterface::providerNamekhông cóBáo cáo tên provider chuẩn tắcstringKhông khai báo gìlocal, aws, gcp, azure, vault
LocalKmsProvider::__constructstring $encryptionKey (nhạy cảm)Kiểm định một hex root key có ít nhất 64 ký tự hex (32 byte)LocalKmsProviderInvalidArgumentException khi giá trị quá ngắn hoặc không phải hexGuard fail-fast; tự nó không thực hiện dẫn xuất
LocalKmsProvider::getEncryptionKeystring $collectionIdTạo ra local:{collectionId}:v{version}; version mặc định là 1EncryptionKeyResultKhông khai báo gìNhãn thuật toán AES-256-GCM
LocalKmsProvider::rotateKeystring $collectionIdTăng bộ đếm version trong tiến trìnhEncryptionKeyResultKhông khai báo gìTrạng thái version theo từng instance
EncryptionKeyResult::__constructstring $keyId, int $keyVersion, string $algorithm = 'AES-256-GCM', string $provider = 'local'Đối tượng giá trị metadata bất biếnEncryptionKeyResultKhông khai báo gìKhông bao giờ mang vật liệu khóa
GpuEmbeddingService::embedstring $textỦy thác cho batchEmbed và trả về phần tử thứ khônglist<float>Như batchEmbedVector 1024 chiều
GpuEmbeddingService::batchEmbedarray $textsNhúng cả batch trên sidecarlist<list<float>>InvalidArgumentException khi batch rỗng; SpectrumNotAvailableException khi sidecar không thể tiếp cận; SpectrumApiException khi response thất bại, dị dạng, hoặc sai số lượngKhông bao giờ trả về kết quả một phần
GpuEmbeddingService::getDimensionkhông cóTrả về 1024intKhông khai báo gìHằng số
GpuEmbeddingService::getModelNamekhông cóTrả về multilingual-e5-largestringKhông khai báo gìHằng số
GpuVectorIndex::__constructSpectrumClient $client, string $collectionId = 'default'Gắn handle với một collectionGpuVectorIndexKhông khai báo gìMột handle cho mỗi định danh collection
GpuVectorIndex::buildarray $vectors, array $idsDựng chỉ mục collection trên sidecarvoidInvalidArgumentException khi batch rỗng hoặc độ dài không khớp; SpectrumNotAvailableException khi không thể tiếp cận; SpectrumApiException khi response build ngoài mong đợiMột lần dựng lại sẽ thay thế chỉ mục
GpuVectorIndex::searcharray $queryVector, int $topK = 10Tìm kiếm lân cận gần nhất có xếp hạnglist<VectorSearchResult>SpectrumNotAvailableException khi không thể tiếp cận; JsonException khi thân response dị dạngXếp hạng theo từng hit trong metadata kết quả
GpuVectorIndex::deletearray $idsLuôn từ chốivoid (khai báo)Luôn luôn: SpectrumApiException (chưa hiện thực)Chỉ mục đã dựng là bất biến; hãy dựng lại thay vì xóa
GpuVectorIndex::countkhông cóĐọc tổng số của collection từ sidecarintKhông ném; mọi thất bại đều trả về 00 là nhập nhằng: rỗng hoặc không thể tiếp cận
final class KmsProviderFactory
{
public static function fromEnvironment(): KmsProviderInterface
public static function create(string $providerType, array $config = []): KmsProviderInterface
}
interface KmsProviderInterface
{
public function getEncryptionKey(string $collectionId): EncryptionKeyResult;
public function rotateKey(string $collectionId): EncryptionKeyResult;
public function providerName(): string;
}
final class LocalKmsProvider implements KmsProviderInterface
{
public function __construct(
#[SensitiveParameter]
private readonly string $encryptionKey,
)
}
final readonly class EncryptionKeyResult
{
public function __construct(
public string $keyId,
public int $keyVersion,
public string $algorithm = 'AES-256-GCM',
public string $provider = 'local',
)
}
final class GpuEmbeddingService implements EmbeddingServiceInterface
{
public function __construct(private readonly SpectrumClient $client)
public function embed(string $text): array
public function batchEmbed(array $texts): array
public function getDimension(): int
public function getModelName(): string
}
final class GpuVectorIndex implements VectorIndexInterface
{
public function __construct(
private readonly SpectrumClient $client,
string $collectionId = 'default',
)
public function build(array $vectors, array $ids): void
public function search(array $queryVector, int $topK = 10): array
public function delete(array $ids): void
public function count(): int
}
Thiết lậpBên tiêu thụÝ nghĩa
SPECTRUM_KMS_PROVIDERfromEnvironment()Bộ chọn provider. Chưa đặt hoặc rỗng sẽ phân giải thành local.
SPECTRUM_ENCRYPTION_KEYĐường dẫn provider localRoot key mã hóa hex; ít nhất 64 ký tự hex (32 byte). Chia sẻ với sidecar.
encryption_keycreate('local', [...])Root key tường minh; cùng định dạng và kiểm định.

KmsProviderFactory::fromEnvironment đọc biến selector và mặc định là local. Các tên cloud provider aws, gcp, azure, và vault được nhận diện nhưng không thể dựng trong bản phát hành này. Chọn aws sẽ làm phát sinh một lỗi có kiểu nêu tên gói aws/aws-sdk-php cần thiết; ba tên còn lại báo cáo tích hợp là chưa hiện thực. Một tên không xác định sẽ làm phát sinh một lỗi có kiểu liệt kê các tên được hỗ trợ. KmsProviderFactory::create chấp nhận một tên provider tường minh và một configuration map; local là tên duy nhất mà nó dựng.

Một provider trả về key metadata bất biến: một định danh khóa, một phiên bản khóa tăng đơn điệu, nhãn thuật toán, và tên provider. Nó không bao giờ trả về các byte khóa thô, nên một rò rỉ metadata không để lộ vật liệu khóa. Provider cục bộ phân chia nhiệm vụ với accelerator sidecar. Class PHP kiểm định bí mật khóa chủ lúc khởi tạo và tạo ra một danh tính khóa ổn định, theo phạm vi collection, có dạng local:{collectionId}:v{version}. Sidecar thực hiện dẫn xuất HKDF-SHA256 và mã hóa AES-256-GCM, dẫn xuất một khóa mã hóa dữ liệu 32 byte riêng biệt cho mỗi collection với định danh collection và phiên bản làm bộ tách miền. Cả hai bên đều đọc cùng một bí mật khóa chủ đã cấu hình. Không có dịch vụ KMS bên ngoài nào được liên hệ; việc xử lý khóa nằm bên trong triển khai. Phiên bản khóa và mô hình vòng đời tuân theo NIST SP 800-57 Part 1 Rev.5 §4.

Một lời gọi xoay khóa nâng phiên bản khóa và trả về metadata mới. Người gọi mã hóa lại dữ liệu collection bằng phiên bản mới; bản thân provider không mã hóa lại gì cả.

Tính bảo mật của khóa phụ thuộc vào KMS hoặc bí mật khóa chủ, vào triển khai, và vào người vận hành — không phải vào riêng NextPDF Enterprise. Người vận hành sở hữu việc cấp phát khóa chủ, lưu trữ bí mật, cấu hình KMS, và lập lịch xoay khóa. Trách nhiệm bảo vệ khóa tuân theo NIST SP 800-57 Part 1 Rev.5 §5.5.2.

GpuEmbeddingService hiện thực contract embedding của Core và ủy thác cho sidecar. Sidecar chạy mô hình embedding trên một GPU khi có sẵn và dự phòng về CPU nếu không, đánh dấu metadata của response là suy giảm so với GPU. Hình dạng vector giống nhau trong cả hai trường hợp. Mô hình (khoảng 1.3 GB) được tải xuống và nạp một cách lười biếng ở request đầu tiên. Ngữ nghĩa batch là tất-cả-hoặc-không: một thất bại theo từng phần tử, một vector dị dạng, hoặc một sai số lượng sẽ làm phát sinh một lỗi có kiểu thay vì trả về kết quả một phần.

GpuVectorIndex hiện thực contract vector-index của Core và gắn một handle với một định danh collection. build dựng chỉ mục trên sidecar; sidecar dùng một chỉ mục GPU khi có sẵn và một chỉ mục CPU nếu không. Chỉ mục là bất biến một khi đã dựng: delete luôn từ chối bằng một lỗi có kiểu chưa-hiện-thực, và việc xóa yêu cầu dựng lại. search trả về các hit có xếp hạng với một thứ hạng bắt đầu từ một trong metadata của mỗi kết quả. count hỏi sidecar về tổng số của collection và báo cáo 0 khi có bất kỳ thất bại nào thay vì ném lỗi.

Trường hợp biên và các chế độ thất bại

Phần tiêu đề “Trường hợp biên và các chế độ thất bại”
  • Root key phải giải mã từ hex ra ít nhất 32 byte. Một giá trị ngắn hơn hoặc không phải hex sẽ làm phát sinh InvalidArgumentException lúc khởi tạo, trước bất kỳ lời gọi sidecar nào.
  • Một biến selector chưa đặt hoặc rỗng sẽ phân giải thành local; factory không bao giờ đoán một provider khác.
  • fromEnvironment trên đường dẫn local mà thiếu biến root-key sẽ làm phát sinh một lỗi có kiểu nêu tên biến còn thiếu.
  • create('local', [...]) mà thiếu một mục encryption_key không rỗng sẽ làm phát sinh một lỗi có kiểu nêu tên mục còn thiếu.
  • Trạng thái phiên bản khóa nằm trong tiến trình và theo từng instance provider. Một tiến trình mới quan sát thấy version 1 cho đến khi xoay khóa chạy lại. Hãy lưu bền kết quả xoay khóa bằng cách mã hóa lại dữ liệu, không phải bằng cách tin vào trạng thái của provider.
  • Một batch embedding rỗng sẽ làm phát sinh InvalidArgumentException; sidecar không được liên hệ.
  • Tính khả dụng của sidecar được thăm dò theo từng lời gọi. Một sidecar không thể tiếp cận sẽ làm phát sinh SpectrumNotAvailableException; các dịch vụ không bao giờ thất bại âm thầm.
  • Một thành phần không phải số bên trong một vector embedding trả về sẽ bị ép thành 0.0; một vector thiếu hoặc không phải mảng sẽ làm phát sinh SpectrumApiException.
  • Request embedding đầu tiên phải trả chi phí tải xuống và nạp mô hình một lần; hãy định cỡ timeout đó riêng.
  • buildsearch giải mã response của sidecar một cách nghiêm ngặt; một thân dị dạng sẽ làm phát sinh JsonException. count nuốt mọi thất bại và trả về 0.
  • Một hit tìm kiếm thiếu định danh hoặc điểm số sẽ mặc định thành một chuỗi rỗng và 0.0 thay vì làm hỏng cả batch.
  • Các mã lỗi của sidecar và phân cấp exception được liệt kê trong tài liệu tham chiếu lỗi Accelerator.

Đường dẫn khóa cục bộ dùng HKDF-SHA256 cho dẫn xuất và AES-256-GCM cho mã hóa; sidecar thực thi cả hai. Nhãn thuật toán được ghi trong key metadata là AES-256-GCM. Khi triển khai chạy với một provider mật mã được thẩm định FIPS, các primitive đó chạy trong ranh giới đã thẩm định đó. Việc dùng AES-GCM yêu cầu một initialization vector duy nhất cho mỗi khóa, theo NIST SP 800-38D §5.

NextPDF Enterprise không phải là một module mật mã được thẩm định FIPS và không đưa ra tuyên bố chứng nhận FIPS nào. Nó chỉ hoạt động ở một chế độ tương thích FIPS khi được cấu hình với một provider mật mã được thẩm định FIPS hoặc một KMS được thẩm định FIPS. Không có artifact chứng nhận FIPS nào tồn tại trong repository này.

Tuyên bốTiêu chuẩnĐiều khoản
Phiên bản khóa và mô hình vòng đời tuân theo hướng dẫn về trạng thái khóa.NIST SP 800-57 Part 1 Rev.5§4
Trách nhiệm bảo vệ và giám hộ khóa thuộc về chủ sở hữu khóa và người vận hành.NIST SP 800-57 Part 1 Rev.5§5.5.2
AES-GCM yêu cầu một initialization vector duy nhất cho mỗi khóa.NIST SP 800-38D§5

Tất cả các điều khoản đều được diễn giải lại; NextPDF không tái hiện văn bản quy phạm. NextPDF không đưa ra tuyên bố chứng nhận nào. Sự tương thích với các điều khoản được trích dẫn là một tuyên bố về khả năng, không phải một chứng nhận. Trang này liên quan đến quản lý khóa; tuyên bố về FIPS-mode là một tuyên bố về tính tương thích, không phải một ý kiến pháp lý. Hãy tham vấn các cố vấn tuân thủ và pháp lý của riêng bạn.

  • Mã nguồn module mang @since 2.1.0; tài liệu tham chiếu này mô tả bề mặt như được phát hành trong nextpdf/enterprise 3.1.0.
  • Tất cả các class đều là final; EncryptionKeyResultfinal readonly. Hãy dựng các instance mới thay vì biến đổi tại chỗ.
  • Root key là một tham số khởi tạo nhạy cảm (#[SensitiveParameter]); PHP che nó khỏi các stack trace. Hãy giữ nó ngoài các log ứng dụng và các bản đổ cấu hình.
  • SpectrumClient, VectorSearchResult, cùng các contract EmbeddingServiceInterfaceVectorIndexInterface đến từ NextPDF Core; người gọi dựng và cung cấp client sidecar.
  • Namespace NextPDF\Enterprise\Accelerator cũng mang các engine batch offload cùng các ngăn xếp retrieval-collection và trích xuất OCR; các bề mặt đó nằm ngoài phạm vi của trang này.
  • Chi tiết cơ chế nội bộ nằm trong tài liệu nội bộ của source repository và nằm ngoài phạm vi của cẩm nang này.

Trang này chỉ ghi lại hành vi có thể quan sát từ bên ngoài và bề mặt public API được hỗ trợ. Các đường dẫn namespace nội bộ, các class trợ giúp, các bảng cơ chế, tên tệp runbook, và tiền tố ticket nằm ngoài phạm vi.