Практычныя прытамулкі: Разбіўка дадзеных на часткі – гэта схована дыяктарская рашынка ў RAG.
Практычныя прытамулкі: Разбіўка дадзеных на часткі – гэта схована дыяктарская рашынка ў RAG: контракты, перакананняі і спецыяльныя слоты для коду для команд, якія викорыстоўваюць гэты патэрн.
У гэтым керавані перакладзенаецца весь парадокс ад сыр'ёў да рабочай системы: падзел на часткі — гэта скрытая дыяктуатывае рашэнне ў RAG. Акцэнт ставіцца на практычныя крокі, чысткія пераконтрацыі і код, які можна проста дадаць у репазітарый без неабяснення меты. У стадзіі агляду неабходна з'явіць вхідныя даны, адпаведальнага за крок і критэрыя завершэння прычымо перад зменай коду. Аператары должны магчымае перадзеісцаваць крок з вядомага пункта контролю без неабяснення скрытых станоў. Неабходна задокументаваць як успішны, так і варыянт вяснаўлення. Перапрыбуткі, людзкія пераконтрацыі і обробка некоректных паведамленняў є частью продукту, а не наступным этапам дапрацоўкі.
Прыток RAG
Калі працюеце над стадзіяй The RAG flow, спачатку запісайце умовы кантракту: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцьварыць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына нявыпання павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок задач. Перад налаштаваннем запитоў пераканайцеся ў рэверыі на фіксаванай сэтке запитаў. Частыя змены запітоў рэдка калі вядуць да павышэння якасці выкарыстоўвання дакументаў.
З тексту да вектараў
Калі працюеце над стадзіяй «З тэксту да вектараў», спачатку запісайце кантракт: неабходныя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага нэуспеху. Такі список пераканальвае залічваць змяны ў кодзе пасля таго. Спрэцьвачайце гэтую стадзію як кантракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задацьте критэрыя успеху і не падтрымайце частковае завершэння без адпаведных падтверджэнняў. Замерайце рівень запамятовання на фіксаваным наборе пытанняў прычым рэгулюванні запрошэнняў. Частае змяненне запрошэнняў рэдка калі вялікі парадокс слабкага адзысквання інформаціі.
Размер чакаў і перакрыцча
Калі працюеце над этапамі размеру частак і перакрыцця, спачатку запісайце угоду: неабяжлівыя данні, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список контроля дапамагае заліцьваты пазнейшыя змены коду. Запісуйце час выканання і кост токеноў або запытаў разам з функцыйнальнымі рэзултатамі. Відразы костаў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя среды. Замерайце рэкалі на фіксованым наборы пытанняў прычыну налаштавання прапаза. Частыя змены прапаза рэдка калі вядуць да павышэння якосці выкарыстоўвання дадзеных.
DEFAULT_CHUNK_SIZE = 800 # characters
DEFAULT_CHUNK_OVERLAP = 150 # characters
stride = chunk_size − chunk_overlap
= 800 − 150
= 650 characters
"…but left school at the age of ten."
Што міститься ў записе вектарнага сховіща
Этап «Што міститься ў записе вектарнага сховіща» працюе найкраща, калі яго розглядаць як виміроўваную плошчу. Запісуйце адны ідеальны прыклад, адзін випадак неудачы і прыметкі па поверненню да попярэдня стану перш чым расширваць масштабы. Валіце маленькія, тэставаныя елементы замест велікіх скрыптов. Калі якась зе ступеней не выконваецца, прычына неудачы павінна вказываць на адную адповядальнасць, а не на заплутаны процес. Раздзеляйце правіла часткавання дадзеных і правіла ўзяць іх. Змена адных не павінна вымагаць перапісву іншых, калі зменяюцца показнікі яснасцы.
id
document
embedding
metadata
id 7c2a1e90-4b11-4d3e-9f08-12a6c0e84b21
document "His boyhood in Boston was a stern beginning of the habit
of hard work and rigid economy which marked the man. For
a year he went to the Latin Grammar School on School
Street, but left off at the age of ten to help his father
in making soap and candles."
embedding 384 floats — [-0.0412, 0.0187, 0.0621, -0.0094, 0.0330, …]
norm = 1.0
metadata {
book: "Franklin's Autobiography",
source: "https://www.gutenberg.org/cache/epub/36151/pg36151-images.html",
gutenberg_id: 36151,
page_label: "5",
chunk_index: 2
}
Чаму важна нормалізацыя
Этап, які выяснюе прычыны значэння нормалізацыі, працюе наяўней, калі яго розглядаць як вимерную плошчу. Зафіксавайце адны ідеальны прыклад, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Разглядзайце гэты этап як кантракт межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаць критэрыя успеху і не падзеўляйцеся частым, непূরным выпаннем задачы. Раздзеліце правілы часткавага абрабатвання данных і правілы ўзяць іх збераганых версый. Змена адных не павінна вымагаць перапісвання іншых, калі змянююцца показнікі якосці.
‖v‖ = √(v₁² + v₂² + … + vₙ²)
cos θ = (a · b) / (‖a‖ ‖b‖)
If ‖a‖ = ‖b‖ = 1:
cos θ = a · b
Ліміт токенав, які вы не можете бачыць
Ліміт токенав, які вы насталявайце, працюе найэфектыўней, калі яго спрыяваць як вимерную величыну. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваце сферу дзейнасці. Запісвайце часы выканання і косць токенав або запытак праза функцыйнальныя рэзултаты. Відразувая можнаць бачыць косць, ухілваецца ад неспакоўных рахунков, калі працэс пераходзіць з дамавайна ў спяльныя сэрвісы. Задаце бюджет токенав на кожны раунд і на кожную сэсію. Інструменты-агенты агрэсывна расширваюць контекст; жорсткія ліміты не дазволяюць дамавайнам ператварыцца на неспакоўныя рахункі. Ліміт токенав, які вы насталявайце, працюе найэфектыўней, калі яго спрыяваць як вимерную величыну. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваце сферу дзейнасці. Дакументавайце як успешны, так і вярнэчы паты. Перапрыбуткі, людзкія контрольны пункты і обработка некоректных запытак ёсць часткай продукту, а не чымсь, што дадацца пазней.
maximum safe chunk size in characters
≈ model token limit × 4
Фрагменты коду
У стадії фрагментаў коду неабходна пазначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры зміне коду. Аператары должны магчыма ўвайсці крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптаў. Калі крок не выйшоў, прычына неудачы павінна вказываць на аднойчыную адпаведальнасць, а не на заплутаную ланцюговую структуру. Наводзіць трэба тыя часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цитатаў аператары не зможаць розразліць галюцинацыю ад працягу ў індэксаванні.
from rag_qa.gutenberg import load_pages
from rag_qa.chunk import chunk_documents
from rag_qa.config import load_settings
s = load_settings()
print(s.summary())
# {
# 'chunk_size_chars': 800,
# 'chunk_overlap_chars': 150,
# 'stride_chars': 650, # size − overlap; this sets chunk count
# 'model': 'all-MiniLM-L6-v2',
# 'model_max_tokens': 256, # hard cap; overflow is silent
# 'embedding_dims': 384,
# 'max_safe_chunk_chars': 1024, # 256 × 4
# 'book': "Franklin's Autobiography",
# 'gutenberg_id': 36151,
# }
pages = load_pages()
chunks = chunk_documents(pages, s.chunk_size, s.chunk_overlap)
print(len(pages), len(chunks), s.stride)
from sentence_transformers import SentenceTransformer
from rag_qa.tokens import check_chunk
m = SentenceTransformer("all-MiniLM-L6-v2")
print(m.max_seq_length) # 256
for c in chunks:
r = check_chunk(c)
if r.truncated:
print("silent truncate:", r.n_chars, "chars /", r.n_tokens, "tokens")
256
256
silent truncate: 1820 chars / 412 tokens
silent truncate: 960 chars / 301 tokens
from rag_qa.store import ingest, open_store
store = open_store()
ingest(chunks, store)
row = store.get(limit=1)
print(row["ids"][0])
print(row["documents"][0][:200])
print(len(row["embeddings"][0]), row["metadatas"][0])
# 384 floats, norm 1.0, metadata.page_label == printed [Pg N]
doc-12-p3-c0
She left school at the age of ten. The next sentence continues on the same page…
384 {'page_label': '3', 'source': 'notes.pdf'}
from rag_qa.retrieve import search, search_mmr
q = "why did Franklin want Britain to keep Canada"
for hit in search(q, k=5):
print(f"{hit['score']:.3f} p.{hit['metadata']['page_label']} {hit['document'][:120]}")
# overlap makes near-duplicate hits; MMR trades a little score for diversity
for hit in search_mmr(q, k=5):
print(hit["metadata"]["page_label"], hit["score"])
0.812 p.7 I have long been of opinion that the foundations of the future grandeur and stability of the British empire lie in America
0.781 p.7 they are, nevertheless, broad and strong enough to support the greatest political structure that human wisdom ever yet
0.744 p.7 I am, therefore, by no means for restoring Canada. If we keep it all the country from the St. Lawrence to the Mississippi
0.691 p.8 I left England about the end of August, 1762, in company with ten sail of merchant ships
0.640 p.6 In this Autobiography Franklin tells of his own life to the year 1757, when he went to England
Дапаможні матэрыялы
Для стадіі Дапэндама неабяжнае прадзеўліць вхідныя даны, адпаведальнага за крок і крэтыяры завершэння пры перадзмене коду. Аперацыйныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрацавляйце з гэтай стадіяй як з кантрактом межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, прадзеўліць перакананне ў успеху і адмовіцеся ад тыхнай частковай рэалізацыі без паведамлення. Цитуйце тыя часткі, якія фактычна лежалі в основе адпаведнай адказы. Без цітатаў аперацыйныя працавнікі не зможуць адразніць галюцинацыю ад прасоў у індэксаванні.
A. Той самы аблак, перакрыцце часамі
У стадії перакрыцця адноўскага фрагмента неабходна пазначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры перадзмене коду. Аперацыйныя працавнікі должны магчыма было перзапускаць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выконання і вартасьць токеноў або запытанняя разам з функцыйнальнымі рэзультатамі. Відразлівае паказанне вартасцей запобегае неспадзяваным рахункам, калі процес пераходзіць з дэмовай среды ў спадзеленыя сераўеры. Указвайце тыя фрагменты, якія насправдзе ляглі в основу адпаведнай адпаведзі. Без цых цытатаў аперацыйныя працавнікі не можуць розлічыць галюцинацію ад працягу індэксавання. У стадії перакрыцця адноўскага фрагмента неабходна пазначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры перадзмене коду. Аперацыйныя працавнікі должны магчыма было перзапускаць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Дакументавайце як «шчаслівы» шлях, так і шлях вяснавання проблем. Перапрыбуткі, людзкія перакрыцця і обробка некоректных паведамленняў є частью продукту, а не елементамі пазнейшай дапрацоўкі.
[0] 59 His boyhood in Boston was a stern beginning of the habit of
[1] 55 hard work and rigid economy which marked the man. For a
[2] 58 year he went to the Latin Grammar School on School Street,
[3] 31 but left off at the age of ten.
[0] 59 His boyhood in Boston was a stern beginning of the habit of
[1] 57 ⟦the habit of⟧ hard work and rigid economy which marked the
[2] 55 ⟦marked the⟧ man. For a year he went to the Latin Grammar
[3] 58 ⟦Latin Grammar⟧ School on School Street, but left off at the
[4] 22 ⟦off at the⟧ age of ten.
⟦…⟧ = text repeated from the previous chunk
B. Бібліятэкі для стварэння RAG і куды падаюць векторы
Калі працуеце над стадзіяй стварэння з адпаведнымі бібліятэкамі, спачатку запісайце умовы викорыстоўвання: неабходныя данні, сігнал успеху і тое, што выходзіць на частым невялікім браке. Такі список контроля дапамагае залічыць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына браку павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Перад налаштаваннем запитоў пераканайцеся ў рэкалі на фіксаваным наборе запитанняў. Частае змена запитоў рэдка калі-небудзь выправляе слабкую систему пошуку інформацыі.
Чэк-ліст для эксплуатацыі
Стадзія чэк-ліста для эксплуатацыі працюе найэфектывней, калі яе спрыяваць як меравальную велічыну. Запісайце адна ідеальная версія рэзультата, адин прыклад браку і прыметкі па поверненню да пачатковага стану, перш чым расширваць сферу дзеяння.
Зберагаюце канфігурацыю пазначкай за межамі коду прыемліка. Файлы сяродавішчыны, храненні секрэтных дадзей і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аудыт без неабяжнага чытання всей структуры.
Раздзеляйце політыку часткавання дадзей ад політыки ўзяць іх. Змена адной з яных не должна вымагаць перапісву другой, калі зменяюцыся паказнікі якосці.
Калі дозволяе бюджет, дадзейце тэст на першыя працаванні, які пераблакуе критычны маршрут у процесе CI з викорыстаннем фіксатываў, а не рэальных платных API.
Документавайце як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных дадзей ўжо є часткай продукту, а не чымсь, што дадаецца пазней.
Раздзеляйце політыку часткавання дадзей ад політыки ўзяць іх. Змена адной з яых не должна вымагаць перапісву другой, калі зменяюцыся паказнікі якосці.
Перш чым запускать стак, заморозьце версіі, зафіксавце «золаты» транскрыпты для критычнага шляху і паказвце способы абяроны. У спільных средах неабходны ліміты частоты запытанняў, пераконтрольванне прав на выкарыстоўвання ресурсаў і чысткі власнік для змены секрэтных даных. Лепш выбіраць простую надзею на надзейнасць, чым хітрыя експерыментальныя дэманстрацыі.
Прыметкі для 62ec22cbf28d: не кладзіце ключы прадаўцаў у репазітарый, задаце верхнюю межу токенав для кожной сесіі і зберагачыце транскрыпты празаўседы ў фіксы для ацэнкі, каб пазнейшыя замены моделяў заставаліся порównаннэй.