TwT-6's picture
Upload 2667 files
256a159 verified
raw
history blame contribute delete
7.32 kB
# Copyright 2023 The Google Research Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Registry of all instructions."""
import opencompass.datasets.IFEval.instructions as instructions
_KEYWORD = 'keywords:'
_LANGUAGE = 'language:'
_LENGTH = 'length_constraints:'
_CONTENT = 'detectable_content:'
_FORMAT = 'detectable_format:'
_MULTITURN = 'multi-turn:'
_COMBINATION = 'combination:'
_STARTEND = 'startend:'
_CHANGE_CASES = 'change_case:'
_PUNCTUATION = 'punctuation:'
INSTRUCTION_DICT = {
_KEYWORD + 'existence':
instructions.KeywordChecker,
_KEYWORD + 'frequency':
instructions.KeywordFrequencyChecker,
# TODO(jeffreyzhou): make a proper set of sentences to choose from
# _KEYWORD + "key_sentences": instructions.KeySentenceChecker,
_KEYWORD + 'forbidden_words':
instructions.ForbiddenWords,
_KEYWORD + 'letter_frequency':
instructions.LetterFrequencyChecker,
_LANGUAGE + 'response_language':
instructions.ResponseLanguageChecker,
_LENGTH + 'number_sentences':
instructions.NumberOfSentences,
_LENGTH + 'number_paragraphs':
instructions.ParagraphChecker,
_LENGTH + 'number_words':
instructions.NumberOfWords,
_LENGTH + 'nth_paragraph_first_word':
instructions.ParagraphFirstWordCheck,
_CONTENT + 'number_placeholders':
instructions.PlaceholderChecker,
_CONTENT + 'postscript':
instructions.PostscriptChecker,
_FORMAT + 'number_bullet_lists':
instructions.BulletListChecker,
# TODO(jeffreyzhou): Pre-create paragraph or use prompt to replace
# _CONTENT + "rephrase_paragraph": instructions.RephraseParagraph,
_FORMAT + 'constrained_response':
instructions.ConstrainedResponseChecker,
_FORMAT + 'number_highlighted_sections':
(instructions.HighlightSectionChecker),
_FORMAT + 'multiple_sections':
instructions.SectionChecker,
# TODO(tianjianlu): Re-enable rephrasing with preprocessing the message.
# _FORMAT + "rephrase": instructions.RephraseChecker,
_FORMAT + 'json_format':
instructions.JsonFormat,
_FORMAT + 'title':
instructions.TitleChecker,
# TODO(tianjianlu): Re-enable with specific prompts.
# _MULTITURN + "constrained_start": instructions.ConstrainedStartChecker,
_COMBINATION + 'two_responses':
instructions.TwoResponsesChecker,
_COMBINATION + 'repeat_prompt':
instructions.RepeatPromptThenAnswer,
_STARTEND + 'end_checker':
instructions.EndChecker,
_CHANGE_CASES + 'capital_word_frequency':
instructions.CapitalWordFrequencyChecker,
_CHANGE_CASES + 'english_capital':
instructions.CapitalLettersEnglishChecker,
_CHANGE_CASES + 'english_lowercase':
instructions.LowercaseLettersEnglishChecker,
_PUNCTUATION + 'no_comma':
instructions.CommaChecker,
_STARTEND + 'quotation':
instructions.QuotationChecker,
}
INSTRUCTION_CONFLICTS = {
_KEYWORD + 'existence': {_KEYWORD + 'existence'},
_KEYWORD + 'frequency': {_KEYWORD + 'frequency'},
# TODO(jeffreyzhou): make a proper set of sentences to choose from
# _KEYWORD + "key_sentences": instructions.KeySentenceChecker,
_KEYWORD + 'forbidden_words': {_KEYWORD + 'forbidden_words'},
_KEYWORD + 'letter_frequency': {_KEYWORD + 'letter_frequency'},
_LANGUAGE + 'response_language': {
_LANGUAGE + 'response_language',
_FORMAT + 'multiple_sections',
_KEYWORD + 'existence',
_KEYWORD + 'frequency',
_KEYWORD + 'forbidden_words',
_STARTEND + 'end_checker',
_CHANGE_CASES + 'english_capital',
_CHANGE_CASES + 'english_lowercase',
},
_LENGTH + 'number_sentences': {_LENGTH + 'number_sentences'},
_LENGTH + 'number_paragraphs': {
_LENGTH + 'number_paragraphs',
_LENGTH + 'nth_paragraph_first_word',
_LENGTH + 'number_sentences',
_LENGTH + 'nth_paragraph_first_word',
},
_LENGTH + 'number_words': {_LENGTH + 'number_words'},
_LENGTH + 'nth_paragraph_first_word': {
_LENGTH + 'nth_paragraph_first_word',
_LENGTH + 'number_paragraphs',
},
_CONTENT + 'number_placeholders': {_CONTENT + 'number_placeholders'},
_CONTENT + 'postscript': {_CONTENT + 'postscript'},
_FORMAT + 'number_bullet_lists': {_FORMAT + 'number_bullet_lists'},
# TODO(jeffreyzhou): Pre-create paragraph or use prompt to replace
# _CONTENT + "rephrase_paragraph": instructions.RephraseParagraph,
_FORMAT + 'constrained_response':
set(INSTRUCTION_DICT.keys()),
_FORMAT + 'number_highlighted_sections':
{_FORMAT + 'number_highlighted_sections'},
_FORMAT + 'multiple_sections': {
_FORMAT + 'multiple_sections',
_LANGUAGE + 'response_language',
_FORMAT + 'number_highlighted_sections',
},
# TODO(tianjianlu): Re-enable rephrasing with preprocessing the message.
# _FORMAT + "rephrase": instructions.RephraseChecker,
_FORMAT + 'json_format':
set(INSTRUCTION_DICT.keys()).difference(
{_KEYWORD + 'forbidden_words', _KEYWORD + 'existence'}),
_FORMAT + 'title': {_FORMAT + 'title'},
# TODO(tianjianlu): Re-enable with specific prompts.
# _MULTITURN + "constrained_start": instructions.ConstrainedStartChecker,
_COMBINATION + 'two_responses':
set(INSTRUCTION_DICT.keys()).difference({
_KEYWORD + 'forbidden_words', _KEYWORD + 'existence',
_LANGUAGE + 'response_language', _FORMAT + 'title',
_PUNCTUATION + 'no_comma'
}),
_COMBINATION + 'repeat_prompt':
set(INSTRUCTION_DICT.keys()).difference(
{_KEYWORD + 'existence', _FORMAT + 'title',
_PUNCTUATION + 'no_comma'}),
_STARTEND + 'end_checker': {_STARTEND + 'end_checker'},
_CHANGE_CASES + 'capital_word_frequency': {
_CHANGE_CASES + 'capital_word_frequency',
_CHANGE_CASES + 'english_lowercase',
_CHANGE_CASES + 'english_capital',
},
_CHANGE_CASES + 'english_capital': {_CHANGE_CASES + 'english_capital'},
_CHANGE_CASES + 'english_lowercase': {
_CHANGE_CASES + 'english_lowercase',
_CHANGE_CASES + 'english_capital',
},
_PUNCTUATION + 'no_comma': {_PUNCTUATION + 'no_comma'},
_STARTEND + 'quotation': {_STARTEND + 'quotation', _FORMAT + 'title'},
}
def conflict_make(conflicts):
"""Makes sure if A conflicts with B, B will conflict with A.
Args:
conflicts: Dictionary of potential conflicts where key is instruction id
and value is set of instruction ids that it conflicts with.
Returns:
Revised version of the dictionary. All instructions conflict with
themselves. If A conflicts with B, B will conflict with A.
"""
for key in conflicts:
for k in conflicts[key]:
conflicts[k].add(key)
conflicts[key].add(key)
return conflicts