Галоўная / Артыкулы / Практычныя прытамулкі: За межамі базовага RAG: стварэнне системы прававых даследжэнняяў у стыле працоўных рашэнняў

Практычныя прытамулкі: За межамі базовага RAG: стварэнне системы прававых даследжэнняяў у стыле працоўных рашэнняў

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

3979 слоў

У гэтым карыце парадоксу перадстаўляецца шлях ад сыр'ёчных матэрыялаў да рабочай системы для: «Beyond Basic RAG: Building a Production-Style Legal Research Assistant (Part-I)». Акцэнт ставіцца на практычныя крокі, чыстае перакананне і код, які можна проста дадаць у репазітарый без неабязковасці з'ясоўвання намеру. У стадзіі агляду неабходна з'явіць вхідныя даны, адпаведальнага за крок і критэрыя завершэння прычыні перад зменым коду. Аператары должны магчымае перадзначыць крок з вядомай точкі контролю без неабязковасці з'ясоўвання схованага стану. Неабходна задокументаваць як шлях успеху, так і шлях вяснавання проблем. Перапрыбуткі, людзкія перакананні і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.

1. Працэс пераканання: прыемка правовага PDF у структураваны контэнт

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

!mineru -p c.pdf -o output --dump-content-list -b pipeline -l en

2.Chunking

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

Structured document
        ↓
Heading-aware parent chunks
        ↓
Semantic child chunks

Чаму дваэтапная стратэгія ўжытковая

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

Query
  ↓
Retrieve focused child
  ↓
Read parent_id
  ↓
Return complete parent context

Стварэнне чакаў-родзічаў, якія бяруць за ўвагу загалоўкі

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

data/processed/cr.md
data/extracted/auto/blockpage.json
code/chunking_parent.py

Крок 1: Чытайце оба артыфакта выкарыстоўвання

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

md_text = MARKDOWN_PATH.read_text(encoding="utf-8")
with BLOCKPAGE_PATH.open("r", encoding="utf-8") as file:
    blockpage = json.load(file)

Шаг 2: Раздзеліце Markdown на блокі

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

for raw_block in md_text.split("\n\n"):
heading
paragraph
list
table
superscript
blank
HEADING_RE = re.compile(r"^(#{1,6})\s+")

Этап 3: Следзіць за актыўным заглавам

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

def find_heading(heading_text: str):
    nonlocal search_pos
    for index in range(search_pos, len(blockpage)):
        block = blockpage[index]        if (
            block.get("type") == "text"
            and block.get("text") == heading_text
            and "text_level" in block
        ):
            search_pos = index + 1
            return block

Крок 4: Збіраць супаўзелеглы контэнт

Для стадіі «Збор паўтараючыхся данных» (крок 4) неабходна перад змянай коду вызначыць параметры вхідных дадзеных, адпаведальнага за крок і критэрыя завершэння. Аператары должны магчымае запускіць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце цій стадіі як даговору межа вхіднымі дадзенымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, вызначыце критэрыя успеху і не прымайце часткова завершаныя рэзультаты без падтверджэння. Указывайце тыя часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цитатаў аператары не зможаць розразліць галюцинацыю ад працягу індэксавання.

Heading
  ├── Paragraph
  ├── Clause
  ├── List
  └── Table
        ↓
     Parent chunk

Крок 5: Назначыць стабільную мета-інфармацыю

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

{
    "parent_id": f"parent_{len(chunks):04d}",
    "doc_id": DOC_ID,
    "heading_path": heading_path.copy(),
    "text": "\n\n".join(stack),
}
{
  "parent_id": "parent_0164",
  "doc_id": "constitution_of_india",
  "heading_path": ["PART XII"],
  "text": "# PART XII\n\nFINANCE, PROPERTY, CONTRACTS AND SUITS..."
}
PART XII — Finance
Article 264 — Interpretation
Article 265 — Taxes not to be imposed without authority of law
Article 266 — Consolidated Funds and public accounts
Article 267 — Contingency Fund

Стварэнне семантычных дзецячых чакункоў

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

code/semantic-children.ipynb

Крок 1: Разбіранне роднічага элемента на структурныя блакі

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

table_pattern = re.compile(
    r"(<table[\s\S]*?</table>)",
    re.IGNORECASE
)

Шаг 2: Даўжыце загалоўкі ўхіднаму тэксту

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

if pending_heading:
    block.text = pending_heading + "\n\n" + block.text
    pending_heading = None

Шаг 3: Пораўнянне суседзяючых параграфаў

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

embedder = SentenceTransformer(
    "BAAI/bge-base-en-v1.5"
)
similarity = cosine_similarity(
    emb1,
    emb2
)[0][0]
Similarity threshold: 0.40

Шаг 4: Застосаванне обмежэнняў па розмеру і структуре

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

Preferred minimum size: 800 characters
Maximum combined size: 1,600 characters
Tiny-block threshold: 150 characters
if (
    current_type == BlockType.TABLE
    and block.type != BlockType.TABLE
) or (
    block.type == BlockType.TABLE
    and current_type != BlockType.TABLE
):
    is_under_min = False
Document structure
        +
Semantic similarity
        +
Minimum and maximum sizes

Этап 5: Зберагчыце аднос праўільніка

Крок 5 «Зберагчы стадію» працуе наяўней, калі яго спрыявае можласць вимеры паверхні. Зафіксавайце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Запісвайце часы выканання і косты токеноў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівае паказанне костаў з’являецца рана, таму не будзе неспакою з рахункамі, калі процес перейдзе з дэма-серавера ў спільныя среды. Раздзеляйце політыку частковага обробкі дадзеных і політыку ўзяць дадзеныя. Змена адной з іх не должна вымагаць перапісвы другой, калі зменяюцца паказнікі якосці. Крок 5 «Зберагчы стадію» працуе наяўней, калі яго спрыявае можласць вимеры паверхні. Зафіксавайце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Документавайце як шлях успеху, так і шлях вярнэння да нормальнага стану разам. Перапрыбуткі, людзкія контрольныя пункты і обробка некоректных паведамленняў є частью продукту, а не чымсь, што дадаецца пазней.

{
    "parent_id": parent["parent_id"],
    "child_id": f"{parent['parent_id']}_child_{index}",
    "doc_id": parent.get("doc_id", ""),
    "heading_path": parent.get("heading_path", []),
    "text": chunk["text"],
    "type": chunk.get("type", "mixed"),
    "embedding": encode_text(chunk["text"])
}
parent_0164
│
├── parent_0164_child_1
│   Article 264 and introductory Finance context
│
├── parent_0164_child_2
│   Articles 265 and 266 concerning taxation and public funds
│
└── parent_0164_child_3
    Article 267 concerning the Contingency Fund
{
  "parent_id": "parent_0164"
}
{
  "child_id": "parent_0164_child_2",
  "parent_id": "parent_0164",
  "doc_id": "constitution_of_india",
  "heading_path": ["PART XII"],
  "type": "list",
  "text": "265. Taxes not to be imposed save by authority of law...",
  "embedding": [0.012, -0.034, 0.021]
}

3. Гібрыдны выкарыстанне: ад запытку да абмовай контэкст

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

Чаму адналь метод выкарыстання не была достатней

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

Рэдкае адгэтування з BM25

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

/p>

Інтэнсіўнае адзысканне з BGE і FAISS

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

embedding_text = heading_path + child_text

Выбір модэлю імбеддынгу праз ацэнку

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

query_text = (
    "Represent this sentence for searching relevant passages: "
    + user_query
)

Стварэнне індексу FAISS

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

index = faiss.IndexHNSWFlat(
    embedding_dimension,
    32,
    faiss.METRIC_INNER_PRODUCT,
)
index.hnsw.efConstruction = 200
index.hnsw.efSearch = 64
index.add(embeddings)

Спалучэнне двух рангаваń

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

RRF score = Σ 1 / (k + rank + 1)
sparse_results = bm25_search(query)
dense_results = dense_search(query)
fused_candidates = reciprocal_rank_fusion(
    sparse_results,
    dense_results,
)

Перарангаванне за дапамою крос-кодувальніка

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

pairs = [
    (query, child_text),
    ...
]
scores = reranker.predict(pairs)
candidates = fused_candidates[:30]
reranked_children = cross_encoder.rank(query, candidates)
selected_children = [
    child
    for child in reranked_children[:20]
    if child.score >= 0.30
]

Расширэнне выбраных дзеціных элементаў у контекст абяцаючага элемента

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

{
  "child_id": "parent_0082_child_1",
  "parent_id": "parent_0082",
  "text": "23. Prohibition of traffic in human beings and forced labour..."
}
parent_id = selected_child["parent_id"]
parent = parent_lookup[parent_id]
Selected child 1 ──┐
Selected child 2 ──┼── parent_0082
Selected child 3 ──┘

4. Расширэнне запытку і багатоэтапныя запыткі

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

Што паказала ацэнка на Kaggle

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

Расшырэнне запиту без змены яго намеру

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

Расширэнне запиту не ўзмаўляецца з стварэнням падзапиту

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

Рэзультатыва стратэгія запиту

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

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

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

Чэк-ліст для эксплуатацыі

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

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

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

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

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

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

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

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