Przejdź do głównej zawartości
getnextpdf.com

Enterprise edycja

Accelerator — szczegółowa referencja (sidecar GPU, fabryka dostawców KMS)

Ta strona to szczegółowa referencja publicznej powierzchni akceleracji NextPDF\Enterprise\Accelerator. Obejmuje stos dostawców KMS — fabrykę, kontrakt dostawcy, dostawcę lokalnego oraz wynik z metadanymi klucza — a także usługi sidecara GPU do osadzania i wyszukiwania wektorowego. Podaje parametry, wartości domyślne, tryby awarii oraz stanowisko w sprawie pieczy nad kluczami. W celu uzyskania wskazówek dotyczących przepływu pracy przeczytaj najpierw stronę możliwości Accelerator. Pozostałe symbole w tej samej przestrzeni nazw należą do innych możliwości i są poza zakresem tej strony.

Ta możliwość jest dostarczana w NextPDF Enterprise (nextpdf/enterprise) i uaktywnia się wraz z kopertą licencyjną poziomu Enterprise. Wdrożenie bez tego uprawnienia nie wczytuje klas tej możliwości. Porównaj edycje i uzyskaj licencję.

Dostawca KMS jest wybierany w czasie wykonywania; kod wywołujący zależy od kontraktu dostawcy, a nie od konkretnego dostawcy. Usługi osadzania i indeksu wektorowego implementują kontrakty Core EmbeddingServiceInterface oraz VectorIndexInterface.

Okno terminala
composer require nextpdf/enterprise:^3
SymbolParametryZachowanie domyślneZwracaZgłasza lub kończy się błędemUwagi
KmsProviderFactory::fromEnvironmentbrakBuduje dostawcę wskazanego przez zmienną selektora; brak wartości lub pusta wartość wybiera localKmsProviderInterfaceRuntimeException przy braku klucza głównego, niedostępnym dostawcy chmurowym lub nieznanej nazwieStatyczny punkt wejścia
KmsProviderFactory::createstring $providerType, array $config = []Buduje wskazanego dostawcę na podstawie jawnej konfiguracjiKmsProviderInterfaceRuntimeException, gdy local nie ma niepustego encryption_key, lub przy nieznanej nazwielocal to jedyna konstruowalna nazwa w tym wydaniu
KmsProviderInterface::getEncryptionKeystring $collectionIdZwraca bieżące metadane klucza dla kolekcjiEncryptionKeyResultRuntimeException, gdy dostawca jest nieosiągalny lub błędnie skonfigurowany (kontrakt)Wyłącznie metadane; nigdy surowe bajty klucza
KmsProviderInterface::rotateKeystring $collectionIdZwiększa wersję kluczaEncryptionKeyResultRuntimeException, gdy rotacja się nie powiedzie (kontrakt)Rotacja to sygnał ponownego szyfrowania dla wywołującego
KmsProviderInterface::providerNamebrakZgłasza kanoniczną nazwę dostawcystringNic nie zadeklarowanolocal, aws, gcp, azure, vault
LocalKmsProvider::__constructstring $encryptionKey (wrażliwy)Waliduje szesnastkowy klucz główny o długości co najmniej 64 znaków szesnastkowych (32 bajty)LocalKmsProviderInvalidArgumentException przy zbyt krótkiej lub nieszesnastkowej wartościZabezpieczenie fail-fast; samo nie wykonuje wyprowadzania
LocalKmsProvider::getEncryptionKeystring $collectionIdTworzy local:{collectionId}:v{version}; wersja domyślnie wynosi 1EncryptionKeyResultNic nie zadeklarowanoEtykieta algorytmu AES-256-GCM
LocalKmsProvider::rotateKeystring $collectionIdZwiększa licznik wersji w procesieEncryptionKeyResultNic nie zadeklarowanoStan wersji jest właściwy dla instancji
EncryptionKeyResult::__constructstring $keyId, int $keyVersion, string $algorithm = 'AES-256-GCM', string $provider = 'local'Niezmienny obiekt wartości metadanychEncryptionKeyResultNic nie zadeklarowanoNigdy nie przenosi materiału klucza
GpuEmbeddingService::embedstring $textDeleguje do batchEmbed i zwraca element zerowylist<float>Jak batchEmbedWektor o wymiarze 1024
GpuEmbeddingService::batchEmbedarray $textsOsadza partię w sidecarzelist<list<float>>InvalidArgumentException przy pustej partii; SpectrumNotAvailableException, gdy sidecar jest nieosiągalny; SpectrumApiException przy nieudanej, zniekształconej lub niezgodnej co do liczby odpowiedziNigdy nie zwraca wyników częściowych
GpuEmbeddingService::getDimensionbrakZwraca 1024intNic nie zadeklarowanoStała
GpuEmbeddingService::getModelNamebrakZwraca multilingual-e5-largestringNic nie zadeklarowanoStała
GpuVectorIndex::__constructSpectrumClient $client, string $collectionId = 'default'Wiąże uchwyt z jedną kolekcjąGpuVectorIndexNic nie zadeklarowanoJeden uchwyt na identyfikator kolekcji
GpuVectorIndex::buildarray $vectors, array $idsBuduje indeks kolekcji w sidecarzevoidInvalidArgumentException przy pustej partii lub niezgodności długości; SpectrumNotAvailableException, gdy nieosiągalny; SpectrumApiException przy nieoczekiwanej odpowiedzi budowaniaPrzebudowa zastępuje indeks
GpuVectorIndex::searcharray $queryVector, int $topK = 10Rankingowe wyszukiwanie najbliższych sąsiadówlist<VectorSearchResult>SpectrumNotAvailableException, gdy nieosiągalny; JsonException przy zniekształconym ciele odpowiedziRanking każdego trafienia w metadanych wyniku
GpuVectorIndex::deletearray $idsZawsze odrzucavoid (zadeklarowane)Zawsze: SpectrumApiException (niezaimplementowane)Zbudowany indeks jest niezmienny; zamiast tego przebuduj
GpuVectorIndex::countbrakOdczytuje sumę kolekcji z sidecaraintNie zgłasza wyjątku; każda awaria zwraca 00 jest niejednoznaczne: pusty lub nieosiągalny
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
}
UstawienieKonsumentZnaczenie
SPECTRUM_KMS_PROVIDERfromEnvironment()Selektor dostawcy. Brak wartości lub pusta wartość rozwiązuje się do local.
SPECTRUM_ENCRYPTION_KEYŚcieżka dostawcy localKlucz główny zakodowany szesnastkowo; co najmniej 64 znaki szesnastkowe (32 bajty). Współdzielony z sidecarem.
encryption_keycreate('local', [...])Jawny klucz główny; ten sam format i walidacja.

KmsProviderFactory::fromEnvironment odczytuje zmienną selektora i domyślnie przyjmuje local. Nazwy dostawców chmurowych aws, gcp, azure oraz vault są rozpoznawane, ale nie są konstruowalne w tym wydaniu. Wybranie aws zgłasza typowany błąd wskazujący wymagany pakiet aws/aws-sdk-php; pozostałe trzy zgłaszają integrację jako niezaimplementowaną. Nieznana nazwa zgłasza typowany błąd wymieniający obsługiwane nazwy. KmsProviderFactory::create przyjmuje jawną nazwę dostawcy oraz mapę konfiguracji; local to jedyna nazwa, którą konstruuje.

Dostawca zwraca niezmienne metadane klucza: identyfikator klucza, monotonicznie rosnącą wersję klucza, etykietę algorytmu oraz nazwę dostawcy. Nigdy nie zwraca surowych bajtów klucza, więc wyciek metadanych nie ujawnia materiału klucza. Dostawca lokalny dzieli obowiązki z sidecarem akceleratora. Klasa PHP waliduje sekret główny przy konstrukcji i tworzy stabilną, właściwą dla kolekcji tożsamość klucza w postaci local:{collectionId}:v{version}. Sidecar wykonuje wyprowadzanie HKDF-SHA256 oraz szyfrowanie AES-256-GCM, wyprowadzając odrębny 32-bajtowy klucz szyfrowania danych dla każdej kolekcji, przy czym identyfikator kolekcji i wersja pełnią rolę separacji domen. Obie strony odczytują ten sam skonfigurowany sekret główny. Nie następuje kontakt z żadną zewnętrzną usługą KMS; obsługa klucza pozostaje wewnątrz wdrożenia. Wersja klucza oraz model cyklu życia są zgodne z NIST SP 800-57 Part 1 Rev.5 §4.

Wywołanie rotacji zwiększa wersję klucza i zwraca nowe metadane. Wywołujący ponownie szyfruje dane kolekcji nową wersją; dostawca sam niczego ponownie nie szyfruje.

Bezpieczeństwo klucza zależy od KMS lub sekretu klucza głównego, od wdrożenia oraz od operatora — a nie wyłącznie od NextPDF Enterprise. Operator odpowiada za udostępnianie klucza głównego, przechowywanie sekretów, konfigurację KMS oraz harmonogram rotacji. Odpowiedzialność za ochronę kluczy jest zgodna z NIST SP 800-57 Part 1 Rev.5 §5.5.2.

GpuEmbeddingService implementuje kontrakt osadzania Core i deleguje do sidecara. Sidecar uruchamia model osadzania na GPU, gdy jest ono dostępne, a w przeciwnym razie przechodzi na CPU, oznaczając metadane odpowiedzi jako zdegradowane względem GPU. Kształt wektora jest identyczny w obu przypadkach. Model (około 1,3 GB) jest pobierany i wczytywany leniwie przy pierwszym żądaniu. Semantyka partii jest „wszystko albo nic”: awaria pojedynczego elementu, zniekształcony wektor lub niezgodność liczby zgłasza typowany błąd zamiast zwracać wyniki częściowe.

GpuVectorIndex implementuje kontrakt indeksu wektorowego Core i wiąże jeden uchwyt z jednym identyfikatorem kolekcji. build konstruuje indeks w sidecarze; sidecar używa indeksu GPU, gdy jest on dostępny, a w przeciwnym razie indeksu CPU. Po zbudowaniu indeks jest niezmienny: delete zawsze odrzuca typowanym błędem „niezaimplementowane”, a usunięcie wymaga przebudowy. search zwraca trafienia z rankingiem, z rankingiem liczonym od jedynki w metadanych każdego wyniku. count pyta sidecar o sumę kolekcji i przy każdej awarii zgłasza 0 zamiast wyjątku.

  • Klucz główny musi dekodować się z postaci szesnastkowej do co najmniej 32 bajtów. Krótsza lub nieszesnastkowa wartość zgłasza InvalidArgumentException przy konstrukcji, przed jakimkolwiek wywołaniem sidecara.
  • Brak wartości lub pusta zmienna selektora rozwiązuje się do local; fabryka nigdy nie zgaduje innego dostawcy.
  • fromEnvironment na ścieżce local bez zmiennej z kluczem głównym zgłasza typowany błąd wskazujący brakującą zmienną.
  • create('local', [...]) bez niepustego wpisu encryption_key zgłasza typowany błąd wskazujący brakujący wpis.
  • Stan wersji klucza jest w procesie i właściwy dla instancji dostawcy. Nowy proces obserwuje wersję 1, dopóki rotacja nie zostanie ponownie uruchomiona. Utrwalaj wyniki rotacji przez ponowne szyfrowanie danych, a nie przez zaufanie stanowi dostawcy.
  • Pusta partia osadzania zgłasza InvalidArgumentException; nie następuje kontakt z sidecarem.
  • Dostępność sidecara jest sprawdzana przy każdym wywołaniu. Nieosiągalny sidecar zgłasza SpectrumNotAvailableException; usługi nigdy nie zawodzą po cichu.
  • Nienumeryczny składnik zwróconego wektora osadzania jest wymuszany na 0.0; brakujący lub nietablicowy wektor zgłasza SpectrumApiException.
  • Pierwsze żądanie osadzania ponosi jednorazowy koszt pobrania i wczytania modelu; wymiaruj ten limit czasu osobno.
  • build i search dekodują odpowiedź sidecara rygorystycznie; zniekształcone ciało zgłasza JsonException. count pochłania każdą awarię i zwraca 0.
  • Trafienie wyszukiwania bez identyfikatora lub oceny domyślnie przyjmuje pusty ciąg i 0.0 zamiast zawieść partię.
  • Kody błędów sidecara oraz hierarchia wyjątków są skatalogowane w referencji błędów Accelerator.

Lokalna ścieżka klucza używa HKDF-SHA256 do wyprowadzania oraz AES-256-GCM do szyfrowania; sidecar wykonuje oba. Etykieta algorytmu zapisana w metadanych klucza to AES-256-GCM. Gdy wdrożenie działa z dostawcą kryptograficznym zwalidowanym zgodnie z FIPS, te prymitywy działają w tej zwalidowanej granicy. Użycie AES-GCM wymaga unikatowego wektora inicjującego dla każdego klucza, zgodnie z NIST SP 800-38D §5.

NextPDF Enterprise nie jest modułem kryptograficznym zwalidowanym zgodnie z FIPS i nie wysuwa żadnej deklaracji certyfikacji FIPS. Działa w trybie zgodnym z FIPS wyłącznie wtedy, gdy jest skonfigurowany z dostawcą kryptograficznym zwalidowanym zgodnie z FIPS lub z KMS zwalidowanym zgodnie z FIPS. W tym repozytorium nie istnieje żaden artefakt certyfikacji FIPS.

DeklaracjaStandardKlauzula
Wersja klucza oraz model cyklu życia są zgodne z wytycznymi dotyczącymi stanów klucza.NIST SP 800-57 Part 1 Rev.5§4
Odpowiedzialność za ochronę klucza oraz pieczę spoczywa na właścicielu klucza i operatorze.NIST SP 800-57 Part 1 Rev.5§5.5.2
AES-GCM wymaga unikatowego wektora inicjującego dla każdego klucza.NIST SP 800-38D§5

Wszystkie klauzule są parafrazowane; NextPDF nie odtwarza tekstu normatywnego. NextPDF nie wysuwa żadnej deklaracji certyfikacji. Zgodność z przywołanymi klauzulami jest deklaracją możliwości, a nie certyfikacją. Ta strona dotyczy zarządzania kluczami; stwierdzenie o trybie FIPS jest stwierdzeniem o zgodności, a nie opinią prawną. Skonsultuj się z własnymi doradcami ds. zgodności i prawnymi.

  • Źródło modułu zawiera @since 2.1.0; ta referencja dokumentuje powierzchnię w postaci dostarczonej w nextpdf/enterprise 3.1.0.
  • Wszystkie klasy są final; EncryptionKeyResult jest final readonly. Konstruuj nowe instancje zamiast mutować.
  • Klucz główny to wrażliwy parametr konstruktora (#[SensitiveParameter]); PHP redaguje go w śladach stosu. Trzymaj go z dala od dzienników aplikacji i zrzutów konfiguracji.
  • SpectrumClient, VectorSearchResult oraz kontrakty EmbeddingServiceInterface i VectorIndexInterface pochodzą z NextPDF Core; wywołujący konstruuje i dostarcza klienta sidecara.
  • Przestrzeń nazw NextPDF\Enterprise\Accelerator zawiera również silniki odciążania wsadowego oraz stosy kolekcji wyszukiwania i ekstrakcji OCR; te powierzchnie są poza zakresem tej strony.
  • Szczegóły wewnętrznego mechanizmu pozostają w wewnętrznej dokumentacji repozytorium źródłowego i są poza zakresem tego podręcznika.

Ta strona dokumentuje wyłącznie zewnętrznie obserwowalne zachowanie oraz obsługiwaną powierzchnię publicznego API. Wewnętrzne ścieżki przestrzeni nazw, klasy pomocnicze, tabele mechanizmów, nazwy plików runbooków oraz prefiksy zgłoszeń są poza zakresem.