هذا هو المستودع الرسمي لمحاذاة إعادة إصلاح .
مروحة Run-Ze ، Xuefeng Li ، Haoyang Zou ، Junlong LI ، Shwai He ، Ethan Chern ، Jiewen Hu ، Pengfei Liu
نستكشف رفع جودة بيانات التعليمات الحالية لتتوافق بشكل أفضل مع القيم الإنسانية ، وتقديم نهج بسيط وفعال يسمى "إعادة التنسيق " ، والذي يعيد إعادة صياغة استجابات بيانات التعليمات إلى تنسيق أفضل مع المعايير المسبقة والأدلة المجمعة. يقلل هذا النهج من التعليقات التوضيحية البشرية ، والهلوسة ، وصعوبة التحجيم ، وتبقى متعامدًا لتقنيات المحاذاة الحالية. من الناحية التجريبية ، تعزز إعادة تنظيم قدرة المحاذاة العامة ، وتفكير الرياضيات ، والواقعية ، وقابلية القراءة في LLMs.
بشكل مشجع ، دون تقديم أي بيانات إضافية أو تقنيات تدريب متقدمة ، ومجرد إعادة تنسيق الاستجابة ، يمكن تحسين قدرة التفكير الرياضي في LLAMA-2-13B على GSM8K من 46.77 ٪ إلى 56.63 ٪ في الدقة. بالإضافة إلى ذلك ، فإن 5 ٪ فقط من بيانات إعادة تنظيم تعطي زيادة بنسبة 67 ٪ في قدرة المحاذاة العامة التي تقاسها مجموعة بيانات الألبكة. يسلط هذا العمل الضوء على الحاجة إلى مزيد من البحث في العلوم والتفسير الميكانيكي لـ LLMs.
تتمثل الفلسفة الأساسية لإعادة التنسيق في إعادة تنسيق أدوار البشر و LLMS في عملية المحاذاة ، والاستفادة من نقاط قوته التكميلية-البشر يوضحون تفضيلاتهم ، و LLMs ، بدورها ، إعادة بناء التعليمات بناءً على قوتهم التوليدية (على سبيل المثال ، قدرة التتبع التعليمية) ، دون استخدام المعرفة المقطوعة مباشرة. من خلال هذا التآزر التعاوني ، نتوقع ألا تكون بيانات التعليمات التي تم إنشاؤها أكثر دقة فحسب ، بل تتماشى بشكل أكبر مع التفضيلات البشرية.


تتكشف عملية إعادة تنظيم في ثلاث خطوات رئيسية.
تتضمن الخطوة الأولى تعريف المعايير ، حيث يحدد البشر تفضيلاتهم (على سبيل المثال ، التنسيق المفضل للاستجابات) في سيناريوهات مختلفة في شكل لغة طبيعية. في هذه الورقة ، نحدد بدقة معايير 46 سيناريوهات متميزة.
الخطوة الثانية ، زيادة الاسترجاع ، توسع قاعدة المعرفة للمهام كثيفة المعرفة مثل QA المجال المفتوح والتحقق من الحقيقة. يتم تحقيق ذلك من خلال دمج معلومات إضافية ، وبالتالي تحسين واقعية الاستجابات والمعلوماتية.
تهدف الخطوة النهائية ، إعادة التنسيق ، إلى إعادة تحديد الاستجابات مع المعايير المسبقة المسبقة والأدلة المجمعة ، مما يضمن المخرجات التي يتم تنظيمها ومثبتة.


نستخدم python 3.10 في هذا المشروع. نشجعك على إنشاء بيئة افتراضية من خلال conda .
بعد ذلك ، يتعين علينا تثبيت جميع المكتبات المدرجة في requirements.txt . لاحظ أنه يمكنك اختيار إصدار مناسب من torch وفقًا لإصدار CUDA الخاص بك (نكتب torch>=2.0.1+cu118 في هذا الملف).
pip install -r requirements.txtقم بتنزيل مصنف المهام من Huggingface Hub:
| اسم النموذج | نقاط التفتيش HF | مقاس | رخصة |
|---|---|---|---|
| مصنف المهام | ؟ Gair/Reenign-tass-classifier | 13 ب | لاما 2 |
بعد ذلك ، باستخدام المطالبة التالية ، يمكن لمصنف المهام تحديد المهمة التي ينتمي إليها الاستعلام:
PROMPT_INPUT_FOR_TASK_CLS : str = '''
You will receive a user's query. Additionally, you are given some pre-defined tasks below:
[Existing tasks start]
question_generation
story_generation
poem_generation
email_generation
data_generation
advice_giving
recommendations
how_to_generation
planning
instructional_rewriting
language_polishing
paraphrasing
text_correction
code_correction
code_simplification
information_extraction
keywords_extraction
table_extraction
title_generation
text_summarization
note_summarization
explain_code
explain_answer
text_to_text_translation
text_to_code_translation
code_to_code_translation
code_to_text_translation
open_qa
closed_qa
fill_in_the_blank
fact_verification
math_puzzles
language_learning_questions
natural_language_learning_tutor
exam_problem_solving_tutor
ml_ai_language_model_tutor
general_classification
ordering
sentiment_analysis
code_language_classification
language_classification
topic_classification
value_judgement
rejecting
roleplay
default
[Existing tasks end]
You objective is to choose the most appropriate task that can reflect the high-level intention of this query. You should first clearly give out your choice. Your choice should exactly match one of the task names provided above, without any modification. Do not include the task description in your choice.
Your output should be just the task name.
User's query is below:
[User's query start]
{input}
[User's query end]
Task name:
'''هنا مثال:
from vllm import LLM , SamplingParams
import torch
num_gpus = torch . cuda . device_count ()
model_name_or_dir = "GAIR/ReAlign-Task-Classifier" # or the local directory to store the downloaded model
llm = LLM ( model = model_name_or_dir , tensor_parallel_size = num_gpus )
query = "Give three tips for staying healthy."
input_ = PROMPT_INPUT_FOR_TASK_CLS . format ( input = query )
sampling_params = SamplingParams ( temperature = 0.0 , top_p = 1.0 , max_tokens = 50 )
outputs = llm . generate ( input_ , sampling_params )
task = output [ 0 ]. outputs [ 0 ]. text
print ( task ) # should be `advice_giving`.
# If the classified result is not in task list, set it as `default`. قم بتحويل مجموعة البيانات الخاصة بك إلى التنسيق التالي مع نوع JSON ، مثل مجموعات البيانات إعادة تنظيم.
هنا مثال:
[
{
"id" : 0 ,
"items" : [
{
# question
"from" : "human" ,
"value" : "Give three tips for staying healthy." ,
"category" : "advice_giving"
},
{
# response
"from" : "gpt" ,
"value" : "1.Eat a balanced diet and make sure to include plenty of fruits and vegetables. n 2. Exercise regularly to keep your body active and strong. n 3. Get enough sleep and maintain a consistent sleep schedule."
}
]
}
]اضبط مفتاح API الخاص بك:
export SERPER_API_KEY = ...قم بتشغيل البرنامج النصي التالي:
python retrieval . py
- - input_data_path dataset . json
- - output_path dataset_retrieval . json
- - batch_size 10ملف الإخراج:
يتم إضافة dataset_retrieval.json نتائج الاسترجاع الأصلية.
تتم إضافة نتائج الاسترجاع dataset_retrieval_clean_evidence.json تم التنظيف. هذا يستخدم لإعادة تنظيم.
اضبط مفتاح Openai API:
export OPENAI_API_KEY = ...قم بتشغيل البرنامج النصي التالي:
python reformat . py
- - input_data_path dataset_retrieval_clean_evidence . json
- - output_directory reformat_results
- - tokenizer_path meta - llama / Llama - 2 - 7 b - chat - hf # or the local directory to store the downloaded tokenizer
- - dataset_batch_id 0 # the first file (it's in 0 - 9) of ten files
- - dataset_batch_num 10 # the total number of the file
- - openai_key < OPENAI_API_KEY >
- - top_k 2 # output 2 reformatted response for each response
- - model gpt - 3.5 - turbo - 1106
- - temperature 0.3
- - top_p 1
- - target_length 4096 لاحظ أننا نستخدم عملية موازية للتسريع ، مما يعني أننا سنقوم بتشغيل عمليات dataset_batch_num في نفس الوقت لإعادة الصياغة ، وستحتاج كل عملية إلى تحديد dataset_batch_id يدويًا.
على سبيل المثال:
إذا قمت بتعيين dataset_batch_num AS 10 ، فهذا يعني أن مجموعات البيانات سيتم تقسيمها إلى 10 dataset (تسارع 10x). يجب عليك تشغيل البرنامج النصي 10 مرات في نفس الوقت ، في كل مرة تحديد dataset_batch_id AS 0 إلى 9.
بعد ذلك ، يمكنك الحصول على ملفات dataset_batch_num في الدليل output_directory .
قم بتشغيل البرنامج النصي التالي لدمج هذه الملفات في مجموعات بيانات نهائية واحدة:
python parallel_data_merge . py
- - input_data_path dataset_retrieval_clean_evidence . json # the <input_data_path> in reformat script
- - output_directory reformat_results # the <output_directory> in reformat script
- - final_output_path dataset_reformat . jsonأخيرًا ، يمكنك الحصول على مجموعات البيانات النهائية التي تم إعادة إصلاحها.
يمكنك الجمع بين قواعد التصفية في rewrite_data_selection.py أو تخصيص قواعد التصفية.
قم بتشغيل البرنامج النصي التالي لتصفية مجموعة البيانات التي تم إعادة إصلاحها:
python rewrite_data_selection . py
- - input_original_data_path dataset_retrieval_clean_evidence . json # the dataset path before reformatting
- - input_rewrite_data_path dataset_reformat . json # the reformatted dataset path
- - output_path realign_dataset . json # the final dataset path after filtering الآن ، يمكنك الحصول على مجموعة البيانات النهائية realign_dataset.json .
نحن نعيد إعادة تهيئة خمس مجموعات بيانات قائمة على المفتوح ، الألبكة ، بدون روبوتات ، GSM8K ، والرياضيات:
إعادة تنظيم Open-Platypus: datasets/realign_OpenPlatypus.json
إعادة تنظيم الألبكة: datasets/realign_alpaca.json
إعادة تنظيم لا روبوتات: datasets/realign_no_robots.json
إعادة تنظيم GSM8K: datasets/realign_gsm8k.json
إعادة تنظيم الرياضيات: datasets/realign_math.json
يمكن أيضًا تحميل مجموعات البيانات على الوجه المعانقة:
| اسم مجموعة البيانات | معانقة رابط الوجه | مقاس |
|---|---|---|
| إعادة تنظيم Open-Platypus | ؟ Gair/Reenign-Open-Platypus | 25 كيلو |
| إعادة تنظيم الألبكة | ؟ جاير/إعادة تنظيم alpaca | 52 كيلو |
| إعادة تنظيم أي روبوتات | ؟ جاير/إعادة تنظيم لا رو | 10K |
| إعادة تنظيم GSM8K | ؟ Gair/Reenign-GSM8K | 7.4k |
| إعادة تنظيم الرياضيات | ؟ جاير/إعادة تنظيم | 6.5k |
يمكن العثور على وصف المهام والتنسيقات المحددة مسبقًا في code/constant.py .
بيانات التدريب الخاصة بمصنف المهام موجودة في datasets/classification/task_classifier_train_dataset.json .
بيانات الاختبار موجودة في datasets/classification/task_classifier_test_dataset.json .
التنسيق كما يلي:
{
"instruction" : "Create a story about a dog that finds a magical portal." ,
"category" : "story_generation"
} نقوم بتجربة 100 حالة بشكل عشوائي من مجموعة بيانات NQ لتقييم الواقعية ، والتي يمكن العثور عليها في datasets/nq .
الحقيقة الأساسية في datasets/nq/nq_factuality_100.json .
التنسيق كما يلي:
{
"items" : [
{
"from" : "human" ,
"value" : "when did the democratic party change its name?"
},
{
"from" : "gpt" ,
"value" : "the 1830s"
}
],
"id" : 0
}يرجى الاستشهاد بالورقة إذا كان المورد في هذا الريبو أو الورقة مفيدة لك.
@article{fan2024reformatted,
title={Reformatted Alignment},
author={Fan, Run-Ze and Li, Xuefeng and Zou, Haoyang and Li, Junlong and He, Shwai and Chern, Ethan and Hu, Jiewen and Liu, Pengfei},
year={2024},
journal={arXiv preprint arXiv:2402.12219},
url={https://arxiv.org/abs/2402.12219}
}
نشكر أعضاء Gair على مراجعة ورقتنا وإعطاء ملاحظات قيمة. نحن نقدر المؤلفين في OpenChat لتوفير قاعدة كود التدريب والمساعدة.