Галоўная / Артыкулы

ToolCallingAgent супраць CodeAgent на лакальных мадэлях Qwen2.5 14B

ToolCallingAgent і CodeAgent у smolagents на Mac з M4: хуткасць і дакладнасць маршрутызацыі з лакальнымі мадэлямі Qwen2.5 14B instruct і coder пры розных тэмпературах.

Выдавец: REACTAPP.TOP4 хв чытання848 слоў

Крыніцы: ToolCallingAgent vs. CodeAgent: Which Performs Better on a Local LLM?

Настройкі падрэбных агентаў быстра адкрываюць слабыя месцы. Апаратная частка, якая была выкорыстана, — гэта базавы Mac з процэсорам Apple M4 з 16 ГБ аб’еднанай памяці, без можлівасці апрацоўкі дадзеных у воблаку і без дадзеных VRAM для запасу, таму нават сяродній прызначальнік кантэксту можа спрычыніць замену памяці. Два стылі агентаў з smolagents — ToolCallingAgent і CodeAgent — былі працаваны кожны з іх проты двух модэляў, якія працавалі локальна: qwen2.5-coder:14b і qwen2.5:14b-instruct. Бны маюць аднаковы размер 14 Б і базавуюяя архітэктуру, і оба працавалі на той самы апарат.

  • Qwen2.5:14b-instruct — гэта універсальны модэль у лінейцы 14 Б, настроены на шырокія даны інструкцый і дыялогаў, таму ён добра выконвае команды.
  • qwen2.5-coder:14b выкорыстоўвае тую ж архітэктуру, але працаваў пад час дадатковага прадзялёвання на вялікія масы коду і пасляцільнага настроювання, спрамованага на гэта.

З урачунку такага скромнага бюджэту на апаратную частку не спадзялася, што жадныя з наладкі будуць выдатныя. Болей цікавым было пытанне, дзе кожна з іх паспячае, і чы можа выбор іншага тыпу агента смягчыць гэтыя обмежэнні.

Наладка

Была адрабоўвана тэмпература 0, 0,1, 0,3 і 0,6 для обох тыпаў агентаў па аднам заданні: знайсці пяць найкрашчых месцаў з піццай у Сіэтле, пераканацца ў часе чакання ў кожным з іх і рэкамендаваць толькі тыя, якія падпадаюць пад прагу кліента. Функцыі, якія вычыляюць час чакання і паўставляюць іх у адносе да прагі, ёсць дэтэрміністычныя.

@tool
def get_wait_time(restaurant_name: str) -> int:
    """Current wait in minutes for a restaurant. Deterministic, not a live lookup."""

@tool
def restaurants_in_wait_limit(wait_time: int, wait_threshold: int) -> bool:
    """True if the wait is within the customer's threshold."""

Дэтэрміністычны дзейнародзец яе намераны. Актуальны пошук дазволіў бы модэлю здагадацца пра правдападобны час чакання і продаваць працу. Прыводны вызов функцыі пераканаецца ў тым, што ў гэтым случае мае значэння: чы робат керуецца інструментам у замест на стварэнне значэння, і чы гэта застаецца такім, калі змянюецца тэмпература або тып праца.

Следзілі за трыма пунктамі: затрымкай, тым, чы завершыўся запуск, і тэчыю падачы дадзеных, якая вызначаецца як частка всей ланцуга інструментаў, якая была выканана правільна за кожны вызов. Спрыяйце цыфрам як прамеру, адколі гэта не ўрочыстны крэйтарыў.

Як разлічаюцца два працы

З ToolCallingAgent кожны крок стварае адзін JSON-вызов інструмента. Модэль падае аргументы, фрэймворк выкананае інструмент, а пасля пачынаецца наступны крок. Пяць рэстаранаў і две функцыі даўаюць дзесяць адзінаковых вызоў, і кожны з іх — новая можлівасць зіпсаваць структураваны выхід.

CodeAgent выбірае іншы падход і стварае фрагмент Python, які працюе за адны крок. Адна петля можа охопіць усі рэстараны і вызваць обе функцыі ўсерэдзіні яе. Правільная петля будзе правільной для ўсіх іх пад час такога выканання, таму рашэнне прыймаецца раз, а не дзесяць разоў.

Рэзультаты

На Qwen2.5:14b-instruct

Оба агента парадзіліся добра. CodeAgent падтрымваў точнасць маршрутацыі 1.00 на кожной тэмпературэ, а ToolCallingAgent залішаўся ў дыяпазоне з 0.95 і 1.00. У правільнасці не было значных разлікаў.

Скорасць паказала іншую картыну. ToolCallingAgent працав прыблізна удвое медленней — адно запусканне трывала апошнія пяць хвілін, тады як для CodeAgent гэты час станавіўся апошнія два з половайя хвіліны. Прычына крыўціця ў структуры. ToolCallingAgent за кожны крок выконвае новы запыт да модэлю, перасылае кантэкст размовы і ў кожны раз генеруе тэкст з нуля. CodeAgent выконвае такі запыт толькі аднае. На локальным камп’ютары, дзе кожна генерацыя і так ўжо ўповільнена, такі додатковы навантажэння не можна ігнараваць.

На Qwen2.5-coder:14b

Тут два агента роزніліся сутычна. ToolCallingAgent ніколі не досягаў 50 процэнта тачнасці направлення запытоў ні пры якім значэнні параметра тэмпературы, залішаючыся ў дыяпазоне ад 0,40 да 0,50. Ён працаваў быстрэй, чым на модэлі для выканання інструкцый, але гэта не было хорашым знакам. Ён працаваў быстрэй таму, што здаваўся. Калі вось паводкі вярталіся, ён перэстаў выкананне запытоў і завершаў працу раней, зробіўшы менш.

CodeAgent выграў без канкурэнціі, парадуўшыся тачнасцю маршрутацыі 1,00, што зроўна да найлепшых показнікаў іншых агентаў. Гэта было чакана, адколькі ён прасіў мадэль-кодавальніка пра код на Python, а не пра структураваны JSON.

Што можна выняць з гэтага

Прыродная перадчыннасць CodeAgent у вікорыстоўванні цыклаў ёсць рэальная. У тэстах на модэль інструкцый, дзе оба агенты парадуваліся тачнасцю маршрутацыі 1,00, агрэгаванне заведамаў зробіла CodeAgent у два разы быстрым за ToolCallingAgent.

Qwen2.5:14b-instruct прадстаўляе сабою надзеяны генераліста, які лепа справляецца як з вызвамі структураванага JSON, так і з простым кодам. Qwen2.5-coder:14b лепшая падходзіць для складных заведамаў па кодаванню, адколькі ён можа быць ненадзеяным у стварэнні структураванага JSON і ў падтрыманні гэтага стандарта працы ў серыі вызваў.

Адкрытыя пытанні

Застаецца ўзгалджанне. Два фактора разлічваюць гэтыя агенты: CodeAgent агрупавае свою работу ў адну програму і пішае код на Python, а не на структураваны JSON. Наступны эксперымент мог бы разлучыць іх, калі CodeAgent будзе выдаваць структураваныя запыты до інструментаў, пры тым як продовжае працаваць у рэжыме пакетных аперацый. Рэзультат паказаў бы, чы роўныя перавагі вынікаюць галоўная з цыклаў, чы ў зв’язку з тым, што мадэлі легча ствараюць код, чым довгія серыі запытоў у фармаце JSON.