Галоўная / Артыкулы / Адмініструванне керування дадзейбамі на Azure: разбій на часткі, гібрыдны пошук, фільтры і цытаты

Адмініструванне керування дадзейбамі на Azure: разбій на часткі, гібрыдны пошук, фільтры і цытаты

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

1350 слоў

Дэманстрацыі 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 на адной стороне, ўпэўніцца, што кожны новы задань надае тыя ж данні, якіх чакае фільтр адзыскання.

Ацэнка павінна знаходзіцца ў тым жа репазітарыі, што і настройкі чанкавання: калі хтось “толькі налаштоввае” параметры перакрыцча, “золаты пакет” павінен збіцца пры першай спробе, перш чым це пазнаюць корыстнікі.