def METHOD_NAME(pipe, df, anno_2_ex_config, get_embeddings) -> List[str]:
    """Get List of columns in df that are generated from components in the pipeline
        which are at the same output level as the pipe .
    :param pipe: NLU Pipeline
    :param df: Pandas DataFrame resulting from applying the pipe
    :param anno_2_ex_config: mapping between anno to extractor, from get_annotator_extraction_configs()
    :param get_embeddings: Should embeddings be included
    :return: List of columns which are generated from components
            at same output level as the pipe.prediction_output_level
    """
    same_output_level_cols = []
    for c in pipe.components:
        if 'embedding' in c.type and get_embeddings is False:
            continue
        output_level = OutputLevelUtils.resolve_component_to_output_level(pipe, c)
        if output_level == pipe.prediction_output_level:
            generated_cols = ColSubstitutionUtils.get_final_output_cols_of_component(c, df, anno_2_ex_config)
            for generated_col in generated_cols:
                if '_k_' in generated_col and c.jsl_anno_class_id == NLP_HC_NODE_IDS.SENTENCE_ENTITY_RESOLVER:
                    # all _k_ fields of resolver may never be viewed as any common outputlevel and thus never be zipped.
                    continue
                same_output_level_cols.append(generated_col)
    return list(set(same_output_level_cols))