Back to blog
RAG Systems

Multilingual RAG for Armenian, Russian and English Content

Language is a retrieval contract, not a cosmetic setting for the final answer

Language state, source lineage, policy, evaluation and controlled production rollout

Original ML-RAG-9 workflow with routing pseudocode and failure-mode gates
multilingual RAG, Armenian Russian English RAG, multilingual retrieval, RAG architecture, RAG evaluation and ML-RAG-9
Primary nodeLanguage-aware evidence routing
Routing modeML-RAG-9
StatusPUBLISHED
Armenian, Russian and English document streams pass through a shared retrieval core to a verified answer
ML_RAG_9_V01: language state, source lineage and evidence coverage remain explicit through retrieval and fallback.
TERMINAL_PREVIEW.LOG
$ retrieve multilingual --contract ML-RAG-9
> inspect: identity / locale / language confidence
> search: language lane / shared evidence / policy
> verify: source / version / coverage / fallback
> evaluate: hy / ru / en / mixed-language
> route: answer / clarification / review / no-answer
Multilingual RAG architecture

Multilingual RAG is not one English retrieval system with a translation step at the end. The language in which a user asks, the language of the governing source, the way documents are analysed and the language used in the answer all affect whether retrieved evidence is appropriate. A plausible answer can still be wrong if it silently crosses a language or version boundary.

This guide addresses the technical question of multilingual RAG for Armenian, Russian and English content. The broader decision to build and operate a RAG product belongs to the RAG systems service. Teams that need an architecture review can frame the work through an AI engineering brief, rather than using this article as a substitute for a commercial service page.

Start with a language contract, not a language switch

Record language as structured state at the request boundary. A useful request record contains the authenticated scope, a declared locale when the UI has one, detected language with confidence, requested output language, and the policy for mixed-language text. Detection is a signal, not authorization to rewrite the request.

The same discipline applies to sources. Each document or passage needs a source language, a canonical source ID, version, lifecycle, access attributes and a human-openable locator. If a document is a translation, retain the relation to the governing original rather than presenting both versions as interchangeable. In some workflows an Armenian translation is the approved source; in others the Russian or English original governs. That is a content-policy decision which retrieval should preserve.

json
{
  "requestLanguage": "hy",
  "outputLanguage": "hy",
  "languageConfidence": 0.93,
  "allowedSourceLanguages": ["hy", "ru", "en"],
  "translationPolicy": "show-governing-source",
  "scope": { "tenant": "example", "role": "support" }
}

Do not use a confidence value as a claim of quality. It is a routing input: a low-confidence or mixed-language request can ask for clarification, run a bounded fallback, or go to review.

ML-RAG-9 architecture: one evidence contract, explicit language lanes

The ML-RAG-9 workflow separates language handling from permissions and evidence. It can use shared infrastructure, but it does not erase language-specific behaviour.

text
REQUEST + authenticated scope + declared locale
  -> classify language and preserve confidence
  -> apply trusted scope, lifecycle and language policy
  -> retrieve eligible Armenian / Russian / English evidence
  -> normalize candidates without losing source language or locator
  -> select evidence for each material claim
  -> compose in requested language with visible source context
  -> evaluate route: answer | clarify | review | no-answer

At ingestion, preserve original Unicode text and structural boundaries. Normalisation may improve matching, but it must not replace the original passage that a reviewer needs to inspect. Store analysis configuration with the indexed version: tokenizer or analyser, embedding model, chunking policy, language fields and source version. Without that receipt, an operator cannot tell whether a retrieval regression came from a source update, an analyser change or a model change.

At retrieval, calculate eligibility before ranking. Tenant, role, document lifecycle and product scope remain deterministic filters. Language policy then decides whether the first search lane should be exact-language only, whether a permitted parallel lane is allowed, and how translated or bilingual sources are labelled. A vector similarity score must not grant access, override a superseded version or hide a language mismatch.

Component contracts that prevent silent drift

Request router. Keep raw input, declared locale, detected language, confidence and fallback decision separate. A user may write an Armenian sentence containing Russian product terms and English identifiers. That is not an error; it is a case the acceptance set must cover.

Document pipeline. Keep source language and writing system with each chunk. Do not assume all Cyrillic text is Russian, or that all Latin-script content is English. Preserve the canonical source and any approved translation relationship. Re-indexing a changed document should make the prior version ineligible according to the lifecycle policy.

Retriever and reranker. Pass language, source ID, version, locator and access attributes to every candidate. The hybrid search guide is relevant when exact identifiers and paraphrases require separate lexical and semantic signals; the language contract must survive both lanes and rank fusion.

Answer composer and UI. Draft only from selected evidence. If a statement is translated for the response, keep the original source title and a clear locator. Do not make a translated paraphrase look like a verbatim source quote. The citation workflow in RAG citations and traceability shows why source, version and locator should remain structured objects through the final UI.

Failure modes to test before production

Failure modeWhat goes wrongControlled response
Script or language misclassificationThe request is sent to the wrong analyser or language laneRecord confidence; clarify or use an evaluated fallback
Cross-language false friendSimilar tokens retrieve a document with a different meaningRequire claim-level evidence and evaluate ambiguous terms
Missing governing translationA convenient translation replaces the policy sourceLabel language and source relationship; route conflicts to review
Uneven corpus coverageEnglish appears strong while Armenian sources are sparse or staleMeasure and report acceptance outcomes per language
Mixed-language queryOne query contains Armenian, Russian and English termsPreserve the original input and use a tested mixed-query route
Update driftA source changes in one language but an older translation remains searchableReconcile lifecycle and source relationships before declaring the index current
Unsupported evidenceRetrieval finds no permitted, current sourceReturn no-answer or request review instead of filling the gap

The important test is not whether the system can produce three fluent answers. It is whether it can preserve evidence and choose a safe route when language, source and product policy disagree.

Build a per-language acceptance set

Create cases from the real corpus and review them with the owners of the governing documents. Include equivalent questions in Armenian, Russian and English only when they are genuinely equivalent; keep language-specific terminology, document titles and workflows where they differ.

For every language lane, test normal retrieval, exact identifiers, paraphrases, recently changed sources, denied access, missing evidence and citation links. Add mixed-language queries, ambiguous transliteration and a request whose answer must be qualified because the authoritative source exists only in another language. Track the route and evidence receipt, not only a single answer-quality score.

GateEvidence to inspect
Language stateraw input, declared locale, detection confidence and chosen route
Eligibilitytenant, role, lifecycle and language policy were applied before ranking
Lineageselected passages retain source ID, version, language and locator
Coverageevery material claim is supported or explicitly limited
ParityArmenian, Russian and English cases are measured separately
Fallbacklow-confidence, conflict and no-evidence cases are safe and observable
Operationssource/update owners, rollback and evaluation ownership are named

A bounded production check

Start with one workflow and a small, permission-safe source set. Pin the ingestion, embedding, retrieval and language-policy configurations for the test. Release with a rollback path, then inspect real traces for language route, source versions, citation-link health, no-answer reasons and changed-source reconciliation. Avoid collecting unnecessary user or document text in telemetry.

ts
const route = decideLanguageRoute(request, localePolicy);
const candidates = retrieve({
  scope: request.scope,
  languages: route.allowedSourceLanguages,
  lifecycle: "current",
});

const evidence = selectCitableEvidence(candidates, route);
if (!evidence.coversMaterialClaims) return { route: "review-or-no-answer" };
return composeAnswer({ outputLanguage: route.outputLanguage, evidence });

This is a control sketch, not a universal implementation. The decisive acceptance criteria are that scope is trusted, language policy is explicit, evidence is inspectable and the system can decline an answer when it cannot support one. Those are practical criteria for an architecture review or technical audit before scaling a multilingual RAG system.

CODE_BLOCK.TXT
require(request.scope && request.localePolicy);
require(candidate.sourceId && candidate.version && candidate.language);
require(policy.allows(candidate, request.scope));
require(evalSet.hy && evalSet.ru && evalSet.en && evalSet.mixed);
require(evalSet.changed && evalSet.denied && evalSet.noAnswer);

if (language.confidence < threshold) route = "clarify-or-search-fallback";
if (!evidence.coversClaim) route = "review-or-no-answer";