Интеграция LlamaIndex для RAG-пайплайнов в мобильном приложении
RAG (Retrieval-Augmented Generation) решает фундаментальный изъян LLM: модель не знает ваших данных. LlamaIndex — это специализированный фреймворк именно для RAG, в отличие от LangChain с широким охватом. Парсинг документов, чанкинг, индексирование, retrieval — в LlamaIndex всё это проработано глубже.
Архитектура RAG для мобильного приложения
Мобильный клиент работает с бэкендом через REST API. LlamaIndex живёт на сервере и отвечает за весь цикл: индексирование документов → retrieval по запросу → генерация ответа с контекстом.
[Мобильный клиент]
│ POST /api/query {"question": "...", "user_id": "..."}
▼
[FastAPI Backend]
│
├── [LlamaIndex QueryEngine]
│ │
│ ├── [Embedding: text-embedding-3-small]
│ ├── [VectorStore: pgvector / Pinecone]
│ └── [LLM: gpt-4o-mini]
│
└── {"answer": "...", "sources": [...]}
Индексирование документов
LlamaIndex парсит PDF, Word, Notion, Google Docs, HTML через SimpleDirectoryReader или специализированные ридеры. Чанкинг — разбивка документа на фрагменты для индексирования:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI
from llama_index.vector_stores.postgres import PGVectorStore
from llama_index.core.node_parser import SentenceSplitter
# Конфигурация глобальных настроек
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
Settings.llm = OpenAI(model="gpt-4o-mini", temperature=0.1)
Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=50)
# Загрузка и индексирование
documents = SimpleDirectoryReader("./docs").load_data()
vector_store = PGVectorStore.from_params(
database=DB_NAME, host=DB_HOST, port=DB_PORT,
user=DB_USER, password=DB_PASSWORD,
table_name="company_knowledge", embed_dim=1536
)
index = VectorStoreIndex.from_documents(documents, vector_store=vector_store)
Размер чанка — ключевой параметр. Чанк 512 токенов подходит для документации с разными разделами. Для длинных нарративных текстов — 1024–2048 с большим overlap (100–200 токенов).
Продвинутый retrieval: проблемы и решения
Наивный RAG — топ-K по cosine similarity — часто возвращает нерелевантные чанки при сложных вопросах. LlamaIndex предлагает несколько стратегий:
Hybrid search (BM25 + векторный): ключевые слова для точного поиска, embeddings для семантического. Особенно помогает при специфических терминах (артикулы, имена, даты).
Re-ranking: первичный retrieval возвращает топ-20, кросс-энкодер переранжирует и оставляет топ-4. Cohere Rerank — managed вариант, cross-encoder/ms-marco-MiniLM-L-6-v2 — open-source:
from llama_index.postprocessor.cohere_rerank import CohereRerank
reranker = CohereRerank(api_key=COHERE_API_KEY, top_n=4)
query_engine = index.as_query_engine(
similarity_top_k=20,
node_postprocessors=[reranker]
)
HyDE (Hypothetical Document Embeddings): перед retrieval генерируем гипотетический ответ, ищем по его embedding вместо embedding вопроса. Работает, когда вопросы и документы формулируются в разном стиле.
Мультидокументный retrieval и routing
Если база знаний разбита по типам (политики, инструкции, FAQ) — router направляет запрос к нужному под-индексу. Это снижает шум в retrieved контексте:
from llama_index.core.tools import QueryEngineTool
from llama_index.core.query_engine import RouterQueryEngine
from llama_index.core.selectors import LLMSingleSelector
policy_engine = policy_index.as_query_engine()
faq_engine = faq_index.as_query_engine()
router = RouterQueryEngine(
selector=LLMSingleSelector.from_defaults(),
query_engine_tools=[
QueryEngineTool.from_defaults(policy_engine, description="Политики компании и регламенты"),
QueryEngineTool.from_defaults(faq_engine, description="Часто задаваемые вопросы"),
]
)
Обновление индекса
Документы меняются. Стратегии обновления: полная переиндексация (дёшево для небольших корпусов, раз в сутки), инкрементальное добавление новых документов, удаление устаревших по метаданным. LlamaIndex поддерживает refresh_ref_docs() для инкрементального обновления без пересоздания всего индекса.
Процесс работы
Аудит документальной базы → выбор стратегии чанкинга → индексирование → настройка retrieval pipeline → A/B тест наивного vs гибридного поиска → API для мобильного клиента.
Ориентиры по срокам
Базовый RAG с pgvector — 3–5 дней. Гибридный поиск с реранкером — 1–2 недели. Мультидокументный роутер с инкрементальным обновлением — 2–3 недели.







