Адмініструванне керування дадзейбамі на Azure: разбій на часткі, гібрыдны пошук, фільтры і цытаты
Адмініструванне керуванне асамбляжамі на Azure: разбій на часткі з урахоўваннем структуры, гібрыдны пошук, фільтры ACL, пераранжаванне, запрошэнні з апавязаннямі на джэрэла з цітатамі, а таксама ацэнка, якая выходзіць за межы простага PDF-дэмана.
Дэманстрацыі RAG выглядаюць проста: PDF → фрагменты → эмбедынгі → база вектарных даных → запыт да модэлі. А потам прыходзіць пяць тысяч дакументаў, і хтось запытаеся пра правіла вярнення грошаў за межы краіны. Складная частка — надзеянае і правільнае падачыце доказоў да модэлі.
1. Пачніце з дадзеных, а не з LLM
Перад выборам модэлі чату пераканайцеся ў наявнасці вучоркаў, кантроле доступу, свежасці дадзеных і ўсіх фарматах. Некалігантныя корпусы дадзеных прыводзяць да некорэктных, але „праўдападобных“ адказаў.
2. Разбіянне на фрагменты: не роздзеляйце кожныя N сімвалаў слепа
Вядзьміце за прыклад разбіянне з урахоўванням структуры (загаловкі, сторункі, таблыцы) з перакрыццем. Тэбліцы з тарыфамі і пункты правіла ненавідзяць простае разбіянне на фрагменты па колькасці сімвалаў.
3. Стварэнне эмбедынгаў
Выберыце аднойчы спосаб стварэння эмбедынгаў; заносьце розмер і ідэнтыфікатор модэлі каля кожнага індэксу. Сумешанне разных модэляў таямна паслабляе можлівасць адзыскання неабходных дадзеных.
document = {
"document_id": "HR-2026-001",
"title": "Employee Benefits Policy",
"department": "HR",
"country": "India",
"version": "2026.1",
"effective_date": "2026-01-01",
"source": "HR Portal"
}
def chunk_text(text, size=1000):
return [
text[i:i + size]
for i in range(0, len(text), size)
]
def chunk_by_sections(document):
chunks = []
for section in document.sections:
chunks.append({
"title": section.title,
"content": section.text,
"document_id": document.id
})
return chunks
pip install openai azure-identity
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
token_provider = get_bearer_token_provider(
DefaultAzureCredential(),
"https://ai.azure.com/.default"
)
client = OpenAI(
base_url="https://YOUR-RESOURCE.openai.azure.com/openai/v1/",
api_key=token_provider
)
response = client.embeddings.create(
model="text-embedding-3-small",
input="Employees are eligible after completing 12 months of service."
)
vector = response.data[0].embedding
{
"id": "HR-2026-001-004",
"document_id": "HR-2026-001",
"title": "Employee Benefits Policy",
"content": "...",
"country": "India",
"version": "2026.1",
"content_vector": embedding
}
from azure.search.documents import SearchClient
from azure.search.documents.models import VectorizedQuery
query = "Can I work remotely from another country?"
query_vector = client.embeddings.create(
model="text-embedding-3-small",
input=query
).data[0].embedding
vector_query = VectorizedQuery(
vector=query_vector,
k_nearest_neighbors=10,
fields="content_vector"
)
results = search_client.search(
search_text=query,
vector_queries=[vector_query],
top=5,
select=["title", "content", "document_id", "country"]
)
results = search_client.search(
search_text=query,
vector_queries=[vector_query],
filter="country eq 'India'",
top=5
)
context = "\n\n".join(
f"Source: {r['title']}\n{r['content']}"
for r in results
)
prompt = f"""
You are an enterprise policy assistant.
Answer the user's question using only the provided evidence.
If the evidence does not contain the answer, say that you don't have enough information.
Do not invent policies.
Evidence: {context}
Question: {query}
"""
{
"document_id": "HR-2026-001",
"page": 14,
"section": "Eligibility",
"content": "..."
}
def answer_question(question):
# 1. Embed the question
vector = embed(question)
# 2. Hybrid retrieval
candidates = search(
query=question,
vector=vector,
top=20
)
# 3. Apply metadata/business filters
candidates = apply_filters(candidates)
# 4. Rerank
ranked = rerank(question, candidates)
# 5. Keep only useful evidence
evidence = ranked[:5]
# 6. Build grounded prompt
prompt = build_prompt(
question,
evidence
)
# 7. Generate answer
response = generate(prompt)
# 8. Return answer + citations
return {
"answer": response,
"sources": extract_sources(evidence)
}
test_cases = [
{
"question": "What is the India travel allowance?",
"expected_source": "travel-policy-india.pdf"
},
{
"question": "How long is parental leave?",
"expected_source": "leave-policy-2026.pdf"
}
]
4. Зберагачыце эмбедынгі ў Azure AI Search
Зберагачыце тэкст, вектары і метаданы, якія можна фільтрацыяваць (ID документа, продукт, рэгіон, група ACL, updated_at).
5. Гібрыдны пошук лепшы за пошук толькі на вектарах для большасці падпрыемств
Спалучайце методы ўзаемнай сэмліварнасці з BM25/клучовымі словамі для ID, кодаў і рэдкіх іменаванняў.
6. Фільтруйце раней, чым будзе вітрачаны кантэкст
Застаўляйце фільтры безпекі і прыналежнасці ў самай запытке — а не пасля таго, як модэль вярнулася з забранымі часткамі тэкста.
7. Рэзультаты пошуку — гэта не завершаны кантэкст
Перэранжавайце рэзультаты, адмахвайце дублікаты і скорачайцы ў межах назначанага ліміту токэнаў. Больш частак тэкста ≠ лепшыя адпаведзі.
8. Складаце запытку на аднойчыні з доказаў
Інструкцыі должны выклікаць адпаведзеныя толькі з паданых фрагментаў і пры нехватце доказоў павінны быць зазначаныя.
9. Апарунак з цітатамі
Прыкажыце ідэнтыфікаторы фрагментаў/сторанак, каб корыстнікі моглі іх пераканаць. Работа без цітатаў ёсць рызыкам.
10. Працэс, які варыта адправіць
Прыём → разбіўка на часткі → уключэнне → індэксаванне → гібрыдны пошук → фільтрацыя → пераранжаванне → стварэнне запіту → генераванне → цітаты → ацэнка.
11. Чаго зазвычай не хапяе
Некалькасна разбіўка на часткі; парадныя метаданы; пошук толькі на аснове вектараў; занадта большы кантэкст; адсутнае калекцыя для ацэнкі; адсутныя цітаты; відсутняя сістэма ACL; таямнічныя змены модэляў уключэння; адсутняя інформацыя пра свежасць.
Заключэнне
Продакшны RAG — гэта пошук інформацыі з прыўязаным канцэнтрам LLM, а не навпакі. Інвестыруйце у разбіўку на часткі, гібрыдны пошук, фільтры, цітаты і ацэнку; мадэль чата ёсць фінальны етап.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднавагу точнага ID, запыткі-парапрафразы і прыклады ACL-негатывных рэшэнняў. Автаматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкавання або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднавагу точнага ID, запыткі-парапрафразы і прыклады ACL-негатывных рэшэнняў. Автаматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкавання або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднавагу точнага ID, запыткі-парапрафразы і прыклады ACL-негатывных рэшэнняў. Автаматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкавання або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднавагу точнага ID, запыткі-парапрафразы і прыклады ACL-негатывных рэшэнняў. Автаматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкавання або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднавагу точнага ID, запыткі-парапрафразы і прыклады ACL-негатывных рэшэнняў. Автаматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкавання або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднаковасць ID, запыткі-парапрафразы і прыклады з негатывным рэзультатам ACL. Автоматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднаковасць ID, запыткі-парапрафразы і прыклады з негатывным рэзультатам ACL. Автоматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднаковасць ID, запыткі-парапрафразы і прыклады з негатывным рэзультатам ACL. Автоматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднаковасць ID, запыткі-парапрафразы і прыклады з негатывным рэзультатам ACL. Автоматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднаковасць ID, запыткі-парапрафразы і прыклады з негатывным рэзультатам ACL. Автоматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднаковасць ID, запыткі-парапрафразы і прыклады з негатывным рэшэнням ACL. Автаматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднаковасць ID, запыткі-парапрафразы і прыклады з негатывным рэшэнням ACL. Автаматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднаковасць ID, запыткі-парапрафразы і прыклады з негатывным рэшэнням ACL. Автаматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднаковасць ID, запыткі-парапрафразы і прыклады з негатывным рэшэнням ACL. Автаматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднаковасць ID, запыткі-парапрафразы і прыклады з негатывным рэшэнням ACL. Автаматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднавагу точнага ID, запыткі-парапрафразы і прыклады з негатывным рэзультатам ACL. Автоматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднавагу точнага ID, запыткі-парапрафразы і прыклады з негатывным рэзультатам ACL. Автоматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднавагу точнага ID, запыткі-парапрафразы і прыклады з негатывным рэзультатам ACL. Автоматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднавагу точнага ID, запыткі-парапрафразы і прыклады з негатывным рэзультатам ACL. Автоматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Для кожнага домэна трэба зберагчы «золатны» пакет запыткаў: запыткі на аднавагу точнага ID, запыткі-парапрафразы і прыклады з негатывным рэзультатам ACL. Автоматызаваць іх у CI кожны раз, калі змянююцца настройкі чанкування або імбеддынгу.
Ацэнка павінна знаходзіцца ў тым жа рэпазітарыі, што і настройкі чанкавання: калі хтось “толькі налаштоввае” параметры перакрыцча, “золаты пакет” павінен збіцца пры першай спробе, перш чым гэта пазнаюць корыстнікі.
Гібрыдны пошук все ўсё захоць хорашых аналізатораў і спіса сынанімав для жаргону домэна; самыя эмбедынгі не дапаможуць, калі код правіл напісаны некорэктна.
Документавацыя кантракту поля ACL на адной стороне, ўпэўніцца, што кожны новы задань надае тыя ж даныя, якіх чакае фільтр адзыскання.
Ацэнка павінна знаходзіцца ў тым жа рэпазітарыі, што і настройкі чанкавання: калі хтось “толькі налаштоввае” параметры перакрыцча, “золаты пакет” павінен збіцца пры першай спробе, перш чым гэта пазнаюць корыстнікі.