Выбор между LlamaIndex и LangChain: полное руководство

Выбор между LlamaIndex и LangChain: полное руководство

Ключевые моменты

  • 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-видение в реальность.

Рекомендуемое чтение

How to Create Your LLM With LangChain: a Step-by-Step Guide

Master Streaming Langchain: Tips for Interacting with LLMs