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

Памяць кліента для AI-агентаў за строгім лімітам токенаў.

Як шар памяці агента выкарыстоўвае факты, ацэнюе ўпорадкі, усувае дублікаты за дапамогою косай велічыны 0,92, зберагае вектары ў pgvector і выкарыстоўвае ліміт у 2 048 токенаў з можлівасцю вымовы з памяці.

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

Крыніцы: Engineering a Multi-Agent AI Platform — Part 6: Memory Under Token Constraints

Агент падтрымкі размовляе з кліентам, і ўсе, што яму патрэбна, должна поместыцца ў адна вікно кантэксту. GPT-4o працюе з 128K токенамі, а меншыя мадэлі можа маты 32K або менш. У гэтым вікні павінны быць сістэмны запрос, апісанні інструментоў, запрашаныя ведамасці, ход якой-небудзь размовы і все, што агент памятае пра конкрэтнага чалавека. У гэтым абзацы опісваецца прымета памяці для такой схемы: як факты выкарыстоўваюцца з завершаных размов, якім даецца ранг, як ўсунуць дублікаты, як яны зберагаюцца як вектары і як яны зноў запрашуюцца за строгім лімітом токенамі.

Вікно — гэта бюджэт, а не кантэйнер

Усе, што вядома пра кліента, падае ў запрос, а іншыя даныя змушаны паспяшыцца. Запрашанне ведамасці стае непূরным, історыя размовы скрачваецца, а сістэмны запрос можа адступіць настолькі даўно, што мадэль перастае памятаць сваі сабеўказы.

Не включаецца нічога, і агент спрыяе кожнай розмове як даўнему зустрэчанню. Кліент, які спытаеся пра час свайго апэксу, атрымвае адказ «У мяне няма такой інформацыі», нават як той даны ўжо ў паўтарэнні ў вёсень.

Выход з гэтай сітуацыі — гэта фіксаваная кантыятка для памяці кліента. У опісаным тут дызайне яна становіць 2 048 токенав. У межах гэтай кантыяткі сістэма включае тыя факты, якія ў данай розмове ўсё найважлівейшыя для данага кліента. Не кожны факт, не абыякія, а толькі тыя правыя.

Адзысканне фактов з завершаных розмов

Калі розмова завершыцца, працюе працэс агрэгацыі, які аналізуе яе на прэдмет фактов, якія варта зберагчы. Для выдзялэння фактов вікорыстоўваецца LLM (GPT-4o-mini) з структураваным запітам, які спытаеся, якія фактычныя даны пра кліента можна адзыскаць, і як оцаніць кожны факт з 0 да 1 па ступеню спецыфічнасці, практычнасці і частоты павтарэння.

Ключовым словам ёсць «спецыфічны». Факты павінны опісваць самэго гэтаго кліента, а не мець загальныя заазначэнні. «Вяршыць прыорытэт уранізавым кансультацыям» — гэта факт. «Задаў запытанне» — не ёсць фактам.

Мадэль адпавядае масівам JSON, у кожнай елемента якога знаходзіцца роштак тэксту і значэнне важнасці. Сістэма прыймае толькі тыя факты, якія маюць значэнне не менш 0,5. Гэты порог адсілае непатрэбныя заазначэнні, якія зазвычай маюць значэнне ад 0,2 да 0,3, і залішае тое, што можа стаць корыстным пазней.

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

Што включае значэнне важнасці

Адзін лік 0,0 да 1,0 адбівае тры якасці.

  • Спецыфічнасць. Насколькі конкрэтным ўзмаўкі ёсць для гэтага кліента? Фраза «Воліе электранаўленне працоўнікам тэлфона» ёсць спецыфічной, тады як «Я ўсё ж кліент» — ні.
  • Можлівасць дзеяння. Чы можа агент выкорыстаць гэты узмаўк для крашчай адпаведзі наступны раз? Фраза «Мае паўтараючыся проблему з рахункам №4821» падходзіць, тады як «Сказаў прывіт» — ні.
  • Паўтарэнне. Чы будзе гэта значным у калькі разоў спілкування? Інформацыя пра часовыя зону UTC+3 павтараецца ў кожны раз, калі йдзе пра планаванне, а запіт пра погоду сёння — толькі раз.

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

Эмбеддынгі і контроль дуплікатаў

Кожны факт, які застаецца, ўкладаецца як 3072-вымерны вектар, які ўсё ў тым являе сабою размер выходных даных выкарыстоўванага модэлю укладання, аднавае OpenAI’s text-embedding-3-large. Большыя выміры дазваляюць болей тонкае разгранічэнне сэроднечнасці, што ёсць важлівым, калі трэба адразніць перапісаны варыант ад сапраўдна новай інформацыі.

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

Чаму самэ цяе чысло? Людзі выражаюць адно і тое ж рознымі спосабамі. Фразы „Волію камунікацыю па электроннай пошцы“, „Хачу, каб з мной былі на ты па электроннай пошцы“ і „Сказаў, што рэдка скарычвае тэлефон, вяршыць усё па электроннай пошцы“ абоўсюды опісваюць адну і тую ж асновную рэч. За значэння 0,92 сістэма надзеямо адлучае такія сэмантычныя павтарэнні. Меньшыя прагрызы, такія як 0,85 або 0,88, пачыналі злучаць рэальна разныя факты, тады як вышэйшыя, як 0,95 або 0,97, дазволялі збірацца занадта многім перафразаванням.

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

Чаму Postgres з pgvector

Факты зберагаюцца ў PostgreSQL з расшырэннем pgvector, якое адпавядае за пошук за сэмантычнаю схожасцю. Рэкорд customer_memories мае:

  • content – факт у фармаце звычнага тэксту
  • embedding – столбец вектара(3072), які вікорыстоўваецца для пошуку за сэмабільнасцю
  • importance – бал, які прызначаецца пад час выкарыстоўвання факту
  • source_channel – месца, дзе быў з’явіўся факт (вебчат, WhatsApp, голас і т. д.)
  • created_at – час першага адкладання факту
  • last_accessed_at – пасляпэўнейшы час, калі факт быў выкарыстоўаны ў чаце

Звычайным альтэрнатыўным рашэннем ёст тэплівы сховішч, такі як Qdrant або Pinecone, але існуюць тры прычыны, чаму яго лепшая не выкарыстоўваць.

  1. Колекцыі ў такіх сховішчах маленькія. У кожнага кліента максымум 500 фактов. Аддзельны сервіс дагадвае сябе дапамогай сеціі, карыстоўваннем з’язкамі і неабходнасцю падтрымкі консыстэнтнасі, што не ёсць неабходным пры такім размерэ дадзеных.
  • Аператыя маюць значэнне. Факты належаць да дакумента кліента. Калі кліента вычыраюць сагаўна GDPR, яго факты павінны знікнуць разам з усім іншым. У pgvector гэта адна аператыя, тады як окольны хранальнік вектараў патрабаваў бы распраўдзанай консыстэнціі.
  • Запіт просты. Фільтруйце па customer_id за дапамою точнага падабення, пасля чаго сортавайце па схожасці вектараў, што pgvector эфектыўна выконвае за дапамою компазітнага індэкса.
  • База знанняяў — гэта іншая справа. Дакументы продуктаў, часта задаваемыя запытанні і інструкцыі знаходзяцца ў Qdrant, таму што гэты калекцыя вялікая, з тыячамі дакументаў на кожнага корыстувальніка, обслужвае вялікі трафік і не патрабуе транзакцыйнага зв’язку з рэляцыйнымі дадзеннямі. Разныя проблемы — разныя інструменты.

    Адзысканне з лімітам токенаў

    Калі прыходзіць новая паведамленне і агент павінен адпаведзець, прымаецца адзысканне з памяці:

    1. Уключыце прыйшлыя паведамленнія за дапамою таго ж 3072-вымірнага модэлю, які вікорыстоўваецца для зберагачвання.
    2. Выберыце дзесяць найбліжэйшых рэкордаў з customer_memories для данага customer_id, аранжаваных па значэнні <=> расстояння межа кожным зберажаным эмбедынгам і векторам запіту.
    3. Пройдзіце па рэзультатах па спадку сэмабільнасці, стаўлячы лічбу токэнаў.
    4. Оцэніце колькісць токэнаў кожнага факту як len(content) / 4 — грубы, але абераглівы показнік.
    5. Зупініцеся, калі дадаць наступны факт прыведзе да перакrocення 2,048 токэнаў.
    6. Апдэйтавайце last_accessed_at для кожнага атрыманага факту.

    Аператар <=> вычысляе косайны расстоянне, таму чым меньшае значэнне, тым болей блізкая адпаведнасць да тэкушчага паведамлення.

    Пятачок ўскладнены. Агент атрымлеяе самыя рэлевантныя факты, якія запамячваюцца ў 2,048 токенах, распараджаныя па рэлевантнасці. Калі самы рэлевантны факт займае 800 токенаў, можа паспасці толькі два чы тры факты, а якшо кожны факт ўзьміцца короткі, у меры 50-80 токенаў, то можа паспасці пятнаццац-дваццаць фактов. Бюджэт сама адрабатваецца па рэальным кантэнце, без якога-лібо ручнага налагоджэння. Стандартныя дзесяць радоў рэдка калі маюць значэнне на практыцы, адтуды што спачатку пачынае дзейсніцца ліміт токенаў, але гэта не дазволяе запытам базы дадзенаў стаць безмежнымі.

    Запіс last_accessed_at выканае два заведаменні. Ён паведамляе політыку выключэння, якія факты яшчэ застаюцца актуальнымі, і паказвае, на якія даныя агент насправды апіраецца, а якія застаюцца невыкарыстанымі.

    Ліміт у 500 фактов і хто будзе выключаны

    Кліент можа зберагаць максымум 500 фактов. Шырокі ліміт дазваляе прыцягнучы ліквідаваць вартасць зберагачвання на кліента і падтрымвае шырокую швальнасць адзысквання даклэга, адколькі косайна сэмліранасць для 500 вектараў ёсць быстрая і значымая, тады калі яе выкарыстоўваць для 50 000 вектараў, яна становіцца некантрольванай.

    Калі сістэма адзынавання хочаць захаваць факт, а у кліента ўжо ёсць 500 фактов, пачынаецца ўдаленне. Парадак удалення:

    1. Факты, якія не змяніліся прынаймні 90 дзён і якія ўжо застарэлі, а значыць, верагатна, не маюць значэння.
    2. Серэд тых, што засталося, факты з найменшым рэйтынгам значымасці.
    3. У разе равенства — тыя, у якіх значэнне created_at ёсць найбольшым.

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

    Памяць і знанні — гэта разныя рэчы

    Эты два сістэмы рашаюць разныя проблемы і конкуруюць за адной і той жа прастор.

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

    Кожны элемент мае свой саўстанні бюджэт токенав: 2,048 для памяці, а большы — зазвычай 4,096 да 8,192 — для знанняў. Яны дзеляцца вікнам кантэксту модэлі, не парадуючы адзін другаму. Нават калі памяць выкарыстоўвае ўсю сваю квоту, знанняя продалжаюць атрымваць усю сваю квоту.

    Такое раздзеленне запобегае неблагопрыятным сітуацыям. Без адзельных бюджэтаў кліент з 500 дакладных фактов мог бы перакрыць усе можлівасці атрымання знанняў, і агент бы памятаў усё пра гэтага чалавека, забываючы пра дакументацыю да продукту, якая яму патрэбна, каб дапамогчы яму.

    Як памяць вплывае на глыбіну разумовых працэсаў

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

    Першым ёсць сігнал „залежнасці ад кантэксту“. Калі падчытанне вярта высокаадэкватныя факты, тое ў значэнні нізкая косайнае адстань да чырвонага паведамлення, рэйтынг context_dependency падыходзіць угору. Класіфікатор спрыяе гэта як „правільная адказ залежыць ад дадзэйна, спецыфічных для кліента“, і можа адправіць запіт на вышэйшы рэвэжынгавы рэвэрс. Запыт „Можнаце пераканацца маёй замовкай?“ атрымвае вышы рэйтынг, калі зберажаныя факты згадваюць незавершаную замовку, чым тая ж запыт ад кліента без історыі замовак.

    Другая проблема — цэнтрацыя рэсурсаў на процэс раздумаў. У рэжыме повнага аналізу мадэль выдэляе 4,096 або 16,384 токенаў на раздумы, залежна ад складнасці. Факты з памяці, якія дадаюцца ў запіт, выкарыстоўваюць токены з таго ж обмежанага кантэйнера, таму кліент, які мае 2,048 токенаў памяці, залішае менш прастору, чым той, хто мае 200. Ція рэсурсы керуецца незалежна, і кожны з іх мае жорсткі ліміт, таму сістэма ніколі не заменяе аднаго на другі.

    Элементы, якія застаюцца складнымі

    Две труднасці не паказваюцца на дыяграме архітэктуры.

    Змена фактав. Перакантаванні зміняюцца. Упадак «воліе запісвы раніцай» за тры месцы можа ператворыцца ў «воліе запісвы пасляобеднія». Сістэма не выканаўляе автаматычнае выяўленне супераслінства межу новымі і старымі фактамі. Праграда 0,92 іноды дапамагае ў выяўленні такіх супераслінстваў, калі новая заява дастаткова супадае з старой, каб паўнастаць з яю, але гэта не ўсега надзеяна. Наразе старыя факты залішаюцца завяршэннымі за дапамогою правілаў вякі і доступу, а крашчая обработка супераслінстваў ўключана ў планы развіцця.

    Галюцынацыя пад час выкарыстоўвання. Мадэль LLM, якая выкарыстоўваецца для выкарыстоўвання інфармацыі, часам выводзіць тыя рашэнні, якіх ніхто не высказваў. Нейтральны запыт, сформульаваны певным спосабам, можа быць зафіксаваны як "кліент, здаецца, незадоволены продуктам". Праграда 0,5 пазбавляе нас слабейшых вывадоў, але не ўсіх. Усуненне дуплікацый таксама дапамагае косвенна, адколі выдуманыя вывады рэдка калі павтараюцца, таму яны застаюцца як рэдка выкарыстоўваныя элементы, пакуль ўсуненне не пазбавіць іх месца.

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

    Два напрыямкі ў стыку

    Пасля размовы прыцэпны канал выкарыстоўвае LLM для выяўлення фактов, ацэнюе ўжоўтарнасць кожнага факту, фільтруе іх па праграме 0,5, стварае імбеддынгі, адмахвае дуплікаты па праграме косай схожасці 0,92, зберагае новыя факты і адмахвае старыя, калі досягнута межа у 500 фактов. Перад адпаведзеннем прыходзячыя паведамленні прыводзяцца у фармат імбеддынгаў, найболей значныя факты выбіраюцца па косай схожасці, сабіраюцца ў межах ліміту у 2 048 токенаў і вводзяцца ў кантэкст агента.

    Спаднёе чытанне

  • Адаптацыя адзінаго велікага запросу да модульнага асістэнта AutoGen для пакупак — Чаму адзін запрос чатбота не падходзіць для е-камеры і як дызайн AutoGen і MCP аддзельняюць розумеўне мовы ад дэтэрміністычнай бізнес-логікі.