Практычныя прытамулі: Разбіўка на часткі межаюць родзічамі і дзецямі та іерархічна індэксаванне ў RAG: А
Практычныя прыказкі: Разбіўка на часткі межаючы адзінам і дзецямі та іерархічна індэксацыя ў RAG: А – кантракты, перакрыцці та слоты для коду для команд, якія викорыстоўваюць гэты патэрн.
У гэтым карыце парадоксальны спосаб разбірваець весь процес, пры яком з сырых матэріялаў ствараецца рабочы система для: розбівання на часткі «родны–дзеця» і іерархічнага індексавання ў RAG: практычныя вядомасці для кращага выкарыстоўвання дадзеных. Акцэнт ставіцца на практычныя крокі, чыстае перакананне ў правильнасці дзействаў і код, які можна проста падключыць у репазітарый, не прабуючы здогадвацца пра намеры разработчыка. У стадії агульнага апісання неабходна з’явіць вхідныя даны, адпаведальнага за крок і критэрыя завершэння прычымоў перад зменай коду. Аператары должны магчымае перадзеяць крок з вядомай точкі контролю, не прабуючы здагадвацца пра схованы стан системы. Неабходна адначасова задокументаваць як правільны ход працы, так і способы ўсунення праблем. Перапрыбуткі, перакананне людзей і обробка некоректных паведамленняў є частью самага продукту, а не пасляднім элементам дапрацоўкі.
Чаму розбівання на часткі ёсць найважэлейшай частью RAG
Калі працюеце над разумоўкамі, чым насправды є этапы функцыянавання, спачатку запісайце умовы: неабходныя даны, сигнал успеху та тое, што відбываецца у разы частковага невдачліва. Такі список переконвае ў тым, што пазнейшыя змены коду будуць чэстнымі. Валіце маленькія, теставаныя елементы замест велікіх скрыптов. Калі якісь крок не выходзіць, невдача должна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг дзеянняў. Перад налаштаваннем запитоў пераканайцеся ў рівні відтворэння інформацыі на фіксаванай сэтке запитанняў. Частыя змены запитоў рэдка калі вядуць да павышэння якасці адтворэння інформацыі.
Тыповы прыклад невдачліва
Калі працюеце над стадзіяй «Тыповы прыклад неудачы», спачатку запісайце кантракт: неабяжлівыя вхідныя даны, сігнал успеху і тое, што выходзіць пад частковай неудачы. Такі чэк-ліст дапамагае заставіць пазнейшыя змены коду быць чыстымі. Спрэтавайцеся да гэтай стадзіі як да кантракта межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаце правіла пераканання успеху і адмовіцеся ад тыхоўскага частковага завершэння. Замерайце рівень запам’ятовання на фіксаванай сэтцы пытанняў прычым перад налаштаваннем запрошэнняў. Частае зміненне запрошэнняў рэдка калі вялікі эфект на слабую систему аднаходжэння інформацыі.
from sentence_transformers import SentenceTransformer
import numpy as np
model = SentenceTransformer("all-MiniLM-L6-v2")
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
query = "What is a risk of caching?"
chunk_a = "Caching improves system performance significantly."
chunk_b = "However, improper cache invalidation can lead to stale data issues."
query_embedding = model.encode(query)
score_a = cosine_similarity(query_embedding, model.encode(chunk_a))
score_b = cosine_similarity(query_embedding, model.encode(chunk_b))
print(f"Chunk A similarity: {score_a:.4f} - '{chunk_a}'")
print(f"Chunk B similarity: {score_b:.4f} - '{chunk_b}'")
Chunk A similarity: 0.5891 — 'Caching improves system performance significantly.'
Chunk B similarity: 0.5103 — 'However, improper cache invalidation can lead to stale data issues.'
Разбіўка на фрагменты «родны–дзеця»
Калі працюеце над стадзіяй разбівання на «родык» і «дзеця», спачатку запісайце угоду: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцьварыць пазнейшыя змены ў кодзе чыстымі. Запісвайце час выканання і кост токеноў або запытаў праза функцыйнае рэзультат. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя среды. Замерьце рэткі адзыв на фіксаваны набор запытаў прычым регулюванні прапаза. Частыя змены прапаза рэдка калі вядуць да павышэння якосці адзыва. Калі працюеце над стадзіяй разбівання на «родык» і «дзеця», спачатку запісайце угоду: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцьварыць пазнейшыя змены ў кодзе чыстымі. Дакументавайце як «шчаслівы» так і «вярнучыся» шляхі. Перапрыбуткі, людзкія контрольныя пункты і обработка нераспакаваных паведамленняў ёсць часткай продукту, а не пазнейшым дапрацоўкам.
Як гэта працуе ў практыцы
Прыцэп «Як гэта працюе на практычным етапе» найкраща працюе, калі яго розглядаць як вимерную плошчу. Зберыце адна ідеальная версія, адзин прыклад неудачы і запіс парадоксу перад расшырэнням масштаба. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Раздзеліце правілы часткавання інфармацыі ад правіл яе выявлення. Змена ў одных не павінна прымусваць перапісванне іншых, калі змянююцца паказателі якосці.
def build_parent_child_index(document_section, parent_text, child_splitter, embedding_model):
child_chunks = child_splitter(parent_text)
records = []
for child_text in child_chunks:
records.append({
"text": child_text,
"embedding": embedding_model.encode(child_text),
"parent_text": parent_text # full parent stored directly on every child
})
return records
parent_text = """Indexing improves query speed by reducing scan time across large tables.
Caching reduces repeated computation but may introduce staleness if not invalidated properly.
Query optimization involves rewriting SQL queries to use more efficient execution plans."""
child_texts = [
"Indexing improves query speed by reducing scan time across large tables.",
"Caching reduces repeated computation but may introduce staleness if not invalidated properly.",
"Query optimization involves rewriting SQL queries to use more efficient execution plans.",
]
records = [
{"text": t, "parent_text": parent_text} for t in child_texts
]
for r in records:
print(f"Child: {r['text'][:50]}...")
print(f" → linked to parent ({len(r['parent_text'])} chars)\n")
Ключовая ідея: выявляць маленькі элементы, расшыроўваць большыя
Ключовая ідея этапа адзыёвання працюе найэфектыўней, калі яго спрыяваць як мерыемую паверхню. Запісаце адна ідеальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштаб. Спрыявайце гэты этап як кантракт межа вхіднымі дадзеннямі і паверыжанымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад тыхняй частковай роботы без паведамлення. Раздзеліце правілы часткавага разбівання дадзенняў ад правілаў адзыёвання. Змена ў адных не павінна прымусваць перапісванне іншых, калі змянююцца паказнікі якасці.
def parent_child_retrieve(query, child_records, embedding_model, top_k=3):
query_embedding = embedding_model.encode(query)
scored = [
(np.dot(query_embedding, r["embedding"]) /
(np.linalg.norm(query_embedding) * np.linalg.norm(r["embedding"])), r)
for r in child_records
]
scored.sort(key=lambda x: x[0], reverse=True)
top_children = scored[:top_k]
# Expand each matched child to its parent - but deduplicate first
seen_parents = set()
expanded_context = []
for score, record in top_children:
parent = record["parent_text"]
if parent not in seen_parents:
expanded_context.append(parent)
seen_parents.add(parent)
return expanded_context
for r in records:
r["embedding"] = model.encode(r["text"])
context = parent_child_retrieve("What is a risk of caching?", records, model, top_k=2)
print("Context sent to the LLM:\n")
for c in context:
print(c)
Чаму гэта так добра працюе
Этот падж выконваець наяўнасцю таму, што ён лепша працуе, калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адны ідеальны прымер роботы, адзін прыклад неудачы і запіс пра вярненне да пачатковага стану перад расшырэнням масштаба. Запісвайце часы виконання і косты токеноў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівае паказанне костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмовай среды ў спяльнаныя сераўы. Раздзеліце політыку часткавага оброблэння дадзеных ад політыкі ўтрымання іх. Змена адной з яных не павінна вымагаць перапісвання другой, калі зменяюцыся паказнікі якосці. Этот падж выконваець наяўнасцю таму, што ён лепша працуе, калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адны ідеальны прымер роботы, адзін прыклад неудачы і запіс пра вярненне да пачатковага стану перад расшырэнням масштаба. Дакументавайце як шлях успеху, так і шлях вярнення да нормальнага стану разам. Перапрыбуткі, людзкія контрольныя пункты і обробка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Іерархічны індексаванне: праходжэння ўсё далей
Для запуску іерархічнага індексавання неабяжна практыка: перш чым зменьваць код, неабяжна визначыць вхідныя даны, адпаведальнага за крок і критэрыі завершэння. Аперацыяныя працавнікі должны магчымасць перзапуск крока з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставальныя елементы замест большых скрыптов. Калі крок не выйшаў, прычына неабяжна стосавацца адной відпаведальнасці, а не заплутанага ланцоўка задач. Наводзіце тыя часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цитатаў аперацыяныя працавнікі не зможуць адразніць галюцинацыю ад прасоў у індексаванні.
Document: "Cloud Architecture Guide"
Section: Networking
Subsection: Load Balancing
Chunk: Round-robin method
Chunk: Least connections method
Subsection: CDN usage
Section: Security
Subsection: IAM policies
Subsection: Encryption
Чаму іерархія мае значэнне
На стадії «Чаму іерархія мае значэнне» неабходна практычная дэфініцыя вхідных даных, адміністратара крока і крэтэрыяў завершэння пры перадзеіснаванні коду. Аператары должны магчымае запускать крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце цій стадіі як даговору межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, практычна дэфініюйце перакананне ў успеху і адмовіцеся ад беззвучнага частковага завершэння. Цітуйце тыя часткі, якія фактычна сталі падставай для адпаведнай адказы. Без цітаў аператары не зможаць разлічыць галюцинацыю ад прасоў у індэксаванні.
Іерархічнае выкарыстоўванне дадзеных у практыцы
Для стадії рэтрыбыціі з іерархічным падходам неабяжна перад зменайом коду адзначыць вхідныя данні, адпаведальную особу за крок і критэрыі завершэння. Аперацыяныя працавнікі должны магчыма ўможна перайсці на выкананне кроку з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выканання і вартасць токенаў або запытак па боку функцыйнальных рэзультаатаў. Відразлівае паказанне вартасцей запобегае неспадзяваным рахункам, калі процес пераходзіць з дэмовай среды ў спадзеленую. Указвайце тыя часткі тексту, якія фактычна сталі падставай для адпаведнага адказу. Без ціх цытатаў аперацыяныя працавнікі не можуць адразліваць галюцинацыі ад прасоў у індэксаванні. Для стадії рэтрыбыціі з іерархічным падходам неабяжна перад зменайом коду адзначыць вхідныя данні, адпаведальную особу за крок і критэрыі завершэння. Аперацыяныя працавнікі должны магчыма ўможна перайсці на выкананне кроку з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Дакументавайце як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія перакрыцця і обработка неканальных паведамленняў є часткай продукту, а не чымсь занадта додатковым.
Для падчырнення.
Індексаванне типу «родык-дзеці» проты іерархічнага індексавання
Калі працуеце над этапам «родык-дзеці» проты іерархічнага індексавання, спачатку запісайце умовы: неабяжлівыя даны, сигнал успеху і тое, што выходзіць па частым неудачам. Такі список контроля дапамагае заліцьваты змяны ў кодзе. Валіце маленькія, тэставаныя елементы замест вялікіх скрыптов. Калі якісь крок не выйшоў, неудача должна вказваць на адну адпаведальнасць, а не на заплутаны ланцюг задач. Перад налаштаваннем запитоў пераканайцеся ў рэкале на фіксаваным наборы пытанняў. Частае змена запитоў рэдка калі-небудзь выправляе слабую систему адналёгчэння інформацыі.
Шаблон рэалізацыі (рэальны ланцюг RAG)
Калі працуеце з фазай RAG у рэальных системах, адпрацоўваючы шаблон айментэйвання, спачатку запісайце контракт: неабяжныя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага няўспэху. Такі список контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Спрэчвайце гэтую фазу як контракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаце критэрыя успеху і не падзеўляйцеся частковым завершэнням без паведамлення. Змяркуйце рэкалі на фіксаванай сэтке запытаў прычым регулювання прамптав. Частае змена прамптав рэдка калі вярнуе слабую способнасць да выкарыстоўвання інформацыі.
Пашчэрстаныя прыклады ў рэальных системах
Калі працуеце над распашчымі памылкамі ў рэальным сераве, спачатку запісайце угоду: неабяжлівыя даннэ, сигнал успеху і тое, што выходзіць пад частым неудачам. Такі список пераканаець у тым, што пасляэйшныя змены коду буду чыстымі. Запісвайце час выканання і кост токена або запытку празаўсёды разам з функцыйнальнымі рэзултатамі. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Замерьце рэткість аднаходжэння адпаведных дадзеных на фіксованыя наборы запытак прычым рэгулюванню підказак. Часта змена підказак рэдка калі-небудзь выправляе слабую систему аднаходжэння інформацыі. Калі працуеце над распашчымі памылкамі ў рэальным сераве, спачатку запісайце угоду: неабяжлівыя даннэ, сигнал успеху і тое, што выходзіць пад частым неудачам. Такі список пераканаець у тым, што пасляэйшныя змены коду буду чыстымі. Дакументавайце як «шчаслівы» шлях, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць часткай продукту, а не пасляэйшым дапрацоўкам.
Дзе гэта дае самыя большыя наследкі
Ён працюе найэфектывней, калі сцэна спрыяе як вимерная паверхня. Зафіксавайце адны «золаты» прыклад, адну справу з бягамі і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Валіце варот на маленькія, тэставаныя элементы замест большых скрыптов. Калі якісь крок збягае, прычына бягу должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Раздзеляйце правілы часткавання інфармацыі ад правіл яе выявлення. Змена ў одных не павинна прымусваць перапісванне іншых, калі змянююцца паказателі якосці.
Большая картына
Этап анаізу большай шчырыні працюе наяўней, калі яго спрыяваць як мерыемую паверхню. Запісаце адна «золатая» транскрыпцыю, адин прыклад неудачы і прыметку па вярнэнню да пачатковага стану пры расшырэнні масштаба. Спрыявайце гэты этап як кантракт межа вхіднымі дадзеннямі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад тыхоўскага частковага завершэння. Раздзеліце політыку часткавага аналізу ад політыки выкарыстоўвання дадзенняў. Змена адной з іх не должна прымусіваць перапісванне другой, калі зменяюцца паказнікі якосці.
Заключныя меркі
Этап «Пасляпэўнія» працюе наякша, калі яго спрыяваць як меравальную плошчу. Зберагучы адні «золаты» прыклад выкарыстоўвання, адні кейс неудачы і прыметку па вярнэнню да пачатковага стану, перш чым расширваць масштабы. Запісвайце час выканання і вартасьць токенаў або запытак па боку ад функцыйнальных рэзультатаў. Візуабельнасьць вартасцей з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Раздзеляйце політыку часткавага оброблэння дадзеных і політыку ўзяць іх. Змена адной з яных не павінна вымагаць перапісву другой, калі зменяюцца паказнікі якосьці. Этап «Пасляпэўнія» працюе наякша, калі яго спрыяваць як меравальную плошчу. Зберагучы адні «золаты» прыклад выкарыстоўвання, адні кейс неудачы і прыметку па вярнэнню да пачатковага стану, перш чым расширваць масштабы. Дакументавайце як успішны, так і вярнучыся шляхы роботы. Перапрыбуткі, людзкія контрольны пункты і обробка некоректных паведамленняў є частью продукту, а не етапамі далейшай доработкі.
Чэрніця кантролю
Этап перагляду канцэлкі працюе найэфектывней, калі яго спрыяваць як меравальную плошчу. Запісаўце адна ідеальная транскрыпцыя, адзін прыклад неудачы і запіс пра атрыбуцыю назад перш чым расширваць масштаб.
Зберагаўце канфігурацыю праза код аплікацыі. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць без неабяжнай чытанняў усіх дадзеных.
Раздзеляйце правілы часткавага оброблення дадзеных ад правіл ях выявлення. Змена ў одных не павинна прымусваць перапісванне іншых, калі змянююцыся паказателі якосці.
Оцэнюйце адпаведы на адна запитанне і мнагаэтапныя траекторыі адна з другойю окрема. Агрэгаванне балоў чату маскіруе неудачы ў рамках алгорытму.
Напісце кароткі посібнік: як змяніць канфігурацыйныя ключы, як спрабаваць очысці чергу запитоў, як атрыбуцыяваць назад пасляльнія даныя.
Спрыявайце гэтам этапу як кантракту межа вхіднымі дадзенымі і перакананымі выходнымі рэзультатамі. Назвайце всі элементы, задаце критэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння задачы.
Перш чым запускать стэк, заморозьце версіі, зафіксавце «золаты» транскрыпты для критичных шляхоў і паказваце спосабы атрыбуціі. У спадзяльных средах неабходны ліміты частоты запуска, пераканання ў належнасці тэриторыі і чысткі власніка для ротацыі секрэтных дадзенняў. Валідную надзею на стабільнасць лепш за крэатыўныя, адзінразовыя дамахі.
Прыметка для de861b3bd2cb: не кладзіце ключы прадаўцаў у репазітарый, задаце верхнюю межу токеноў на сесію і зберагачыце транскрыпты празаўсёды з фікстурамі eval, каб пазнейшыя замены модэляў заставаліся пораўнанымі.
Для прыметкі па забезпечэнню безпекі на стадыі 0, перш чым зменяць код, апісаце вхідныя даны, власніка крока і критэрыя завершэння. Аперацыёныя системы павінны магчымае перзапуск крока з вядомай точкі контролю, не падозрываючы схованы стан. Спрыяйце цій стадыі як даговору межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, апісаце перакананні на успех і адмовіцеся ад тыхоўскага частковага завершэння.
Дзеянне паўжасткі 0/954: звярніце увагу на час выканання, клас памылкі і колькасць викорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынныя крэтыры, а не на індывідуальныя прыклады, вырашыце, чы робіць змяну.
Калі працюеце над першым этапам запісу паўжасткі, спачатку запішыце контракт: неабходныя данні, сігнал успеху і тое, што выканаецца у разе частковай памылкі. Такі список контроля дапамагае заставіць пазнейшыя змяны коду чыстымі. Канфігурацыю трэба зберагаць праз адны частка з кодам прыемлівача. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куда аператары можу аудытаваць іх, не чытаючы весь код.
Дзеянне паўжасткі 1/954: звярніце увагу на час выканання, клас памылкі і колькасць викорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынныя крэтыры, а не на індывідуальныя прыклады, вырашыце, чы робіць змяну.
Этап 2 прыцеленняя на зміцнэнне работае найкраща, калі яго розглядаць як вимероўваную паверхню. Запісаце адна «золатая» транскрыпцыя, адин прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказваць на адную адпаведальнасць, а не на заплутаны процес.
Дзеянне прыцеленняя на зміцнэнне 2/954: вимеравайце час выканання, класію памылак і колькасць выкорыстоўваных токенав для гэтага запісу, а потым вырашайце, чы рашыцца застаўляць змяну, стварываючыся на адной фіксаванай сэтцы пытанняў, а не на анекдотах.