LangChain — универсальный конструктор, LlamaIndex — для RAG и поиска, CrewAI — для multi-agent систем. Что выбрать под задачу.
╔═══════════════╦══════════════════════╦══════════════════════╦══════════════════════╗ ║ Характеристика║ LangChain ║ LlamaIndex ║ CrewAI ║ ╠═══════════════╬══════════════════════╬══════════════════════╬══════════════════════╣ ║ Назначение ║ Универсальный ║ RAG, индексация, ║ Multi-agent ║ ║ ║ конструктор LLM- ║ поиск по документам ║ оркестрация ║ ║ ║ приложений ║ ║ ║ ╠═══════════════╬══════════════════════╬══════════════════════╬══════════════════════╣ ║ Сложность ║ Средняя ║ Низкая ║ Низкая ║ ╠═══════════════╬══════════════════════╬══════════════════════╬══════════════════════╣ ║ Экосистема ║ Огромная (500+ ║ Растущая (200+ ║ Небольшая (50+ ║ ║ ║ интеграций) ║ коннекторов) ║ инструментов) ║ ╠═══════════════╬══════════════════════╬══════════════════════╬══════════════════════╣ ║ GitHub Stars ║ ~95k ║ ~36k ║ ~20k ║ ╠═══════════════╬══════════════════════╬══════════════════════╬══════════════════════╣ ║ Идеально для ║ Сложные цепочки, ║ Поиск по PDF, ║ Команды агентов, ║ ║ ║ кастомные агенты, ║ чат с документами, ║ распределённые ║ ║ ║ API-оркестрация ║ семантический поиск ║ задачи ║ ╚═══════════════╩══════════════════════╩══════════════════════╩══════════════════════╝
# Установка LangChain с инструментами pip install langchain langchain-openai langchain-community from langchain.chains import LLMChain from langchain.prompts import PromptTemplate from langchain_openai import ChatOpenAI from langchain.agents import initialize_agent, Tool from langchain_community.tools import GoogleSearchRun # Инициализация LLM llm = ChatOpenAI(model="gpt-4o", temperature=0.1) # Создание цепочки с шаблоном template = """Ты — эксперт по {topic}. Ответь на вопрос: {question} Дай развёрнутый ответ с примерами.""" prompt = PromptTemplate( input_variables=["topic", "question"], template=template ) chain = LLMChain(llm=llm, prompt=prompt) # Запуск цепочки result = chain.run( topic="машинное обучение", question="как работает градиентный спуск?" ) print(result)
# Установка LlamaIndex pip install llama-index llama-index-llms-openai from llama_index.core import SimpleDirectoryReader, VectorStoreIndex from llama_index.core.node_parser import SentenceSplitter from llama_index.llms.openai import OpenAI # Загрузка PDF-документов из папки documents = SimpleDirectoryReader( input_dir="./docs/", required_exts=[".pdf"] ).load_data() # Разбивка на чанки и индексация parser = SentenceSplitter(chunk_size=512, chunk_overlap=64) index = VectorStoreIndex.from_documents( documents, transformations=[parser] ) # Создание query-движка и поиск query_engine = index.as_query_engine(similarity_top_k=3) response = query_engine.query( "Какие метрики качества используются в проекте?" ) print(response) print(f"Источники: {response.source_nodes}")
# Установка CrewAI pip install crewai crewai-tools from crewai import Agent, Task, Crew, Process from crewai_tools import SerperDevTool # Создание инструментов search_tool = SerperDevTool() # Агент-исследователь researcher = Agent( role="Research Specialist", goal="Найти актуальную информацию по теме", backstory="Эксперт по поиску данных", tools=[search_tool], verbose=True ) # Агент-писатель writer = Agent( role="Content Writer", goal="Написать статью на основе исследования", backstory="Профессиональный копирайтер", verbose=True ) # Задачи research_task = Task( description="Исследовать тему: AI-агенты в 2026", expected_output="Структурированный отчёт на 500 слов", agent=researcher ) write_task = Task( description="Написать статью на русском на основе отчёта", expected_output="Статья на 1000 слов с заголовками", agent=writer ) # Запуск команды crew = Crew( agents=[researcher, writer], tasks=[research_task, write_task], process=Process.sequential ) result = crew.kickoff() print(result)
┌─────────────────────────┐ │ ВАША ЗАДАЧА │ └────────────┬────────────┘ │ ┌──────────────────┼──────────────────┐ │ │ │ ┌────────▼────────┐ ┌───────▼───────┐ ┌────────▼────────┐ │ Поиск по │ │ Сложный │ │ Команда │ │ документам? │ │ workflow? │ │ агентов? │ └────────┬────────┘ └───────┬───────┘ └────────┬────────┘ │ YES │ YES │ YES ┌────────▼────────┐ ┌───────▼───────┐ ┌────────▼────────┐ │ 🟢 LlamaIndex │ │ 🟡 LangChain │ │ 🟠 CrewAI │ │ + embedding │ │ + LangGraph │ │ + инструменты │ └─────────────────┘ └───────────────┘ └─────────────────┘ │ │ │ └──────────────────┼──────────────────┘ │ ┌────────────▼────────────┐ │ 🔵 ГИБРИДНЫЙ СТЕК: │ │ LlamaIndex (retrieval) │ │ + LangChain (orchestr) │ │ + CrewAI (agents) │ └─────────────────────────┘
# Гибрид: LlamaIndex для retrieval + LangChain для агента pip install llama-index langchain langchain-openai from llama_index.core import VectorStoreIndex, SimpleDirectoryReader from langchain_openai import ChatOpenAI from langchain.agents import create_openai_functions_agent, AgentExecutor from langchain.tools import Tool # Шаг 1: LlamaIndex — загрузка и индексация docs = SimpleDirectoryReader("./knowledge_base/").load_data() index = VectorStoreIndex.from_documents(docs) query_engine = index.as_query_engine() # Шаг 2: Оборачиваем LlamaIndex в LangChain Tool def search_knowledge_base(query: str) -> str: """Поиск по внутренней базе знаний через LlamaIndex""" return str(query_engine.query(query)) rag_tool = Tool( name="KnowledgeBase", func=search_knowledge_base, description="Поиск по корпоративной базе знаний" ) # Шаг 3: LangChain агент с RAG-инструментом llm = ChatOpenAI(model="gpt-4o") agent = create_openai_functions_agent(llm, [rag_tool], "Ты — ассистент.") executor = AgentExecutor(agent=agent, tools=[rag_tool], verbose=True) result = executor.invoke({"input": "Расскажи про roadmap продукта"}) print(result["output"])