اليوم، نحن متحمسون لفتح المصدر لسلسلة Qwen2.5-Coder "القوية" و"المتنوعة" و"العملية" (المعروفة سابقًا باسم CodeQwen1.5)، المخصصة للترويج المستمر لتطوير Open CodeLLMs.
قوي: أصبح Qwen2.5-Coder-32B-Instruct هو نموذج التعليمات البرمجية مفتوح المصدر الحالي لـ SOTA، والذي يتوافق مع إمكانات التشفير لـ GPT-4o. على الرغم من إظهاره قدرات برمجية قوية وشاملة، إلا أنه يمتلك أيضًا مهارات عامة ورياضية جيدة؛
متنوع: بناءً على الحجمين المفتوحين سابقًا وهما 1.5B / 7B، يقدم هذا الإصدار أربعة أحجام للنماذج، بما في ذلك 0.5B / 3B / 14B / 32B. اعتبارًا من الآن، قام Qwen2.5-Coder بتغطية ستة أحجام نموذجية رئيسية لتلبية احتياجات المطورين المختلفين؛
؟ عملي: نستكشف التطبيق العملي لـ Qwen2.5-Coder في سيناريوهين، بما في ذلك مساعدي التعليمات البرمجية والعناصر، مع بعض الأمثلة التي تعرض التطبيقات المحتملة لـ Qwen2.5-Coder في سيناريوهات العالم الحقيقي؛
دعم فهم السياق الطويل وتوليده بطول سياق يبلغ 128 ألف رمز مميز؛
دعم 92 لغة ترميز؛
['ada', 'agda', 'alloy', 'antlr', 'applescript', 'assembly', 'augeas', 'awk', 'batchfile', 'bluespec', 'c', 'c#', 'c++', 'clojure', 'cmake', 'coffeescript', 'common-lisp', 'css', 'cuda', 'dart', 'dockerfile', 'elixir', 'elm', 'emacs-lisp', 'erlang', 'f#', 'fortran', 'glsl', 'go', 'groovy', 'haskell', 'html', 'idris', 'isabelle', 'java', 'java-server-pages', 'javascript', 'json', 'julia', 'jupyter-notebook', 'kotlin', 'lean', 'literate-agda', 'literate-coffeescript', 'literate-haskell', 'lua', 'makefile', 'maple', 'markdown', 'mathematica', 'matlab', 'objectc++', 'ocaml', 'pascal', 'perl', 'php', 'powershell', 'prolog', 'protocol-buffer', 'python', 'r', 'racket', 'restructuredtext', 'rmarkdown', 'ruby', 'rust', 'sas', 'scala', 'scheme', 'shell', 'smalltalk', 'solidity', 'sparql', 'sql', 'stan', 'standard-ml', 'stata', 'swift', 'systemverilog', 'tcl', 'tcsh', 'tex', 'thrift', 'typescript', 'verilog', 'vhdl', 'visual-basic', 'vue', 'xslt', 'yacc', 'yaml', 'zig']
الاحتفاظ بنقاط القوة في الرياضيات والقدرات العامة من النموذج الأساسي
مهم
نقوم بتحديث كل من الرموز المميزة ومعرفات الرموز المميزة المقابلة لها، من أجل الحفاظ على الاتساق مع Qwen2.5. الرموز الخاصة الجديدة هي كما يلي:
{ "<|fim_prefix|>": 151659، "<|fim_middle|>": 151660, "<|fim_suffix|>": 151661، "<|fim_pad|>": 151662, "<|repo_name|>": 151663, "<|file_sep|>": 151664, "<|im_start|>": 151644, "<|im_end|>": 151645}
اسم النموذج | يكتب | طول | تحميل |
---|---|---|---|
Qwen2.5-Coder-0.5B | قاعدة | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-1.5B | قاعدة | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-3B | قاعدة | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-7B | قاعدة | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-14B | قاعدة | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-كودر-32B | قاعدة | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-0.5B-instruct | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-1.5B-instruct | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-3B-instruct | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-7B-instruct | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-14B-instruct | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-32B-instruct | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-AWQ | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-GGUF | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-GPTQ-Int4 | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-GPTQ-Int8 | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-AWQ | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-GGUF | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-GPTQ-Int4 | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-GPTQ-Int8 | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-3B-Instruct-AWQ | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-3B-Instruct-GGUF | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-3B-Instruct-GPTQ-Int4 | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-3B-Instruct-GPTQ-Int8 | إرشاد | 32 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-7B-Instruct-AWQ | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-7B-Instruct-GGUF | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-7B-Instruct-GPTQ-Int4 | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-7B-Instruct-GPTQ-Int8 | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-14B-Instruct-AWQ | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-14B-Instruct-GGUF | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-14B-Instruct-GPTQ-Int4 | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-14B-Instruct-GPTQ-Int8 | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-32B-Instruct-AWQ | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-32B-Instruct-GGUF | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-32B-Instruct-GPTQ-Int4 | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
Qwen2.5-Coder-32B-Instruct-GPTQ-Int8 | إرشاد | 128 ألف | معانقة الوجه • ModelScope |
يتم عرض الأداء التفصيلي والمقدمة في هذا؟ مدونة.
python>=3.9
transformers>4.37.0
لنماذج Qwen2.5 الكثيفة.
تحذير
يعد هذا أمرًا ضروريًا لأن رموز Qwen2 المدمجة في "المحولات" منذ "4.37.0".
يمكنك تثبيت الحزم المطلوبة باستخدام الأمر التالي:
تثبيت النقطة -r متطلبات.txt
مهم
Qwen2.5-Coder-[0.5-32]B-Instrcut هي نماذج تعليمات للدردشة؛
Qwen2.5-Coder-[0.5-32]B هو نموذج أساسي يُستخدم عادةً للإكمال، ويعمل كنقطة بداية أفضل للضبط الدقيق.
يمكنك فقط كتابة عدة أسطر من التعليمات البرمجية باستخدام transformers
للدردشة مع Qwen2.5-Coder-32B-Instruct. بشكل أساسي، نقوم ببناء الرمز المميز والنموذج باستخدام طريقة from_pretrained
، ونستخدم طريقة الإنشاء لإجراء الدردشة بمساعدة قالب الدردشة الذي يوفره الرمز المميز. فيما يلي مثال لكيفية الدردشة مع Qwen2.5-Coder-32B-Instruct:
من المحولات استيراد AutoModelForCausalLM، AutoTokenizermodel_name = "Qwen/Qwen2.5-Coder-32B-Instruct"model = AutoModelForCausalLM.from_pretrained(model_name,torch_dtype = "auto"،device_map = "auto")tokenizer = AutoTokenizer.from_pretrained(model_name)prompt = "اكتب خوارزمية الفرز السريع."الرسائل = [ {"role": "system"، "content": "أنت Qwen، تم إنشاؤها بواسطة Alibaba Cloud. أنت مساعد مفيد."}, {"الدور": "المستخدم"، "المحتوى": موجه} ]text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True)model_inputs = tokenizer([text], return_tensors="pt").to(model.device)generated_ids = model.generate(**model_inputs,max_new_tokens= 512)generated_ids = [output_ids[len(input_ids):] لـ input_ids وoutput_ids في ملف مضغوط (model_inputs.input_ids، generator_ids) ]الاستجابة = tokenizer.batch_decode(generated_ids, Skip_special_tokens=True)[0]
يتم استخدام وظيفة apply_chat_template()
لتحويل الرسائل إلى تنسيق يمكن للنموذج فهمه. يتم استخدام الوسيطة add_generation_prompt
لإضافة موجه إنشاء، والذي يشير إلى <|im_start|>assistantn
الإدخال. والجدير بالذكر أننا نطبق قالب ChatML لنماذج الدردشة باتباع ممارستنا السابقة. يتم استخدام الوسيطة max_new_tokens
لتعيين الحد الأقصى لطول الاستجابة. يتم استخدام الدالة tokenizer.batch_decode()
لفك تشفير الاستجابة. فيما يتعلق بالإدخال، تعد الرسائل المذكورة أعلاه مثالًا لإظهار كيفية تنسيق سجل الحوار وموجه النظام. يمكنك استخدام الحجم الآخر لنموذج التعليمات بنفس الطريقة.
يكمل النموذج مقتطفات التعليمات البرمجية وفقًا للمطالبات المحددة، دون أي تنسيق إضافي، والذي يُطلق عليه عادةً اسم code completion
في مهام إنشاء التعليمات البرمجية.
بشكل أساسي، نقوم ببناء الرمز المميز والنموذج باستخدام طريقة from_pretrained
، ونستخدم طريقة الإنشاء لتنفيذ إكمال التعليمات البرمجية. فيما يلي مثال لكيفية الدردشة مع Qwen2.5-Coder-32B:
من المحولات import AutoTokenizer, AutoModelForCausalLMdevice = "cuda" # الجهاز الذي سيتم تحميل النموذج عليه # الآن لا تحتاج إلى إضافة "trust_remote_code=True"TOKENIZER = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-32B")MODEL = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-Coder-32B"، devices_map="auto").eval()# ترميز الإدخال إلى tokensinput_text = "#write خوارزمية فرز سريع"model_inputs = TOKENIZER([input_text], return_tensors ="pt").to(device)# استخدم `max_new_tokens` للتحكم في الحد الأقصى للمخرجات الطول. model_inputs.input_ids[0]):]، Skip_special_tokens=True)print(f"مطالبة: {input_text}nnالنص الذي تم إنشاؤه: {output_text}")
يتم استخدام الوسيطة max_new_tokens
لتعيين الحد الأقصى لطول الاستجابة. يمكن أن يكون input_text
أي نص تريد أن يستمر النموذج فيه.
تم تعيين config.json
الحالي لطول سياق يصل إلى 32,768 رمزًا مميزًا. للتعامل مع المدخلات واسعة النطاق التي تتجاوز 32,768 رمزًا مميزًا، نستخدم YaRN، وهي تقنية لتحسين استقراء طول النموذج، مما يضمن الأداء الأمثل للنصوص الطويلة.
بالنسبة للأطر المدعومة، يمكنك إضافة ما يلي إلى config.json
لتمكين YaRN:
{ ...، "rope_scaling": {"factor": 4.0,"original_max_position_embeddings": 32768,type": "yarn" } }
تتطلب مهمة إدراج التعليمات البرمجية، والتي يشار إليها أيضًا باسم تحدي "ملء الوسط"، إدراج مقاطع التعليمات البرمجية بطريقة تعمل على سد الفجوات داخل سياق التعليمات البرمجية المحدد. للحصول على نهج يتماشى مع أفضل الممارسات، نوصي بالالتزام بإرشادات التنسيق الموضحة في الورقة "التدريب الفعال لنماذج اللغة لملء الوسط"[arxiv]. يتضمن ذلك استخدام ثلاثة رموز مميزة <fim_prefix>
و <fim_suffix>
و <fim_middle>
للإشارة إلى الأجزاء المعنية من بنية التعليمات البرمجية. ينبغي تنظيم المطالبة على النحو التالي:
موجه = '<|fim_prefix|>' + prefix_code + '<|fim_suffix|>' + suffix_code + '<|fim_middle|>'
باتباع النهج المذكور، سيتم تنظيم المثال بهذه الطريقة:
من المحولات import AutoTokenizer, AutoModelForCausalLM# تحميل modeldevice = "cuda" # الجهاز لتحميل النموذج علىTOKENIZER = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-32B")MODEL = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5" -المبرمج-32B"، Device_map="auto").eval()input_text = """<|fim_prefix|>def Quicksort(arr): if len(arr) <= 1: return arr المحور = arr[len(arr) // 2] < |fim_suffix|> middle = [x لـ x في arr إذا x == محوري] يمين = [x لـ x في arr إذا x > المحوري] يُرجع فرزًا سريعًا (يسار) + متوسط + Quicksort(right)<|fim_middle|>"""model_inputs = TOKENIZER([input_text], return_tensors="pt").to(device)# استخدم `max_new_tokens` للتحكم في الحد الأقصى لطول الإخراج.generated_ids = MODEL.generate(model_inputs .input_ids, max_new_tokens=512, do_sample=False)[0]# تتضمن المعرفات التي تم إنشاؤها موجه_ids، نحتاج فقط إلى فك تشفير الرموز المميزة بعد موجه_ids.output_text = TOKENIZER.decode(generated_ids[len(model_inputs.input_ids[0]):], Skip_special_tokens=True)print(f"Prompt: {input_text}nnGenerated text : {output_text}")
تتضمن مهمة إكمال التعليمات البرمجية على مستوى المستودع تغذية النموذج بمحتوى ملفات متعددة من نفس المستودع. يتيح ذلك للنموذج فهم العلاقات المتبادلة بين الاستدعاءات المختلفة داخل هذه الملفات، وبالتالي تسهيل إكمال محتوى التعليمات البرمجية. نوصي باستخدام الرمزين المميزين <|repo_name|>
و <|file_sep|>
للإشارة إلى بنية المستودع. على سبيل المثال، بافتراض أن اسم المستودع مخزن في repo_name
، ويحتوي على ملفات بمساراتها ومحتوياتها المدرجة كـ [( file_path1
, file_content1
), ( file_path2
, file_content2
)]، سيكون تنسيق موجه الإدخال النهائي كما يلي:
input_text = f'''<|repo_name|>{repo_name<|file_sep|>{file_path1} {file_content1<|file_sep|>{file_path2} {file_content2}''
من المحولات import AutoTokenizer, AutoModelForCausalLMdevice = "cuda" # الجهاز الذي سيتم تحميل النموذج عليه # الآن لا تحتاج إلى إضافة "trust_remote_code=True"TOKENIZER = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-32B")MODEL = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-Coder-32B"، devices_map="auto").eval()# قم بترميز الإدخال في tokensinput_text = """<|repo_name|>library-system<|file_sep|>library كتاب .pyclass: def __init__(self, title, Author, isbn, cops): self.title = title self.author = المؤلف self.isbn = isbn self.copies = نسخ def __str__(self): return f"Title: {self.title}، المؤلف: {self.author}، ISBN: {self.isbn}، النسخ: {self. نسخ}"class Library: def __init__(self): self.books = [] def add_book(self, title, Author, isbn, cops): book = Book(title, Author, isbn, cops) self.books.append(book) def find_book(self, isbn): للكتاب في self.books: if book.isbn == isbn: إرجاع الكتاب لا يوجد def list_books(self): إرجاع self.books<|file_sep|> Student.pyclass الطالب: def __init__(self, name, id): self.name = name self.id = id self.borrowed_books = [] def Borrow_book(self, book, مكتبة): إذا كان الكتاب وbook.copies > 0: self.borrowed_books.append(book) book.copies -= 1 return True return False def return_book(self, book, Library): إذا كان الكتاب في self.borrowed_books: self.borrowed_books .remove(book) book.copies += 1 return True return False<|file_sep|>main.pyfrom مكتبة استيراد Libraryfrom طالب استيراد Studentdef main(): # إعداد المكتبة ببعض الكتب Library = Library() Library.add_book("The Great Gatsby", "F. سكوت فيتزجيرالد"، "1234567890"، 3) Library.add_book("To Kill a Mockingbird"، "Harper Lee"، "1234567891"، 2) # إعداد الطالب Student = Student("Alice"، "S1") # طالب يستعير كتابًا"""model_inputs = TOKENIZER([input_text], return_tensors="pt").to(device)# استخدم `max_new_tokens` للتحكم في الحد الأقصى لطول الإخراج.generated_ids = MODEL.generate(model_inputs.input_ids, max_new_tokens=1024, do_sample=False)[0]# تتضمن المعرفات التي تم إنشاؤها موجه_ids، لذلك نحتاج فقط إلى فك تشفير الرموز المميزة بعد موجه_ids.output_text = TOKENIZER.decode(generated_ids[len(model_inputs.input_ids[0]):]، Skip_special_tokens=True)print(f"Prompt: n{input_text}nnالنص الذي تم إنشاؤه: n{output_text}")
الناتج المتوقع كالآتي:
النص الذي تم إنشاؤه:book = Library.find_book("1234567890")if Student.borrow_book(book, Library):print(f"{student.name} اقترضت {book.title}")else:print(f"{student.name } لا يمكن استعارة {book.title}") # يقوم الطالب بإرجاع كتاب إذا تم إرجاع Student.return_book(book, Library):print(f"{student.name} {book.title}")else:print(f"{student.name} لا يمكن إرجاع {book.title}") # قائمة بجميع الكتب في المكتبةprint("جميع الكتب في المكتبة:")للكتاب في المكتبة. list_books():print(book)if __name__ == "__main__":main()
كأحد أفراد عائلة Qwen2.5، يتم دعم Qwen2.5-Coder بواسطة vLLM. يمكن العثور على البرنامج التعليمي التفصيلي في برنامج Qwen التعليمي. هنا، نقدم لك مثالًا بسيطًا على الاستدلال المجمع دون اتصال بالإنترنت في vLLM.
من المحولات import AutoTokenizerfrom vllm import LLM, SamplingParams# تهيئة tokenizertokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-32B")# تمرير معلمات فك التشفير الافتراضية لـ Qwen1.5-32B-Chat# max_tokens هو الحد الأقصى طول Generation.sampling_params = SamplingParams(temperature=0.7, top_p=0.8, repetition_penalty=1.05, max_tokens=1024)# أدخل اسم النموذج أو المسار. يمكن أن تكون نماذج GPTQ أو AWQ.llm = LLM(model="Qwen/Qwen2.5-Coder-32B")# قم بإعداد مطالبتك المطالبة = "#اكتب خوارزمية فرز سريع.ndef fast_sort("# إنشاء مخرجات مخرجات = llm.generate( [مطالبة]، sampling_params)# اطبع المخرجات. للإخراج في المخرجات:prompt =output.promptgenerated_text = output.outputs[0].textprint(f"المطالبة: {prompt!r}، النص الذي تم إنشاؤه: {generated_text!r}")
لزيادة إنتاجية العرض، يساعدك العرض الموزع من خلال الاستفادة من المزيد من أجهزة GPU. عند استخدام تسلسلات طويلة جدًا للاستدلال، قد يتسبب ذلك في عدم كفاية ذاكرة وحدة معالجة الرسومات. نوضح هنا كيفية تشغيل Qwen2.5-Coder-32B بتوازي الموتر فقط عن طريق تمرير الوسيطة tensor_parallel_size
.
llm = LLM(model="Qwen/Qwen2.5-Coder-32B"، Tensor_parallel_size=8)
نوفر أيضًا واجهة Gradio لتجربة أفضل، يتم تشغيلها فقط من خلال:
cd demo/chatbot/# لمستخدمي Linux وWindows (وmacOS مع Intel؟؟)python app.py # بالنسبة لنظام التشغيل macOS مع مستخدمي Apple Silicon، Intel غير مدعوم، ربما يكون هذا أبطأ بمقدار 20 مرة من RTX 4090PYTORCH_ENABLE_MPS_FALLBACK=1 python app.py
نوفر أيضًا واجهة Gradio لوضع القطع الأثرية:
عرض القرص المضغوط / التحف / بيثون app.py
يمكنك تحديد وسيطات --server_port
و --share
و --server_name
لتلبية احتياجاتك!
أو جربه دون عناء على HuggingFace: 「عرض chatbot」؟ 「عرض التحف」
لمزيد من المعلومات، يرجى الرجوع إلى التقرير الفني لـ Qwen2.5-Coder.
إذا وجدت عملنا مفيدًا، فلا تتردد في إعطائنا اقتباسًا.
@article{hui2024qwen2, title={Qwen2. 5-التقرير الفني للمبرمج}، المؤلف={Hui، Binyuan and Yang، Jian and Cui، Zeyu and Yang، Jiaxi and Liu، Dayiheng and Zhang، Lei and Liu، Tianyu and Zhang، Jiajun and Yu، Bowen and Dang، Kai and آخرون}، مجلة = {arXiv طبعة أولية arXiv:2409.12186}، year={2024}}@article{qwen2,title={تقرير Qwen2 الفني},author={An Yang وBaosong Yang وBinyuan Hui وBo Zheng وBoen Yu وChang Zhou وChengpeng Li وChengyuan Li وDayiheng Liu وFei هوانغ وجوانتنج دونج وهاوران وي وهوان لين وجيالونج تانج وجالين وانج وجيان يانج وجيانهونج تو وجيانوي زانج و جيانكسين ما وجين شو وجينغرين تشو وجينزي باي وجينتشنغ هي وجونيانغ لين وكاي دانغ وكيمينغ لو وكيكين تشين وكيكسين يانغ ومي لي ومينغفنغ شيويه ونا ني وبي تشانغ وبنغ وانغ ورو بنغ وروي مين ورويز جاو ورونجي لين وشيجي وانغ وشواي باي وسنان تان وتيانهانغ تشو وتيانهاو لي وتيانيو ليو وWenbin Ge وXiaodong Deng وXiaohuan Zhou وXingzhang Ren وXinyu Zhang وXipin Wei وXuancheng Ren وYang Fan وYang Yao وYichang Zhang وYu Wan وYunfei Chu وYuqiong Liu وZeyu Cui وZhenru Zhang وZhihao Fan}، مجلة = {arXiv نسخة أولية أرخايف:2407.10671},السنة={2024}}
إذا كنت مهتمًا بترك رسالة لفريق البحث أو فريق المنتج لدينا، انضم إلى مجموعات Discord أو WeChat الخاصة بنا!
↑ العودة إلى الأعلى ↑