Практычныя нарады: Проектаванне RAG для 100 мільйонам дакументаў
Практычныя нарады: Проектаванне RAG для 100 мільйонам дакументаў: контракты, перапалні та слоты для коду для команд, якія викорыстоўваюць гэты патэрн.
Існавайце гэта як перапрацоўку ідэй з кнігі «Проектаванне RAG для 100 мільйонаў дакументаїв», адпрацавануюя для аператараў: чыстыя этапы, аранжаваныя блакі коду і прыметкі з восстанавлення, якія застаюцца пасля перадачы. Этап Аналізу працюе найэфектывней, калі яго розглядаць як вимерную плошчу. Запісайце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметкі з вярнення да пачатковага стану прычаму расшырэння масштаба. Запісвайце часы выканення і косты токенаў або запытаў праза функцыйнае рэзультат. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды.
Усія трэбованні:
У стадії выявлення трэбаванняяў неабходна прадзефініраваць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры зміне коду. Аперацыйныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба залічыць паза кодам прыемленае. Файлы серавэра, хранільнікі секретных дадзенняў і флагі функцыйяй должны знаходзіцца ў аднам месцы, якое працавнікі можуць пераглядаць, не чытаючы весь структуру. Неабходна цітаваць тыя часткі, якія фактычна лежалі в основе адпаведнай адказу. Без цітатаў працавнікі не зможуць адразліць галюцинацыю ад працяванняяў індэксавання.
Пачніце з матэматыкі
Для стадіі «Пачатак з матэматыкі» неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры перадзеі коду. Аператары должны магчыма ўвайсці зноў у крок па вядомым пункту контролю, не спрабоўваючы здагадвацца пра схованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней. Паказваць трэба тыя часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цитатаў аператары не зможаць розразліць галюцинацыю ад працягу індэксавання.
Documents = 100,000,000
Average chunks/document = 30
Embedding dimensions = 768
Storage/dimension = 4 bytes (float32)
100,000,000 × 30
= 3,000,000,000 vectors
3B × 768 × 4 bytes
≈ 9.2 TB
ANN index structures
chunk text
document metadata
ACL metadata
IDs
lexical indexes
replicas
snapshots
WALs
temporary indexes
operational headroom
100M documents × 50 chunks
= 5 billion vectors
Архітектура, яюю вы б пабудавалі
Для архітектуры, якая будзе выкорыстоўвана, прайшліва ўзначыць вхідныя даны, адпаведальнага за кожны крок і крэтыярыі завершэння пры змены коду. Аператары должны магчымае перзапускаць крок з вядомай точкі контролю, не падозрываючы пра схованы стан. Валідзіце маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выконваецца, прычына неудачы павінна вказываць на адзін конкрэтны элемент, а не на заплутаную структуру. Указывайце тыя часткі тексту, якія фактычна лежачы ў падставе адпаведнай адказу. Без ціх цытатаў аператары не можуць розразліць галюцинацію ад працягу індэксавання. Для архітектуры, якая будзе выкорыстоўвана, прайшліва ўзначыць вхідныя даны, адпаведальнага за кожны крок і крэтыярыі завершэння пры змены коду. Аператары должны магчымае перзапускаць крок з вядомай точкі контролю, не падозрываючы пра схованы стан. Запісвайце час выконання і кост токеноў або запытаў разам з функцыйнаімі рэзультатамі. Відразувыя даны пра косцы запобегаюць неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльнае сераўерское сэрא.
Рэгламенты.
Адказчык правды — гэта не ваша база дадзейна вектараў
Кал працуеце на стадіі «Адказчык правды», спачатку запісайце умовы: неабходныя даннэ, сігнал успеху і тое, што выканаецца у разы ў частковай нявыполненасці. Такі список контроля дапамагае заставіць пазнейшыя змены коду застаўцца чыстымі. Зберагайце настройкі парадульна ад коду прыемлівача. Файлы сяродавішча, хранільнікі секрэтных дадзенняў і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аудыт без неабходнасці чытання всей структуры. Перад налагоджэньем запитоў пераканайцеся, як працуея система на фіксаванай сэтке запытаў. Частае змены запытаў рэдка калі вярнуюць хорашыя результаты пошуку.
Процес прыемлівання дадзенняў должен быць асінхронным
Калі працюеце над стадзіяй «Прыем данных павінен быць асінхронным», спачатку запішыце умовы вярбавання: неабяжлівыя даны, сігнал працэйскага успеху і тое, што выканаецца у разе частковага нявыполнення. Такі список контроля дапамагае заліцьварыць пазнейшыя змены ў кодзе. Дакументаваць трэба як шлях успеху, так і шлях вяснавання пасля проблем. Перапрыбуткі, людзкія перакрыцця і обробка непрацэйскіх паведамленняў ёсць часткай продукту, а не пазнейшым дапрацоўкам. Перад налаштаваннем запитаў змерыце рэгрэсію на фіксаванай сэтке запытаў. Частае змена запытаў рэдка калі вярнуе слабую эфектыўнасць выкарыстоўвання данных.
POST /documents
│
▼
Store document
│
▼
Create ingestion event
│
▼
Return 202 Accepted
Кожны крок прыему дадзен быть ідэмпатным
Калі працуеце над стадіяй «Every Ingestion Step Should», спачатку запісайце умовы взаўзейшага дакумента: неабходныя даны, сігнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выпаняецца, прычына невыпання павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Перад налаштаваннем запитоў пераканайцеся ў рэверсі інформацыі на фіксаванай сэтке запитанняў. Частыя змены запитоў рэдка калі вядуць да павышэння якасці выкарыстоўвання інформацыі. Калі працуеце над стадіяй «Every Ingestion Step Should», спачатку запісайце умовы взаўзейшага дакумента: неабходныя даны, сігнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Запісвайце час выканання і вартасць токеноў або запитоў разам з функцыональнымі рэзултатамі. Відразувыя даны пра вартасці запобегаюць неспакойным рахункам, калі праця пераходзіць з дэмаверсій у спакульнаныя сераўсы.
document_id
document_version
chunk_index
embedding_model_version
hash(
tenant_id +
document_id +
document_version +
chunk_index
)
upsert(chunk_id, ...)
Разбіўка на часткі стае рашэннем па інфраструктуре
Этап «Разбіўка на часткі стае рашэннем па інфраструктуре» працюе найэфективней, калі яго спрыяваць як меруючую плошчу. Зафіксавайце адну ідеальную транскрыпцыю, адзін прыклад неудачы і запіс пра вярненне да пачатковага стану перш чым расширваць масштабы. Зберагаюце настройкі паза кодам прыемліка. Файлы сераўнавальнага сераўсу, хранілішчы секрэтных дадзеных і флагі функцый должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль без неабяжнага чытання всіх дадзеных. Раздзеляйце політыку разбіўкі на часткі і політыку выявлення дадзеных. Змена адной з іх не должна вымагаць перапісвання другой, калі зменяюцыся паказнікі якосці.
embedding compute
vector storage
indexing work
retrieval fan-out
reindexing time
replication traffic
{
"chunk_id": "c_982...",
"document_id": "doc_51...",
"document_version": 8,
"tenant_id": "tenant_17",
"page": 43,
"section": "Risk Factors",
"language": "en",
"created_at": "...",
"acl_groups": ["finance", "executives"],
"embedding_version": "embed_v4"
}
Не шукаце ў всім корпусе, якщо толькі вам сапраўды не трэба
Функція «Не шукаце» працюе найэфектывней, калі яе розглядаць як вимерную плошчу. Зафіксавайце адна ідеальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да поперадняе стану перш чым расширваць масштабы. Запісвайце адночасна шлях успеху і шлях вярнэння. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є частью продукту, а не етапамі далейшай наладкі. Раздзеліце правілы частковай обработкі даных ад правіл ўзяць іх. Змена адных не павинна вымагаць перапісвання іншых, калі змянююцыся показнікі якосці.
organization = current tenant
region = Europe
topic = refund policy
time = current quarter
permissions = documents user may access
Шардаванне — гэта спосаб, які дазволяе вектарнаму слою стаць распраўленым
Шардаванне — гэта спосаб, які дазволяе этапу працаваць наяўнейшым чынам, калі яго розглядаць як вимерную паверхню. Зафіксуйце адны ідеальны прыклад роботы, адзін прыклад неудачы і прыметку па анулюванні змян перш чым расширваць масштабы. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Раздзеліце правілы часткавання ад правілаў выкарыстоўвання дадзеных. Змена адных не павінна вымагаць перапісву іншых, калі зменяюцца паказнікі якосці. Шардаванне — гэта спосаб, які дазволяе этапу працаваць наяўнейшым чынам, калі яго розглядаць як вимерную паверхню. Зафіксуйце адны ідеальны прыклад роботы, адзін прыклад неудачы і прыметку па анулюванні змян перш чым расширваць масштабы. Запісвайце час выканання адзінакоў чы скоў запытавання разам з функцыйнальнымі рэзультатамі. Відразлівасць скоў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя сераўы.
tenant_id
region
document namespace
language
time partition
Query
↓
128 shards
tenant_id = 429
↓
Shard group 18
↓
4 shards
Реплікацыя рашае іншую проблему
У стадіўцы «Реплікацыя рашае іншую проблему» неабходна пазначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры перадзмене коду. Аператары должны магчыма было перзапускаць крок з вядомай точкі контролю, не спрабоўваючы з’ясаваць схованы стан. Конфігурацыю трэба залічыць паза кодам прыкладнення. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функцыяй павінны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь структураны код. Паказваць трэба тыя часткі тексту, якія фактычна ляглі в основу адпаведнай адпаведзі. Без цых цитатаў аператары не зможаць розразліць галюцинацыю ад працягу праз прасоўванне індэкса.
Shard A → Node 1
Shard B → Node 2
Shard C → Node 3
Shard A → Node 1 + Node 4
Shard B → Node 2 + Node 5
Shard C → Node 3 + Node 6
Толькі пошук за вектарамі недасты
У стадзіі «Толькі пошук за вектарамі» неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры перадзеіснавленні коду. Аператары должны магчыма ўвайсці крок з вядомага пункта контролю без неабяжнасці адгадваць схованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней. Указваць трэба тыя часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цитатаў аператары не зможаць розразліць галюцинацыю ад прасоў у індэксаванні.
RRF(d) = Σ 1 / (k + rank_i(d))
Будзьце абераглівы ў выкарыстоўванні прадзефлектараў па спраўе
Для стадіі «Будзьце абярожны ў секвэнцыйных задачах» неабходна прадзефінаваць вхідныя даны, адпаведальную особу за кожны крок і критэрыі завершэння пры змяне коду. Аперацыйныя працавнікі должны магчымае перайсці на выконанне кроку з вядомага пункта контролю, не спрабоўваючы здогадвацца пра схованы стан. Валідзіце маленькія, тэставаныя елементы замест амаль неконтрольваных скрыптав. Калі крок не выконваецца, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Указывайце тыя часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цитатаў аперацыйныя працавнікі не зможуць адразніць галюцинацыю ад працявання з непаштоўнымі даннымі. Для стадіі «Будзьце абярожны ў секвэнцыйных задачах» неабходна прадзефінаваць вхідныя даны, адпаведальную особу за кожны крок і критэрыі завершэння пры змяне коду. Аперацыйныя працавнікі должны магчымае перайсці на выконанне кроку з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выконання, а таксама вартасьць токенав чы іншых запитоў, разам з функцыйнальнымі рэзультатамі. Відразувыя даны пра вартасьці запобегаюць неспакоўным рахункам, калі процес пераходзіць з дэмавай версіі ў спяльную среду.
ронменты.3B documents
↓
BM25 returns 10,000
↓
vector search only those
tenant
permissions
document status
Разрэшэнне павінна быць атрымана раней, чым доказаткі дасягнуць LLM
Калі працюеце над этапам, дзе разрэшэнне павінна быць атрымана раней, спачатку запісайце контракт: неабяжлівыя даннэ, сигнал успеху і тое, што выканаецца у разы ўзельнага неякшага рашэння. Такі чыртак дапамагае заліцьцеваць пазнейшыя змены ў кодзе. Зберагаюце настройкі за межамі коду прыемліка. Файлы сяродавішча, хранільнікі секрэтных данных і флагі функцый крануцца ў аднам месцы, якое аператары можаць пераглядаць без неабяжлівага чытання всей структуры. Кэшавайце стабільныя інструкцыі системы і схемы інструментаў. Перадзесланне ідэнтычных даных — частая прычына зношвання ресурсаў.
Engineering documents
HR documents
Board documents
Legal documents
Executive compensation
Customer contracts
Vector Search
↓
Retrieve confidential chunk
↓
Send chunk to LLM
↓
Check permission
User
↓
Identity
↓
Groups / roles / ACL
↓
Authorized search space
↓
Retrieval
Процес адаптавання павінен даўаць кандыдатаў, а не контэкст
Калі працуеце над стадіяй адаптавання павінен даўаць кандыдатаў, спачатку запісайце умовы: неабходныя вхідныя даны, сигнал успеху і тое, што відбываецца у разе частковай нявыполнення. Такі список контроля дапамагае заліцьваты змяны ў кодзе. Документавайце як шлях успеху, так і шлях вярнення да нормы. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є частью продукту, а не етапамі далейшай доўнелівання. Перад налаштаваннем запитоў пераканайцеся, як працюе функцыя запам’ятовання на фіксаванай сэтцы пытанняў. Частае зміненне запитоў рэдка калі вярна выправляе слабкія аспекты процесу адтварання інформаціі.
Vector candidates: 200
Lexical candidates: 200
│
▼
Fusion
│
▼
~250 unique chunks
│
▼
Reranker
│
▼
top 20–40
Потым адзьёўваюце зайвасці
Калі працуеце на стадзіі «Потым адзьёўваюце зайвасці», спачатку запісуйце умовы працы: неабходныя даны, сігнал успеху і тое, што выканаецца у разы частковага неудачы. Такі список контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Валіце маленькія, тэставаныя елементы замест абмежлівых скрыптав. Калі якісь крок не выйшоў, неудача павінна вказваць на адную адпаведальнасць, а не на заплутаны ланцужок задач. Перад налаштаваннем запитоў пераканайцеся ў рэгулярнасці адпаведных адказаў на фіксованыя запитанні. Частае змены запитоў рэдка калі-небудзь выправляюць слабкую эфектыўнасць адзысквання інформаціі. Калі працуеце на стадзіі «Потым адзьёўваюце зайвасці», спачатку запісуйце умовы працы: неабходныя даны, сігнал успеху і тое, што выканаецца у разы частковага неудачы. Такі список контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Рэгіструйце час выканання і кост токенав або запытаў разам з функцыйнальнымі рэзултатамі. Відразувыя даны пра косты запобегаюць неспакойным рахункам, калі праця пераходзіць з дэмавайнага режыма ў спяльныя среды.
Chunk 1 → page 14
Chunk 2 → page 14
Chunk 3 → page 15
Chunk 4 → page 14
Chunk 5 → page 15
deduplication
document diversity
section diversity
near-duplicate detection
adjacent-chunk merging
token budgeting
chunk 46
chunk 47
chunk 48
Стварэнне контекста — гэта сама ўпорная складовая
Процес стварэння контекста працюе найэфективней, калі яго розглядаюць як вимерную паверхню. Запісаўце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметку па адкату перш чым расширваць масштабы. Зберагаўце настройкі праза код аплікацыі. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функций павінны знаходзіцца ў адном месцы, куды аператары можаць адбавляць без неабяжнага чытання всіх дадзеных. Раздзеляйце правілы часткавання дадзеных ад правілаў ўзяць іх. Змена адных не павінна вымагаць перапісву іншых, калі зменяюцыся паказнікі якосці.
context = "\n\n".join(retrieved_chunks)
Retrieved Evidence
↓
Deduplicate
↓
Merge related chunks
↓
Enforce token budget
↓
Preserve source IDs
↓
Order evidence
↓
Generate context
SOURCE S1
Document: Employee Handbook
Page: 42
Version: 18
Text: ...
SOURCE S2
Document: European Leave Addendum
Page: 7
Version: 4
Text: ...
QUESTION
...
Розумеўць запитоў должен быць дасканальны
Этап розумеўця запитоў працюе найкраща, калі яго розглядаюць як вимерную плошчу. Зафіксавайце адну ідеальную транскрыпцію, адин прыклад неудачы і прыметку па вярнэнню да пачатковага стану пры расшырэнні масштаба. Запісуйце адночасна шлях успеху і шлях вярнэння. Перапрыбуткі, людзкі контроль і обработка непрацюючых паведамленняў є частью продукту, а не наступным етапам дорабкі. Раздзеліце правілы частковай обработкі інфармацыі ад правіл яе пошуку. Змена аднаго з іх не должна вымагаць перапісву другога, калі зменяюцыся показнікі якосці.
metric = revenue
region = Europe
year = 2025
intent = financial comparison
How much did revenue grow in Asia in 2025?
small model
↓
classification
small model
↓
query rewriting
embedding model
↓
retrieval
reranker
↓
relevance
large model
↓
final reasoning
largest model everywhere
Разбіўка запита дапамагае у розв’язанні запытаў з кальцамі
Метод «Разбіўка запита дапамагае у розв’язанні запытаў з кальцамі» працюе найэфективней, калі яго розглядаць як виміроўваную структуру. Перш чым расширваць масштаб, зафіксавайте адну ідеальную транскрыпцыю, адин випадак неудачі і прыметку па поверненню до поперадньго стану. Вярніцеся да маленькіх, тэставаных елементаў замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказываць на адную конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Раздзеліце правілы часткавання інфармацыі ад правіл яе выкарыстоўвання. Змена адных не павінна вымагаць перапісвання іншых, калі змінююцца показнікі якосці. Метод «Разбіўка запита дапамагае у розв’язанні запытаў з кальцамі» працюе найэфективней, калі яго розглядаць як виміроўваную структуру. Перш чым расширваць масштаб, зафіксавайте адну ідеальную транскрыпцыю, адин випадак неудачі і прыметку па поверненню до поперадньго стану. Запісвайце час выконання і вартасьць токенав або запытаў разам з функцыйнальнымі рэзультатамі. Відразувыя даны пра вартасьці запобегаюць неспакоўным рахункам, калі процес пераходзіць з дэмовай среды ў спадзеленыя сераверы.
Question 1:
Which European product had the largest decline?
Question 2:
What explanation did management provide for that product?
Complex Query
│
▼
Query Decomposer
/ \
/ \
▼ ▼
Subquery A Subquery B
│ │
▼ ▼
Retrieval Retrieval
\ /
\ /
▼ ▼
Evidence Join
│
▼
LLM
Свежасць змінюе стратэгію індексавання
У стадіўцы «Свежасць змінюе індексавання» неабходна пазначыць вхідныя даны, адпаведальнага за выкананне крока і крэтыры завершэння прычыненне перад змянай коду. Аператары должны магчыма было перзапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба залічваць пазначкай ад коду прыемленае. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функцый должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь граф. Прыкладзіце аддзелы тексту, якія фактычна ляглі в основу адпаведнай адказы. Без цых аддзелоў аператары не можаць разлічыць галюцинацію ад прасоўкі ў індексаванні.
Document updated
│
▼
new document version
│
▼
parse changed document
│
▼
generate new chunks
│
▼
embed
│
▼
write new index entries
│
▼
mark previous version inactive
document_id = D17
version 41 → status=inactive
version 42 → status=active
status = active
Версіюванне модэлі таксама мае значэння
На стадіўцы «Версіюванне модэлі таксама мае значэння» неабходна прадзефінаваць вхідныя даны, адпаведальную особу за выкананне крока і критэрыя завершэння пры зміне коду. Аператары должны магчыма было перзапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабходна аддзеўнаваць дакументацыю як пра успішны ход роботы, так і пра способы вярнення ў нормальны стан. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней. Калі наступны крок — це код або вызов інструмента, лепш выкарыстоўваць структураваныя выходныя даны з пераканальваннем схэмы, чым вольнае пісьменне выражэння.
embedding_model
embedding_version
embedding_dimensions
chunking_version
parser_version
Documents
│
┌─────────┴─────────┐
▼ ▼
embedding model V3 embedding model V4
│ │
▼ ▼
Index V3 Index V4
│
▼
shadow traffic
│
▼
evaluate
│
▼
switch alias
Кэшаванне павінна існаваць на калькоў разных рэвэліваў
Для этапа «Кэшаванне павінна існаваць» неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры зміне коду. Аператары павінны магчымаць перзапуск кроку з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Валідзіце маленькія, тэставаныя елементы замест амаль неконтрольваных скрыптав. Калі крок не выйшоў, прычына нехацкага рэзультата павінна вказываць на адну конкрэтную прычыну, а не на заплутаную сітку крокаў. Указывайце тыя часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цитатаў аператары не зможаць розразліць галюцинацыю ад працягу індэксавання. Для этапа «Кэшаванне павінна існаваць» неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры зміне коду. Аператары павінны магчымаць перзапуск кроку з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выконання і вартасьць токенав або запытав пры якіх-небудзь функцыйнальных рэзультатах. Відразувыя даны пра вартасьці запобегаюць неспакоўным рахункам, калі процес пераходзіць з дэмавай версіі у спяльную среду.
цэнт.embedding
→ distributed retrieval
→ reranking
→ large LLM
User Query
│
▼
Exact Response Cache
│ miss
▼
Semantic Cache
│ miss
▼
Retrieval Cache
│ miss
▼
Search
hash(normalized_query)
↓
query embedding
Policy version 17
Policy version 18
Раскід збоў мае большое значэнне, чым затрымка па заданаму шляху
Калі працюеце над этапам «Раскід збоў мае большое значэнне», спачатку запісайце умовы викорыстання: неабходныя даны, сігнал успеху і тое, што вядзецца пад частым збоем. Такі список дапамагае заліцварыць пазнейшыя змены ў кодзе. Зберагаюце настройкі паза кодам прыемліка. Файлы сераўнавання, хранільнікі секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куда аператары можуць пераглядаць іх, не чытаючы весь код. Перад налаштаваннем запитоў пераканайцеся, што система правільна вяртае даны на аднаковых касетах пытанняў. Частая зміна запитоў рэдка калі вярнее слабкага механізма пошуку.
embedding provider unavailable
one vector shard unavailable
search cluster degraded
reranker timeout
LLM rate limited
LLM provider outage
queue backlog growing
parser crashing on malformed PDF
OCR worker running out of memory
Vector search fails
↓
Can lexical search answer?
↓
yes
↓
return degraded retrieval mode
Primary LLM unavailable
↓
Fallback model
↓
Lower quality but service continues
Document parser fails 5 times
↓
Dead-letter queue
↓
record failure reason
↓
operator / automated remediation
Бэкпрэшар ўскладненняў є неабходным
Калі працуеце над этапам «Бэкпрэшар ўскладненняў є неабходным», спачатку запішыце умовы викорыстоўвання: неабходныя данні, сигнал пра успех і тое, што вядзець да частковага невыпання. Такі список дапамагае заліцьваты змяны ў кодзе. Документавацыя стандартнага і варіантаго падчас выконання таксама є важлівай. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є часткай продукту, а не дадатковым элементам для паліровання. Перад налаштаваннем запитоў пераканайцеся, што система правільна адпавядае на фіксованы набор запитаў. Частая зміна запитоў рэдка калі вярнуе хорашую якасць адпаведзей.
20M chunks/hour
25M chunks/hour
200M chunks/hour
embedding service overloaded
↓
timeouts
↓
retries
↓
more load
↓
more failures
↓
retry storm
incoming workload
↓
durable queue
↓
workers consume at safe rate
↓
backlog temporarily grows
Возможнае спостэрэнне павінна меркаваць якасць адзыскання
Калі працуеце над стадзіяй «Абсарбярнасць должна мераваць», спачатку запісайце умовы вярбунка: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага абякання. Такі список дапамагае залічыць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок абякае, прычына абякання должна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок задач. Перад налаштаваннем запитоў пераканайцеся ў рэкале на фіксаваным наборы пытанняў. Рэдкая змена запитоў выправляе слабкія аспекты выкарыстоўвання данных. Калі працуеце над стадзіяй «Абсарбярнасць должна мераваць», спачатку запісайце умовы вярбунка: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага абякання. Такі список дапамагае залічыць пазнейшыя змены ў кодзе. Запісвайце час выканання і кост токеноў або запытаў разам з функцыйнаімі рэзультатамі. Відкрытыя данні пра косцы з’являюцца рана, таму не будзе неспакойных сум у момент пераходу з дэмавай версіі ў спяльныя сераўы.
HTTP 200 rate
CPU
memory
disk
p95 latency
error rate
requests/second
request_id: rq_912
query rewrite:
"parental policy?" → "parental leave policy"
vector retrieval:
200 candidates
145 ms
lexical retrieval:
200 candidates
91 ms
fusion:
278 unique candidates
reranking:
278 → 20
212 ms
context:
13 chunks
8,420 tokens
LLM:
input 9,104 tokens
output 681 tokens
1.8 sec
citations:
3 documents
total:
2.4 sec
Ацэніце процес адзыскання дадзейна окалічна ад LLM
Этап ацэніцы процеса адзыскання дадзейна працюе наяўней, калі яго розглядаюць як меркаваны элемент. Запісаўце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметку па адвярненню перад расшырэнням масштаба. Зберагачыце настройкі праза код прыемлівача. Файлы сяродавішча, хранілішчы секрэтных дадзейнаў і флагі функций должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць без неабходнасці чытання всей структуры. Задаўце ліміт токенав на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расшырваюць контекст; жорсткія ліміты запобегаюць таму, каб дэманстрацыі ператварыліся на неспакоўныя рахункі.
Неудача адзыскання дадзейна
Этап адміністрування неудач запошуку працюе найэфектывней, калі яго розглядаць як вимерную характерыстыку. Зберагачыце адна ідеальная версія дадзеных, адзин прыклад неудачы і запіс працэй з вярненням да пачатковага стану, прычаму расширэння масштаба. Дакументавайце як шлях успеху, так і шлях вярнення да нормальнага стану разам. Перапрыятыя спробы, людзкі контроль і обработка некоректных паведамленняў ёсць часткай продукту, а не элементамі пазнейшага доўрабатвання. Раздзеляйце правілы частковай обработкі дадзеных і правілы запошуку. Змена адных не должна вымагаць перапісвання іншых, калі змянююцца паказнікі якасці.
Correct document exists
↓
retriever misses it
↓
LLM never sees it
↓
wrong answer
Праця генеравання з бягамі
Этап працы генеравання з бягамі работае наўзяй калі яго спрыяваць як мерыемую плошчу. Зберагачыце адны ідеальны транскрыпт, адзін прыклад бягу і запіс пра вярнэнне да пачатковага стану перш чым расширваць сферу дзеяння. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, бяг должен вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок задач. Раздзеляйце правілы часткавання дадзеных і правілы ўтрымання іх. Змена адных не должна вымагаць перапісву іншых, калі зменяюцыся паказнікі якосці. Этап працы генеравання з бягамі работае наўзяй калі яго спрыяваць як мерыемую плошчу. Зберагачыце адны ідеальны транскрыпт, адзін прыклад бягу і запіс пра вярнэнне да пачатковага стану перш чым расширваць сферу дзеяння. Запісвайце часы выконання і косты токенав або запытак праза функцыйнальныя рэзултаты. Відразувая візуабельнасць костаў запобегае неспакойным рахункам, калі процес пераходзіць з дэмовай среды ў спяльныя сераўеры.
correct evidence
↓
context
↓
LLM
↓
incorrect interpretation
Затрымка павінна мяць бюджет
Для етапу «Затрымка павінна мяць бюджет» неабходна ясная прызначэння вхідных дадзеных, адпаведальнага за выкананне крока і крэтарыяў завершэння працы перад зменыма коду. Аператары павінны магчымасць перзапуск крока з вядомай точкі контролю, не прабуючы вычысляць захаваны стан. Конфігурацыю трэба знаходзіць паза кодам прыемленае. Файлы сераўнавальнага сяродовішча, хранілішчы секрэтных дадзеных і флагі функцый павінны быць у адном месца, якое аператары можаць пераглядаць, не чытаяўшы весь ланцуг задач. Неабходна цітаваць тыя часткі тексту, якія фактычна лежалі в основе адпаведнай адказы. Без цітатаў аператары не можаць розразліць галюцинацію ад прычыны, зв’язанай з недастаткам індэксацыі.
API + auth 50 ms
query understanding 100 ms
retrieval 300 ms
fusion 20 ms
reranking 250 ms
context construction 30 ms
LLM time-to-first-token 1,200 ms
network / safety margin 550 ms
-----------------------------------
target ~2,500 ms
Косцы трэбуе тое ж самае адзьёмленне
У стадіі «Косцы трэбуе тое ж самае» неабяжна практычна вакуменція інпутаў, адпаведальнага за крок і крэатарыяў выходу пры перадзмене коду. Аператары павінны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы схованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і адарожванне некоректных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам. Паказваць часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цитатаў аператары не можуць разлічыць галюцинацію ад прасоўкі ў індэксаванні.
object storage
document parsing
OCR
embedding generation
vector storage
vector replicas
lexical search
metadata database
network transfer
reranking
LLM input tokens
LLM output tokens
observability
backups
cost / 1,000 indexed documents
cost / million chunks
cost / query
cost / successful answer
cost / tenant
Tenant A
5% of revenue
42% of LLM spend
Не кладзіце все у дорогія сховышчы
Для стадіі «Не кладзіце все» неабяжна ўскладнення вхідных дадзеных, адпаведнага адпаведальнага за крок і крэтарыяў выходу пры перадзмене коду. Аператары должны магчыма было перзапускаць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшаў, прычына неудачы павінна вказываць на адзін конкрэтны аспект, а не на заплутаны ланцужок задач. Прытамульвайце тыя часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх прамянаў аператары не зможаць разлічыць галюцинацію ад працягу ў індэксаванні. Для стадіі «Не кладзіце все» неабяжна ўскладнення вхідных дадзеных, адпаведнага адпаведальнага за крок і крэтарыяў выходу пры перадзмене коду. Аператары должны магчыма было перзапускаць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выконання і кост токеноў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмавай версіі ў спяльныя среды.
>expensive / fast
▲
│
vector indexes
search indexes
Redis caches
│
metadata DB
│
object storage
│
▼
cheap / large
Гарячыя і холадныя даны можаць патрабаваць разлічнага адказу
Калі працюеце над этапам гарячых і холадных даноў, спачатку запісайце умовы: неабходныя даны, сигнал успеху і тое, што выканаецца у разы ўзельнага неяксамоства. Такі чарт дапамагае залічваць змяны ў кодзе. Зберагаюце настройкі паза кодам прыемлі. Файлы сераўнавання, храненні секрэтных дадзенаў і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць пераглядаць іх без неабходнасці чытання всей структуры. Перад налагоджэньем запытанняў пераканайцеся, як працуе система з фіксаваным наборам запытанняў. Частае змена запытанняў рэдка калі вярнуе слабую эфектыўнасць пошуку.
Last 30 days → 70% of queries
Last 12 months → 25%
Older archive → 5%
Query
│
├────→ Hot index
│
└────→ Archive index when necessary
Мнагатэнарнасць зміняе ўсё
Калі працуеце над этапам «Мнагатэнарнасць зміняе ўсё», спачатку запішыце умовы: неабходныя даны, сигнал успеху і тое, што відбываецца у разы частковага невдачы. Такі список дапамагае заліцьватися з пазнейшымі змянамі коду. Документавайце як шлях успеху, так і шлях відновлення. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є частью продукту, а не пазнейшым допрацоўкам. Перад налаштаваннем запитаў пераканайцеся, наскількі эфективна система адзысквання інформаціі, выкорыстоўваючы фіксаваны набор запитанняї. Частае зміненне запитоў рэдка калі вирашае проблемы слабкага адзысквання дакументаў.
10,000 organizations
10,000 completely independent vector clusters
Small tenants
↓
shared shard groups
Medium tenants
↓
partitioned shared infrastructure
Very large tenants
↓
dedicated shard groups
LLM павінен знаходзіцца бліжэй да канца архітектуры
Калі працюеце над стадіяй «LLM павінен знаходзіцца…», спачатку запісайте умовы викорыстання: неабяжлівыя даннэ, сигнал успеху і тое, што відбываецца у разе частковага невыпання. Такі список дапамагае заліцварваць будучыя змены коду. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына невыпання павінна вказываць на адзін конкрэтны элемент, а не на заплутаны ланцюг задач. Зберагаеце інструкцыі стабільных систем і схемы інструментаў у кэшы. Павторны адправкі ідэнтычных даных — частая прычына зайвых витрацэнняў. Калі працюеце над стадіяй «LLM павінен знаходзіцца…», спачатку запісайте умовы викорыстання: неабяжлівыя даннэ, сигнал успеху і тое, што відбываецца у разе частковага невыпання. Такі список дапамагае заліцварваць будучыя змены коду. Запісвайце час выканання і вартасць токенав або запытак праза функцыйнальныя рэзултаты. Відразувая візуабільнасць вартасцей запобегае неспакою, калі процес пераходзіць з дэмавайнага режыма ў спяльныя сераўеры.
User
↓
API Gateway
↓
Authentication
↓
Authorization
↓
Rate Limiter
↓
Query Understanding
↓
Shard Routing
↓
Hybrid Candidate Retrieval
↓
Rank Fusion
↓
Reranker
↓
Deduplication
↓
Context Builder
↓
LLM
↓
Citation Validation
↓
Response
Полная архітектура вырабатывання
Этап «Полная архітектура вырабатывання» працюе найэфективнейша, калі яго розглядаць як меравальную плошчу. Зберагачыце адны ідеальны транскрыпт, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Храніце настройкі парадульна коду прыемлена. Файлы сяродавішняе, хранільнікі секрэтных дадзеных і флагі функцый канальны ў аднам месца, дзе аператары можаць аудытаваць іх без неабяжнага чытання всіх элементаў. Раздзеляйце правілы часткавання дадзеных і правілы ўтрымання іх. Змена адных не павінна вымагаць перапісву іншых, калі зменяюцца паказнікі якосці.
CLIENTS
│
▼
┌──────────────┐
│ API Gateway │
└──────┬───────┘
│
┌──────▼───────┐
│ Auth / ACL │
│ Rate Limits │
└──────┬───────┘
│
▼
┌────────────────────┐
│ Query Orchestrator │
└─────────┬──────────┘
│
┌─────────────┼──────────────┐
│ │ │
▼ ▼ ▼
Cache Query Rewrite Metadata
Filters
│ │ │
└─────────────┼──────────────┘
▼
Shard Router
│
┌────────────┴────────────┐
▼ ▼
Lexical Search Vector Search
│ │
└───────────┬─────────────┘
▼
Rank Fusion
│
▼
Reranker
│
▼
Deduplicate
│
▼
Context Builder
│
▼
LLM
│
▼
Citation Validation
│
▼
RESPONSE
================================================================
INGESTION SYSTEM
Documents
│
▼
Object Store
│
▼
Event Queue
│
┌────────────┼────────────┐
▼ ▼ ▼
Parser Parser Parser
│ │ │
└────────────┼────────────┘
▼
Normalization
│
▼
Chunker
│
┌──────────────┴──────────────┐
▼ ▼
Embedding Queue Text Index Queue
│ │
┌─────┼─────┐ ▼
▼ ▼ ▼ Lexical Index
GPU GPU GPU
│ │ │
└─────┼─────┘
▼
Vector Index
================================================================
SUPPORTING SYSTEMS
Metadata DB → document state, versions, ownership
Object Storage → original source documents
Vector Cluster → semantic retrieval
Search Cluster → lexical retrieval
Redis → caches and rate limiting
Message Queue → asynchronous ingestion
Observability → traces, metrics, evaluation
Secrets / IAM → service authorization
Evaluation System → retrieval + answer-quality tests
Што вы не будзеце робіць
Падход «Што вы не будзеце робіць» работае наяўней, калі яго спрыяваць як мерыемую плошчу. Запісаўце адна ідеальная версія, адзін прыклад неудачы і прыметку па адвярненню змян перш чым расширваць масштаб. Дакументаваўце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не наступным этапам дапрацоўкі. Раздзеляйце правілы частковай обработкі дадзеных і правілы ўтрымання іх. Змена аднаго з іх не должна прымусіць перапісваць другі, калі зменяюцыся показнікі ясноцы.
One giant vector collection with no routing strategy
Synchronous PDF ingestion
Only vector retrieval, no lexical search
ACL filtering after retrieval
No document versioning
No embedding model version
No reranking
Sending top-100 chunks directly to the LLM
Using the LLM for every trivial classification task
No dead-letter queue
No retrieval-level evaluation
No tenant-level cost attribution
Treating the vector DB as permanent document storage
Re-embedding the entire corpus for every small content change
Benchmarking only average latency instead of tail latency
Асалідны прынцып дзяржабнага проектавання
Этап Асаліднага прынцыпа дзяржабнага проектавання працуе наўзяй калі яго спрыяваць як меравальную плошчу. Зберагачыце адны ідеальны прыклад, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэнням масштаба. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неудача павінна адносіцца да адной відповядальнасці, а не да заплутанага ланца задач. Раздзеляйце правілы часткавання інфармацыі ад правіл яе выкарыстоўвання. Змена аднаго з іх не павінна вымагаць перапісвання другога, калі зменяюцыся паказнікі якосці. Этап Асаліднага прынцыпа дзяржабнага проектавання працуе наўзяй калі яго спрыяваць як меравальную плошчу. Зберагачыце адны ідеальны прыклад, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэнням масштаба. Запісвайце часы выканання і косты токеноў або запытак праза функцыйнае рэзультат. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмавайшанняў у спяльныя среды.
question
→ vector search
→ LLM
billions of possible evidence units
↓
routing constraints
↓
relevant partitions
↓
cheap candidate search
↓
hundreds of items
↓
expensive reranking
↓
tens of passages
↓
context optimization
↓
LLM
↓
grounded answer
Cheap operation → huge search space
Moderate operation → smaller candidate set
Expensive operation → tiny candidate set
Most expensive model → final context only
Заключныя заўважэнні
У стадыі заключных заўважэнняя неабходна практычна адзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры зміне коду. Аперацыйныя спецыялісты должны магчыма ўвайсці крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба залічыць паза кодам прыкладнення. Файлы сераўіса, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое спецыялісты можаць пераглядаць, не чытаяўшы весь код. Паказваць трэба тыя часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цитатаў спецыялісты не можаюць адразніць галюцинацію ад прычыны, вызванай недастаткам індэксацыі.
Чек-ліст для аперацый
Працюючы над чек-лістам для аперацый, спачатку неабходна запісаць умовы: неабходныя вхідныя даны, сігнал успеху і тое, што выходзіць пад час частковага абякання. Такі чек-ліст дапамагае заставіць пасляэтапныя змены коду чыстымі і прозрачнымі.
Спрытваце гэты ўраг як кантракт межа вхіднымі дадзеннямі і паверыцельнымі выходамі. Дайце назву рэзультатам, задаце критэрыя успеху і не прымайце часткова завершэння без паведамлення.
Змяркуйце рэкалі на фіксаванай сэтке запытаў прычым налаштаванні прамптам. Часта змена прамптам рэдка калі-небудзь выправляе слабую систему аднаходжэння інфармацыі.
Зафіксавайце версіі залежнасцяў і запісаце хеш-значэнне зображэння, якое было выкарыстоўвана для дэманстрацыі. Возможнасць павтарэння роботы важлівей, чым традыцыйныя знання.
Запісвайце час выконання і кост токэнаў або запытаў разам з функцыйнымі рэзультатамі. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэманстрацыйнага режыма ў спільныя сэрвісы.
Змяркуйце рэкалі на фіксаванай сэтке запытаў прычым налаштаванні прамптам. Часта змена прамптам рэдка калі-небудзь выправляе слабую систему аднаходжэння інфармацыі.
Перш чым запускать стак, заморозьце версіі, зафіксавце «золаты» транскрыпты для критычнага шляху і паказвце способы абяроны. У спільных средах неабходны ліміты частоты запытанняў, пераконтроўкі прав на выкарыстоўванне ресурсаў і чысткі власнік для змены секрэтных даных. Лепш выбіраць простую надзею на надзейнасць, чым хітрыя експерыментальныя дэманстрацыі.
Прыметкі для 1f03733b8d4b: не кладзіце ключы прадаўцаў у репазітарый, задаце верхнюю межу токеноў на кожную сесію і зберагачыце транскрыпты празаўседлік з фікстурамі для ацэнкі, каб пазнейшыя замены моделяў заставаліся пораўнанымі.