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

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

Ліміты контексту, вектарныя LTM, прыемкі LangChain buffer+retriever, гібрыдныя сховышчы, а таксама безпека, прыватнае жыццё і масштабаванне у працэйнай среды.

1952 слоў

Канвы контэксту ёсць кашточная памяц 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 для вычысцэння і экспорту данных, а таксама карточкі падтрымкі. Чэтырты тыдзень: гібрантны рангаванне структураваных ентытаў і неструктураваных суседзей, плюс панелі каштоў. Пераход да складных потокаў памяці раней, чым будзе адбыта ізоляцыя тэнантов, прыводзіць да таго, што дэманстрацыі стаюць прытварам. Паследовнасць важней новатыні. Кожны тыдзень павінен заканчвацца меркамы, якія іншы чалавек можа перадзеўсці без прысутнасці таго, хто іх спачатку реалізаваў, адтак як системы памяці жыву дылей, у якіх былі створаны, і будуць апераваны людзьмі, якія ніколі не бачылі першых праектных нотатак.

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

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

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