Огляд та порівняння LLM-фреймворків LangChain та LlamaIndex
Вітаю, IT-спільното! Мене звуть Марк, я Back-end Engineer в компанії Welltech. Сьогодні ми поговоримо про бібліотеки для розробки
Якщо раніше ви послуговувались клієнтами для OpenAI або чимось схожим, і не використовували ці фреймворки, то одне з перших питань, яке у вас з’явиться: «А навіщо воно потрібно? В клієнтській бібліотеці і так все ясно!».
Тому почнемо з переліку основних переваг
- Абстракція над мовними моделями. Класи моделей в цих фреймворках реалізують уніфікований інтерфейс для
LLM-моделей, тож це дозволяє швидко перемикатися між моделями, експериментувати та пробувати різні моделі без необхідності глобального переписування коду. - Легка реалізація RAG. RAG — це пошук і додавання відповідного контексту до промпту, щоб LLM могла генерувати відповідь на «незагальні» питання. Детальніше про це нижче.
- Полегшення індексації ваших документів та їх збереження в різні векторні бази даних для їх майбутнього використання.
- Абстракції для роботи з «пам’яттю» чат-моделей, тобто можливість додати в промпт ланцюжок попередніх повідомлень.
- 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 пропоную розглянути компоненти та концепти, які є в обох цих фреймворках.
- Класи для роботи з шаблонами для промптів (клас PromptTemplate).
- Класи-абстракції для різних мовних моделей. Наприклад, класи як для платних моделей (GPT або Claude), так і безкоштовних опенсорсних Llama, Mistral, etc.
- Можливість реалізації RAG — Retrieval Augmented Generation.
Ключові відмінності
Після переліку можливостей, які надають обидва фреймворка, перейдемо до їхніх відмінностей.
- Перше, що ви можете помітити, — велика екосистема LangChain. Наприклад, LlamaIndex не має відповідних альтернатив для LangServe та LangSmith.
- LlamaIndex більше сфокусована на RAG. До прикладу, для запуску простого RAG-based-застосунку ви можете використовувати високорівневі класи, які дозволяють буквально за п’ять рядків коду під’єднати vector store і робити запити до LLM з даними з вашої бази знань. Водночас в Llamindex є багато можливостей для гнучкої кастомізації кожного етапу RAG. Таким чином LlamaIndex більш зосереджений на індексуванні та пошуку даних.
- LangChain краще підходить для agent-based-застосунків. Хоча LlamaIndex має підтримку агентів, але LangChain більшою мірою є агент-орієнтовним фреймворком.
- LangChain є більш популярною бібліотекою, він має втричі більше зірок на GitHub і в шість разів більше питань на StackOverflow.
Висновок
LangChain і LlamaIndex доволі схожі між собою і в більшості типових проєктів можуть замінити один одного. Головною ж відмінністю між цими двома рішеннями є фокус на основні інструменти: для LangChain це ланцюги та агенти, тоді як LlamaIndex більш орієнтований на дані та має потужну і гнучку реалізацію всіх етапів RAG.
4 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів