Qwen 2.5 Coder 32B: آیا این بهترین مدل وزن باز بهتر از GPT-4o و غزل کلود 3.5 است؟


نویسنده(های): برهومی مصبه

در ابتدا منتشر شد به سمت هوش مصنوعی.

منبع

در 11 نوامبر، علی بابا پیشرفته ترین مدل کدنویسی خود را تا به امروز معرفی کرد: Qwen 2.5-Coder-32B-Instruct. اما این همه چیز نیست، در واقع بخشی از یک خانواده کامل از مدل های کدنویسی است! علاوه بر مدل 32B، نسخه هایی با پارامترهای 0.5B، 1.5B، 3B، 7B و 14B وجود دارد. قبل از نوشتن این مقاله، بازخورد بسیاری از یوتیوب‌برها، نویسندگان و کارشناسان فنی را بررسی کردم و اتفاق نظر بسیار مثبت بود. امروز، ما بررسی خواهیم کرد که آیا واقعاً مطابق با تبلیغات تبلیغاتی است یا خیر.

من مدتی است که از ChatGPT، Gemini و Claude استفاده می کنم و می توانم با اطمینان بگویم که کلود در کدنویسی و درک وظایف پیچیده بهترین است. صادقانه بگویم، جمینی در یک لیگ متفاوت است. واقعیت جالب: من یک بار برنده شدم یادگیری ماشینی رقابت دو سال پیش با استفاده از Bard (که اکنون به عنوان جمینی تغییر نام داده شده است) زیرا همه از ChatGPT استفاده می کردند. عملکرد بارد در آن زمان به من برتری رقابتی داد. امروز، من معتقدم Gemini ممکن است بهترین مدل بینایی موجود باشد، اما در کل، من طرفدار زیادی نیستم.

به ارزیابی کنید عملکرد مدل در کدنویسی، باید سه جنبه کلیدی زیر را پوشش دهیم: تولید کد، تعمیر کد، و استدلال کد. علاوه بر این، ما باید در نظر بگیریم که مدل از چند زبان برنامه نویسی پشتیبانی می کند و همسویی آن با ترجیحات انسانی.

نمای کلی

قبل از آزمایش مدل علی بابا، بیایید نگاهی به نتایج عملکردی که آنها اعلام کرده اند بیندازیم.

منبع

بر اساس معیارهای داخلی آنها، حتی از GPT-4 نیز بهتر است و به کلود 3.5 بسیار نزدیک است. با این حال، من شخصاً وزن زیادی برای معیارهای داخلی به تنهایی قائل نیستم، اما نتایج به نظر کسانی که آن را امتحان کرده اند بسیار جالب به نظر می رسد.

شما می توانید جزئیات بیشتر در مورد عملکرد را در اینجا بیابید:

Qwen2.5-Coder-32B-Instruct – Qwen2

اکنون زمان آن است، 11 نوامبر 10:24! بهترین زمان برای بهترین مدل کدگذار ما تا کنون! Qwen2.5-Coder-32B-Instruct!

qwen2.org

من در حال تست مدل به صورت محلی با استفاده از اولاما:

qwen2.5-coder:32b

آخرین سری از مدل‌های Qwen خاص کد، با پیشرفت‌های قابل توجه در تولید کد، استدلال کد و…

olama.com

همچنین می توانید این مدل را در صفحه نمایشی Hugging Face امتحان کنید:

نسخه ی نمایشی کدگذار Qwen2.5 – فضای صورت در آغوش گرفته توسط Qwen

برنامه های شگفت انگیز ML ساخته شده توسط انجمن را کشف کنید

huggingface.co

تولید کد

بسیاری از افراد قبلاً نحوه عملکرد آن در طراحی وب و طراحی را پوشش داده اند:

https://www.youtube.com/watch?v=KYvVl0UT1Sk

بنابراین، ما بر روی آزمایش آن با برخی از چالش های پایتون تمرکز خواهیم کرد. بیایید با یک مشکل LeetCode سطح متوسط ​​شروع کنیم:

اعلان

شرح مشکل: طولانی ترین زیر رشته بدون نویسه های تکراری

پاسخ دهید

class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""

# Dictionary to store the last seen index of each character
char_index_map = {}
# Initialize the start of the current window and the maximum length
start = 0
max_length = 0

for end in range(len(s)):
# If the character is already in the map and its index is within the current window
if s[end] in char_index_map and char_index_map[s[end]] >= start:
# Move the start to the right of the last occurrence of the current character
start = char_index_map[s[end]] + 1

# Update the last seen index of the current character
char_index_map[s[end]] = end

# Update the maximum length of the substring found so far
max_length = max(max_length, end - start + 1)

return max_length

نتایج

تصویر از نویسنده

بهترین نیست، اما کارها را انجام می دهد و تمام تست ها را با موفقیت پشت سر می گذارد. آیا می تواند یک مشکل سخت را حل کند؟ (توجه داشته باشید که این مدل قبلاً می توانست در مورد این مشکلات آموزش دیده باشد، اما هنوز هم چشمگیر است.)

اعلان

شرح مشکل: تطبیق عبارات منظم

پاسخ دهید

class Solution(object):
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""

m, n = len(s), len(p)

# Create a 2D array to store the results of subproblems
dp = [[False] * (n + 1) for _ in range(m + 1)]

# Base case: empty string matches empty pattern
dp[0][0] = True

# Handle patterns like a*, a*b*, etc., which can match an empty string
for j in range(1, n + 1):
if p[j - 1] == '*':
dp[0][j] = dp[0][j - 2]

# Fill the dp table
for i in range(1, m + 1):
for j in range(1, n + 1):
if p[j - 1] == '.' or p[j - 1] == s[i - 1]:
dp[i][j] = dp[i - 1][j - 1]
elif p[j - 1] == '*':
dp[i][j] = dp[i][j - 2] # '*' matches zero occurrences
if p[j - 2] == '.' or p[j - 2] == s[i - 1]:
dp[i][j] = dp[i][j] or dp[i - 1][j] # '*' matches one or more occurrences

# The result is in dp[m][n]
return dp[m][n]

نتایج

تصویر از نویسنده

پس از آزمایش آن بر روی 10 تا 20 مشکل در LeetCode، من این تصور را دارم که در مورد همه مشکلات آموزش داده شده است، بنابراین بهترین راه برای ارزیابی آن نیست. با این حال، هنوز هم ارزش اشتراک گذاری دارد. علاوه بر این، همیشه انتخاب می کند که یک راه حل پایتون ارائه دهد، حتی زمانی که به طور خاص برای آن درخواست نشده باشد. اما بیایید چیز دیگری را امتحان کنیم. من از مدل خواستم کد را بهینه کند تا مصرف منابع را تا حد امکان به حداقل برساند.

تصویر از نویسنده

من چنین انتظاری نداشتم، اما وقتی از مدل خواستم عملکرد را بهبود بخشد، حتی در ساده ترین موارد نیز شکست می خورد.

حالا بریم سراغ تست بعدی، تعمیر کد. من تعدادی کد حاوی خطاهای ایجاد شده توسط کلود را به مدل ارائه خواهم کرد. من از مدل خواستم چند مورد سخت برای تعمیر ایجاد کند، و بیایید ببینیم که چگونه کار می کند.

تعمیر کد

اعلان

The following code contains several bugs. Please identify and fix them, 
and provide an explanation for each bug you find.
class AsyncTaskQueue:
def __init__(self):
self.tasks = []
self.running = False
self.lock = threading.Lock()
self.workers = []

async def add_task(self, task):
async with self.lock:
self.tasks.append(task)
if not self.running:
self.start_processing()

async def start_processing(self):
self.running = True
while self.tasks:
task = self.tasks.pop(0)
worker = asyncio.create_task(self.process_task(task))
self.workers.append(worker)
if len(self.workers) >= 3:

done, pending = await asyncio.wait(self.workers)
self.workers = list(pending)
self.running = False

async def process_task(self, task):
result = await task()
return result

پاسخ دهید

Certainly! Let's go through the provided code and identify the issues, then correct them. Here are the main problems and their fixes:

Issues Identified
Threading Lock Usage with Asyncio:
The threading.Lock is not suitable for use with asyncio. Instead, you should use asyncio.Lock.
Async Context Manager for Lock:
The async with statement is used incorrectly with threading.Lock. It should be used with asyncio.Lock.
Starting Processing:
The start_processing method should be called in a non-blocking manner. Since start_processing is an async method, it should be awaited properly.
Task Management:
The start_processing method should handle task processing more efficiently. The current implementation might not handle task completion correctly.
Worker Management:
The workers list should be managed more carefully to ensure that tasks are completed before marking the queue as not running.
Corrected Code
Here's the corrected version of the code:

import asyncio
import threading

class AsyncTaskQueue:
def __init__(self):
self.tasks = []
self.running = False
self.lock = asyncio.Lock()
self.workers = []

async def add_task(self, task):
async with self.lock:
self.tasks.append(task)
if not self.running:
self.running = True
asyncio.create_task(self.start_processing())

async def start_processing(self):
while True:
async with self.lock:
if not self.tasks:
self.running = False
break
task = self.tasks.pop(0)

worker = asyncio.create_task(self.process_task(task))
self.workers.append(worker)

if len(self.workers) >= 3:
done, pending = await asyncio.wait(self.workers, return_when=asyncio.FIRST_COMPLETED)
self.workers = list(pending)

async def process_task(self, task):
result = await task()
return result

# Example usage
async def example_task():
await asyncio.sleep(1)
print("Task completed")
return "Result"

async def main():
queue = AsyncTaskQueue()
await queue.add_task(example_task)
await queue.add_task(example_task)
await queue.add_task(example_task)
await queue.add_task(example_task)
await queue.add_task(example_task)
await queue.add_task(example_task)

asyncio.run(main())
Explanation of Fixes
Asyncio Lock:
Replaced threading.Lock with asyncio.Lock to ensure compatibility with asynchronous operations.
Async Context Manager for Lock:
Used async with self.lock: to properly manage the lock in an asynchronous context.
Starting Processing:
Changed the logic to start processing in a non-blocking manner by using asyncio.create_task(self.start_processing()) inside add_task.
Task Management:
Modified start_processing to continuously check for tasks and process them until no tasks are left. It breaks out of the loop when there are no more tasks and sets self.running to False.
Worker Management:
Ensured that workers are managed correctly by using asyncio.wait with return_when=asyncio.FIRST_COMPLETED to handle task completion efficiently.
Example Usage
The example usage demonstrates how to add tasks to the AsyncTaskQueue and run them asynchronously. The main function adds several tasks to the queue, and they are processed concurrently with a maximum of 3 workers at a time.

This corrected and optimized code should perform better and be more reliable.

نتایج و بازخورد

کلود پاسخ مدل را 7.5/10 ارزیابی می کند. با این بازخورد:

در حالی که این مدل راه‌حلی از لحاظ عملکردی درست ارائه می‌کرد، به جای اجرای «درجه تولید»، یک اصلاح «درجه آموزشی» ارائه کرد. این نشان می دهد که برای وظایف برنامه نویسی همزمان پیچیده، تخصص انسانی هنوز برای طراحی سیستم قوی حیاتی است.

پس از آزمایش با مدل، آن را می گیرد شغل انجام شد، اما اغلب برای بهبود پاسخ به اعلان های بعدی نیاز دارد. در حالی که با درک کار در دست مشکلی ندارد و می‌تواند بسیاری از باگ‌های حیاتی را تصحیح کند، هنوز برخی از نقاط قوت را که در مدل‌هایی مانند ChatGPT و Claude مشاهده می‌شود، ندارد، به‌ویژه در زمینه‌هایی مانند مدیریت خطا، مدیریت منابع و بهینه‌سازی. من معتقدم اینها ممکن است نقاط ضعف کلیدی مدل باشند.

LLM های تخصصی: دوره ای جدید در هوش مصنوعی

مشاهده ظهور مدل‌های زبان نسبتاً کوچک و مختص دامنه که می‌توانند به صورت محلی اجرا شوند، بسیار جذاب است. من معتقدم که ما در حال ورود به دوره جدید هیجان انگیز تخصصی هستیم LLMs، و این تازه شروع است. در حالی که این مفهوم جدید نیست، ما در نهایت مدل هایی را می بینیم که واقعاً در حوزه های خاص عالی هستند.

ترکیبی از RAG (Retrieval-Augmented Generation) و متخصص LLMs می تواند چشم انداز هوش مصنوعی را در ماه ها / سال های آینده تعریف کند. احتمالاً شاهد مدل‌های متمرکز بر کدنویسی قدرتمندتری از رهبران صنعت مانند OpenAI و Anthropic خواهیم بود. برنامه نویسی شاید یکی از طبیعی ترین حوزه ها برای هوش مصنوعی تخصصی باشد، و ممکن است به زودی شاهد مدل های متمرکز تری باشیم، تصور کنید LLM هایی که به طور خاص برای DevOps یا توسعه فرانت اند بهینه شده اند!

از این پیشرفت های سریع غرق نشوید. بله، دیدن مهارت‌های تسلط LLM که به طور سنتی سال‌ها طول می‌کشید، می‌تواند تا حدودی دلهره‌آور باشد. کدگذاری که دهه ها بشریت را به چالش کشیده است، در برابر چشمان ما در حال تغییر است. اما به جای اینکه این را به عنوان یک نقطه پایان ببینیم، باید به آن به عنوان فرصتی برای رشد و نوآوری نگاه کنیم.

چه موج کنونی پیشرفت‌های LLM در سال‌های آینده کند شود یا این صرفاً آغاز یک سفر طولانی‌تر باشد، پاسخ ما باید ثابت بماند: کنجکاو بمانیم، به یادگیری ادامه دهیم و هرگز دست از نوآوری نکشیم. آینده فناوری در حال حاضر نوشته می شود و همه ما نقشی در شکل دادن به آن داریم.

منتشر شده از طریق به سمت هوش مصنوعی



منبع: https://towardsai.net/p/l/qwen-2-5-coder-32b-is-this-best-open-weight-model-better-than-gpt-4o-and-claude-3-5-sonnet