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

Як адладжваць пусты пошук, калі RAG-сістэма нічога не вяртае

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

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

Крыніцы: **Part II — When RAG Returns Nothing**

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

Падзеяння інфармацыі можа збіцца ў багацько мест

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

1. Пачніце з індэксавання і стварэння эмбедынгаў

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

  • Разам з’явіце калькі фрагментаў, якія зберагліся. У іх павінен быць чытальны тэкст, стабільныя ID, эмбедынгі і всі метаданы, на якіх базуюцца вашы фільтры.
  • Ўжыце тыя ж мадэлі эмбедынгаў і ўзрасты для дакументаў і для запытанняў корыстніка. Змена мадэлі запытання без перабудовы індэкса прыводзіць да таго, што значэнні показнікаў сэмантычнай адпоўнасці стаюць беззначнымі.
  • Таксама ацэніце працэс парсінгу. PDF-файлы, сканы, табліцы і сторанкі HTML могу ператварыцца на порожнія або нескасаваныя фрагменты, хаця сістэма яшчэ будзе паказваць, што задача завершылася успешна.

2. Аналізуйце прагі, значэнні показнікаў і фільтры

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

results = vector_store.search(query_embedding, top_k=10)
for r in results:
    print(r.score, r.metadata.get('source'))

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

Фільтры можу выдаліць хорашыя рэзультаты

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

3. Анаіз перапісву запіту і якосці фрагментаў

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

Разбій на часткі таксама выконваецца неудачна. Загалоўка, такая як „Складзенне настройкаў маршрутызатора X500“, не павінна быць аддзеленая ад інструкцый, якія знаходзяцца пад яю. Разбіяйце дакумент па яго структуры, каб загалоўка, яе параграфы, пункты спісу і асупраўніваючы кантэкст засталіся ў ўсім цэлым. Правы размер часткі залежыць ад обсягу працы, але разумны пачатковы дыяпазон — ад 500 да 1 000 токенав, з невялікім перакрыццем, пасля чаго адбываецца ацэнка на рэальных запітах.

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

4. Спалучэнне лексычнага і вектарнага пошуку

Вектарный пошук ўзьміцца ў прыгоду, калі корыстувальнік і дакумент выражаюць адну і тую ж ідэю рознымі спосабамі. Лексычны пошук, такі як BM25, ўзьміцца ў прыгоду, калі важлівы точныя токены. Паколькі складныя запіты рэдка калі належаць толькі да аднаго тыпу, у прымэтных сістэмах часта вікорыстоўваюцца оба падходы. BM25 зазвычай ёсць лепшым для такіх рэчаў, як коды абэракцый (напрыклад, ERR-XK-1042), SKU, номеры рахункоў-фактур, назвы продуктав, назвы класаў, ключы налаштаванняў і назвы параметраў API. Вектарны пошук дагадвае пра суседніяя концэптуальныя адпаведнасці, тады як BM25 стараецца, каб не працягнуцца точныя лексычныя доказы. Тыповыя рашэнні спачатку знаходзяць шырокі набор кандыдатаў, а пасля прыкладзяюць болей сільны механізм перэранківання для падвышэння точнасці.

5. Знаходзіце шырока, а пасля перэранківайце

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

Звычны патэрн — скарыстаць 20–50 кандыдатаў з вектарнага і лексычнага пошуку, з’едыніць іх і адмахнуцца ад дублікатаў, а пасля пераранкаваць іх, залішыўшы найлепшыя 5–10 варыянтаў. Крос-кодэры ёсць эфектывнымі і створаныя для ацэнкі рэлевантнасці, тады як пераранкавальнік на адной большай мовной модэлі можа выконваць болей сложныя інструкцыі, але зазвычай працюе медленней і коштуе дорожа.

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

Служынне з’еднанне і адзначэнне дублікатаў

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

6. Пашырэнне запіту з запланаваным альтэрнатыўным варыянтом

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

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

docs = retrieve(query)
if not useful(docs): docs = retrieve(expand(query), hybrid=True)
if not useful(docs): return ask_for_clarification_or_no_answer()

Порожнія рэзультаты проты некальканых

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

7. Болей стойкая архітэктура вырабоцтва

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

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

Доверлівасць вялічына наступны крок

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

Не включаць безпеку ў цыкл прабавак

Будзь-яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя

log({
  'query': query, 'rewritten': rewritten_query, 'filters': filters,
  'candidate_count': len(raw_results), 'scores': scores,
  'selected_chunk_ids': selected_ids, 'fallback': fallback_stage
})

Разумная парадыгма адміністрацыі кашалоў

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

  1. Спачатку пераконтракцыя дакументаў: пераканайцеся ў колькасці дакументаў, аналізаваным тэксце, колькасці частак, схованых вектарах і колькісці запісаў, якія, як вядома, должны існаваць.
  2. Далей — працэс выкарыстоўвання первісных запітоў: адправіце асалодны запіт без жадных додатковых фільтраў чы праград, а пасля прачытайце топ-к рэзультатаў і ўзраўненняях да яных.
  3. Паштоўна вярніце фільтры, адна за адной, так як гэта дапаможа выявіць той самы фільтр, які спрычыніў вялікія порожнія рэзультаты.
  4. Пераканайцеся ў сэмантыцы узраўненняяў: чы вышэйшы чы ніжэйшы показнік лепшы, і чы прыменяецца якая-небудзь нормалізацыя?
  5. Параўняйце асалодныя чы перапісаныя запіты, застаўляючы тыя ж ідэнтыфікаторы, каб з’ясаваць, чы перапісванне дапамагае чы шкодзіць кантролі рэзультатаў.
  6. Ацэніце гібрыдны спосаб выкарыстоўвання і перыяркавання рэзультатаў на аднойчы пазначанай групе запытанняў, пераканаючыся, чы рэчы, якія якія ляжалі на меце, з’являюцца сярод топ-k і топ-n пасля перыяркавання.
  7. Прабавайце метод адзінаковага падходу, выдаючы порожнія і слабкія рэзультаты, каб паўнастацьіце, чы сістэма дае адказ чы адмовляе, і чы не створае халюцынацый.

Што мерыць

Толькі якосьць адказа не дае достатню інфармацыю пра процэс выкарыстоўвання даных. Следзіце за показнікам recall@k (чы рэч, якая якія ляжалася на меце, была ў групе кандыдатаў?), тачнасцю пасля перыяркавання, часткаю порожніх рэзультатаў, часткаю адзінаковага падходу, часам адпаведзення, а таксама часткаю запытанняў, якія патрабавалі дадатковых дакументаў чы адказаў. Раздзеляйце гэтыя показнікі па тыпу запытанняў, напрыклад, семантычныя запытанні проты точных ідэнтыфікатораў, а таксама па корыстніках, мовах і колекціях дакументаў, таму што загальныя сярэбры можу закрыць проблемы ў адзіных частках.

Не карайце спачатку LLM

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

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

  • Час працы запіту RAG у дзесяці мільйонаў дакументаў: каналы адзыскання, маршрутызаторы, агенты і метрыкі ацэнкі — Канал адзыскання з часам працы менш чым 200 мс з відпаведнымі фільтрамі SQL, гібрыдным пошукам і перэранківанням, а таксама маршрутызацыяю запітаў, оркестрацыяю агентаў, метрыкамі ацэнкі і скрыптам канвею Qdrant.
  • Практычныя прыметкі: падышча карыстоўнасці RAG — Частка 2: HyDE (гіпотэтычны дакумент) — Практычны паследовы апіс практычных прыметак: падышча карыстоўнасці RAG — Частка 2: HyDE (гіпотэтычны дакумент), укладаны для команд, якія вікорыстоўваюць гэты патэрн, з кантрактамі, пераказамі і слотамі для коду.