FIX #2562: send "dimensions" to Nvidia embedding NIM for variable-dimension models - #2561
FIX #2562: send "dimensions" to Nvidia embedding NIM for variable-dimension models#2561erichare wants to merge 5 commits into
Conversation
… models NvidiaEmbeddingRequest never carried `dimensions`, so for nvidia/llama-3.2-nv-embedqa-1b-v2 (384/512/768/1024/2048, default 2048) the NIM always returned 2048-dim vectors and vectorize failed with "did not return expected embedding length. Expect: '512'. Actual: '2048'". - add `dimensions` to NvidiaEmbeddingRequest, omitted when 0 (NIM rejects 0) - acceptsNvidiaDimensions(modelConfig): model has no fixed vector-dimension; fixed-dimension models (NV-Embed-QA, nv-embedqa-e5-v5) are unchanged - NvidiaEmbeddingClientTest (WireMock) covers both cases
📈 Unit Test Coverage Delta vs Main Branch
|
Unit Test Coverage Report
|
📉 Integration Test Coverage Delta vs Main Branch (dse69-it)
|
Integration Test Coverage Report (dse69-it)
|
📉 Integration Test Coverage Delta vs Main Branch (hcd-it)
|
Integration Test Coverage Report (hcd-it)
|
There was a problem hiding this comment.
The fix is not generalized enough - it can only fix nvidia's problem but not others. I think the key problem is this line https://github.com/stargate/data-api/blob/main/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/VectorizeConfigValidator.java#L355 and specifically model.vectorDimension().get() != 0
it should't go inside this if block and the range dimension should be handled here: https://github.com/stargate/data-api/blob/main/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/VectorizeConfigValidator.java#L372 and add some tests here: https://github.com/stargate/data-api/blob/main/src/test/java/io/stargate/sgv2/jsonapi/api/v1/CreateCollectionIntegrationTest.java#L734
| protected static boolean acceptsNvidiaDimensions( | ||
| EmbeddingProvidersConfig.EmbeddingProviderConfig.ModelConfig modelConfig) { | ||
| return modelConfig.parameters().stream() | ||
| .anyMatch(parameter -> parameter.name().equals("vectorDimension")); |
There was a problem hiding this comment.
Could we explain in java doc why parameter -> parameter.name().equals("vectorDimension") could decide whether models accept dimensions or not
Summary
NvidiaEmbeddingRequestnever carrieddimensions, so the Collection/Table dimension never reached the NIM. For variable-dimension models (nvidia/llama-3.2-nv-embedqa-1b-v2: 384/512/768/1024/2048, default 2048) the NIM always returned 2048-dim vectors and vectorize failed:Changes
NvidiaEmbeddingRequest.dimensions, serialized only when non-zero. The NIM rejectsdimensions: 0with HTTP 400, so it must be omitted (not zeroed) for fixed-dimension models.Verification
dimensions→ 2048;512→ 512;384→ 384;0→ HTTP 400../mvnw test -Dtest=NvidiaEmbeddingClientTest,EmbeddingProviderErrorMessageTest,EmbeddingGatewayClientTest,OpenAiEmbeddingClientTest→ 19 tests, 0 failures.