def populate_chunks_and_embeddings(self, chunks: List[str], embeddings: List[List[float]],
                                       for_top_level_field: bool = True) -> None:
        """
        Populate chunks and embeddings to this tensor field. Chunks and embeddings can come from the following sources:
        - For custom vector field, field content is the single chunk, and single embedding is provided by user
        - For existing tensor, chunks and embeddings are from the original document
        - Vectorisation result from the inference process

        When all needed embeddings are populated, the tensor field is marked as resolved. We only select unresolved
        fields when doing vectorisation.

        Args:
            chunks (List[str]): List of chunk keys
            embeddings (List[List[float]]): List of embeddings
            for_top_level_field (bool): if the embedding is for top level field or subfields
        """
        if (not chunks or not embeddings
                or not isinstance(chunks, list) or not isinstance(chunks[0], str)
                or not isinstance(embeddings, list) or not isinstance(embeddings[0], list)
                or not isinstance(embeddings[0][0], (float, int))):  # custom vector can be integers
            raise ValueError(f'Invalid chunks and embeddings for doc: {self.doc_id}, field: {self.field_name}')

        if len(chunks) != len(embeddings):
            raise ValueError(f'Chunk and embedding size does not match for doc: {self.doc_id}, field: {self.field_name}'
                             f': chunk size: {len(chunks)}, embedding size: {len(embeddings)}')

        if for_top_level_field or self.is_audio_or_video():
            self.chunks = chunks
            self.embeddings = embeddings

            if not self.is_multimodal_subfield or self.is_audio_or_video():
                self.is_resolved = True
            else:
                # for image and text fields which are both top level field and subfield
                if len(chunks) == 1 and chunks[0] == self.field_content:
                    # This is an optimisation that if only one chunk is returned and the chunk equals the content
                    # the single embedding can be used as a subfield embedding as well, saving one vectorise call
                    self.multimodal_subfield_embedding = embeddings[0]
                    self.is_resolved = True
        else:
            # for image and text subfields only, it should not be chunked
            if len(chunks) != 1:
                raise ValueError(f'{self.field_name} of doc: {self.doc_id} is a subfield and should not be chunked')

            self.multimodal_subfield_embedding = embeddings[0]
            self.is_resolved = True

        Populate chunks and embeddings to this tensor field. Chunks and embeddings can come from the following sources:
        - For custom vector field, field content is the single chunk, and single embedding is provided by user
        - For existing tensor, chunks and embeddings are from the original document
        - Vectorisation result from the inference process

        When all needed embeddings are populated, the tensor field is marked as resolved. We only select unresolved
        fields when doing vectorisation.

        Args:
            chunks (List[str]): List of chunk keys
            embeddings (List[List[float]]): List of embeddings
            for_top_level_field (bool): if the embedding is for top level field or subfields
        
src/marqo/core/inference/tensor_fields_container.py