Ключевые моменты
- LlamaIndex: Специализируется на приёме, структурировании и использовании частных или предметно-ориентированных данных для таких задач, как расширенные вопросы-ответы и понимание документов.
- LangChain: Предлагает открытую комплексную платформу для разработки, развёртывания и масштабирования приложений с LLM, поддерживая разнообразные сценарии использования, включая диалоговые агенты, перевод и сложные рабочие процессы.
- Пользовательская интеграция LLM: Предоставляет подробное пошаговое руководство по коду для реализации пользовательских LLM с фреймворками LlamaIndex и LangChain, демонстрируя их соответствующие подходы к интеграции и использованию внешних API, таких как Novita AI.
Введение
В быстро развивающейся сфере искусственного интеллекта и обработки естественного языка появились два фреймворка, которые стали мощными инструментами для разработчиков, работающих с большими языковыми моделями (LLM): LlamaIndex и LangChain. Цель этой статьи — предоставить всестороннее сравнение LlamaIndex и LangChain, исследуя их ключевые особенности, варианты использования и практические применения. Углубившись в основные функции, модели ценообразования и возможности интеграции каждого фреймворка, мы дадим вам знания, необходимые для принятия обоснованного решения о том, какой инструмент лучше всего подходит для ваших конкретных потребностей.
Что такое LlamaIndex?
LlamaIndex — это сложная платформа для работы с данными, предназначенная для расширения возможностей больших языковых моделей (LLM) путём предоставления им контекстуально релевантных, специфичных для пользователя данных. В отличие от универсальных LLM, предварительно обученных на публичных данных, LlamaIndex позволяет этим моделям получать доступ и использовать частные, предметно-ориентированные или проблемно-ориентированные данные, которые часто изолированы за API, в базах данных или в неструктурированных форматах, таких как PDF.

Ключевые особенности и возможности
- Приём данных: LlamaIndex предлагает коннекторы данных, которые легко принимают данные из различных источников, включая, но не ограничиваясь API, PDF и SQL базами данных, в их исходных форматах.
- Структурирование данных: Он структурирует принятые данные в промежуточные представления, оптимизированные для эффективного потребления LLM, обеспечивая высокую производительность.
- Доступ на естественном языке: LlamaIndex предоставляет движки, которые обеспечивают доступ к данным на естественном языке, облегчая вопросы-ответы через поисковые движки и позволяя вести диалоговое взаимодействие через чат-движки.
- Интеллектуальные работники: Платформа включает агентов, которые функционируют как работники знаний на базе LLM, дополненные набором инструментов, от простых помощников до сложных интеграций API.
- Наблюдаемость и оценка: Включает интеграции для тщательного экспериментирования, оценки и мониторинга, обеспечивая цикл непрерывного улучшения приложений.
Варианты использования
LlamaIndex поддерживает разнообразные сценарии использования, такие как:
- Retrieval-Augmented Generation (RAG) для продвинутых систем вопросов-ответов.
- Чат-боты, способные вести осмысленные, контекстно-зависимые разговоры.
- Понимание документов и извлечение данных из неструктурированных документов.
- Автономные агенты, способные проводить исследования и выполнять действия.
- Мультимодальные приложения, которые интегрируют текст с изображениями и другими типами данных.
- Тонкая настройка моделей на конкретных данных для повышения производительности.
Что такое LangChain?
LangChain — это передовой фреймворк, специально разработанный для упрощения разработки, производственной оптимизации и развёртывания приложений, работающих на больших языковых моделях (LLM). Он предлагает полный набор инструментов и библиотек, которые охватывают каждый этап жизненного цикла LLM-приложения, обеспечивая плавный и эффективный процесс разработки.

Ключевые особенности и возможности
- Разработка: LangChain предоставляет строительные блоки с открытым исходным кодом, компоненты и сторонние интеграции, которые упрощают создание LLM-приложений. LangGraph, ключевой компонент, позволяет создавать агентированные приложения с поддержкой потоковой передачи данных и циклов с участием человека.
- Производственная оптимизация: LangSmith — мощный инструмент для проверки, мониторинга и оценки производительности ваших цепочек LLM. Он обеспечивает непрерывную оптимизацию и уверенное развёртывание, предоставляя глубокое понимание производительности приложения.
- Развёртывание: LangGraph Cloud упрощает преобразование приложений LangGraph в готовые к производству API и ассистенты, что позволяет легко масштабировать и интегрировать LLM-приложения в различные системы.
- Иерархическая организация: Платформа организована иерархически, с взаимосвязанными частями на нескольких уровнях, что обеспечивает модульность и гибкость при разработке приложений.
Библиотеки с открытым исходным кодом
- langchain-core: Предоставляет базовые абстракции и язык выражений LangChain, служа основой фреймворка.
- langchain-community: Интегрирует сторонние сервисы и расширяет возможности LangChain.
- Партнёрские пакеты: Лёгкие пакеты, такие как langchain-openai и langchain-anthropic, которые обеспечивают специфические интеграции, расширяя универсальность фреймворка.
- langchain: Содержит цепочки, агенты и стратегии поиска, которые формируют когнитивную архитектуру приложения.
- LangGraph: Мощный инструмент для создания состояний с несколькими акторами в приложениях с LLM, использующий графовую модель для шагов, который может быть интегрирован с LangChain или использоваться независимо.
- LangServe: Развёртывает цепочки LangChain как REST API, упрощая интеграцию с веб-сервисами.
- LangSmith: Платформа для разработчиков, которая предоставляет полный набор инструментов для отладки, тестирования, оценки и мониторинга LLM-приложений.
Целевая аудитория и варианты использования
LangChain предназначен для разработчиков любого уровня, от новичков до экспертов, которые хотят использовать возможности LLM в своих приложениях. Его модульная и расширяемая архитектура делает его подходящим для широкого круга задач, включая, но не ограничиваясь:
- Создание диалоговых агентов и чат-ботов.
- Разработка инструментов перевода и суммаризации текста.
- Создание систем генерации контента и классификации.
- Реализация сложных рабочих процессов с LLM.
LlamaIndex vs LangChain: Ключевые различия
Основная функциональность:
- LangChain — это комплексный фреймворк, предназначенный для упрощения создания приложений, осведомлённых о данных и способных к агентским действиям, с использованием больших языковых моделей (LLM). Он предлагает широкий спектр инструментов для различных LLM-приложений, уделяя особое внимание гибкости и продвинутым возможностям ИИ.
- LlamaIndex (ранее известный как GPT Index) — это платформа для работы с данными, которая специализируется на приёме, структурировании и доступе к частным или предметно-ориентированным данным для LLM. Она упрощает индексирование и поиск информации, что делает её идеальной для текстового поиска и генерации точных ответов.
Варианты использования:
- LangChain универсален и может использоваться для различных приложений, таких как генерация текста, перевод языка, суммаризация текста и классификация текста. Он особенно хорошо подходит для поддержания длинных и контекстуально релевантных разговоров благодаря отличному управлению памятью и возможностям цепочек.
- LlamaIndex превосходен в сценариях, где текстовый поиск и высококачественные ответы являются главным приоритетом. Распространённые случаи использования включают генерацию контента, поиск и извлечение документов, дополнение LLM для чат-ботов и виртуальных ассистентов.
Ценообразование и доступность:
- LangChain — это инструмент с открытым исходным кодом и бесплатный, его исходный код доступен для загрузки на таких платформах, как GitHub, что делает его доступным для любого.
- LlamaIndex — это коммерческий продукт, и его цена определяется использованием, что может повлечь затраты в зависимости от того, насколько интенсивно он используется в приложениях.
Настройка и гибкость:
- LangChain предлагает расширенные возможности настройки, что делает его подходящим для разработчиков, которым необходимо точно настраивать свои приложения в соответствии с конкретными требованиями.
- LlamaIndex предлагает удобные функции и инструменты, которые облегчают бесшовную интеграцию частных или предметно-ориентированных данных в LLM, уделяя основное внимание простоте использования и прямому управлению данными.
Обработка данных:
- LangChain предназначен для работы с различными типами и источниками данных, предлагая такие компоненты, как Schema для организации данных и Indexes для эффективного поиска информации.
- LlamaIndex подчёркивает возможность создания индекса из других индексов, что делает его очень эффективным для сложных запросов и рабочих процессов, включающих несколько источников данных.
Интеграция:
- LangChain предоставляет интеграции со сторонними сервисами и может быть расширен с помощью партнёрских пакетов для конкретных провайдеров LLM.
- LlamaIndex предлагает коннекторы данных для бесшовной интеграции различных источников данных, повышая качество данных и производительность.
LlamaIndex vs LangChain: Сравнение на практических примерах
Ссылаясь на статью Ming на Medium, вот несколько практических примеров сравнения LlamaIndex и LangChain.
Создание чат-бота с локальной LLM
Примеры кода показывают, как инициализировать LLM в обоих фреймворках и как вывести результат взаимодействия в чате.
Код LlamaIndex:
from llama_index.llms import ChatMessage, OpenAILike
llm = OpenAILike(
api_base="http://localhost:1234/v1",
timeout=600,
api_key="loremIpsum",
is_chat_model=True,
context_window=32768,
)
chat_history = [
ChatMessage(role="system", content="You are a bartender."),
ChatMessage(role="user", content="What do I enjoy drinking?"),
]
output = llm.chat(chat_history)
print(output)
Код LangChain:
from langchain.schema import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
openai_api_base="http://localhost:1234/v1",
request_timeout=600,
openai_api_key="loremIpsum",
max_tokens=32768,
)
chat_history = [
SystemMessage(content="You are a bartender."),
HumanMessage(content="What do I enjoy drinking?"),
]
print(llm(chat_history))
Создание RAG-системы для локальных файлов
Фрагменты кода иллюстрируют, как загружать данные, создавать индекс и выполнять запрос.
Код LlamaIndex:
from llama_index import ServiceContext, SimpleDirectoryReader, VectorStoreIndex
service_context = ServiceContext.from_defaults(
embed_model="local",
llm=llm, # This should be the LLM initialized in the task above.
)
documents = SimpleDirectoryReader(
input_dir="mock_notebook/",
).load_data()
index = VectorStoreIndex.from_documents(
documents=documents,
service_context=service_context,
)
engine = index.as_query_engine(
service_context=service_context,
)
output = engine.query("What do I like to drink?")
print(output)
Код LangChain:
from langchain_community.document_loaders import DirectoryLoader
# pip install "unstructured[md]"
loader = DirectoryLoader("mock_notebook/", glob="*.md")
docs = loader.load()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
from langchain_community.embeddings.fastembed import FastEmbedEmbeddings
from langchain_community.vectorstores import Chroma
vectorstore = Chroma.from_documents(documents=splits, embedding=FastEmbedEmbeddings())
retriever = vectorstore.as_retriever()
from langchain import hub
# pip install langchainhub
prompt = hub.pull("rlm/rag-prompt")
def format_docs(docs):
return "\
\
".join(doc.page_content for doc in docs)
from langchain_core.runnables import RunnablePassthrough
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm # This should be the LLM initialized in the task above.
)
print(rag_chain.invoke("What do I like to drink?"))
Из сравнения видно, что LlamaIndex, ориентированный на RAG-системы, предлагает более простой подход, в то время как LangChain предлагает более абстрактный, высокоуровневый метод.
LlamaIndex vs LangChain: Как использовать пользовательскую LLM с LlamaIndex?
Чтобы интегрировать LLM API от Novita AI с LlamaIndex, вам нужно создать пользовательский адаптер, который оборачивает вызовы API Novita AI в фреймворке LlamaIndex. Ниже приведён концептуальный пример того, как это можно сделать. Обратите внимание, что этот пример предполагает, что у вас есть базовое понимание работы с API и фреймворком LlamaIndex.
Шаг 1: Определите пользовательский адаптер для LLM Novita AI
Сначала определим пользовательский адаптер для LLM Novita AI:
class NovitaAILLM:
def __init__(self, api_key):
from openai import OpenAI
self.client = OpenAI(api_key=api_key, base_url="https://api.novita.ai/v3/openai")
def complete_chat(self, messages, stream=False, max_tokens=512):
response = self.client.chat.completions.create(
model="Nous-Hermes-2-Mixtral-8x7B-DPO",
messages=messages,
stream=stream,
max_tokens=max_tokens
)
return response
Шаг 2: Интеграция в сервисный контекст LlamaIndex
Затем вам нужно будет интегрировать этот адаптер в сервисный контекст LlamaIndex. Вот концептуальный пример того, как это можно сделать:
from llama_index import (
KeywordTableIndex,
SimpleDirectoryReader,
ServiceContext,
)
from llama_index.llms import LLM
class NovitaAILLMAdapter(LLM):
def __init__(self, api_key):
self.novitailm = NovitaAILLM(api_key)
def generate_text(self, prompt, stop_sequences=None, **kwargs):
# Prepare the messages for the chat completion
messages = [
{"role": "system", "content": prompt}
]
# Call the Novita AI LLM to complete the chat
response = self.novitailm.complete_chat(messages)
if isinstance(response, list): # If streaming, collect all chunks
return "".join([chunk.choices[0].delta.content for chunk in response])
else:
return response.choices[0].message.content
# Initialize the Novita AI LLM adapter with your API key
novitailm_adapter = NovitaAILLMAdapter(api_key="<YOUR Novita AI API Key>")
# Create the service context with the custom LLM adapter
service_context = ServiceContext.from_defaults(llm=novitailm_adapter)
# Load documents and build the index as before
documents = SimpleDirectoryReader("data").load_data()
index = KeywordTableIndex.from_documents(documents, service_context=service_context)
# Now you can use the index with the custom LLM for queries
query_engine = index.as_query_engine()
response = query_engine.query("What did the author do after his time at Y Combinator?")
print(response)
Этот пример показывает, как создать пользовательский адаптер для LLM Novita AI и интегрировать его в фреймворк LlamaIndex. Вам нужно будет заменить <YOUR Novita AI API Key> на ваш реальный ключ API от Novita AI.
Обратите внимание, что это концептуальный пример и может потребовать корректировок в соответствии с конкретными версиями используемых библиотек и точными деталями API LLM от Novita AI. Всегда обращайтесь к официальной документации для получения наиболее точной и актуальной информации.
LlamaIndex vs LangChain: Как использовать пользовательскую LLM с LangChain?
Чтобы интегрировать LLM API от Novita AI с LangChain, используя пользовательскую LLM, вам нужно создать пользовательский класс, который расширяет класс LLM из LangChain и использует API Novita AI для своей логики.
Вот пошаговое руководство, как это сделать:
Шаг 1: Установите библиотеку OpenAI для Python
Сначала убедитесь, что у вас установлена библиотека OpenAI, которая будет использоваться для взаимодействия с API Novita AI.
pip install 'openai>=1.0.0'
Шаг 2: Импортируйте необходимые библиотеки
Импортируйте необходимые модули из LangChain и библиотеки OpenAI.
from typing import Any, Dict, Iterator, List, Optional
from langchain_core.callbacks.manager import CallbackManagerForLLMRun
from langchain_core.language_models.llms import LLM
from langchain_core.outputs import GenerationChunk
from openai import OpenAI
Шаг 3: Определите пользовательский класс LLM
Расширьте класс LLM, чтобы создать пользовательскую LLM, использующую API Novita AI.
class NovitaAILLM(LLM):
def __init__(self, api_key: str, model_name: str = "Nous-Hermes-2-Mixtral-8x7B-DPO"):
self.api_key = api_key
self.model_name = model_name
self.client = OpenAI(api_key=api_key, base_url="https://api.novita.ai/v3/openai")
def _call(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
**kwargs: Any,
) -> str:
"""Run the LLM on the given input."""
response = self.client.chat.completions.create(
model=self.model_name,
messages=[{"role": "user", "content": prompt}],
stream=False,
max_tokens=512,
)
return response.choices[0].message.content
def _stream(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
**kwargs: Any,
) -> Iterator[GenerationChunk]:
"""Stream the LLM on the given prompt."""
response = self.client.chat.completions.create(
model=self.model_name,
messages=[{"role": "user", "content": prompt}],
stream=True,
max_tokens=512,
)
for chunk in response:
chunk_text = chunk.choices[0].delta.content or ""
yield GenerationChunk(text=chunk_text)
@property
def _identifying_params(self) -> Dict[str, Any]:
"""Return a dictionary of identifying parameters."""
return {
"model_name": self.model_name,
}
@property
def _llm_type(self) -> str:
"""Get the type of language model used by this chat model. Used for logging purposes only."""
return "NovitaAILLM"
Шаг 4: Инициализируйте и используйте пользовательскую LLM
Создайте экземпляр вашей пользовательской LLM с ключом API Novita AI и используйте его для генерации текста.
# Replace with your actual Novita AI API key
novita_api_key = "<YOUR Novita AI API Key>"
# Initialize the custom LLM
novita_llm = NovitaAILLM(api_key=novita_api_key)
# Generate text
prompt = "Hi there!"
response = novita_llm._call(prompt=prompt)
print(response)
# Or stream the response
for chunk in novita_llm._stream(prompt=prompt):
print(chunk.text, end="")
Этот код настраивает пользовательскую LLM, которая использует API Novita AI для генерации текста на основе заданного запроса. Метод _call используется для ответов без потоковой передачи, а метод _stream — для потоковой передачи ответов. При необходимости настройте model_name и другие параметры в соответствии с документацией API Novita AI и вашими конкретными требованиями.
Заключение
В заключение, LlamaIndex и LangChain — это ценные инструменты для работы с большими языковыми моделями, каждый из которых имеет свои сильные стороны. LlamaIndex превосходен в приёме и поиске данных, что делает его идеальным для проектов, требующих эффективной обработки конкретных данных и продвинутых систем вопросов-ответов. LangChain предлагает более комплексный фреймворк для разработки и развёртывания LLM-приложений благодаря своей модульной архитектуре и обширным интеграциям. Выбор между ними зависит от конкретных потребностей вашего проекта.
Часто задаваемые вопросы
Можно ли использовать LangChain и LlamaIndex вместе?
Да. Это зависит от конкретных потребностей вашего LLM-проекта.
Подходит ли LangChain для продакшена?
Да, LangChain 0.1 и более поздние версии готовы к продакшену.
Что лучше для RAG: LlamaIndex или LangChain?
LlamaIndex рекомендуется, если ваш основной фокус — на поиске и извлечении данных. LangChain лучше подходит для сценариев, где вам нужен гибкий фреймворк, способный обрабатывать сложные рабочие процессы.
Novita AI — это универсальная облачная платформа, которая расширяет ваши AI-амбиции. Интегрированные API, бессерверные вычисления, GPU-инстансы — экономически эффективные инструменты, которые вам нужны. Устраните инфраструктуру, начните бесплатно и воплотите своё AI-видение в реальность.
Рекомендуемое чтение
