LlamaIndex vs LangChain: что выбрать для RAG и агентов в 2026

Обе библиотеки умеют RAG и агентов, но растут из разных идей. Сравниваем подходы, показываем минимальный код с одной моделью и считаем стоимость запроса.

5 мин · · разработка · сравнение

LlamaIndex и LangChain часто сравнивают так, будто нужно выбрать одну библиотеку навсегда. На практике они пересекаются: обе умеют RAG, обе умеют агентов, обе подключаются к любой модели с OpenAI-совместимым API. Вопрос «llamaindex vs langchain» точнее звучит так: с какой стороны вам удобнее подходить к задаче, со стороны данных или со стороны цепочки действий. Ниже разбираем идеи обеих библиотек, показываем рабочий код с одной и той же моделью через шлюз и считаем стоимость запроса.

LlamaIndex vs LangChain: на чём они построены

LlamaIndex растёт из данных. Центральная схема: загрузить документы, разбить на фрагменты, построить индекс, задавать вопросы через движок запросов. В его документации есть отдельные разделы про загрузку данных, индексацию, запросы, хранение и агентов. Агент в современной версии строится классом FunctionAgent с набором инструментов, а поиск по документам оборачивается в такой инструмент.

LangChain растёт из компонентов и цикла агента. В актуальной документации главной точкой входа назван create_agent: минимальная настраиваемая «обвязка» вокруг модели, куда добавляются инструменты, системный промпт и промежуточные обработчики (middleware). Для сложной оркестрации с состояниями рядом стоит LangGraph, а агентные абстракции LangChain построены поверх него.

LlamaIndexLangChain
Исходная идеяДанные, индексы, запросыКомпоненты, цепочки, цикл агента
RAGНесколько строк: индекс из документов и движок запросовСобирается из деталей: загрузчик, нарезка, векторное хранилище, ретривер, промпт
АгентыFunctionAgent, мультиагентные сценарииcreate_agent, при необходимости LangGraph
Свой OpenAI-совместимый APIКласс OpenAILikeКласс ChatOpenAI с base_url
ЭмбеддингиОтдельная настройка Settings.embed_modelОтдельный объект эмбеддингов в векторном хранилище
Что гибчеПриёмы работы с даннымиСвобода сборки и интеграции

Порог входа ниже у того, чьи значения по умолчанию совпадают с вашей задачей. Если задача звучит как «ответы по моим документам», проще начать с LlamaIndex. Если задача звучит как «агент с набором инструментов и своей логикой», проще начать с LangChain.

Одна модель через шлюз в обеих

Установка: pip install langchain-openai llama-index-core llama-index-llms-openai-like. Нужны ключ fetch_... из кабинета и адрес https://api.zukko.pro/v1; общий формат запросов описан в справочнике Python и chat/completions.

bash
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="claude-sonnet-5-5",
    base_url="https://api.zukko.pro/v1",
    api_key="fetch_ваш_ключ",
)
print(llm.invoke("Назови три риска при миграции базы данных").content)
bash
from llama_index.core.llms import ChatMessage
from llama_index.llms.openai_like import OpenAILike

llm = OpenAILike(
    model="claude-sonnet-5-5",
    api_base="https://api.zukko.pro/v1",
    api_key="fetch_ваш_ключ",
    is_chat_model=True,
    context_window=1000000,
)
reply = llm.chat([ChatMessage(role="user", content="Назови три риска при миграции базы данных")])
print(reply.message.content)

Две ловушки именно для LlamaIndex. Первая: обычный класс OpenAI проверяет имя модели по своему списку и на claude-sonnet-5-5 отвечает ошибкой Unknown model. Для шлюза берите OpenAILike, как советует и документация LlamaIndex для любых OpenAI-совместимых API. Вторая: если не задать модель эмбеддингов, VectorStoreIndex по умолчанию обратится к эмбеддингам OpenAI. В документации Zukko нет эндпоинта эмбеддингов, поэтому задавайте их явно, например локальной моделью.

RAG: минимальные примеры

LlamaIndex. Установка: pip install llama-index-embeddings-huggingface.

bash
from llama_index.core import Settings, SimpleDirectoryReader, VectorStoreIndex
from llama_index.embeddings.huggingface import HuggingFaceEmbedding

Settings.llm = llm  # OpenAILike из примера выше
Settings.embed_model = HuggingFaceEmbedding(model_name="intfloat/multilingual-e5-small")

docs = SimpleDirectoryReader("docs").load_data()
index = VectorStoreIndex.from_documents(docs)
print(index.as_query_engine().query("Какой срок оплаты по договору?"))

Для русскоязычных документов берите многоязычную модель эмбеддингов и проверьте качество поиска на своих вопросах.

LangChain. Установка: pip install langchain-huggingface. Здесь поиск и генерация собираются явно:

bash
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_huggingface import HuggingFaceEmbeddings

emb = HuggingFaceEmbeddings(model_name="intfloat/multilingual-e5-small")
store = InMemoryVectorStore.from_texts(["Договор действует один год.", "Оплата в течение 10 дней."], emb)

question = "Какой срок оплаты по договору?"
context = "\n\n".join(d.page_content for d in store.similarity_search(question, k=2))
prompt = ChatPromptTemplate.from_messages(
    [("system", "Отвечай только по контексту:\n{context}"), ("user", "{question}")]
)
chain = prompt | llm | StrOutputParser()  # ChatOpenAI из примера выше
print(chain.invoke({"context": context, "question": question}))

Строк больше, зато каждый шаг виден и заменяем: другой ретривер, другая нарезка, другой промпт.

Агенты

В LangChain: create_agent(model=llm, tools=[...], system_prompt="..."), затем agent.invoke({"messages": [...]}). В LlamaIndex: FunctionAgent(tools=[...], llm=llm, system_prompt="..."), затем await agent.run("..."). Для LlamaIndex при работе через OpenAILike укажите is_function_calling_model=True, иначе агент не будет вызывать функции через API. Какой бы библиотекой вы ни пользовались, проверьте, что выбранная модель умеет вызов инструментов, и поставьте лимит шагов, чтобы агент не зациклился.

Сколько стоит запрос

Цены на 18 октября 2026, за 1M токенов. Типичный RAG-запрос: 6 000 токенов входа (вопрос, инструкция и найденные фрагменты) и 500 токенов выхода. Фреймворки добавляют свои шаблоны промптов, поэтому смотрите реальный вход в «Использовании» кабинета.

  • claude-sonnet-5-5 (0.4 / 2): 6 000 × 0.4 + 500 × 2 = 2 400 + 1 000 = 3 400 микродолларов, $0.0034 на запрос, $3.40 на 1 000 запросов.
  • gpt-6.1-sol (0.27 / 1.32): 6 000 × 0.27 + 500 × 1.32 = 1 620 + 660 = 2 280 микродолларов, $2.28 на 1 000 запросов.
  • glm-5.3-flash (0.04 / 0.04): 6 000 × 0.04 + 500 × 0.04 = 240 + 20 = 260 микродолларов, $0.26 на 1 000 запросов.

Силу модели и контекст сравнивайте по таблице моделей и проверяйте на своих вопросах: список и цены по GET https://api.zukko.pro/v1/models. Оплата: СБП (комиссия платёжной страницы 8,5% сверху), криптовалюта или карты MasterCard. Подробнее о каждой библиотеке отдельно: LlamaIndex: индексация данных и LangChain: свой base_url.

Что выбрать

  • Основная задача — ответы по документам, много источников данных: LlamaIndex.
  • Основная задача — агент с инструментами и своей логикой, нужны интеграции и трассировка: LangChain.
  • Не хотите зависеть от фреймворка: хватит официального SDK и пары сотен строк своего кода.
  • Можно смешивать: загрузка и индекс в LlamaIndex, цикл агента в LangChain. Но каждая зависимость стоит поддержки.

Частые вопросы

Можно ли использовать обе библиотеки в одном проекте?

Да. Они не конфликтуют, а общую модель удобно вынести в отдельный модуль с адресом https://api.zukko.pro/v1 и ключом из переменной окружения.

Почему LlamaIndex пытается обратиться к OpenAI, хотя я задал свой адрес?

Скорее всего, не задана модель эмбеддингов: по умолчанию используются эмбеддинги OpenAI. Укажите Settings.embed_model.

Нужен ли формат Anthropic для Claude?

Нет, Claude работает и в OpenAI-формате. Различие только в кэше: скидку за чтение кэша Claude даёт Anthropic-формат.

Как не потратить лишнего при отладке?

Задайте ключу дневной лимит в долларах и начинайте с дешёвой модели вроде glm-5.3-flash, а на сильную переходите, когда логика работает.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.