Галоўная / Артыкулы / Система RAG можа «функціонаваць» і пры тым спачатку аднаходзіць некоректныя доказы.

Система RAG можа «функціонаваць» і пры тым спачатку аднаходзіць некоректныя доказы.

Практычныя інструкцыі па тым, як система A RAG можа «функцыянацыяваць», але ўсё рава спачатку знаходзіць некоректныя доказы: контракты, чекі і месцы для вставкі коду для команд, якія выкарыстоўваюць гэты патерн.

1229 слоў

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

Система RAG можа “выканаць” свою роботу, але ўсё рава спачатку знайсці некоректныя доказы

Калі працуеце над стадіяй A RAG System Can, спачатку запісайце контракт: неабяжныя даны, сігнал успеху і тое, што выканаецца у разы частковага невясковасці. Такі список контроля дапамагае залічыць пазнейшыя змены ў коде. Зберагаюце настройкі паза кодам прыемліка. Файлы серавэсу, хранілішча секретных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць без неабяжнага чытання всіх элементаў структуры. Перад налагоджэнням запрошэнняў (prompts) пераканайцеся, што рэтарык запрошэнняў эфектываў на фіксаваным наборе запытанняў. Частае змена запрошэнняў рэдка калі вялікі парадокс слабай спроможнасці системы да пошуку.

Короткая адмова

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

def recall_at_k(gold_id: str, ranked_ids: list[str], k: int = 5) -> int:
    """1 if the gold chunk appears anywhere in the top k, else 0."""
    return int(gold_id in ranked_ids[:k])

def reciprocal_rank(gold_id: str, ranked_ids: list[str]) -> float:
    """1/rank of the gold chunk's first appearance, 0 if absent."""
    for rank, doc_id in enumerate(ranked_ids, start=1):
        if doc_id == gold_id:
            return 1.0 / rank
    return 0.0
def reciprocal_rank_fusion(
    rankings: dict[str, list[str]], k: int = 60
) -> list[str]:
    """Fuse multiple ranked lists using rank position only."""
    scores: dict[str, float] = {}
    for ranking in rankings.values():
        for rank, doc_id in enumerate(ranking, start=1):
            scores[doc_id] = scores.get(doc_id, 0.0) + 1.0 / (k + rank)
    return sorted(scores, key=scores.get, reverse=True)

Чы маглі б вы рашыць проблему самі?

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

Заключная думка

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

Код і чытанне

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

Чарт контролю эксплуатацыі

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

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

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

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

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

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

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

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

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

Дакладнасць практыкі зміцнення 0/710: вы мерзіце час выканання, класію адказаў і колькасць выкарыстоўваных токенав для гэтага запісу, а пасля выявляеце, чы хацеце застаўіць змяну, спынюючыся на апранаванай сэтцы пытанняў, а не на індывідуальных спостараваннях.

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

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

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

Запісвайце часы выканання, а таксама вартасць токена чыў запиту праз адныя з функцыйнальных рэзультатаў. Відразлівае паказанне вартасцей запобегае неспадзячым рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды.

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

2-я стадзія практыкы заспекцыі працюе лепей, калі яе спрыямаць як меравальную плошчу. Запісайце адну ідеальную транскрыпцыю, адзін прыклад нявыполненасці і запіс пра анулювання змены, перш чым расширваць сферу дзеяння.

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

Дзеянні паўжасткі 3/710: звярніце увагу на час працы стэны, клас памылкі і колькасць выкарыстоўваных токенав для гэтага зьязку, а пасля, на аднойчынай базе паказаных пытанняў, а не на індывідуальных прыкладах, выявіце, чы хацеце застаўіць змяну.