RAG: адзінаменна сутнасць да трох канстантных агентаў
Чаму вагі фальшуюць на прыватных данных, як працююць эмбеддінгі і косайнус-фетч, а таксама тры прагрэсіўныя агенты — ад кераваных баз знанняў да самакераванага прыему дадзэнняў.
Моделі фундаменту, які знаходзяцца у стане замарожвання, не можу адказаць на прыватныя запытанні падпрыемства, выкарыстоўваючы толькі вагі. Практыка навучэння ніколі не включала внутрашнія правіла кадровага аддзелу, контракты чы рэгламенты; момент замарожвання завершае часовы працэс; а калі бракуе фактав, генератор усё рава стварае правдопадобныя прыпускі. Таму навучэнне сеткі таму, што знае падпрыемство, стае проблемай системы, а не простаю проблемай большога пункта перапрыямлення.
Чаму толькі вагі не дапамагаюць
Тры структурныя абмежэння перакрываюць можлівасці адпаведзення на запытанні ў корпорацыях:
- Прыватныя корпусы ніколі не включаліся ў процэс навучэння. Правіла зберагчыка і макросы не ўзяткі з публічных веб-тэкстаў.
- Час зупіняецца на моменте замарожвання. Перапісаныя ў минулы месяц законадаўства недоступныя для перагляду ў замарожанай копіі.
- Мовчанне не є стандартам. Прогназаванне наступнага токена воліе правдопадобны продаж чым чыстае незнаёмства.
Тры спосабы внесення знаёмстваў — і якія з іх є эфектывнымі
Варыянт 1: Тонкая наладка на корпусе
Даўальнейшая падготовка може запісаць стыль або навыкі, пры тым размываючы факты між параметрамі без цітатаў, і не можа забезпечыць видазрэннасць для кожнага пользователя, таму што всі выкарыстоўваюць аднаковыя вагі. Для падзеў Q&A, дзе неабходна цітаваць і контролюваць доступ, тонкая наладка ўсунутая механізм.
Варыянт 2: Вставіць усё ў інструкцыю системы
Перадача тексту пад час запиту ператварае выкарыстоўванне інформацыі на чытанне — гэта правильны механізм. Гэта працуе для маленькіх стабільных набораў. Гэта не працуе, калі об’ём дадзеных перасягае межы, калі за кожны токен ставляцца плата за кожны запит, калі адпаведзі, знаходзяцься серед запитаў, падпадаюць на низкія стандарты, і калі адна статычная вставка не можа фільтруваць за роллю.
Варыянт 3: Вставіць толькі тое, што важна
Зберагчы механізм чытання пад час запиту, трэба выправіць масштаб. З’явіць кальку актуальных параграфаў, а потым стварыць адпаведзь. Гэта ўжо є рэтрыбют-аддытывованая генерацыя ў адной фразе.
Што такое RAG, з самага пачатку
У режыме без сеті: запрашваюцца файлы, яны дзеляцца на фрагменты, гэтыя фрагменты вбудовваюцца, а векторы (і частае ўсё тое ж лексычныя індэксы) зберагаюцца. У режыме онлайн: запрашваецца запит, выбіраюцься найболей релевантныя фрагменты, якія пакуецца ў інструкцыю разам з запитам, пасля чаго генеруецца адпаведны адказ на адваротах гэтых фрагментов.
Складная частка — гэта не сама процедура генеравання адказа; складнасць створыць такі механізм запрашэння, які б быў точным, дышчыцам і ўрахоўваў правіла дазволу.
Векторы і эмбеддінгі без містыцызму
Вектор — гэта список цяжэй, які розмешчае фрагмент тексту ў прасторы, дзе аб’екты з падобным значэнням знаходзяцца ў близінстве адзін да другога. Сеть эмбеддінга перадае текст у гэты прастор. Косай схожасць параболізуе направленне больш, чым дужыну, і самэ гэта ўзрошвае яе праблематычнае выкарыстоўванне для ацэнкі релевантнасці. Метрыкі адстані, якія ігнаруюць нормалізацыю, прадстаўляюць ся гіршымі, калі дужыны фрагментаў разнакаватыя.
Выбір размернасці і алгорытму укладання дадзеных — це рашэнне, якое залежыць ад спецыфікі прыемлена: большая колькасць размернасцей можа розлучыць разныя значэння, але выклікае прыбытак у паводзе і часе адпаведзьбы; выкарыстоўванне розных алгорытмаў укладання ў час паведамлення і час запытку таямніча нарабляе проблемы пад час пошуку найбліжэйшых аналогаў.
Арытмэтыка сяродзіцьбы
Косайны — это скалярны добутак единичных вектораў. Два фрагмента пра перазначэнне пароляў з разным формулюванням все равно залишаюцца блізкія, якщо алгорытм укладання правільна пераказаў іх сэнс. Пошук па ключовым словам не бачыць гэтай зв’язку; але пошук за ўсіма параметрамі яго фіксуе — і можа працягнуцься без точных ідэнтыфікатораў товара, якщо толькі не будзе выкарыстоўваны гібрыдны лексычны пошук.
Стварэнне трох цяплых агентаў на базе кераванага хмарнага інферэнсу
У рэште гіда ідеіямы рэалізуюцца чераз трохі прогрэсіўных агентаў на кераваных моделях у стыле AWS Bedrock: адбіраная база ведамасцей, оркестратор LangGraph і самакераваны канвэй для прыемкі дадзеных. Кожны з эўрадаў ёсць цэлыя схематыка агента — чытайце іх як выконвальную архітектуру, а не як фрагменты.
Агент 1 — шлях да кераванай базы ведамасцей
"""
AGENT 1: Managed Knowledge Base. The 30-line version.
Bedrock does the chunking, embedding, indexing and searching. You wire it up.
"""
import boto3
from langchain_aws import AmazonKnowledgeBasesRetriever, ChatBedrockConverse
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
REGION = "eu-west-1"
KB_ID = "ABCD1234EF"
retriever = AmazonKnowledgeBasesRetriever(
knowledge_base_id=KB_ID,
region_name=REGION,
retrieval_config={
"vectorSearchConfiguration": {
"numberOfResults": 5,
"overrideSearchType": "HYBRID",
}
},
)
llm = ChatBedrockConverse(
model="eu.anthropic.claude-sonnet-4-5-20250929-v1:0",
region_name=REGION,
temperature=0,
max_tokens=1024,
)
PROMPT = ChatPromptTemplate.from_messages([
("system",
"Answer only from the numbered context. Cite every claim as [n]. "
"If the context does not contain the answer, say so plainly."),
("human", "Context:\n{context}\n\nQuestion: {question}"),
])
def format_docs(docs) -> str:
return "\n\n".join(
f"[{i}] source={d.metadata.get('location', {}).get('s3Location', {}).get('uri', '?')}\n"
f"{d.page_content}"
for i, d in enumerate(docs, start=1)
)
chain = (
RunnableParallel(context=retriever | format_docs, question=RunnablePassthrough())
| PROMPT
| llm
| StrOutputParser()
)
if __name__ == "__main__":
print(chain.invoke("How fast must we submit a shortlist for a niche engineering role?"))
Этот шлях апыраецца на хоставаную базу ведамасцей: дакументы зберагаюцца ў сховішчы, кераваны індексатор стварае эмбедынгі, а агент адпавядае з цитатамі, якія вяртае гэты сервіс. Серед паўзакаў — меньш кастамнага коду індекса; серед компромісаў — меньшы контроль над межамі сегментаў і ўзаемным з’еднанням дадзеных.
Агент 2 — оркестрацыя за дапамогою LangGraph
"""
AGENT 2: LangGraph agent that decides WHETHER and WHICH index to search.
Retrieval is a tool. Identity travels in typed context, never in the prompt.
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import Any
import boto3
from langchain.agents import create_agent
from langchain.agents.middleware import ModelCallLimitMiddleware, ToolCallLimitMiddleware
from langchain.tools import ToolRuntime
from langchain_aws import ChatBedrockConverse
from langchain_core.tools import tool
REGION = "eu-west-1"
POLICY_KB = "ABCD1234EF"
ENGINEERING_KB = "WXYZ5678GH"
agent_runtime = boto3.client("bedrock-agent-runtime", region_name=REGION)
@dataclass
class RequestContext:
"""Built from validated JWT claims. The model cannot read or forge it."""
subject: str
roles: tuple[str, ...]
region: str
def _retrieve(kb_id: str, query: str, ctx: RequestContext, k: int = 5) -> str:
"""Bedrock Retrieve API with a server-side metadata filter for tenant + residency."""
resp = agent_runtime.retrieve(
knowledgeBaseId=kb_id,
retrievalQuery={"text": query},
retrievalConfiguration={
"vectorSearchConfiguration": {
"numberOfResults": k,
"overrideSearchType": "HYBRID",
"filter": {
"andAll": [
{"in": {"key": "acl_roles", "value": list(ctx.roles)}},
{"in": {"key": "region", "value": [ctx.region, "GLOBAL"]}},
]
},
}
},
)
results: list[dict[str, Any]] = resp.get("retrievalResults", [])
if not results:
return "NO_AUTHORISED_RESULTS: nothing in this index that you may read."
return "\n\n".join(
f"[{i}] score={r.get('score'):.3f} "
f"source={r.get('location', {}).get('s3Location', {}).get('uri', '?')}\n"
f"{r['content']['text']}"
for i, r in enumerate(results, start=1)
)
@tool
def search_policy_docs(query: str, runtime: ToolRuntime[RequestContext]) -> str:
"""Search HR, compliance and commercial policy.
Use for shortlist SLAs and service credits, candidate data retention and consent,
GDPR erasure, statement-of-work approval thresholds, background check rules and
automated decision governance.
"""
return _retrieve(POLICY_KB, query, runtime.context)
@tool
def search_engineering_docs(query: str, runtime: ToolRuntime[RequestContext]) -> str:
"""Search platform runbooks and integration documentation.
Use for the requisition sync service, Workday and SuccessFactors webhooks, Kafka
topics and event schemas, idempotency and retry behaviour, and vector index refresh.
"""
return _retrieve(ENGINEERING_KB, query, runtime.context)
agent = create_agent(
model=ChatBedrockConverse(
model="eu.anthropic.claude-sonnet-4-5-20250929-v1:0",
region_name=REGION,
temperature=0,
),
tools=[search_policy_docs, search_engineering_docs],
system_prompt=(
"You are an enterprise knowledge assistant.\n"
"- Answer only from tool results and cite the [n] markers they return.\n"
"- If a tool returns NO_AUTHORISED_RESULTS, say you cannot access a source and "
"name the document owner. Never fill the gap from memory.\n"
"- For questions spanning policy and platform, call both tools before answering."
),
context_schema=RequestContext,
middleware=[
ModelCallLimitMiddleware(thread_limit=8, run_limit=6, exit_behavior="end"),
ToolCallLimitMiddleware(thread_limit=6, run_limit=5, exit_behavior="end"),
],
)
if __name__ == "__main__":
claims = {"sub": "asha@example.com", "roles": ["recruiter"], "region": "EU"}
result = agent.invoke(
{"messages": [{"role": "user", "content": "How is the vector index refreshed?"}]},
context=RequestContext(
subject=claims["sub"],
roles=tuple(claims["roles"]),
region=claims["region"],
),
)
print(result["messages"][-1].content)
У гэтым случае трыбут контролю ёсць явным графам: класіфікуюцца намер, вызываюцься інструменты адзыскі, за неабяжнасцю запытваецца людзь, пасля чаго даёцца адказ. Функціяы контроля стану і перерывы прыводзяць да таго, што дугі процесы падтрымкі стаюць стойкімі сесіямі замест адзынаковых структураў у памяці.
Агент 3 — самакантролюемая адзыскі і запрашэнне даных
"""
AGENT 3: Self-managed pipeline: your chunking, your index, your fusion, your rerank.
Chosen when Bedrock KB's fixed options are not enough (custom fusion, per-stage timing,
an abstention gate, or a chunking rule the managed service will not express).
"""
from __future__ import annotations
import time
from typing import Annotated, Any, TypedDict
import boto3
from langchain_aws import BedrockEmbeddings, ChatBedrockConverse
from langchain_core.documents import Document
from langchain_core.prompts import ChatPromptTemplate
from langchain_text_splitters import MarkdownHeaderTextSplitter, RecursiveCharacterTextSplitter
from langgraph.graph import END, START, StateGraph
REGION = "eu-west-1"
CONFIDENCE_FLOOR = 0.34
CANDIDATE_K, CONTEXT_K = 20, 4
embeddings = BedrockEmbeddings(
model_id="amazon.titan-embed-text-v2:0",
region_name=REGION,
model_kwargs={"dimensions": 1024, "normalize": True},
)
llm = ChatBedrockConverse(
model="eu.anthropic.claude-sonnet-4-5-20250929-v1:0",
region_name=REGION,
temperature=0,
)
rerank_client = boto3.client("bedrock-agent-runtime", region_name=REGION)
# ---------------------------------------------------------------- ingest
def chunk_policy_document(markdown: str, source: str, acl: list[str], region: str):
"""Structure-aware first, size-capped second. Headings are the natural unit for
policy text; the recursive splitter only intervenes on oversized sections."""
by_heading = MarkdownHeaderTextSplitter(
headers_to_split_on=[("#", "title"), ("##", "section"), ("###", "clause")]
).split_text(markdown)
capper = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)
chunks: list[Document] = []
for part in capper.split_documents(by_heading):
heading = " > ".join(
v for k, v in part.metadata.items() if k in ("title", "section", "clause")
)
chunks.append(
Document(
# contextual retrieval: the chunk carries its own scope
page_content=f"{heading}\n{part.page_content}",
metadata={**part.metadata, "source": source, "acl": acl, "region": region},
)
)
return chunks
# ---------------------------------------------------------------- state
class State(TypedDict, total=False):
question: str
roles: list[str]
region: str
candidates: list[Document]
context_docs: list[Document]
confidence: float
answer: str
timings: Annotated[dict[str, float], lambda a, b: {**(a or {}), **(b or {})}]
def _ms(name: str, t0: float) -> dict[str, float]:
return {name: round((time.perf_counter() - t0) * 1000, 1)}
# ---------------------------------------------------------------- nodes
def retrieve(state: State, *, store) -> State:
"""Hybrid search with an ACL pre-filter pushed into the index query."""
t0 = time.perf_counter()
docs = store.similarity_search(
state["question"],
k=CANDIDATE_K,
filter={"acl": {"$in": state["roles"]}, "region": {"$in": [state["region"], "GLOBAL"]}},
)
return {"candidates": docs, "timings": _ms("retrieve", t0)}
def rerank(state: State) -> State:
"""Bedrock Rerank: a cross-encoder scoring each (query, chunk) pair jointly."""
t0 = time.perf_counter()
cands = state["candidates"]
if not cands:
return {"context_docs": [], "confidence": 0.0, "timings": _ms("rerank", t0)}
resp = rerank_client.rerank(
queries=[{"type": "TEXT", "textQuery": {"text": state["question"]}}],
sources=[
{"type": "INLINE", "inlineDocumentSource": {
"type": "TEXT", "textDocument": {"text": d.page_content}}}
for d in cands
],
rerankingConfiguration={
"type": "BEDROCK_RERANKING_MODEL",
"bedrockRerankingConfiguration": {
"numberOfResults": CONTEXT_K,
"modelConfiguration": {
"modelArn": f"arn:aws:bedrock:{REGION}::foundation-model/amazon.rerank-v1:0"
},
},
},
)
ranked = resp["results"]
top = [cands[r["index"]] for r in ranked]
return {
"context_docs": top,
"confidence": round(float(ranked[0]["relevanceScore"]), 3),
"timings": _ms("rerank", t0),
}
def generate(state: State) -> State:
"""Abstain below the floor rather than answering from weak context."""
t0 = time.perf_counter()
if not state["context_docs"] or state["confidence"] < CONFIDENCE_FLOOR:
return {
"answer": "I cannot ground an answer for that in a source you are permitted "
"to read. Routing to the document owner.",
"timings": _ms("generate", t0),
}
context = "\n\n".join(
f"[{i}] {d.metadata.get('source')}\n{d.page_content}"
for i, d in enumerate(state["context_docs"], start=1)
)
prompt = ChatPromptTemplate.from_messages([
("system", "Answer only from the numbered context and cite each claim as [n]."),
("human", "Context:\n{context}\n\nQuestion: {question}"),
])
reply = (prompt | llm).invoke({"context": context, "question": state["question"]})
return {"answer": reply.content, "timings": _ms("generate", t0)}
def build_graph(store):
g = StateGraph(State)
g.add_node("retrieve", lambda s: retrieve(s, store=store))
g.add_node("rerank", rerank)
g.add_node("generate", generate)
g.add_edge(START, "retrieve")
g.add_edge("retrieve", "rerank")
g.add_edge("rerank", "generate")
g.add_edge("generate", END)
return g.compile()
У гэтым варіянте адпаведальнае кантролюванне за часткавым адзбіраннем даных, вызывамі функцый укладкі, хранэнням вектароў і складаннем запыткаў. Команды выбіраюць гэты варіант, калі правілы сегментавання, гібрыднае з’еднанне лексычных і ўжоўтворэных элементаў, або фільтры належнасці павінны быць частью основнага коду, а не проста настройкамі ў консолі.
Выбір з трох варыянтав
Выбірайце кантролюемы варіант, калі важна швальнасць рэалізацыі і обсяг даных єсць невялікі. Перейдзіце на LangGraph, калі важную ролю выконваюць розгалужэння логіки, перагляд даных людзьмі і запам’ятовванне інформацыі между крокамі. Выбірайце самакантролюемы варіант, калі якасць адзыскі даных па ідэнтыфікаторах, правілах доступу чы ў розбіве домэнаў стае ключовым параметрам продукту.
Ацэнка, якая практычна павышае якасць
Зьвяржыце адзінак Recall@k і Precision@k на зашчытанай калекцыі запытанняў, а таксама ступень адпаведнасці адказоў да запрашаных фрагментаў. Супакуйце кожную змяну розмеру фрагментаў або параметраў эмбеддера з рэзультатамі да і пасля. Адмовіцеся ад использовання, калі найважлівейшыя фрагменты ў слабкам стане — каліраваная тыша лепша, чым вольная інвенцыя.
Калі не варта использоваць RAG
Не выконвуйце запрашэння для фактов, якія вже знае базавая сетка, для чыста творчых задач, для непастойчывых цифр, якія краща обрабоцваюцца за дапамогою API, а таксама для схем з надзяйным часам адпаведзення, якія не можуць дазволіць сабе додатковы запрашэння. Інодзе достатнья лепшая інструкцыя або незначная настройка формата.
Заключэнне
RAG — це сістэма каналайнаў: чысты прыем дадзеных, адкрытае запрашэння інфармацыі, чысткія інструкцыі для генеравання і меркаваныя критэрыі. Тры агентаў паказваюць тую ж ідею на трох разных рэвенюях кантролю. Выберыце той рэвеню, які падходзіць вашым патрэбам у кантроле — а не той, які звучыць найбольш праўазнаўпэшны на слайдзе.
Чарткі з аператыўнай роботы: (1) адны прыстрой для індексавання та запитоў, (2) метаданныя для прав адзыначэння доступу та даты з самага пачатку, (3) гібрыдны пошук, калі з’яўляюцца ідэнтыфікаторы, (4) параджанне рэйтингу, калі важна тачнасць, (5) «золатыя» запиты ў системе CI, (6) фактары перзбудовы, калі змянююцца джэрела. Спрыятлівае сераўыску знанняяў трэба спрыятаць як дарабак з власнікамі, показнікамі якосці та механізмамі вярнення да пачатковага стану — а не як індекс, які ніхто не стежыць у выходныя. Калі графы агентаў растуць, трэба мераваць кост токеноў разам з якасцю адпаведзей; оркестрацыя, якая витрачае падзесяць разоў больш ресурсоў, чым простая пераказваць, не падвышаючы якосці, — это регрэсія пад маскай архітектуры. Трэба зберагчы інструкцыі для ситуацый, калі рэзультаты запытоў пустыя, інцыдэтаў з застарелым індексам та несувярэннасцей прыстроў індексавання, каб спецыялісты не муселі імпровізаваць на адной лог-файлы пераказваць.
Документавацый кожны джэрела корпусу з власнікам та частотай апдэйтаў; «забытыя» контейнеры стаюць прычыной таямнай дэградацыі.
Лепшае ўжыць перакрыцча сегментаў з ранніх стадыяў; прыемліце сэмантычныя роздзелвачы толькі тады, калі адлікі пакажуць, што фіксаваныя вікна не працуюць.
Запісвайце ідэнтыфікаторы запытанняў разам з адпаведзямі, каб паказваць, чы розныя адпаведзі ўскладненыя з-за немагчымасці запрашання дадзеных чы з-за схылу гэнеравання.
Калі таго можна, аддзельце экспертаў для адліку ад сеткі, якая дае адпаведзі, каб зменшыць упераджэнне на адную групу.
Залічвайце витраты на API для індэксавання окрема ад витатак на інтэрактыўную працю, каб фінансавыя віддзелы маглі бачыць оба показнікі.
Тэмпляты прыказаў для версій трэба размешчаць праз тыя ж самыя процесы стварэння індэксаў; змена прыказа без павторнага адліку — гэта спосаб, як прыходзяць да регрэсій.
Для систем з калькуючыміся корыстнікамі пераканайцеся, што фільтры нельга прыкрасіць за дапамогою інжэкцыі прыказаў, якія адаграюць ролі адміністратараў.
Залічвайце можласць абяроны, якая выключае гэнеравання та вяртае толькі цытаты, калі манітары адпаведнасці пакажуць проблемы.
Перазглядзіце гібрыдныя вагі лексыкі ўсё тады, калі коды продуктав становяць большую частку трафіка.
Адаптавайце персонал падтрымкі, каб ён чытаў панелі цитатаў пры перадачы заявак пра «некоректны бот» на вышэйшыя рангі.
Документавайце кожны источнік корпуса з іменем адпаведальнага чалавека та частотай апдэйтаў; ігнораваныя кантэйнеры стаюць прычыной таямнай панэрозі.
Вядома, лепш выкорыстоўваць перакрыцча сегментаў з самага пачатку; прыемлівайце сэмантычныя роздзелювачы толькі тады, калі адлічэнні пакажуць, што фіксаваныя вікна не працуюць.
Запісвайце ідэнтыфікаторы запрошэнняў разам з адпаведнымі адказамі, каб паказваць, чы роўныя адказы є наследкам немагчымасці запрашэння чы ўхілу генеравання.
Калі ўмога, аддзельнайце суддзяў, якія адлічваюць, ад сеті, якая даўае адказы, каб зменшыць уперадзеўленне.
Бюджет на викорыстоўванне API для індэксавання трэба выдзеляць окрема ад бюджету для інтерактывнага сервісавання, каб фінансы моглі бачыць оба пункты.
Размешчайце шаблоны запрошэнняў празаўсёды пад будовамі індэксаў; змяна запрошэння без паўтарной адлічванні — гэта спосаб, як прыносзяць регрэсіі.
Для систем з калькуляцыяй за кількістю корыстувачаў тэставайце, чы фільтры не можна абйсці за дапамогою вставкі запрошэнняў, якія прэтвараюцца ў ролі адміністратараў.
Зберагаеце функцыю выключэння, яка блакуе генераванне та вяртае толькі цітаты, калі рэгулярнасць монітараў падыходзіць да нуля.
Паўтараючы адмацаванне гібрыдных ваг лексыкалных елементаў, калі коды продуктав перамагаюць у складзе трафіку.
Навучайце персонал падтрымкі чытаць панелі цітатаў пры перадачы заявак пра «некоректны бот» на вышэйшы ранг.
Документавайце кожны источнік корпуса з адазначэнням власніка та частотай апдэйтаў; істочнікі без власніка стаюць прычыной таямнай дэградаціі.
Вядома праглядзайце перакрыцчы сегментаў; абрацуйце семантычныя роздзелвачы толькі тады, калі адлічэння пакажуць, што фіксаваныя вакна не працуюць.
Запісвайце ідэнтыфікаторы запрашанняў разам з адпаведзямі, каб паслабыя адпаведзі можна было діагноставаць як непадарожжання даных чы то як схыл генеравання.
Калі ўможліва, аддзельнайце суддзяў, якія адлічваюць, ад сеті, якая даўае адпаведзі, каб зменшыць упераджэнне на адную сторону.
Бюджет на викорыстанне API для індэксавання трэба выделяць окрема ад бюджету для інтерактывной выдачы, каб фінансавая частка магла бачыць оба пункты.
Шаблоны запитаў версіі падле індэксных выконанняў; змяны запіту без парадзеўнае ацэнкі — гэта спосаб, якам выявляюцца регрэсіі.
Для систем з калькуляцыяй па аб’ектах працавайце з тым, каб фільтры не моглі быць абойдзены праз введэнне запіту пад прыводам адпаведных ролей адміністратараў.
Зберагуйце можласць абараняння, якая выключае генераванне тэксту і вяртае толькі цітаты, калі монітары вернасці перестаюць працаваць.
Перазглядзайце гібрыдныя вагі лексыкі ўсё тады, калі коды продуктам выканаюць домінуючую ролю ў сумеснай структуре трафіку.
Навучыце персонал падтрымкі чытаць панелі цітатаў пры перадачы заявкаў пра «некоректны бот».
Зберагуйце парную ацэнку та паказателі адхілення разам з параметрамі запазджэння, каб виткі та якасць былі праказаны на адной старонцы.
Зберагуйце парную ацэнку та паказателі адхілення разам з параметрамі запазджэння, каб виткі та якасць былі праказаны на адной старонцы.
Зберагуйце парную ацэнку та паказателі адхілення разам з параметрамі запазджэння, каб виткі та якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб виткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб виткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб виткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб виткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб виткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб виткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб виткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб виткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты адзынакоўкі і паметры адхоўлення разам з часам адпаведзі, ўжо тады косць і якасць будуць праказаныя на адной старонцы.
Зберагаюце параганутыя атрыбуты адзынакоўкі і паметры адхоўлення разам з часам адпаведзі, ужо тады косць і якасць будуць праказаныя на адной старонцы.
Зберагаюце параганутыя атрыбуты адзынакоўкі і паметры адхоўлення разам з часам адпаведзі, ужо тады косць і якасць будуць праказаныя на адной старонцы.
Зберагаюце параганутыя атрыбуты адзынакоўкі і паметры адхоўлення разам з часам адпаведзі, ужо тады косць і якасць будуць праказаныя на адной старонцы.
Зберагаюце параганутыя атрыбуты адзынакоўкі і паметры адхоўлення разам з часам адпаведзі, ужо тады косць і якасць будуць праказаныя на адной старонцы.
Зберагаюце параганутыя атрыбуты адзынакоўкі і паметры адхоўлення разам з часам адпаведзі, ужо тады косць і якасць будуць праказаныя на адной старонцы.
Зберагаюце параганутыя атрыбуты адзынакоўкі і паметры адхоўлення разам з часам адпаведзі, ужо тады косць і якасць будуць праказаныя на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго витраты і якасць праказуюцца на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго витраты і якасць праказуюцца на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго витраты і якасць праказуюцца на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго витраты і якасць праказуюцца на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго витраты і якасць праказуюцца на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго витраты і якасць праказуюцца на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго витраты і якасць праказуюцца на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго витраты і якасць праказуюцца на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ужо тады косты і якасць будуць на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ужо тады косты і якасць будуць на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ужо тады косты і якасць будуць на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ужо тады косты і якасць будуць на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ужо тады косты і якасць будуць на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказателі адхоўкі праз лятэнс, каб витраты і якасць былі праказаны на адной старонцы.
Зберагаюце паруваныя адзінакі ацэнкав і паметры адхоўкі праз латэнцыю, ўнаследке косцы і якасць будуць праказаныя на адной старонцы.
Зберагаюце паруваныя адзінакі ацэнкав і паметры адхоўкі праз латэнцыю, ўнаследке косцы і якасць будуць праказаныя на адной старонцы.
Зберагаюце паруваныя адзінакі ацэнкав і паметры адхоўкі праз латэнцыю, ўнаследке косцы і якасць будуць праказаныя на адной старонцы.
Зберагаюце паруваныя адзінакі ацэнкав і паметры адхоўкі праз латэнцыю, ўнаследке косцы і якасць будуць праказаныя на адной старонцы.
Зберагаюце паруваныя адзінакі ацэнкав і паметры адхоўкі праз латэнцыю, ўнаследке косцы і якасць будуць праказаныя на адной старонцы.