RAG: адзінаменна сутнасць да трох канстантных агентаў
Чаму вагі фальшуюць на прыватных даных, як працуюць эмбедынгі і пошук косінусаў у RAG, і трое агентаў Bedrock — ад кераванай базы знанняя да самакераванага прыему дадзенняў.
Крыніцы: RAG from the ground up
Мадэлі фундаменту, які знаходзяцца у стане замарожвання, не можу адказаць на прыватныя запытанні падпрыемства, выкарыстоўваючы толькі вагі. Практыка навучэння ніколі не включала внутрашнія правіла кадровага аддзелу, контракты чы рэгламенты; момент замарожвання завершае часовы працэс; а калі бракуе фактав, генератор усё рава стварае правдопадобныя прыпускі. Таму навучэнне сеткі таму, што знае падпрыемство, стае проблемай сістэмы, а не простаю проблемай большога пункта перапрыямлення.
Чаму толькі вагі не дапамагаюць
Тры структурныя абмежэння перакрываюць можлівасці адпаведзення на запытанні ў корпорацыях:
- Прыватныя корпусы ніколі не включаліся ў процэс навучэння. Правіла зберагчыка і макросы не ўзяткі з публічных веб-тэкстаў.
- Час зупіняецца на моменце замарожвання. Перапісаныя ў мінулы месяц законадаўства недоступныя для перагляду ў замарожанай копіі.
- Мовчанне не ёсць стандартам. Прогназаванне наступнага токена воліе правдопадобны продаж чым чыстае незнаёмства.
Тры спосабы внесення знаёмстваў — і якія з іх ёсць эфектывнымі
Варыянт 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 для індэксавання трэба выдэляць окрэма ад бюджэту для інтэрактывной выдачы, каб фінансавая частка магла бачыць оба пункты.
Шаблоны запітаў версіі падле індэксных выконанняў; змяны запіту без парадзеўнае ацэнкі — гэта спосаб, якам выявляюцца рэгрэсіі.
Для сістэм з калькуляцыяй па аб’ектах працавайце з тым, каб фільтры не моглі быць абойдзены праз введэнне запіту пад прыводам адпаведных ролей адміністратараў.
Зберагуйце можласць абараняння, якая выключае генераванне тэксту і вяртае толькі цітаты, калі монітары вернасці перастаюць працаваць.
Перазглядзайце гібрыдныя вагі лексыкі ўсё тады, калі коды продуктам выканаюць домінуючую ролю ў сумеснай структуры трафіку.
Навучыце персонал падтрымкі чытаць панелі цітатаў пры перадачы заявкаў пра «некарэктны бот».
Зберагуйце парную ацэнку і паказчыкі адхілення разам з параметрамі запазджэння, каб віткі і якасць былі праказаны на адной старонцы.
Зберагуйце парную ацэнку і паказчыкі адхілення разам з параметрамі запазджэння, каб віткі і якасць былі праказаны на адной старонцы.
Зберагуйце парную ацэнку і паказчыкі адхілення разам з параметрамі запазджэння, каб віткі і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб віткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб віткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб віткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб віткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб віткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб віткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб віткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказначыкі адхоўлення разам з часам адпаведзення, каб віткі і якасць былі паказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты адзынакоўкі і паметры адхоўлення разам з часам адпаведзі, ўжо тады косць і якасць будуць праказаныя на адной старонцы.
Зберагаюце параганутыя атрыбуты адзынакоўкі і паметры адхоўлення разам з часам адпаведзі, ужо тады косць і якасць будуць праказаныя на адной старонцы.
Зберагаюце параганутыя атрыбуты адзынакоўкі і паметры адхоўлення разам з часам адпаведзі, ужо тады косць і якасць будуць праказаныя на адной старонцы.
Зберагаюце параганутыя атрыбуты адзынакоўкі і паметры адхоўлення разам з часам адпаведзі, ужо тады косць і якасць будуць праказаныя на адной старонцы.
Зберагаюце параганутыя атрыбуты адзынакоўкі і паметры адхоўлення разам з часам адпаведзі, ужо тады косць і якасць будуць праказаныя на адной старонцы.
Зберагаюце параганутыя атрыбуты адзынакоўкі і паметры адхоўлення разам з часам адпаведзі, ужо тады косць і якасць будуць праказаныя на адной старонцы.
Зберагаюце параганутыя атрыбуты адзынакоўкі і паметры адхоўлення разам з часам адпаведзі, ужо тады косць і якасць будуць праказаныя на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго вітраты і якасць праказуюцца на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго вітраты і якасць праказуюцца на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго вітраты і якасць праказуюцца на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго вітраты і якасць праказуюцца на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго вітраты і якасць праказуюцца на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго вітраты і якасць праказуюцца на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго вітраты і якасць праказуюцца на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўнаследке чаго вітраты і якасць праказуюцца на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ужо тады косты і якасць будуць на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ужо тады косты і якасць будуць на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ужо тады косты і якасць будуць на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ужо тады косты і якасць будуць на адной старонцы.
Зберагаюце парапольныя адзынакі ацэнкі і паметры адхоўкі праз латэнцыю, ужо тады косты і якасць будуць на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ўжо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя атрыбуты ацэнкі і паказначыкі адхоўкі праз латэнцыю, ужо тады косты і якасць будуць праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце параганутыя ацэнкі і паказчыкі адхоўкі праз лятэнс, каб вітраты і якасць былі праказаны на адной старонцы.
Зберагаюце паруваныя адзінакі ацэнкав і паметры адхоўкі праз латэнцыю, ўнаследке косцы і якасць будуць праказаныя на адной старонцы.
Зберагаюце паруваныя адзінакі ацэнкав і паметры адхоўкі праз латэнцыю, ўнаследке косцы і якасць будуць праказаныя на адной старонцы.
Зберагаюце паруваныя адзінакі ацэнкав і паметры адхоўкі праз латэнцыю, ўнаследке косцы і якасць будуць праказаныя на адной старонцы.
Зберагаюце паруваныя адзінакі ацэнкав і паметры адхоўкі праз латэнцыю, ўнаследке косцы і якасць будуць праказаныя на адной старонцы.
Зберагаюце паруваныя адзінакі ацэнкав і паметры адхоўкі праз латэнцыю, ўнаследке косцы і якасць будуць праказаныя на адной старонцы.