Sakhanda Wire
NVDA $210.96 -0.59% MSFT $524.51 +0.66% GOOGL $320.21 -1.24% META $642.62 -0.96% AMZN $248.00 -0.95%
← Към новините

Tsinghua AI публикува с отворен код AKV — сървър за управление на кеша за LLM агенти върху SGLang

Изследователи от университета Цинхуа и CUHK пуснаха с отворен код AKV — система за обслужване и инженеринг на KV кеша при LLM агенти. Вместо да обобщават старата история, агентите премахват избрани записи от KV кеша и продължават да използват останалите. При 3 модела и 4 бенчмарка за агенти средната цена намалява с 27,7%. Средният резултат при задачите се повишава с 1,7 точки. Кодът е лицензиран под Apache-2.0 и е изграден върху SGLang.

Накратко

  • Какво представлява: Система за обслужване плюс библиотека от политики, без тегла. Тествана е с GPT-OSS-120B (5,1B активни параметъра), MiniMax-M2.7 (230B общо, 10B активни) и MiroThinker-1.7-Mini (30B общо, 3B активни).
  • Работи на: NVIDIA GPU чрез SGLang. В статията са използвани 8 A800-80GB GPU в BF16. Бързият старт обслужва GPT-OSS-120B на 2 GPU (тензорен паралелизъм 2).
  • Производителност: 27,7% по-ниска средна цена и +1,7 точки среден резултат спрямо обобщаването при достигане на праг.
  • Най-добър резултат: GPT-OSS-120B в SWE-bench Verified: цената на задача спада от 20,0 на 9,7 цента, а резултатът се повишава от 40,0 на 43,2.
  • Най-слаб резултат: MiniMax-M2.7 в BrowseComp-Plus получава 58,9 точки — с 3,4 точки под 62,3 на Text Engineering.

Какво представлява инженерингът на кеша и по какво се различава от инженерингa на контекста?

AKV е система за обслужване от Цинхуа, която позволява на LLM агентите сами да премахват и пренареждат своя KV кеш.

Инженерингът на контекста съкращава или обобщава текстовата история. Редактирането на този префикс обезсилва всяко следващо KV състояние. Запазеният суфикс трябва да бъде предварително изчислен отново. Затова системите обобщават късно и агресивно, което може да доведе до загуба на детайли от междинните ходове.

Инженерингът на кеша оставя текстовата траектория непроменена. Той променя само това кои KV записи остават видими за механизма на вниманието. Запазените записи се използват повторно без преизчисление. Те все още могат да носят информация от премахнатите съобщения. В анализа на разходите в изследователската статия четенето на KV кеша представлява 82,4% от общата цена на API.

Как работи AKV?

AKV дефинира 3 операции с кеша. Append е стандартната актуализация за нови токени. Drop премахва избрани записи от бъдещото внимание, без да променя позициите. Repos презаписва запазените ключове на позиции от 0 до r-1 чрез RoPE ротация. Стойностите остават непроменени, така че скритите състояния не се преизчисляват. В аблационните тестове добавянето на Repos повишава успеваемостта на GPT-OSS-120B в BrowseComp-Plus от 55% на 62%.

Трудната част е обслужването. Идентични токени могат да доведат до различни състояния на кеша при различни истории на операциите. Обикновеното съпоставяне на префикси може да използва неправилните състояния. AKV разширява радиалното дърво на SGLang с възли за премахване и пренареждане. Премахнатият KV се освобождава едва когато нито една активна заявка повече не се нуждае от него. Вниманието със сегментни пакети възстановява изместените състояния с един проход за предварително изчисление.

Как изглежда API интерфейсът на AKV?

Интерфейсът е без състояние и съвместим с OpenAI. Клиентите изпращат пълната история на съобщенията и две незадължителни полета. drop_message свързва индекса на задействащо съобщение със съобщенията, които трябва да бъдат премахнати. reposition съдържа индексите, след които позициите се уплътняват.

CachePolicy изгражда тези полета от задействащ елемент, селектор и правило за пренареждане. Вградените политики са базирани на ходове, токени или модел. CacheTool позволява на модела сам да извика drop_context.

Как се представя AKV при бенчмаркове за агенти?

Основната политика е постепенно премахване на отговорите от инструментите, като се запазват последните 12 отговора. Базовият метод Standard обобщава при 96K токена (192K за MiroThinker). Text Engineering обобщава при 48K. Бенчмарковете са BrowseComp-Plus, GAIA-Text, SWE-bench Verified и xbench-DeepSearch-2510.

МоделРезултат / цена на StandardРезултат / цена на Text Eng.Резултат / цена на AKV
MiniMax-M2.752.4 / 5.052.8 / 5.753.7 / 4.4
GPT-OSS-120B51.0 / 11.248.3 / 10.253.1 / 7.3
MiroThinker-1.7-Mini44.1 / 20.437.1 / 18.145.8 / 14.8

Средна успеваемост (%) и цена (американски центове на задача) при 4 бенчмарка. Източник: Таблица 1 в статията.

AKV намалява цената и с 21,9% спрямо Text Engineering. Разликата в точността се увеличава при дълги изпълнения. При BrowseComp-Plus с 96K токена и повече GPT-OSS-120B получава 37% с AKV. Standard получава 24%, а Text Engineering — 32%, според страницата на проекта.

Цените са еквивалентни на API оценки, базирани на публикувани тарифи. Пренаредените токени се таксуват по тарифата за попадение в кеша — умишлено консервативен избор.

Trim old tool result A</button><button class="btn" id="mtp-akv-reset">Reset</button></div> <div class="cmp" style="margin-top:12px"> <div class="box"><h4>Context engineering (summarize text)</h4> <div class="lane" id="mtp-akv-ce"></div> <div class="meter"><i id="mtp-akv-cem" style="width:0%"></i></div> <div class="mtxt" id="mtp-akv-cet">Re-prefill work: 0 blocks</div> </div> <div class="box"><h4>Cache engineering (AKV drop)</h4> <div class="lane" id="mtp-akv-ae"></div> <div class="meter"><i id="mtp-akv-aem" style="width:0%"></i></div> <div class="mtxt" id="mtp-akv-aet">Re-prefill work: 0 blocks</div> </div> </div> <p class="note" id="mtp-akv-n1">Both agents hold a user prompt, assistant turns and tool results. Press the button to remove old tool result <b>A</b>.</p> <div class="lg"><span><i style="background:#5a3a6a"></i>User</span><span><i style="background:#7d2f93"></i>Assistant</span><span><i style="background:#a64bbd"></i>Tool result</span><span><i style="background:#ffb347"></i>Recomputed</span><span><i style="background:#76B900"></i>New turn</span></div> </div> <!-- P2 --> <div class="panel" id="mtp-akv-p2"> <div class="row"> <button class="btn" data-op="append">1. Append D</button> <button class="btn" data-op="drop">2. Drop B</button> <button class="btn" data-op="repos">3. Repos</button> <button class="btn" data-op="reset2">Reset</button> </div> <div class="lbl">Active KV cache (number = position encoding index)</div> <div class="lane" id="mtp-akv-ops"></div> <p class="note" id="mtp-akv-n2">Start state: tokens A, B, C sit at positions 0, 1, 2. Step through the 3 operations.</p> <pre id="mtp-akv-req">{"messages": [...], "drop_message": {}, "reposition": []}</pre> </div> <!-- P3 --> <div class="panel" id="mtp-akv-p3"> <div class="lbl" style="margin-top:0">Model</div> <div class="row" id="mtp-akv-models"></div> <div class="lbl">Benchmark</div> <div class="row" id="mtp-akv-bench"></div> <div class="grid2" style="margin-top:14px"> <div><div class="lbl" style="margin-top:0">Pass rate (%) · higher is better</div><div class="bars" id="mtp-akv-sc"></div></div> <div><div class="lbl" style="margin-top:0">Cost (US cents per task) · lower is better</div><div class="bars" id="mtp-akv-co"></div></div> </div> <p class="note" id="mtp-akv-n3"></p> </div> <!-- P4 --> <div class="panel" id="mtp-akv-p4"> <div class="lbl" style="margin-top:0">Concurrency: <b id="mtp-akv-cv" style="color:#f3eaf6">14</b> · GPT-OSS-120B · 80 long-context SWE-bench Verified tasks · 8 A800 GPUs</div> <input type="range" id="mtp-akv-c" min="0" max="4" step="1" value="3"> <div class="grid2" style="margin-top:12px"> <div><div class="lbl" style="margin-top:0">P95 request latency (s) · lower is better</div><div class="bars" id="mtp-akv-lat"></div></div> <div><div class="lbl" style="margin-top:0">Output throughput (tokens/s) · higher is better</div><div class="bars" id="mtp-akv-out"></div></div> </div> <div class="stats" style="margin-top:14px"> <div class="stat"><div class="big">1.18x</div><span>Output throughput, peak vs peak</span></div> <div class="stat"><div class="big">1.53x</div><span>Input throughput, peak vs peak</span></div> <div class="stat"><div class="big">1.51x</div><span>Faster P95 latency, peak vs peak</span></div> <div class="stat"><div class="big">2.849ms</div><span>Full attention per decode step (was 7.082)</span></div> </div> <p class="note" id="mtp-akv-n4"></p> </div> <!-- P5 --> <div class="panel" id="mtp-akv-p5"> <ul class="lim" id="mtp-akv-lim"> <li>Few supported model families<em>Drop and Repos are enabled for Qwen, GPT-OSS and MiniMax-M2 text architectures. Linear attention models are future work.</em></li> <li>Self-hosted only<em>You run the AKV server yourself. It extends SGLang with cache-operation support.</em></li> <li>Self-reported, single hardware setup<em>All results come from the authors, on 8 A800-80GB GPUs in BF16.</em></li> <li>Different measurement windows<em>High-concurrency AKV runs were measured through the first 30 task completions. Standard used a 1-hour window.</em></li> <li>Not every benchmark improves<em>MiniMax-M2.7 on BrowseComp-Plus scores 58.9 with AKV, below Text Engineering at 62.3.</em></li> <li>Dropping reasoning cache hurts<em>On SWE-bench Verified, dropping reasoning cache fell to 36.5, and dropping both to 34.5, versus 41.0 for tool drop.</em></li> </ul> <p class="note">Tap a row to expand it.</p> </div> <div class="ft"> <span>Sources: <a href="https://arxiv.org/abs/2610.28577" target="_blank" rel="noopener">Paper</a> · <a href="https://github.com/thu-nics/AKV" target="_blank" rel="noopener">GitHub</a> · <a href="https://fuvty.github.io/thinking_yard_project_page/projects/akv/" target="_blank" rel="noopener">Project page</a> · numbers self-reported</span> <span class="mtp">© Marktechpost</span> </div> <script> (function(){ var R=document.getElementById('mtp-akv'); function $(id){return document.getElementById('mtp-akv-'+id)} function post(){try{var h=R.offsetHeight+40;parent.postMessage({mtpAkvHeight:h},'*')}catch(e){}} R.querySelectorAll('.tab').forEach(function(b){b.addEventListener('click',function(){ R.querySelectorAll('.tab').forEach(function(x){x.classList.remove('on')}); R.querySelectorAll('.panel').forEach(function(x){x.classList.remove('on')}); b.classList.add('on');$(b.getAttribute('data-t').replace('p','p')).classList.add('on'); if(b.getAttribute('data-t')==='p3')drawBench(); if(b.getAttribute('data-t')==='p4')drawServe(); setTimeout(post,60);setTimeout(post,500); })}); function blk(t,cls,sub){var d=document.createElement('div');d.className='blk '+cls;d.innerHTML=t+(sub!==undefined?'<small>'+sub+'</small>':'');return d} /* P1 */ var seq=[['U','k-u'],['A','k-t'],['B','k-a'],['C','k-t'],['D','k-a']]; function initP1(){var ce=$('ce'),ae=$('ae');ce.innerHTML='';ae.innerHTML=''; seq.forEach(function(s){ce.appendChild(blk(s[0],s[1]));ae.appendChild(blk(s[0],s[1]))}); $('cem').style.width='0%';$('aem').style.width='0%';$('cet').textContent='Re-prefill work: 0 blocks';$('aet').textContent='Re-prefill work: 0 blocks'; $('n1').innerHTML='Both agents hold a user prompt, assistant turns and tool results. Press the button to remove old tool result <b>A</b>.';} initP1(); var playing=false; $('play').addEventListener('click',function(){if(playing)return;playing=true;initP1(); var ce=$('ce').children,ae=$('ae').children; setTimeout(function(){ce[1].classList.add('drop');ae[1].classList.add('drop'); $('n1').innerHTML='Step 1: A is removed. Left: the text is summarized, so the prefix changes.';},300); setTimeout(function(){for(var i=2;i<5;i++)ce[i].classList.add('re');$('cem').style.width='75%';$('cet').textContent='Re-prefill work: 3 blocks (B, C, D recomputed)'; $('n1').innerHTML='Step 2: <b>Context engineering</b> must re-prefill everything after the edit. <b>AKV</b> only hides A from attention.';},1300); setTimeout(function(){for(var i=2;i<5;i++)ce[i].classList.remove('re'); var n1=blk('E','k-n new');var n2=blk('E','k-n new');$('ce').appendChild(n1);$('ae').appendChild(n2); $('aet').textContent='Re-prefill work: 0 blocks (B, C, D reused)'; $('n1').innerHTML='Step 3: both append new turn E. AKV reused B, C and D as-is, and they still carry what they learned from A.';playing=false;post();},3000); }); $('reset').addEventListener('click',function(){playing=false;initP1()}); /* P2 */ var st;function initP2(){st={toks:[['A',0],['B',1],['C',2]],dropped:{},next:3,stage:0,drop:{},rep:[]};renderP2(); $('n2').innerHTML='Start state: tokens A, B, C sit at positions 0, 1, 2. Step through the 3 operations.';$('req').textContent='{"messages": [m0:A, m1:B, m2:C], "drop_message": {}, "reposition": []}';} function renderP2(mark){var L=$('ops');L.innerHTML='';st.toks.forEach(function(t){var c=t[0]==='D'?'k-n':(t[0]==='B'?'k-a':'k-t'); var b=blk(t[0],c,'pos '+t[1]);if(st.dropped[t[0]])b.classList.add('drop');if(mark&&mark.indexOf(t[0])>-1)b.classList.add(mark==='D'?'new':'mv');L.appendChild(b)});post();} initP2(); R.querySelectorAll('[data-op]').forEach(function(b){b.addEventListener('click',function(){var op=b.getAttribute('data-op'); R.querySelectorAll('[data-op]').forEach(function(x){x.classList.remove('on')});b.classList.add('on'); if(op==='reset2'){initP2();b.classList.remove('on');return} if(op==='append'){if(st.toks.some(function(t){return t[0]==='D'})){$('n2').innerHTML='D is already appended. Try <b>Drop B</b>.';return} st.toks.push(['D',st.next]);st.next++;renderP2('D'); $('n2').innerHTML='<b>Append</b>: D is computed against the active cache and takes the next position index.'; $('req').textContent='{"messages": [m0:A, m1:B, m2:C, m3:D], "drop_message": {}, "reposition": []}';} if(op==='drop'){if(!st.toks.some(function(t){return t[0]==='D'})){$('n2').innerHTML='Append D first, then drop B.';b.classList.remove('on');return}st.dropped.B=true;renderP2(); $('n2').innerHTML='<b>Drop</b>: B leaves future attention. Positions do not change, and the text history keeps B.'; $('req').textContent='{"messages": [m0..m3], "drop_message": {"3": [1]}, "reposition": []}';} if(op==='repos'){if(!st.dropped.B){$('n2').innerHTML='Drop B first, so there is a gap to compact.';return} var p=0;st.toks.forEach(function(t){if(!st.dropped[t[0]]){t[1]=p;p++}});st.next=p; st.toks=st.toks.filter(function(t){return !st.dropped[t[0]]});st.dropped={};renderP2(['A','C','D']); $('n2').innerHTML='<b>Repos</b>: retained keys are re-rotated (RoPE) to positions 0 to '+(p-1)+'. Values are untouched, so nothing is recomputed.'; $('req').textContent='{"messages": [m0..m3], "drop_message": {"3": [1]}, "reposition": [3]}';} })}); /* P3 */ var M={'MiniMax-M2.7':{s:[[58.9,35.0,75.2,40.5,52.4],[62.3,36.9,72.0,40.0,52.8],[58.9,40.8,74.4,40.5,53.7]],c:[[5.2,2.4,7.0,5.5,5.0],[5.3,2.7,9.4,5.2,5.7],[4.8,2.6,5.5,4.7,4.4]]}, 'GPT-OSS-120B':{s:[[57.5,68.0,40.0,38.5,51.0],[52.7,65.1,36.8,38.5,48.3],[61.9,69.9,43.2,37.5,53.1]],c:[[13.1,5.4,20.0,6.2,11.2],[12.6,6.8,15.8,5.4,10.2],[11.4,4.1,9.7,3.8,7.3]]}, 'MiroThinker-1.7-Mini':{s:[[60.0,68.0,7.8,40.5,44.1],[45.7,66.0,4.2,32.5,37.1],[63.5,68.9,7.4,43.5,45.8]],c:[[25.2,9.2,33.6,13.5,20.4],[17.6,11.0,28.4,15.3,18.1],[15.3,9.5,26.3,8.1,14.8]]}}; var B=['BrowseComp-Plus','GAIA-Text','SWE-bench Verified','xbench-DS','Average'];var mSel='GPT-OSS-120B',bSel=4; var NM=['Standard','Text Eng.','AKV'],CL=['c-s','c-t','c-a']; Object.keys(M).forEach(function(k){var b=document.createElement('button');b.className='btn'+(k===mSel?' on':'');b.textContent=k;b.onclick=function(){mSel=k;$('models').querySelectorAll('.btn').forEach(function(x){x.classList.toggle('on',x===b)});drawBench()};$('models').appendChild(b)}); B.forEach(function(k,i){var b=document.createElement('button');b.className='btn'+(i===bSel?' on':'');b.textContent=k;b.onclick=function(){bSel=i;$('bench').querySelectorAll('.btn').forEach(function(x){x.classList.toggle('on',x===b)});drawBench()};$('bench').appendChild(b)}); function bars(el,vals,max,fmt){el.innerHTML='';vals.forEach(function(v,i){var r=document.createElement('div');r.className='bar'; r.innerHTML='<div class="nm">'+NM[i]+'</div><div class="tr"><div class="fl '+CL[i]+'"></div></div><div class="v">'+fmt(v)+'</div>';el.appendChild(r); (function(f,w){setTimeout(function(){f.style.width=w+'%'},40)})(r.querySelector('.fl'),Math.max(2,v/max*100));});} function drawBench(){var d=M[mSel];var s=d.s.map(function(r){return r[bSel]}),c=d.c.map(function(r){return r[bSel]}); bars($('sc'),s,100,function(v){return v.toFixed(1)});bars($('co'),c,Math.max.apply(null,c)*1.1,function(v){return v.toFixed(1)+'¢'}); var ds=(s[2]-s[0]).toFixed(1),dc=((c[2]/c[0]-1)*100).toFixed(1); $('n3').innerHTML='<b>'+mSel+' · '+B[bSel]+'</b>: AKV vs Standard is '+(ds>=0?'+':'')+ds+' points and '+(dc>0?'+':'')+dc+'% cost. Source: Table 1, self-reported.';post();} /* P4 */ var C=[8,10,12,14,16],LAT=[[43.57,45.03,43.16,108.86,229.90],[43.57,50.27,52.82,60.67,69.96],[25.93,27.11,27.18,28.49,30.63]],OUT=[[217,254,313,146,138],[228,246,264,267,267],[245,295,339,369,369]]; function drawServe(){var i=+$('c').value;$('cv').textContent=C[i]; bars($('lat'),LAT.map(function(r){return r[i]}),235,function(v){return v.toFixed(2)+'s'}); bars($('out'),OUT.map(function(r){return r[i]}),380,function(v){return v}); var x=(LAT[0][i]/LAT[2][i]).toFixed(2); $('n4').innerHTML='At concurrency '+C[i]+', AKV P95 latency is <b>'+x+'x</b> faster than Standard. '+(i>=3?'Above 12, KV pressure forces Standard into re-prefill, so its latency jumps.':'Peak-vs-peak compares AKV at 14 with Standard at 12.');post();} $('c').addEventListener('input',drawServe); /* P5 */ R.querySelectorAll('#mtp-akv-lim li').forEach(function(li){li.addEventListener('click',function(){li.classList.toggle('open');post()})}); window.addEventListener('load',post);window.addEventListener('resize',post);setTimeout(post,300); })(); </script> </div> </body></html>">

Колко бърз е AKV при тестове за обслужване?

Тестовете за обслужване са проведени с GPT-OSS-120B върху 80 задачи от SWE-bench Verified с дълъг контекст. При пиковата настройка на всеки метод AKV постига 1,18 пъти по-висока пропускателна способност на изхода и 1,53 пъти по-висока пропускателна способност на входа. Латентността на заявките на ниво P95 е 1,51 пъти по-ниска.

При конкурентност 16 латентността P95 на Standard достига 229,90 секунди спрямо 30,63 секунди за AKV. Натоварването на KV кеша принуждава Standard да извършва многократно предварително изчисление. На стъпка на декодиране времето за пълно внимание намалява от 7,082 на 2,849 ms.

При 100 задачи от SWE-bench Verified в рамките на бюджет за GPU AKV достига около 47% успеваемост. Standard достига 40,7%, а Text Engineering — 32,3%.

Могат ли агентите сами да настройват политиката си за кеширане?

MiniMax-M2.7 усъвършенства политики върху 20 задачи от BrowseComp-Plus, след което изпълнява 100 задачи за проверка. Политиката от шестата итерация намалява цената с 17,8% спрямо Standard при базова точност. В резюмето се съобщава за икономия от 7,1% спрямо политиката, проектирана от експерти.

Предоставянето на контрол върху кеша като инструмент също повишава точността. GPT-OSS-120B се повишава от 52,1 на 61,0 точки върху подмножество от 100 задачи. Цената на MiniMax-M2.7 обаче се увеличава от 5,4 на 5,9 цента.

AKV спрямо други подходи за KV кеширане

ПоказателиAKVОбобщаване при прагSGLang RadixAttentionStreamingLLMSnapKV
Работи върхуKV кеш, насочван от агентаТекстова историяKV кеш, повторно използване на префиксKV кеш, фиксиран прозорецKV кеш на подканата
Какво се премахваИзбрано от политиката или от извикване на инструмент от моделаИсторията, по-стара от прага за токениНищо, споделените префикси се използват повторноМеждинни токени; запазват се началните и последните токениПозиции в подканата с ниско внимание
Ново предварително изчисление след намаляванеНеДа, на запазения суфиксНеприложимоНе е необходимо обновяване на кешаНеприложимо
Целево натоварванеАгенти с много ходове и извикване на инструментиСистеми за агентиОбщо и агентно обслужванеПотокови диалозиДълги подкани
Основен публикуван резултат-27,7% цена, +1,7 т.Базов метод в статията за AKVДо 6,4 пъти по-висока пропускателна способностДо 22,2 пъти спрямо преизчисление с плъзгащ се прозорец3,6 пъти по-бързо генериране при 16K
МоделиQwen, GPT-OSS, MiniMax-M2ВсекиШирок спектърLlama-2, MPT, Falcon, PythiaLlama, Mistral, Mixtral
Необходимо ли е дообучаванеНеНеНеНеНе
ЛицензApache-2.0Зависи от систематаApache-2.0MITApache-2.0

Основните числа идват от собствените статии на всеки проект и са получени при различни настройки. Те не са пряко сравними.

Основни изводи

  • AKV позволява на агентите да премахват и пренареждат KV кеша, вместо да пренаписват историята.
  • Средната цена намалява с 27,7%, а резултатът се повишава с 1,7 точки при 3 модела.
  • Repos повишава резултата на GPT-OSS-120B в BrowseComp-Plus от 55% на 62%.
  • При конкурентност 16 латентността P95 спада от 229,90 на 30,63 секунди.
  • В момента поддръжката обхваща само текстовите модели Qwen, GPT-OSS и MiniMax-M2.

Разгледайте статията, хранилището в GitHub и страницата на проекта. Също така можете да ни последвате в Twitter и не забравяйте да се присъедините към нашия 150k+ ML SubReddit и да се абонирате за нашия бюлетин. Чакайте! В Telegram ли сте? Вече можете да се присъедините към нас и там.

Имате нужда от партньор за популяризиране на вашето GitHub хранилище, страница в Hugging Face, продуктова премиера, уебинар и др.? Свържете се с нас

Преведено автоматично от английски. Оригиналната статия е на връзката по-долу.

Първоначално публикувано от MarkTechPost на

Прочетете оригинала в MarkTechPost ↗

Текстът и изображенията са собственост на MarkTechPost и са възпроизведени тук с посочване на авторството и връзка към оригиналната публикация.

← Към новините

Още новини

Всички последни новини