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

Лепшая база даных для агента кадавання: PostgreSQL для стану, гібрыдны пошук для ўзгадвання

Лепшая база для агента кадавання: PostgreSQL для стану запускаў, выклікаў інструментаў і артэфактаў, а калі важна ўзгадванне — пласт гібрыднага пошуку з outbox.

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

Крыніцы: The Best Database for Coding Agents? Postgres for State, Weaviate for Recall

Выбірайце базу дадзеных для агента-кодавца, адзірнуўшы, калі саме ён выконвае свае задачы працоўнага дня, а не прыглядаючыся да абазавання ў AI. Агент, які запускае команды ў ізольаваных срэдах, вызывае інструменты, трансляюе логі, стварае файлы, прабуе зноў выконаць неудачныя крокі і продыржвае працу пасля перарываў, пераважна займаецца ведамасцю з дадатковымі наследкамі. Для такой ведамасці стандартны і надзеяны выбор — PostgreSQL. Хранілішча вектараў, такія як Weaviate, займаюць свае месца пазней, як аднае з додатковых складоў, калі продукту патрабуецца знаходзіць падобныя падзеі з мінулага і способы ўсунення проблемаў на адной лэгкай.

Пачніце з аднаго вызыву інструмента

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

Этыя запісі ўтвараюць адну логічную пераходную точку. У разе транзакцый яны або выкананы ўсе разам, або не выкананы ўзагалі, а іншыя сесіі ніколі не бачаюць стану, які застаўся незавершаным. Цяпер розглянем моменты збою. Працэс зупініваецца між станамі „Інструмент завершаны“ і „Выканання на высокім рывні“, і працэс відновлення павінен быць дэтэрміністычным. Прабава выканання адбываецца два разы, і унікальныя обмежэння павінны адхіліцаваць дублікаты. Артыфакт паказуе на выканання, якога не існуе, і іншы ключ павінен адхіліцаваць толькі тыя радкі, якія існуюць. Нічога тут экзотычнага няма. Гэта звычныя завады базы дадзеных, і агент для кодавання постаўляе на яны постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаўляе постаў

  • Этапы — гэта запланаваныя або завершаныя едыніцы працы, якія маюць атрыбуты залежнасці адзін ад другога.
  • Выклікі інструментаў фіксуюць вхідныя даны, выхідныя даны, статус, час адкладання, колькісць пракатоў і ключы ідэмпотэнцыі.
  • Выконанні ў сэндбоксе опісваюць сераўак, метаданы каманды, код выходу, выкарыстоўваныя рэсурсы і прычыны завершэння.
  • Падзеі ствараюць історыю, якая можа толькі дапісваліцца, для дыягнастыкі, стрымінгу і перэгляду.
  • Артыфакты паказваюць патчы, атласы, створаныя файлы або месцы зберагача об’ектаў.
  • Тачкі контролю зберагаюць тое, што неабходна для продажы працы.
  • Кожны элемент патрэбуе стабільную ідэнтыфікацыю і чысткія звязкі з іншымі элементамі. Прымарныя ключы, унікальныя абмежэннія, абмежэннія пераканання і стороннія ключы ускладняюць стварэнне некорэктных станоў, а стороннія ключы, у чыяму разе, гарантуюць, што кожны вызов інструмента належыць да рэальнага запуску, а кожны артыфакт можа быць прыналежнасцю своему создатэлю.

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

    Дзе паслужыць jsonb

    Інструменты быстро меняюцца. Одныя вяртаюць дыягнастыкі кампайляра, іншыя выдаюць запускі браузера, а трэція фіксуюць метаданы рэпазітарыя. Фіксаваныя столбцы для кожнага можлівага поля былі бы некарыстнымі, а jsonb падходзіць для тых частак, якія змінююцяся: аргументы інструментоў, адпаведзі забезпечывача, настройкі сэндбокса і метаданы модэля. PostgreSQL можа выконваць запыты да JSON з выкарыстоўваннем аператараў і выразаў па шляху, а таксама ствараць індэксы для ключоў і значэнняў за дапамогою GIN; компрэсіі, якія гэта дае, опісаны ў афіцыйным дапаможніку.

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

    Падбірайце схованне па шаблоне доступу

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

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

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

    Протакол запісу такі ж важны, як і сам двыжак

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

    • Да операцый, якія можна перапрыцягнуць, трэба даць ключ ідэмпотэнцыі, падтрымваны ўнікальным обмежэннем.
    • Змены жыцёвага цыклу трэба мадэляваць як пераходы стану з адпаведнымі назвамі, а не як свабодныя абнаўленні статусу.
    • Трэба зафіксаваць супаўзележныя рэкорды ў адной транзакцыі, калі частковая відавальнасць была б некорэктная.
  • Ўжыце каштоўнік выходных паведамленняў, калі змяна, якая была зафіксавана, должна спрычыніць аправу паведамлення або запуск задачы індэксавання.
  • Зберагаюце незменныя первісныя запісы падзей, калі важна аўдытна ведамосць, і, як толькі патрэбна, перзначайце проекціі на аднойчынку з іх.
  • Зберагаюце таймауты і станы „рэзультат не вядомы“ окрэмна ад падтвердзілых абэрасцей.
  • Людзі, які шукаюць найлепейшую базу дадзеных для агента для кодавання, не проста зберагаюць паведамленні з чату. Яны коордынуе парадоксальныя эфекты, такія як рэдагаванне файлаў, запуск ненадзірванага коду, вызов платных API і публікацыя змян. Слой стану павінен пераканаць, што кожны пераход можна пераглядзець і вярнуць у пачатковы стан.

    Калі слой выкарыстоўвання дадзеных ўзнагароджваецца

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

    У такім пошуку далей маюць значэнне точныя токены: назвы асабліванняў, версіі пакетаў, коды кампайляра, флагі, назвы файлаў і хэшы. Аднак корыстувачы опісваюць тую ж самую проблему разнымі спосабамі. Чысты пошук за ключавымі словамі працягвае концэптуальныя звязкі, тады як чыстая вектарная сэмабільнасць можа знецэніць буквальныя строкі, на якія паслугоўваюцца інжынеры. Гібрыдны пошук пакрывае аба падходы. Weaviate — адны з двайгоў, які выконвае вектарны пошук і пошук за ключавымі словамі BM25 адночасна і спаўнае ўсе рэйтынгі, такім чынам буквальны код, такі як ERR_MODULE_NOT_FOUND, дапамагае як доказ на аснове ключавых слов, а фраза „рантайм не можа распазнаць імпортаваны пакет“ — як доказ на аснове сэмантыкі.

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

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

    Пяцячастыякі план справак

    1. Автантыпічны статус у PostgreSQL. Запускі, крокі, вызовы інструментаў, рэзультаты працы віртуальнага сераўера, метаданы артыкулаў, пункты контролю і адносы доступу.
    2. Большыя пакеты дадзейнаў у сховішчы об’ектаў. PostgreSQL зберагае месцапаложэнні, хэшы, тыпы кантэнту, власнікаў і даныя прытрымкі.
    3. Рэжым выканання змян, якія былі падтверджаны. Рабочыя працэсы транслююць абнаўленні інтэрфейса, плануюць дальнейшую работу і ствараюць проекціі для пошуку, не выкарыстоўваючы непадтверджаныя даныя.
    4. Зялежна ад патрэбы — адзысканне дакументаў у вектарным чы аб’еднаным індэксе. Уключаюцца апускі, нормалізаваныя памылкі, каманды, выбраныя фрагменты логаў, апісанні выправленняў і метаданы, якія можна фільтрацыяваць.
    5. Раслічэнні рэзультатаў пошуку на адной з базаў дадзейнаў PostgreSQL. Індэкс знаходзіць кандыдатаў, а база дадзейнаў застаецца аўтарытэтам па актуальным стану і правамах.

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

    Чаго трэба утрымацца ад самага пачатку

    • База дадзеных на вектарах проста таму, што ёсць LLM. Большасць пачатковых операцыйных запытанняў ўжо ў структураваным фармаце, напрыклад, запускі для адного карыстальніка з пэўным статусам, крокі, якія неякша завершыліся няўзабаве, медленныя вызывы інструментаў або ўжыцце, зв’язаныя з конкрэтным комітам. Звычайныя індэксы можаць на іх адпавесці.
    • Одна JSON-блок для всіх станоў агента. Гэта дае тымчасовую зручнасць, але прыносіць слабкія абмежэнні, некомфортныя адночасныя абнаўленні і складныя запытанні, асоўваныя з жыцёвым цыклам. Гнеккія метададзеныя ў парадку, але неструктураваная сістэма зберагчэння дадзеных — ні.
  • Пошук унутрэй крытычнай транзакцыі. Агент павінен завершыць вызов інструмента нават тады, калі семантычны індэксаванне адстае. Раздзел «Outbox» і асінхронная проекцыя заходзяць гэтыя межы.
  • Спіс пераканаў

    Выберыце PostgreSQL першы, калі вам патрэбна:

    • транзакцыі ACID з калькамі для калькавання над рэкордамі выканання,
    • забезпечаныя звязкі між запускамі, крокамі, вызамамі, корыстнікамі і рэзультатамі,
    • безпечныя праказы і кантроль канкуранцыі,
    • просты фільтрацыя па статусе, часе, власніку, косце або выніку,
    • метаданы jsonb, якія ўсё ж можна запытваць,
    • надзеяны рэкорд для вярнення да стану пачатковага і аўдыту.

    Дадзіце гібрыдны механізм пошуку, калі вам таксама патрэбна:

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

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

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

    Чаму гібрыдны пошук для логаў? Інжынерныя даныя сумішуюць точныя токены з прыродным языкам. BM25 адкрывае точныя коды, назвы пакетаў і імены файлаў, а пошук вектараў спаўяе апісанні адной неудачы, напісаныя рознымі словамі.

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

    Супаўязаныя матэрыялы

  • Практычныя прыміткі: Qwen 3.8 нарэшце выйшаў, кодаванне на рэвэле Opus з можлівасцю выкарыстоўвання локальных рэсурсаў — Паследовыя інструкцыі па вікорыстоўванню Практычных прымітак: Qwen 3.8 нарэшце выйшаў, кодаванне на рэвэле Opus з можлівасцю выкарыстоўвання локальных рэсурсаў: контракты, перакрыцчы і месцы для додавання коду для команд, якія впроваджаюць гэты патэрн.