davidberenstein1957
HF staff
Refactor stop sequences in chat.py for improved template handling
4af6d10
from distilabel.steps.tasks import ChatGeneration, Magpie, TextGeneration | |
from synthetic_dataset_generator.constants import ( | |
MAGPIE_PRE_QUERY_TEMPLATE, | |
MAX_NUM_TOKENS, | |
) | |
from synthetic_dataset_generator.pipelines.base import _get_llm, _get_llm_class | |
INFORMATION_SEEKING_PROMPT = ( | |
"You are an AI assistant designed to provide accurate and concise information on a wide" | |
" range of topics. Your purpose is to assist users in finding specific facts," | |
" explanations, or details about various subjects. Provide clear, factual responses and," | |
" when appropriate, offer additional context or related information that might be useful" | |
" to the user." | |
) | |
REASONING_PROMPT = ( | |
"You are an AI assistant specialized in logical thinking and problem-solving. Your" | |
" purpose is to help users work through complex ideas, analyze situations, and draw" | |
" conclusions based on given information. Approach each query with structured thinking," | |
" break down problems into manageable parts, and guide users through the reasoning" | |
" process step-by-step." | |
) | |
PLANNING_PROMPT = ( | |
"You are an AI assistant focused on helping users create effective plans and strategies." | |
" Your purpose is to assist in organizing thoughts, setting goals, and developing" | |
" actionable steps for various projects or activities. Offer structured approaches," | |
" consider potential challenges, and provide tips for efficient execution of plans." | |
) | |
EDITING_PROMPT = ( | |
"You are an AI assistant specialized in editing and improving written content. Your" | |
" purpose is to help users refine their writing by offering suggestions for grammar," | |
" style, clarity, and overall structure. Provide constructive feedback, explain your" | |
" edits, and offer alternative phrasings when appropriate." | |
) | |
CODING_DEBUGGING_PROMPT = ( | |
"You are an AI assistant designed to help with programming tasks. Your purpose is to" | |
" assist users in writing, reviewing, and debugging code across various programming" | |
" languages. Provide clear explanations, offer best practices, and help troubleshoot" | |
" issues. When appropriate, suggest optimizations or alternative approaches to coding" | |
" problems." | |
) | |
MATH_SYSTEM_PROMPT = ( | |
"You are an AI assistant designed to provide helpful, step-by-step guidance on solving" | |
" math problems. The user will ask you a wide range of complex mathematical questions." | |
" Your purpose is to assist users in understanding mathematical concepts, working through" | |
" equations, and arriving at the correct solutions." | |
) | |
ROLE_PLAYING_PROMPT = ( | |
"You are an AI assistant capable of engaging in various role-playing scenarios. Your" | |
" purpose is to adopt different personas or characters as requested by the user. Maintain" | |
" consistency with the chosen role, respond in character, and help create immersive and" | |
" interactive experiences for the user." | |
) | |
DATA_ANALYSIS_PROMPT = ( | |
"You are an AI assistant specialized in data analysis and interpretation. Your purpose is" | |
" to help users understand and derive insights from data sets, statistics, and analytical" | |
" tasks. Offer clear explanations of data trends, assist with statistical calculations," | |
" and provide guidance on data visualization and interpretation techniques." | |
) | |
CREATIVE_WRITING_PROMPT = ( | |
"You are an AI assistant designed to support creative writing endeavors. Your purpose is" | |
" to help users craft engaging stories, poems, and other creative texts. Offer" | |
" suggestions for plot development, character creation, dialogue writing, and other" | |
" aspects of creative composition. Provide constructive feedback and inspire creativity." | |
) | |
ADVICE_SEEKING_PROMPT = ( | |
"You are an AI assistant focused on providing thoughtful advice and guidance. Your" | |
" purpose is to help users navigate various personal or professional issues by offering" | |
" balanced perspectives, considering potential outcomes, and suggesting practical" | |
" solutions. Encourage users to think critically about their situations while providing" | |
" supportive and constructive advice." | |
) | |
BRAINSTORMING_PROMPT = ( | |
"You are an AI assistant specialized in generating ideas and facilitating creative" | |
" thinking. Your purpose is to help users explore possibilities, think outside the box," | |
" and develop innovative concepts. Encourage free-flowing thoughts, offer diverse" | |
" perspectives, and help users build upon and refine their ideas." | |
) | |
PROMPT_CREATION_PROMPT = f"""You are an AI assistant specialized in generating very precise prompts for dataset creation. | |
Your task is to write a prompt following the instruction of the user. Respond with the prompt and nothing else. | |
In the generated prompt always finish with this sentence: User questions are direct and concise. | |
The prompt you write should follow the same style and structure as the following example prompts: | |
{INFORMATION_SEEKING_PROMPT} | |
{REASONING_PROMPT} | |
{PLANNING_PROMPT} | |
{CODING_DEBUGGING_PROMPT} | |
{EDITING_PROMPT} | |
{ROLE_PLAYING_PROMPT} | |
{DATA_ANALYSIS_PROMPT} | |
{CREATIVE_WRITING_PROMPT} | |
{ADVICE_SEEKING_PROMPT} | |
{BRAINSTORMING_PROMPT} | |
User dataset description: | |
""" | |
DEFAULT_DATASET_DESCRIPTIONS = [ | |
"rude customer assistant for a phone company", | |
"assistant that solves math puzzles using python", | |
] | |
if MAGPIE_PRE_QUERY_TEMPLATE == "llama3": | |
_STOP_SEQUENCES = [ | |
"<|eot_id|>", | |
"<|start_header_id|>", | |
"assistant", | |
" \n\n", | |
] | |
elif MAGPIE_PRE_QUERY_TEMPLATE == "qwen2": | |
_STOP_SEQUENCES = ["<|im_end|>", "<|im_start|>", "assistant", "\n\n"] | |
else: | |
_STOP_SEQUENCES = [ | |
"<|eot_id|>", | |
"<|start_header_id|>", | |
"assistant", | |
" \n\n", | |
] | |
def _get_output_mappings(num_turns): | |
if num_turns == 1: | |
return {"instruction": "prompt", "response": "completion"} | |
else: | |
return {"conversation": "messages"} | |
def get_prompt_generator(): | |
generation_kwargs = { | |
"temperature": 0.8, | |
"max_new_tokens": MAX_NUM_TOKENS, | |
"do_sample": True, | |
} | |
prompt_generator = TextGeneration( | |
llm=_get_llm(generation_kwargs=generation_kwargs), | |
system_prompt=PROMPT_CREATION_PROMPT, | |
use_system_prompt=True, | |
) | |
prompt_generator.load() | |
return prompt_generator | |
def get_magpie_generator(system_prompt, num_turns, temperature, is_sample): | |
input_mappings = _get_output_mappings(num_turns) | |
output_mappings = input_mappings.copy() | |
if num_turns == 1: | |
generation_kwargs = { | |
"temperature": temperature, | |
"do_sample": True, | |
"max_new_tokens": 256 if is_sample else int(MAX_NUM_TOKENS * 0.25), | |
"stop_sequences": _STOP_SEQUENCES, | |
} | |
magpie_generator = Magpie( | |
llm=_get_llm( | |
generation_kwargs=generation_kwargs, | |
magpie_pre_query_template=MAGPIE_PRE_QUERY_TEMPLATE, | |
use_magpie_template=True, | |
), | |
n_turns=num_turns, | |
output_mappings=output_mappings, | |
only_instruction=True, | |
) | |
else: | |
generation_kwargs = { | |
"temperature": temperature, | |
"do_sample": True, | |
"max_new_tokens": 256 if is_sample else int(MAX_NUM_TOKENS * 0.5), | |
"stop_sequences": _STOP_SEQUENCES, | |
} | |
magpie_generator = Magpie( | |
llm=_get_llm( | |
generation_kwargs=generation_kwargs, | |
magpie_pre_query_template=MAGPIE_PRE_QUERY_TEMPLATE, | |
use_magpie_template=True, | |
), | |
end_with_user=True, | |
n_turns=num_turns, | |
output_mappings=output_mappings, | |
) | |
magpie_generator.load() | |
return magpie_generator | |
def get_response_generator(system_prompt, num_turns, temperature, is_sample): | |
if num_turns == 1: | |
generation_kwargs = { | |
"temperature": temperature, | |
"max_new_tokens": 256 if is_sample else int(MAX_NUM_TOKENS * 0.5), | |
} | |
response_generator = TextGeneration( | |
llm=_get_llm(generation_kwargs=generation_kwargs), | |
system_prompt=system_prompt, | |
output_mappings={"generation": "completion"}, | |
input_mappings={"instruction": "prompt"}, | |
) | |
else: | |
generation_kwargs = { | |
"temperature": temperature, | |
"max_new_tokens": MAX_NUM_TOKENS, | |
} | |
response_generator = ChatGeneration( | |
llm=_get_llm(generation_kwargs=generation_kwargs), | |
output_mappings={"generation": "completion"}, | |
input_mappings={"conversation": "messages"}, | |
) | |
response_generator.load() | |
return response_generator | |
def generate_pipeline_code(system_prompt, num_turns, num_rows): | |
input_mappings = _get_output_mappings(num_turns) | |
code = f""" | |
# Requirements: `pip install distilabel[hf-inference-endpoints]` | |
import os | |
from distilabel.pipeline import Pipeline | |
from distilabel.steps import KeepColumns | |
from distilabel.steps.tasks import MagpieGenerator | |
from distilabel.llms import {_get_llm_class()} | |
SYSTEM_PROMPT = "{system_prompt}" | |
with Pipeline(name="sft") as pipeline: | |
magpie = MagpieGenerator( | |
llm={_get_llm_class()}.from_dict( | |
{_get_llm().dump()} | |
), | |
n_turns={num_turns}, | |
num_rows={num_rows}, | |
batch_size=1, | |
system_prompt=SYSTEM_PROMPT, | |
output_mappings={input_mappings}, | |
) | |
keep_columns = KeepColumns( | |
columns={list(input_mappings.values())} + ["model_name"], | |
) | |
magpie.connect(keep_columns) | |
if __name__ == "__main__": | |
distiset = pipeline.run() | |
""" | |
return code | |