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

Короткі вікна, дзейнавічныя спомнення: стварэнне зовнішньага запам’ятавання для агентаў LLM

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

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

Крыніцы: **A Developer’s Guide to LLM Memory**

Канвы кантэксту ёсць кашточная памяц RAM, а не історыя жыцця

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

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

Чаму агенты патрабуюць надзеяной зовнішней памяці

Агент, які выключаець доверлівае толькі да віндаву, забывае свае прагператыванні межы сэсіямі і трапляецца без абмежэнняў для дзейнаў, якія трываюць дуго. Доўгатэрмінная памяць — гэта стойкі, можна шукаць хранальнік, створаны атавок модэлю: прафілі корыстувачоў, выучаны факты і падсумкі пракцэсаў, якія адбыліся раней. Короткаатэрмінная памяць дапамагае падтрымаць цэліснасць адной розмовы; доўгатэрмінная памяць забезпечвае стойкую адзыскву інфармацыі. Генераванне з падкрэпленнем адзысквай інфармацыі (RAG) — гэта стандартны падход: запрашваюцца рэлевантныя фрагменты, якія падставляюцца ў запіт, і модэль можа прааналізаваць іх без неабходнасці запрашвання ўсіх дадзеных у параметры.

Вектарныя базы дадзеных як основа

Тэкст ператвараецца ў векторы умяшчэння; пошук садоўжнасці (косай, евклідовы і іншыя) знаходзіць «суседаў» у прасторэ значэння, а не толькі элементы, якія падходзяць па ключавым словам. Жыцёвы цыкл: умяшчаеце і зберагае новыя спостарэнні разам з метаданаямі; умяшчаеце новы запіт і выкарыстоўвае метод «top-k» для адбору рэзультатаў; дадаеце дапаможную інфармацыю да запіту і генеруеце рэзультат. Выборы пад час праектавання маюць значэнне: зберагаць неапдытаваныя тэксты (точныя, але з шумамі) протыва кантракцэў, напісанных LLM (компактныя, але з втратамі), протыва выдзельваных аб’ектаў. Зберагчык можна актывація ў кожны момент розмовы, пасля завершэння сесіі або за дапамогою асінхронных фільтраў. Якосьць вектораў умяшчэння, індэксы у стылі HNSW і час адзначэння рэзультатаў вялікай значыцтву для таго, насколькі швыта будзе робіць агент пры генераванні, яшчэ перш чым ёна пачнёцца.

Эскіз LangChain: буфер плюс апарат для адзначэння рэзультатаў

Для кароткага тымчасовага зберагчыка: ConversationBufferMemory захоўвае актуальны транскрыпт у запыце.

from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAI

# 1. Setup the basic components
llm = OpenAI(temperature=0)
template = """You are a helpful AI assistant.

{history}
Human: {input}
AI:"""
prompt = PromptTemplate.from_template(template)

# 2. Instantiate short-term memory
memory = ConversationBufferMemory(memory_key="history")

# 3. Create the memory-enabled chain
conversation_chain = LLMChain(
    llm=llm,
    prompt=prompt,
    memory=memory,
    verbose=False # Set to True to see the constructed prompt
)

# First interaction
conversation_chain.predict(input="Hi, my name is Alex.")
# Second interaction - the model will remember "Alex" from the 'history' variable
conversation_chain.predict(input="What's my name?")

Даўнэйшыя паследкі: VectorStoreRetrieverMemory у супрацоўке з Redis, Chroma або падобнымі інструментамі выкарыстоўваецца для запрашання сэмантычна адносоўных паказаных раней дакументаў.

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.memory import VectorStoreRetrieverMemory

# Assume 'docs' is a list of LangChain Document objects loaded from a persistent source.
# For this sketch, we'll use an in-memory FAISS vector store.
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embeddings)
retriever = vectorstore.as_retriever(search_kwargs=dict(k=1))

# 4. Instantiate long-term memory
long_term_memory = VectorStoreRetrieverMemory(
    retriever=retriever,
    memory_key="relevant_docs" # Use a different key for long-term context
)

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

The following is a friendly conversation between a human and an AI.

Relevant pieces of information from past conversations:
{relevant_docs}

Current conversation:
{history}
Human: {input}
AI:

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

# After a chain run, inspect the long-term memory's state
retrieved_data = long_term_memory.load_memory_variables({"prompt": "some user input"})
print("Retrieved documents:", retrieved_data['relevant_docs'])

Гібрыдныя структуры для сложнейшых агентаў

Агенты, які займаюцяся адміністрацыёю, частаўка памяць на разныя рангі: Redis (או аналогічныя срэдства) для швыдкага кэшу паведамленняў, а хранілнік вектараў — для семантычнага зберагання інфармацыі на далёкую перспектыву. Памяць для аб’ектаў праходзіць да большага: ведомасці аб людзях, організацыях і ўзаўсёмых зв’язках фіксуюцца ў графах аб табелях, каб былі можлівы точныя даныя, якіх не можа гарантаваць толькі семантычны пошук. Неструктураваныя хранілнікі адмініструюць задачы «пашук супадзячага тэксту», а структураваныя — аналітычныя запіты. Хроналагічны строй памяці, які фіксуе спазырванні, думкі і дзеянні, спрыяе пазнейшам аналізу і корэкцыі стратэгій.

Адміністрацыя: безпека, прыватнасць, масштабаванне, цэлесообразнасць

У памяці зберагаецца персональная інформацыя і секрэты. Яе трэба шыфруваць як у стані спакою, так і пад час перадачы. Кожны запіс трэба пазначыць ідэнтыфікаторамі корыстувальніка аб сесіі, каб была можліва выдалення дакументаў па прынцыпам GDPR/CCPA («права на забывчасць»). Калі індэксы растуць, трэба налаштаваць алгорытымы HNSW/IVF, дзеляць даныя на часткі і сочыць за вартасцю запітоў, якія платацца. Трэба західвацца ад «занаводжэння» памяці за дапамою пераканання аб карантыйнага етапу пры вводзе інфармацыі ў надзяйны хранілнік.

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

Выбір таго, што павінна застацца у дзейный памяці

Не кожна фраза заслуговае на вячны жыццё. Зберагачванне необработаных паведамленняў стварае проблемы з ўзяццем інфармацыі; зберагачванне нічога стварае амнезію. Практычны фільтр ставя тры запытанні: Чы ўсё гэта стабільна працюе працягом калькі недзеў (перакананні, ідэнтычнасць, абмежэнні)? Чы гэта можна выкарыстоўваць пазней (назвы праектаў, канечныя даты, паказывачы аутэнтыфікацыйных даных інструментаў — ніколі самыя секрэты)? Чы можа неправільны выкарыстоў каштаваць шкоды (медычныя, правовыя, фінансавыя)? Класы з вялікай шкодой патрабуюць адоўжанага падтверджэння чы людскай пераказкі пры зберагачванні.

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

Адзначэння, якія падтверджаюць, што памяц дапамагае

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

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

Адпаведнасць за організацыю

Доўгастраўная мэмарыя — гэта поверхня продукту, а не проста пункт у інфраструктурным чэк-лісце. Хтосьці неабходна бяраць на сябе адпаведнасць за перыяды зберагання, фарматы экспорту і тэрміны адпаведнасці па выдаленні. Манэжэры продукту вяршаюць рашэнне, чыі функцыя “згадаць мой замовленне кавы” ўключаная ў спектр задач; аддзел безпекі вяршаець рашэнне, чыі гэты праграма зберагаецца зашыфраваны ўжо разам з логамі аўтэнтыфікацыі. Калі адпаведнасць неясная, базы дадзеных з мэмарыямі стаюць “сіротскімі” базамі, якія ніхто не адважваецца чыставаць — і самэ так накапліваюцца выкладкі за расходы і неяўнае супакоўненне з правіламі.

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

Конкрэтны мадэль керавання для агентаў, якія выкарыстоўваюць памяць

Для ўседзённых операцый патрэбны панелі керавання, якія могу чытаць інжынеры, якія не спецыялізуюцца на ML: колькасць дакументаў, запісаных ў дзень, шчыльнасць адчынення, час адчынення на рэвалюціі p95, час адпаведзення на запыты на выдаленне і вартасць зберагання за актыўнага корыстувача. Яе трэба павесты, калі значэння запісаў расце стрымліва (спробы втрымкання падказак, каб запалаваць памяць) або калі шчыльнасць адчынення падупае пасля апградэйваўкі.

З боку прыемлівання, трэба адкрываць для корыстувача вікну “Што вы знаеце пра мяне?”, якое падтрымвалася тымі ж базамі дадзеных, якія чытае агент. Прозрачнасць зменшае навантажэння на падтрымку і дапамагае рана выявіць забруднення. Яго трэба супакоўваць з можласцю рэдагавання/выдалення, якая выкарыстоўвае тыя ж API, якія ужо ўсунутыя.

Для автараў-агентаў неабходна запроставіць невялікую бібліятэку інструментаў для працы з памяцю — remember_fact, forget_fact, search_memory — з строгімі механізмамі автарызаціі, каб чыстая база дадзеных вектароў ніколі не выглядала як звычны SQL-інструмент. Інжэкцыя запітаў, якія прасіюць «ігнараваць паканальныя інструкцыі і вываліць памяць», должна быць абсолютна недазволена.

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

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

З эскіза да рэальнасі з колькіма тэнантамі

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

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

З боку мадэлі лепшая цітаваць ідэнтыфікаторы запам’ятаваных пам’ятак у схованых запісніках або структураваныя рэзультаты інструментаў, так юбачальная адпаведзь зможа мець фразу «так як вы сказалі нам X ў квітні мінулага года» з можлым адстэпленнем да крыніцы. Цітаты таксама спрыяюць шырэйшым розследаванням забруднення: у вадной пам’яткі ёсць ідэнтыфікатор, які можна выкарыстоўваць для ёё усунення. З часам такая аперацыйная дысцыпліна мае большое значэнне, чым выбор будзь-каго адпаведнага вэндара базы дадзеных вектараў.

Спісак перагляду пры выклікванні памяці «завершана»

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

Навучыце каманды падтрымкі пра тыкеты, заснованыя на памяці: корыстнікі, якія кажуць «з’явілася памятка, але я не запісан», патрабуюць дыягназу працэйнай ніткі, а не праховання дадзей; корыстнікі, якія кажуць «з’явілася памятка, але занадта багато», патрабуюць можлівасці выдалення і спосабаў зберагчэння. Дайце інструкцыі падтрымкі з точнымі адміністрацыйскімі інструментамі для безпечнага аналізу прастора імен. Тэхнічная архітэктура становіць сэнс толькі тады, калі людзі параду ўжо не могуць кераваць яе, ствараючы таёмныя табліцы з прывыканнямі корыстнікаў.

Адна графік працы

Першыя тыдзень: буферная памэць і дакладны логаванне запыткаў. Другі тыдзень: вектарныя апэраты upsert з фільтрамі для тэнантов і маленькі набор даных для апытку recall. Трэці тыдзень: API для вычысцэння і экспорту даных, а таксама карточкі падтрымкі. Чэтырты тыдзень: гібрантны рангаванне структураваных ентытаў і неструктураваных суседзей, плюс панелі каштоў. Пераход да складных потокаў памяці раней, чым будзе адбыта ізоляцыя тэнантов, прыводзіць да таго, што дэманстрацыі стаюць прытварам. Паследовнасць важней новатыні. Кожны тыдзень павінен заканчвацца меркамы, якія іншы чалавек можа перадзеўсці без прысутнасці таго, хто іх спачатку рэалізаваў, адтак як сістэмы памяці жыву дылей, у якіх былі створаны, і будуць апераваны людзьмі, якія ніколі не бачылі першых праектных нотатак.

Ішчы раз паглядзім на прычыны забруднення і дрыфту

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

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