Path: blob/main/extensions/copilot/src/platform/embeddings/test/node/packEmbedding.spec.ts
13405 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { suite, test } from 'vitest';7import { Embedding, EmbeddingType } from '../../../embeddings/common/embeddingsComputer';8import { packEmbedding, unpackEmbedding } from '../../common/embeddingsStorage';910suite('Pack Embedding', () => {11test('Text3small should pack and unpack to same values', () => {12const embedding: Embedding = {13type: EmbeddingType.text3small_512,14// Start with float32 array so that we don't check for the very small rounding15// that can happen when going from js number -> float3216value: Array.from(Float32Array.from({ length: 512 }, () => Math.random())),17};1819const serialized = packEmbedding(embedding);20const deserialized = unpackEmbedding(EmbeddingType.text3small_512, serialized);21assert.deepStrictEqual(deserialized.value.length, embedding.value.length);22assert.deepStrictEqual(deserialized.value, embedding.value);23});2425test('Metis should use binary storage', () => {26const embedding: Embedding = {27type: EmbeddingType.metis_1024_I16_Binary,28value: Array.from({ length: 1024 }, () => Math.random() < 0.5 ? 0.03125 : -0.03125)29};3031const serialized = packEmbedding(embedding);32assert.strictEqual(serialized.length, 1024 / 8);3334const deserialized = unpackEmbedding(EmbeddingType.metis_1024_I16_Binary, serialized);35assert.deepStrictEqual(deserialized.value.length, embedding.value.length);36assert.deepStrictEqual(deserialized.value, embedding.value);37});3839test('Unpack should work with buffer offsets', () => {40const embedding: Embedding = {41type: EmbeddingType.metis_1024_I16_Binary,42value: Array.from({ length: 1024 }, () => Math.random() < 0.5 ? 0.03125 : -0.03125)43};4445const serialized = packEmbedding(embedding);4647// Now create a new buffer and write the serialized data to it at an offset48const prefixAndSuffixSize = 512;49const buffer = new Uint8Array(serialized.length + prefixAndSuffixSize * 2);50for (let i = 0; i < serialized.length; i++) {51buffer[i + prefixAndSuffixSize] = serialized[i];52}5354const serializedCopy = new Uint8Array(buffer.buffer, prefixAndSuffixSize, serialized.length);5556const deserialized = unpackEmbedding(EmbeddingType.metis_1024_I16_Binary, serializedCopy);57assert.deepStrictEqual(deserialized.value.length, embedding.value.length);58assert.deepStrictEqual(deserialized.value, embedding.value);59});6061test('Unpack should work with old style metis data', () => {62const embedding: Embedding = {63type: EmbeddingType.metis_1024_I16_Binary,64value: Array.from({ length: 1024 }, () => Math.random() < 0.5 ? 0.03125 : -0.03125)65};6667// Don't use pack68const float32Buf = Float32Array.from(embedding.value);69const serialized = new Uint8Array(float32Buf.buffer, float32Buf.byteOffset, float32Buf.byteLength);7071const deserialized = unpackEmbedding(EmbeddingType.metis_1024_I16_Binary, serialized);72assert.deepStrictEqual(deserialized.value.length, embedding.value.length);73assert.deepStrictEqual(deserialized.value, embedding.value);74});75});767778