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 построены поверх него.
| LlamaIndex | LangChain | |
|---|---|---|
| Исходная идея | Данные, индексы, запросы | Компоненты, цепочки, цикл агента |
| 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.
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)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.
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. Здесь поиск и генерация собираются явно:
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.
Похожие статьи
- OpenAI SDK или LangChain: когда фреймворк нужен, а когда мешаетОдин и тот же сценарий на чистом SDK и на LangChain: сколько кода, где проще отлаживать и как не потерять контроль над расходом токенов.
- LangChain Ollama или облачная модель: один код, две моделиChatOllama запускает модель у вас на машине, ChatOpenAI с base_url шлюза обращается к облачной. Показываем, как написать код один раз и переключаться переменными окружения.
- GPT-6 Astra или Claude Fable 5.1: две топовые модели по цене и индексуДве дорогие модели с одинаковым индексом силы и разной ценой в Zukko. Считаем разовый запрос и агентную сессию с кэшем и объясняем, как выбрать на своих данных.
- Промпт-инъекция: что это и как защитить бота и агентаОбъясняем, как работает промпт-инъекция через пользовательский ввод и чужие документы, и какие меры снижают ущерб: изоляция данных, права инструментов, лимиты ключа.