Огляд та порівняння LLM-фреймворків LangChain та LlamaIndex

💡 Усі статті, обговорення, новини про AI — в одному місці. Приєднуйтесь до AI спільноти!

Вітаю, IT-спільното! Мене звуть Марк, я Back-end Engineer в компанії Welltech. Сьогодні ми поговоримо про бібліотеки для розробки LLM-застосунків, а саме розглянемо та порівняємо два популярних рішення — LangChain і LlamaIndex. Одразу варто зазначити, що обидва ці фреймворки мають реалізації core-бібліотек на Python та на JavaScript/TypeScript.

Якщо раніше ви послуговувались клієнтами для OpenAI або чимось схожим, і не використовували ці фреймворки, то одне з перших питань, яке у вас з’явиться: «А навіщо воно потрібно? В клієнтській бібліотеці і так все ясно!».

Тому почнемо з переліку основних переваг LLM-фреймворків.

  1. Абстракція над мовними моделями. Класи моделей в цих фреймворках реалізують уніфікований інтерфейс для LLM-моделей, тож це дозволяє швидко перемикатися між моделями, експериментувати та пробувати різні моделі без необхідності глобального переписування коду.
  2. Легка реалізація RAG. RAG — це пошук і додавання відповідного контексту до промпту, щоб LLM могла генерувати відповідь на «незагальні» питання. Детальніше про це нижче.
  3. Полегшення індексації ваших документів та їх збереження в різні векторні бази даних для їх майбутнього використання.
  4. Абстракції для роботи з «пам’яттю» чат-моделей, тобто можливість додати в промпт ланцюжок попередніх повідомлень.
  5. Chains and Agents. Chains — це одна з ключових фічей фреймворку LangChain (але не LlamaIndex). У ланцюгах послідовність дій чітко задано в коді, тоді як під час використання агентів мовна модель вирішує, які агенти і в якому порядку потрібно виконати.

Продовжимо коротким оглядом LangChain і LlamaIndex, спираючись на їхню офіційну документацію.

LangChain

LangChain — це великий фреймворк для розробки застосунків, які працюють на основі мовних моделей. Він дозволяє створювати застосунки, які:

  • усвідомлюють контекст (context-aware) — підключають мовну модель до контексту: інструкції до запитів, використання few shots-запитів, контекст для обґрунтування відповідей тощо;
  • розсудливі (reasonable) — покладаються на мовну модель для розуміння того, як відповідати з урахуванням наданого контексту.

Цей фреймворк складається з кількох частин:

  • бібліотеки LangChain на Python та JavaScript. Містять інтерфейси та інтеграції компонентів, базовий код для комбінування цих компонентів у ланцюги (chains) та агенти, а також їхні готові реалізації;
  • LangChain Templates. Колекція різних легких для запуску прикладів готових застосунків;
  • LangServe. Бібліотека для розгортання LangChain як REST API.
  • LangSmith. Платформа для розробників, яка дозволяє налагоджувати, тестувати, оцінювати та моніторити побудовані ланцюги.

Щоб вам було трошки легше усвідомити весь цей «зоопарк», в офіційній документації є ось така візуалізація архітектури всього фреймворку:

Погоджуюсь, ця схема не є простою і доволі багатокомпонентна, але в цій статті ми сфокусуємось тільки на LangChain-бібліотеках:

  • langchain-core — в цьому пакеті зібрані основні абстракції LangChain, а саме: класи для роботи з language models, document loaders, embedding models, vectorstores, retrievers тощо;
  • langchain містить класи для роботи з ланцюгами (chains) та агентами (agents).

LlamaIndex

LlamaIndex (раніше відомий як GPT Index) — це фреймворк для роботи з LLM. Робота з LlamaIndex, як правило, містить використання core LlamaIndex та обраного набору інтеграцій (або плагінів). Важливо зазначити, що коли ви встановлюєте «базову» бібліотеку llama-index, то в складі цієї бібліотеки отримуєте набір з основних модулів. За потреби можна встановити додаткові бібліотеки.

Екосистема LlamaIndex також містить два наступні проєкти:

  • LlamaHub — колекцію дата-конекторів та агентів;
  • LlamaLab — приклади проєктів, які створені на основі LlamaIndex.

Для того, щоб зрозуміти, які є спільні та відмінні риси між цими фреймворками, спочатку нам треба розглянути основні концепти цих фреймворків. Основними я можу виділити наступні чотири концепти:

  • Retrieval Augmented Generation (RAG);
  • інструменти — Tools;
  • ланцюги — Chain;
  • агенти — Agents.

Retrieval Augmented Generation (RAG)

LLM натреновані на величезному обсязі даних, але вони не натреновані на ваших даних. RAG розв’язує цю проблему, додаючи ваші дані в промпт як контекст для відповіді.

Такі кроки проходять ваші дані від місця їх зберігання і до LLM. Розберемо, що ми бачимо на цій картинці.

Ці кроки можна розділити на два головних етапи:

1. Data ingestion:

  • Load — завантаження даних. Сорсом наших даних може бути майже будь-який варіант текстових даних, як-от текстовий документ або директорія з pdf-файлами, набір HTML-сторінок, сайти, сервіси чи бази даних;
  • Transform — очищення даних та розбиття великих документів на менші (для знаходження найбільш релевантної інформації і для того, щоб вони «влазили» в промпт, тобто не перевищували ліміт вікна контексту);
  • Embed — подальша трансформація документів в ембединги, тобто масиви чисел для подальшого пошуку «схожих», релевантних документів;
  • Store — зберігання документів у векторній базі даних. Для цього можна використати спеціалізовані векторні БД, такі як Chroma та Pinecone, або більш універсальні рішення, такі як OpenSearch, Redis або PostgreSQL.

2. Data Usage:

  • Store;
  • Retrieve — знаходження відповідних документів в data store;
  • Pass to LLM — безпосереднє додавання наших даних в запит до LLM.

Інструменти, ланцюги та агенти (Tool, Chains and Agents)

Tool — це один з ключових компонентів в LangChain та LlamaIndex. Tool реалізує певну функціональність і може бути обраний агентом для вирішення конкретного запиту. Типовими задачами інструментів в LangChain є: завантаження та обробка даних, взаємодія з LLMs, виконання інших дій (наприклад SQL або HTTP-запит). В LlamaIndex тули націлені на завантаження, індексування та пошук даних.

Агент — це reasoning-інструмент для ухвалення рішень. До ключових компонентів агента належать:

  • розбиття складного запиту на підзадачі;
  • вибір інструменту та визначення параметрів для його виклику;
  • планування набору задач.

Тобто якщо в ланцюгах послідовність дій статично описана в коді, то за використання агентів саме агент вирішує, яку послідовність дій треба виконати. На практиці це означає, що серед всіх описаних інструментів (tools) треба визначити, які з них використовувати та в якому порядку.

В LangChain термін «ланцюг» (chain) означає послідовності викликів до різних компонентів, таких як LLMs, tools або компонентів обробки даних. Будівельним блоком для одного ланцюга є ланка (chain). Так, трохи незручно, що і ланцюг, і окрема ланка англійською перекладається однаково.

Нижче наведено візуалізацію роботи ланцюга.

Спільні компоненти

Тепер для початку порівняння LangChain з LlamaIndex пропоную розглянути компоненти та концепти, які є в обох цих фреймворках.

  1. Класи для роботи з шаблонами для промптів (клас PromptTemplate).
  2. Класи-абстракції для різних мовних моделей. Наприклад, класи як для платних моделей (GPT або Claude), так і безкоштовних опенсорсних Llama, Mistral, etc.
  3. Можливість реалізації RAG — Retrieval Augmented Generation.

Ключові відмінності

Після переліку можливостей, які надають обидва фреймворка, перейдемо до їхніх відмінностей.

  1. Перше, що ви можете помітити, — велика екосистема LangChain. Наприклад, LlamaIndex не має відповідних альтернатив для LangServe та LangSmith.
  2. LlamaIndex більше сфокусована на RAG. До прикладу, для запуску простого RAG-based-застосунку ви можете використовувати високорівневі класи, які дозволяють буквально за п’ять рядків коду під’єднати vector store і робити запити до LLM з даними з вашої бази знань. Водночас в Llamindex є багато можливостей для гнучкої кастомізації кожного етапу RAG. Таким чином LlamaIndex більш зосереджений на індексуванні та пошуку даних.
  3. LangChain краще підходить для agent-based-застосунків. Хоча LlamaIndex має підтримку агентів, але LangChain більшою мірою є агент-орієнтовним фреймворком.
  4. LangChain є більш популярною бібліотекою, він має втричі більше зірок на GitHub і в шість разів більше питань на StackOverflow.

Висновок

LangChain і LlamaIndex доволі схожі між собою і в більшості типових проєктів можуть замінити один одного. Головною ж відмінністю між цими двома рішеннями є фокус на основні інструменти: для LangChain це ланцюги та агенти, тоді як LlamaIndex більш орієнтований на дані та має потужну і гнучку реалізацію всіх етапів RAG.

👍ПодобаєтьсяСподобалось14
До обраногоВ обраному6
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Наприклад, LlamaIndex не має відповідних альтернатив для LangSmith.

Дуже важко уявити як дебажити більш менш складні AI рішення без таких трейсерів.

Та наче має www.llamaindex.ai/...​servability-with-langfuse
Але треба чекнути як воно інтегровано, як показує практика, там багато брейкінг змін
LangSmith класно шо нативна підтримка ланг чейну

LlamaIndex більше сфокусована на RAG. До прикладу, для запуску простого RAG-based-застосунку ви можете використовувати високорівневі класи, які дозволяють буквально за п’ять рядків коду під’єднати vector store і робити запити до LLM з даними з вашої бази знань.

Ось 5 рядків для створення БД з набору текстових документів в LangChain:

store = LocalFileStore("path")
loader = DirectoryLoader(f"directory_with_txt_data", glob="**/*.txt", loader_cls=TextLoader)
documents = loader.load()

underlying_embeddings = OpenAIEmbeddings()
    cached_embedder = CacheBackedEmbeddings.from_bytes_store(
        underlying_embeddings, store, namespace=underlying_embeddings.model
    )
db = FAISS.from_documents(documents, cached_embedder)
Далі створюємо retriever
retriever = MultiQueryRetriever.from_llm(prompt=QUERY_PROMPT,
        retriever=db.as_retriever(), llm=get_llm(temperature=0)
    )

Чи не могли би Ви трохи детальніше зупинитись на перевагах LlamaIndex?
Дякую.

LlamaIndex як на мене має більший фокус саме на роботу з різними датасорсама та дозволяє будувати потужні пайплани для препроцесінгу даних

Підписатись на коментарі