Пераранжаванне ў RAG: крос-энкодэры супраць LLM-суддзяў і іх затрымка
Як другі этап пераранжавання выпраўляе парадак кандыдатаў у RAG: параўнанне крос-энкодэраў з LLM-суддзямі, кошт затрымкі, тыповыя збоі і спосабы ацэнкі.
Крыніцы: Reranking for RAG: Cross-Encoders, LLM Rerankers, and Latency Tradeoffs
Правы ўзорак быў у рэзультатах, проста занадта нізка
Уявіце сабе сістэму RAG, чыя гібрыдная пашуковая функцыя нарэшце пачала працаваць. Хранілішча вектараў працуюць, індэкс ключоўдзеў функцыональны, логіка з’еднання даных напісана, а ўзорак, які мае містыць адпаведзенне, цяпер з’яўляецца ў якомусь з набора кандыдатаў. Аднак мадэль все раве даўае посерэднія адпаведзення.
Логіяяны пояснююць прычыну. Адны з разрабоўцаў запытаўся, як адлучыць бяду PAYMENTS_API_TIMEOUT у рэжыме тэставання. Гібрыдная пашуковая функцыя падала дваццаць кандыдатаў: загальны апіс аўтэнтыфікацыі, застарэлы справаздача пра інцыдэнт з паканунка, універсальную старонку пра логіку павторных спроб, а на восьмай пазіцыі — частку рукаводства для тэставання з точным рашэнням. У запытцы было месца толькі для трохоў узоракоў. Правы ўзорак знаходзіўся занадта нізка, таму мадэль склала свае адпаведзенне на аднойчынных даных, адколі правыя даныя не паслужыліся.
Сістэма адаптавання знаходзіць доказы, але не ставіць іх на першае месца. Адаптаванне стосуецца запам’ятоввання, тады як перэранківанне — тачнасці за адмітным лімітам рэсурсаў.
Сама по сабе хорашая група кандыдатаў недастатня. Тое, што на самае працо чытае мадэль, залежыць ад парадку ў гэтай групе, і саме гэты парадак являецца вузькім месцам.
Што робіць этап перэранківання
Першы працэс адбываецца швайна і масштабна. Запіт да базы вектарных дадзеных або індэкса ключоў павінен перакрыць мільйоны запісаў за каліксекунды, таму такія сістэмы павязаны з апрыксамамі і загадзя вырахаванымі індэксамі, і яны намеравана знаходзяць больш дакументаў, чым трэба.
Практыка пераранжавання дагае другі этап, які выбірае невялікі сабсэт рэзультатаў і болей адказна аналізуе кожны з іх. Ён ўсё сповольней і болей тачны, пры тым не чапаецца за базу дадзенаў. Усе, што вернуў першы этап, зазвычай дваццаць-пяць найлепшых рэзультатаў, практыкуецца занова за дапамогою моцнейшага, болей точнага модэлю.
Першы этап стварае кандыдатаў, а пераранжаванне вяршыць, калі з іх якія заслуговаюць на месца ў обмежаным вікні кантэксту.
Чаму першы этап не можа завершыць задачу
Якш толькі модэль эмбедынгу хорашая, чаму бы найлепшы фрагмент не стаў першым? Не паводліва, таму што адлік рэзультатаў у першым этапе за сваёю структурой ёсць ненадзеяным.
Оцэнка ключоўых слов, такая як BM25, залежыць ад точнага перакрыцця тэрмінаў. Шырокая сторонняе архівнае паданне, якое пяцьдзiesят разоў паводзіць мову пра код аблыкання, часта перамагае короткі пошаговы путаводзіцель, які паводзіць мову пра яго два разы, адтуды што алгорытм спрыяжае частоту з рэлевантнасцю.
Адзыявленне вектараў мае іншыя проблемы. Эмбедынгі вырачаюць сэмантычную блізкасць, размешчаючы канцэпцыі ў высака-вымірнам прасторэ. Для запытанняў пра адлагоджэнне проблемаў яны выявляюць фрагменты, якія стосуюцься названых сістэм. Шырокія апісанні часта знаходзяцца дужа блізка да конкрэтных процедураў у гэтым прасторэ. Фрагмент, які опісвае архітэктуру вырахоўвання платы, можа мець вышыя балы, чым сама точная команда на пачатак работы працэса вырахоўвання платы. Мадэль знае, што гэта стосуецца вырахоўвання платы, але не можа адразніць аператывную інструкцыю ад тэарытычнага апісання.
Гібрыдны спосаб адзыявлення з’еднае лексычныя і сэмантычныя спісы ў ўзаемапрацоўны сет кандыдатаў, які включае неабходныя доказы. У ём таксама ёсць дуплікаты, застарэлыя дакументы, шырокія падсумкі і фрагменты, якія ёсць часткова рэлевантнымі.
Рэзультаты першага пасэгу адзыявлення ніколі не трэба спрыяжваць з апошнім слайам ранжыравання. Ён працуе як воронка, а пераранжыраванне ўособлівае фільтр у ніжней частцы.
Два спосабы пераранжавання
Калі ужо ёсць кандыдаты, трэба якісь спосаб зорганізаваць ўпорадкаванне ўсіх іх. Стандартамі сталі два падходы. Адны з яых выкарыстоўвае крос-энкодэры — спецыялізаваныя мадэлі, навучаныя оцэніваць, насколькі дакумент ўзаемна адносуецца да запіту. Іншы падход выкарыстоўвае велікія мовныя мадэлі, дзе мадэль на кшталт Claude або GPT прымеў запіт і дакумент і яе запытаюць, насколькі корыстны ён.
Оба падходы значна падымаюць якасць ранжавання па супэрнаціі з першым падходам. Яны разлічаюцца за часам адпаведзення, вартасцю, дэтэрмінізамом і тэхнічнымі вакалітэтамі, якія ўсё гэта выклікае.
Крос-энкодэры
Крос-энкодэр — гэта трансфармер, хоць ён працюе інакша, чым мадэлі эмбедынгу ў базе дадзенаў вектараў.
Стандартны модэль амбеддынга праходзіць запіт праз сетку, каб атрымаць адзін вектар, праходзіць дакумент праз яе, каб атрымаць іншы, і парабялівае гэтыя два вектары за дапамою косай схожасці. Гэта ўзор канструкцыі бі-энкодэра, і ён ўзлётны, таму што кожны вектар дакумента можа быць вычыслены загадзя.
Крос-энкодэр не стварае окалічных вектараў. Ён з’едынае запіт і дакумент у адну строчку і праходзіць усё гэта праз сетку адразу. Такім чынам сама-атэнцыя можа на кожным слою рассматрываць словы запіту і словы дакумента разам, бачачы, як тэрміны адносяцца адно да другога ў кантэксце. Рэзультатам являецца адзін бал рэлевантнасці.
Гэтыя канструкцыі чырпаюць сілу практычна для прыметнага выбору рэлевантных рэзультатаў. Рэзультаты ўзгадваныя і стабільныя, з набліжна меншым распылам, чым у разе вікорыстання мовнага модэля, і ўпэўненна вярнююць спецыфічны фрагмент інфармацыі замест шырокага апісання.
Ёсць функцыя перыякоравання, створаная на адмініструемаймай API крос-кодэра.
import cohere
import time
def rerank_cross_encoder(
query: str,
candidates: list[dict],
top_n: int = 5,
model: str = "rerank-v4.0-pro",
) -> list[dict]:
"""
The practical default for second-stage ranking.
Passes the query and candidate texts to a dedicated cross-encoder model.
"""
co = cohere.ClientV2()
# Extract just the text content for the API call
documents = [c["content"] for c in candidates]
resp = co.rerank(
model=model,
query=query,
documents=documents,
top_n=top_n,
)
# Reattach the original metadata and the new score
reranked = []
for r in resp.results:
original_chunk = candidates[r.index]
reranked.append({
**original_chunk,
"rerank_score": r.relevance_score
})
return reranked
У практычным умовах крос-кодэр падходзіць для дзесяці-пяцідзесятых кандыдатаў. Команды зазвычай выкарыстоўваюць яго пад час пошуку дакументацыі для інжынераў, у базах знанняяпарнення і внутрашніх асістэнтаў.
Галоўныя вітраты — гэта швальнасць. Крос-кодэр не можа сканаваць цэлую базу дадзенаў. Ён чакае першага праходжання, прымеў кандыдатаў праз API або локальную модэль, а потым чакае на рэйтынгі, што дагадваеся сеціянарныя перэходы і крокі обчыслаў.
Алгорытмы перэранкавання LLM
Альтэрнатыва — гэта універсальная мовная модэль, якая выступае як суддзя. Строгі запрос містыць запыт корыстніка і адзін фрагмент кандыдата, а модэль вяртае рэйтынг.
Алгорытмы перыякоравання LLM хораша справляюцца з тонкасцямі. Крос-кодэр шукае глыбокую сэмантычную адносаванасць, тады калі LLM таксама можа пераканацца, чырговая процедура завершана, аналізаваць супераспакованыя доказы і аддзеляць фрагменты з рэальнымі крокамі ад тых, якія маюць толькі фонавы матэрыял.
У цым запіце для судды вікорыстоўваецца кліент Anthropic.
import anthropic
JUDGE_PROMPT = """\
You are a strict relevance judge. Given a user query and a candidate document chunk,
rate how well the chunk answers the query on a scale of 0 to 10.
Respond with ONLY a JSON object in this exact format:
{"score": <int>, "reason": "<one short sentence>"}
Query: {query}
Chunk: {chunk}"""
async def rerank_llm(
query: str,
candidates: list[dict],
top_n: int = 5,
) -> list[dict]:
"""
Expensive special forces. Uses an LLM to reason about nuance and completeness.
"""
client = anthropic.AsyncAnthropic()
scored = []
for c in candidates:
resp = await client.messages.create(
model="claude-opus-4-6",
max_tokens=128,
messages=[{
"role": "user",
"content": JUDGE_PROMPT.format(query=query, chunk=c["content"]),
}],
)
import json
try:
result = json.loads(resp.content[0].text)
scored.append({
**c,
"rerank_score": result["score"],
"reason": result.get("reason", "")
})
except (json.JSONDecodeError, KeyError):
# Fallback if the model fails to follow JSON instructions
scored.append({**c, "rerank_score": 0, "reason": "parse_error"})
# Sort by the LLM-assigned score descending
scored.sort(key=lambda x: x["rerank_score"], reverse=True)
return scored[:top_n]
Адміністратару модэлі прасівае падаць прычыну разам з рэйтынгам. Першыяя напісанне апрацоўкі прычыны працуе як метод «ланцуга мыслей» і стабілізуе канечную цыфру.
Яны зарабляюць грошы на запытках з высокай цэннай, у сістэмах з нізкай працэздатнасцю, дзе точнасць адпаведзі ўсунець патрэбу ў чаканні, а таксама на складных корпусах даных, дзе рэлевантнасць залежыць ад нюансаў правіл, а не толькі ад зусімнай адпаведнасці тэмы.
Косты вельмі высокія. Для кожнага кандыдата-фрагмента выкананае ўсё цэлае запытанне да LLM, і нават калі запытанні выкананы паралельна, найпамедлівейшая адпаведзь вялічыць час атрымання рэзультата. Косты значна вышыя, чым у крос-энкодэраў, а рэзультаты менш дэтэрміністычныя.
Як пераранжаванне вплывае на час атрымання рэзультата
Дадатковы этап змінюе спосаб работы сістэмы. Ён выклікае дадатковыя запытанні да модэлі, дадатковую серыялізацыю тэкстовых дадзеных і дадатковы час на сеція.
Пользоватары не пакуяцься, як арганізавана процедура выкарыстоўвання інфармацыі, і не відчуваюць показнікаў пры выкарыстоўванні даных. Яны звертаюць увагу на якосць адпаведзі і час адпаведзення. Тэарэтычна выдатны прыстрой для перэранківання ёсць беспарадны, калі ён робіць асістэнта занадта повольным, ўсуперэч патрэбам.
Этот помошчнік віміруе час выканання функціі перэранківання.
def rerank_with_timing(
rerank_fn: callable,
query: str,
candidates: list[dict],
top_n: int = 5,
) -> tuple[list[dict], float]:
"""
Measure the exact cost of the reranking stage.
"""
t0 = time.perf_counter()
results = rerank_fn(query, candidates, top_n)
latency_ms = (time.perf_counter() - t0) * 1000
return results, latency_ms
Перадача двадцаты гастронаментаў у API з быстрым крос-кодэрувальнікам можа дадаць 150–300 мілісекунд, што зазвычай ўзято як разумная цена за лепшы кантэкст. Перадача пяцідзесятых гастронаментаў у суддзю на адной ЛЛМ можа дадаць два–чатыры секунды. З урахоўваннем ўсьмох трох секунд на генераванне, корыстнік чакае сем секунд, што перавышае допустым час чакання ў інтэрфейсе чату.
Колькасць гастронаментаў, якія будуць пераранжаваны, трэба налаштаваць. Топ-10 даўае рэзультаты быстра, але можа працягнуцься без правільнага фрагмента, калі першы пасах ёсць проблемы. Топ-50 падбірае практычна все, але выкарыстоўвае весь час на апрацоўку. Для крос-кодэрувальніка ў працэсе вырабоцтва зазвычай оптымальны ёсць топ-20.
Калі пераранжаванне ёсць корыстным
Даўайце перэранжавальнік, калі першы пасах знаходжэння гастронаментаў ёсць нестабільным, але зазвычай знаходзіць неабходныя доказы.
Калі следы паказваюць тое, што точныя фрагменты доказаў часта з’являюцца ў кандыдатах, але толькі на дзесятым чы роўна пятнаццатым месцы, пераранжаванне негайна выправіць сістэму. Гэта правадлежна, калі шырокія дакументы рэгулярна перамагаюць точныя процедуры, і калі якасць адпаведзення сільна залежыць ад наявнасці трохоў найкрашчых фрагментаў у запіце, тады тачнасць мае перавагу над простым запам’ятаваннем.
Кнігі інструкцый, внутрашнія асістэнты для палітыкі і інструменты для адлучэння прычын працоўных недачаў практычна завжды патрабуюць пераранжавання. Выбір правага каманды заместо таго, што ўжо майжэ правільны, можа вялікі ўплынуць на тое, чы рашаецца інцыдэнт чы ператвараецца ў перывод у працоўную недачу.
Калі пераранжаванне — гэта занадта
Калі корпус дадзеных мінімальны, яго можна праігнораваць. База знання з пяцідзесятых стораніц можа быць включана цэлым і аддаўана за дапамогою вектарнага пошуку.
Таксама няма сэнсу, калі першы пасаж вялікай часткай ўжо ідэальны. У сістэме, дзе трэба часта шукаць інфармацыю, і дзе BM25 надзеямо правільна паводзіць правільную API-рэферэнцю на першае месца, крос-кодэр толькі спамцуе працэс, не змінюючы рэзультата.
Калі ёсць дужа мягкая лімітацыя часу адпаведзення, як у голасовых асістэнтов чыць у допаможніцы для коду, то няма месца для дадзейнага етапу. Наладзіце першы пасаж і прыміце певныя недакладнасці. А калі правільны фрагмент зазвычай вядома знаходзіцца на першам чыць другам месцы, то рангаванне ня ёсць тым, што стварае пераканаўленні.
Формы абякання, на якія трэба звернуць увагу
Інструменты для перэрангавання вылагоджваюць парадак, але прыносяць свае сабе проблемы. Следзіце за імі пасля запуску.
Уперакцэнаванне шырокага апুвядомлення. Дзеяныя крос-кодэры трэнуюцца на дадзэннях, якія награджваюць вялікія, всестороннія адпаведзенні. Загальны апুвядомлення можа парадзіць маленькім, точным фрагментам коду, таму што такі апুвядомленні маюць больш спільнага лексыкану з запытам.
Падвойненая перасылка. Калі корпус мае тры версіі аднаго кансэпту выканання, першы працэс, верагацейна, запрашае ўсе тры. Сістэма ранкірацыі бачыць, што кожна з іх добра адпавядае на запіт, і ставяе ўсім высокія балы. Тры лепшыя рэзультаты ў вікні кантэксту тады маюць аднаковую інфармацыю, чым ускладняе включэнне наступнага, адміністрацыйна разлічныя доказа. Такія дапаможнікі адключаюць майжэ падаўтары рэзультаты.
def dedupe_candidates(
candidates: list[dict],
similarity_threshold: float = 0.85,
) -> list[dict]:
seen_tokens: list[set[str]] = []
deduped = []
for c in candidates:
tokens = set(c["content"].lower().split())
is_dup = False
for s in seen_tokens:
# Calculate simple Jaccard similarity
overlap = len(tokens & s) / max(len(tokens | s), 1)
if overlap >= similarity_threshold:
is_dup = True
break
if not is_dup:
deduped.append(c)
seen_tokens.append(tokens)
return deduped
Прыяпэльнасць да старыях дакументах. Мультыкодавач чытае толькі тэкст і не мае жаднага уявлення, калькі год з’яўіўся. Адтоцэненыя інструкцыі за 2022 год можу мець вышэйшыя балы, чым спешна створаныя інструкцыі за 2026 год, нават як стары дакумент ўжо цэлкам застарэў. Метаданы, якія прыкладзяюцца пасля пераранжавання, корэгуюць балы з урахоўваннем свежасці і статусу дакумента.
from datetime import datetime, timezone
def apply_metadata_boost(
candidates: list[dict],
freshness_halflife_days: int = 90,
) -> list[dict]:
now = datetime.now(timezone.utc)
boosted = []
for c in candidates:
score = c.get("rerank_score", 0.0)
# Hard penalty for superseded documentation
if c.get("status") == "superseded":
score *= 0.4
# Gradual decay for older documents
updated = c.get("updated_at")
if updated:
age_days = (now - updated).days
decay_factor = max(0.5, 1 - age_days / (freshness_halflife_days * 2))
score *= decay_factor
boosted.append({**c, "rerank_score": score})
# Sort again based on the adjusted scores
boosted.sort(key=lambda x: x["rerank_score"], reverse=True)
return boosted
Эксплазія затрымкі. Якосьць пасля запуску падае, але час амаль час апаратная частка застаеся на пяць секунд. Гэта зазвычай выклікаецца колі колькасць кандыдаў растае або якосьць зовнішняя API для пераранжавання падае. Заўжды трэба наладзіць альтэрнатыўную працэю з таймаутам, якая ігнаруе прыемнік для пераранжавання і вяртае рэзультаты першага проходу, калі другі этап работае дужа дзяўно.
Правільная ацэнка прыемніка для пераранжавання
Команды часта мераюць не тое, пераканальваючыся, чы роўна той фрагмент з’яўляецца ў топ-20. Аднае вярненне рэзультатаў першага проходу ужо пакрывае гэта.
Лепшы вопыт — чы прыемнік для пераранжавання падняў правільны фрагмент дастаткова высока, каб гэта мела значэнне. Гэта значыць, трэба мерыць рэлевантнасць топ-1 і топ-3, полноту адказу і усуненне дуплікатаў, а таксама сочыць за затрымкамі і вартасцю за запыт.
Створыце прыстрой для адзынакоўвання, які парабяляе стандартны базовы варыянт першага праходу з крос-кодэрам і алгорытмам перэранкавання LLM, выкарыстоўваючы ідэнтычныя наборы кандыдатаў.
from dataclasses import dataclass
@dataclass
class RerankEvalCase:
query: str
expected_substring: str
category: str # e.g., "identifier", "procedure", "troubleshooting"
def eval_reranking(
cases: list[RerankEvalCase],
retrieve_fn: callable,
rerank_fns: dict[str, callable | None],
top_n: int = 3,
) -> dict:
"""
Compare multiple reranking strategies against a baseline.
Measures hit rate at top-N and tracks latency overhead.
"""
results = {}
for name, rerank_fn in rerank_fns.items():
hits = 0
total_latency = 0.0
by_type: dict[str, dict] = {}
for case in cases:
# Get the exact same starting candidates for every strategy
candidates = retrieve_fn(case.query)
if rerank_fn is not None:
reranked, lat = rerank_with_timing(
rerank_fn, case.query, candidates, top_n
)
total_latency += lat
else:
# Baseline: just take the top-N from first-pass retrieval
reranked = candidates[:top_n]
# Check if the expected evidence made it into the final prompt window
top_contents = [r["content"] for r in reranked]
found = any(case.expected_substring in c for c in top_contents)
hits += int(found)
# Track metrics by query category
by_type.setdefault(case.category, {"hit": 0, "total": 0})
by_type[case.category]["total"] += 1
by_type[case.category]["hit"] += int(found)
total = len(cases)
results[name] = {
"hit_rate": hits / total if total else 0,
"avg_latency_ms": total_latency / total if total else 0,
"by_type": {
t: {**v, "rate": v["hit"] / v["total"]}
for t, v in by_type.items()
},
}
return results
Набор для тэставання павінен абараць калькі разных тыпаў запыткаў: тыя, дзе важлівы ідэнтыфікаторы і значыць тое, як адразу пісаецца тэкст, тыя, дзе важліва парада крокаў, і тыя, дзе сімптамы паказваюць асляпныя прычыны.
Ці фігуры потым паказваюць адносна таго, што купляе рэранкер. Калі крос-кодэр паднісае шчытку ў рэйтынгу з 60% да 85% за 200 мілісэкунд, яго трэба адразу вжыць. Калі рэранкер на базе LLM досягае 88% за тры секунды, крос-кодэр, верагодна, застанецца. Рэранкінг павінен быць апрацоўваны, каб даць лепыя фінальныя адказы ў межах рэалістычнага часу адпаведзення.
Разумны стандартны набор
Надзеяны базовы прынцып для сістэмы вырабатчыка выконваецца па адзінаковай сэрыё. Дзелэй дакладных дакументаў выкорыстоўваецца раздзелэнне па часткам, якія урахоўваюць структуру. Для збору ад двадцяці да трохці кандыдатаў выкорыстоўваецца гібрыдны метод пошуку. Выконваецца усуненне дублікатаў, каб апусціць майжэ ідэнтычны тэкст. Рэшту элементаў оцэнюецца за дапамогою крос-кодэра для выявлення сэмантычнай адноснасці. Застосоўваецца падкрэпленне метаданаямі, якое карае застарэлыя дакументы. Пасля чаго з фінальнага сортаванага спісу выбіраюцца тры-пяць лепшых частак і на ўснове іх ствараецца запіт.
def two_stage_retrieve(
query: str,
retrieve_fn: callable,
top_k: int = 20,
top_n: int = 5,
) -> tuple[list[dict], dict]:
"""
The complete production pipeline for second-stage ranking.
"""
t0 = time.perf_counter()
# Stage 1: Fast hybrid retrieval
candidates = retrieve_fn(query)[:top_k]
# Clean up the candidate pool
candidates = dedupe_candidates(candidates)
# Stage 2: Cross-encoder rerank
# We score slightly more than top_n to allow metadata boosts to reorder the edges
score_limit = min(top_n * 2, len(candidates))
reranked = rerank_cross_encoder(query, candidates, top_n=score_limit)
# Apply business logic for freshness and status
final = apply_metadata_boost(reranked)[:top_n]
latency = (time.perf_counter() - t0) * 1000
trace = {
"query": query,
"first_pass_count": len(candidates),
"post_rerank_count": len(reranked),
"final_count": len(final),
"latency_ms": latency,
}
return final, trace
Стандартны падчынні працуюць таму, што кожны інструмент выкананае сваю задачу. Функцыя адзыскання кандыдаата абараняе ўрахоўванне ўсіх можлівых кандыдаатаў, функцыя пераранжавання кандыдаатаў адпавядае за ўпорадкуванне ўсіх кандыдаатаў, а крос-кодэраў даюць найкрашчы спяваработак якосьці і затрымкі для таго другога этапу.
Ёсць адна прымета: пераранжавач не павінен быць прыўязаны для парадкавання зламаных дадзеных. Пры паслабленай разбівцы ён проста будзе правільна сортаваць паслабленыя часткі. Пры відсутнасці метададзеных ён не можа здагадацца, які дакумент ўжо не выкарыстоўваецца. Спачатку паспрабуйце парадкаваць працэсы абробкі і выкарыстоўвання дадзеных.
Што пераранжаванне все ўсё не рашае
Пераранжавач стараецца прыняць найболей пераканальныя доказы з адзысканага набора да модэлю. Але ён не можа сказаць, чыі вектарны пошук узагалі быў правым рашэннем. Возьмімо пытанне пра тое, скількі корыстувачаў актыўных у пэўным рэгіоне: направляць яе на індэкс дакументацыі – глыбока памылка, таму што гэтыя цыфры знаходзяцца ў SQL-базе дадзеных.
Якасць адзыскання інфармацыі мае розныя рэгламенты. Першы этап — гэта адзысканне тэксту, а другі — яго арранжаванне, але ўжо раней прымэчваецца, дзе шукаць. Распрацоўка запытку між вектарным пошукам, запыткамі SQL і жывым пошукам у інтэрнэтэ, на адной засадзе намераў корыстніка, являецца рэгламентам, які стоіць вышэй за всі пераказаны вышэй элементы.