LangChain Framework
LangChain — это фреймворк для разработки приложений с использованием больших языковых моделей (LLM), таких как ChatGPT, GPT-4, Claude и других.
Полезные ссылки:¶
- LangChain + MCP + RAG + Ollama = The Key To Powerful Agentic AI
- LangGraph + MCP + Ollama: The Key To Powerful Agentic AI
Простыми словами, зачем он нужен:¶
-
Упрощает работу с языковыми моделями
— Вместо того чтобы писать сложный код для взаимодействия с API ChatGPT или других моделей, LangChain предоставляет удобные "обёртки" и инструменты. -
Позволяет подключать внешние данные
— Например, ты можешь "скормить" модели свои документы (PDF, тексты, базы данных), и она будет отвечать на их основе. Без LangChain это пришлось бы делать вручную. -
Даёт память и контекст
— Обычные LLM не запоминают прошлые вопросы. LangChain помогает сохранять историю диалога, чтобы бот мог вести осмысленные беседы. -
Интеграция с другими сервисами
— Может работать с Google Search, Wikipedia, базами данных и даже Python-кодом. Например, можно сделать чат-бота, который ищет информацию в интернете и анализирует её. -
Готовые шаблоны для популярных задач
— Чат-боты, аналитика текстов, генерация контента, вопросно-ответные системы — всё это можно сделать быстрее.
Примеры¶
Допустим, ты хочешь создать бота, который отвечает на вопросы по твоей компании. Без LangChain тебе пришлось бы:
- Вручную обрабатывать PDF-файлы с документацией.
- Писать сложные запросы к API ChatGPT.
- Придумывать, как сохранять контекст разговора.
С LangChain это делается в несколько строк кода.
Вывод: LangChain — это как "Лего" для создания умных чат-ботов и приложений с ИИ, чтобы не изобретать велосипед. 🚀
Сравним два подхода: чистый API-запрос к ChatGPT и реализацию через LangChain.
Задача 1:¶
Создать простого бота, который отвечает на вопросы, используя контекст из переданного текста (без LangChain и с LangChain).
1. Код без LangChain (чистый OpenAI API)¶
Здесь нам нужно вручную обрабатывать контекст, историю сообщений и API-запросы.
import openai
# Указываем API-ключ от OpenAI
openai.api_key = "ваш_api_ключ"
# Контекст, который "знает" бот (например, информация о компании)
context = """
Наша компания называется "TechSolutions".
Мы занимаемся разработкой ИИ-решений с 2020 года.
Наш главный офис находится в Москве.
"""
# Функция для запроса к ChatGPT с контекстом
def ask_bot(question, context):
# Собираем промт с контекстом и вопросом
prompt = f"""
Ответь на вопрос, используя только этот контекст:
{context}
Вопрос: {question}
"""
# Отправляем запрос к API
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message['content']
# Пример использования
question = "Где находится главный офис TechSolutions?"
answer = ask_bot(question, context)
print(answer) # Вывод: "Главный офис TechSolutions находится в Москве."
Проблемы этого подхода:¶
- Надо вручную формировать промт.
- Нет встроенной памяти (если нужно сохранять историю диалога, придётся писать дополнительный код).
- Сложно подключать внешние данные (например, PDF или базу данных).
2. Код с LangChain¶
Теперь сделаем то же самое, но с LangChain (всё проще и функциональнее).
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
from langchain.document_loaders import TextLoader # Для загрузки текста
# Указываем API-ключ
import os
os.environ["OPENAI_API_KEY"] = "ваш_api_ключ"
# Загружаем контекст (можно из файла, базы данных и т.д.)
context = """
Наша компания называется "TechSolutions".
Мы занимаемся разработкой ИИ-решений с 2020 года.
Наш главный офис находится в Москве.
"""
# Создаём языковую модель
chat = ChatOpenAI(model="gpt-3.5-turbo")
# Формируем сообщение с контекстом и вопросом
messages = [
SystemMessage(content=f"Отвечай только на основе этого контекста: {context}"),
HumanMessage(content="Где находится главный офис TechSolutions?")
]
# Отправляем запрос
response = chat(messages)
print(response.content) # Вывод: "Главный офис TechSolutions находится в Москве."
Плюсы LangChain:¶
✅ Проще добавлять контекст (можно загружать PDF, CSV, веб-страницы).
✅ Встроенная память (можно сохранять историю диалога без лишнего кода).
✅ Интеграция с другими инструментами (поиск в Google, базы данных и т.д.).
✅ Готовые шаблоны для чат-ботов, Q&A-систем и аналитики.
Вывод:¶
Без LangChain — больше ручной работы, сложнее масштабировать.
С LangChain — удобнее, быстрее и больше возможностей! 🚀
📌 Задача 2 (загрузка PDF-файла и ответы на вопросы по нему):¶
Создать бота, который:
1. Загружает PDF-файл (например, инструкцию или договор).
2. Отвечает на вопросы по его содержимому.
🔧 1. Без LangChain (ручная работа с OpenAI API)¶
Придётся вручную:
- Извлекать текст из PDF.
- Дробить его на части (из-за ограничения длины контекста).
- Формировать сложные промты.
import openai
import PyPDF2 # библиотека для чтения PDF
# Функция для чтения PDF
def extract_text_from_pdf(file_path):
with open(file_path, "rb") as file:
reader = PyPDF2.PdfReader(file)
text = ""
for page in reader.pages:
text += page.extract_text()
return text
# Указываем API-ключ
openai.api_key = "ваш_api_ключ"
# Загружаем PDF (например, файл "contract.pdf")
context = extract_text_from_pdf("contract.pdf")
# Функция для вопроса к боту
def ask_bot(question, context):
prompt = f"""
Ответь на вопрос, используя только этот текст:
{context[:3000]} # Обрезаем, чтобы влезло в контекст модели
Вопрос: {question}
"""
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message['content']
# Пример вопроса
question = "Какие условия расторжения договора?"
print(ask_bot(question, context))
Проблемы:¶
- Текст из PDF может быть кривым (например, "переносыстрок без пробелов").
- Нужно самим обрабатывать ограничения длины контекста.
- Нет семантического поиска (модель получит "сырой" обрезанный текст).
🚀 2. С LangChain (всё готовое!)¶
LangChain сам разбивает текст, обрабатывает PDF и умеет искать нужные фрагменты.
from langchain.document_loaders import PyPDFLoader # Загрузчик PDF
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS # Хранилище для поиска по тексту
# Указываем API-ключ
import os
os.environ["OPENAI_API_KEY"] = "ваш_api_ключ"
# 1. Загружаем PDF
loader = PyPDFLoader("contract.pdf")
pages = loader.load_and_split() # Текст разбивается на части автоматически!
# 2. Создаём "векторное хранилище" для умного поиска
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(pages, embeddings)
# 3. Настраиваем цепочку вопрос-ответ
qa = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-3.5-turbo"),
chain_type="stuff",
retriever=db.as_retriever()
)
# 4. Задаём вопрос
question = "Какие условия расторжения договора?"
result = qa.run(question)
print(result)
Плюсы LangChain:¶
✅ Автоматическая загрузка PDF (и многих других форматов: Word, Excel, веб-страницы).
✅ Умный поиск по документу (модель получает только релевантные фрагменты).
✅ Нет проблем с длинными текстами (LangChain сам разбивает их на части).
✅ Можно подключать базы данных (например, Chroma или Pinecone).
🌟 Бонус: Пример с поиском в интернете¶
С LangChain это делается в 3 строки:
from langchain.utilities import GoogleSearchAPIWrapper
search = GoogleSearchAPIWrapper()
result = search.run("Какая последняя версия Python?")
print(result) # Выведет свежий результат из Google!
Итог:¶
| Без LangChain | С LangChain |
|---|---|
| Всё вручную: PDF, промты, обрезка текста | Автоматическая загрузка, разбивка и поиск |
| Подходит для простых задач | Готовые решения для сложных сценариев |
| Больше кода, больше багов | Меньше кода, встроенные оптимизации |
LangChain — это как "волшебный конструктор" для ИИ-приложений. Если нужно быстро сделать бота с PDF, поиском или памятью — он сэкономит кучу времени! 🎯
🔥 Что умеет LangChain? (Коротко и ясно)¶
- 📂 Загрузка данных – PDF, Word, Excel, сайты, базы данных (без ручного парсинга).
- ✂️ Работа с длинными текстами – сам разбивает документы на части.
- 🔍 Умный поиск – находит в документах нужные фрагменты по смыслу (RAG).
- 🧠 Память диалога – запоминает историю разговора (как у ChatGPT).
- 🤖 Цепочки (Chains) – связывает ИИ с другими сервисами (Google, Python-код, API).
- 📊 Агенты – автономные боты, которые сами решают, какие инструменты использовать.
- 🛠️ Шаблоны промтов – чтобы не писать их вручную каждый раз.
- 🌐 Работа с разными языковыми моделями – OpenAI, Anthropic, локальные (Llama 2).
- 🚀 Векторные базы данных – для хранения и быстрого поиска по данным (FAISS, Pinecone).
- 💡 Fine-tuning на лету – подстройка модели под ваши данные без переобучения.
Вывод:
LangChain – это «швейцарский нож» для создания ИИ-приложений.
Без него – куча рутины, с ним – готовые решения в пару строк. 🚀
LangChain и Model Context Protocol (MCP):¶
1️⃣ Что такое MCP?
Model Context Protocol (MCP) — это экспериментальный подход к управлению контекстом в LLM (например, как модель «видит» историю диалога или документы). Позволяет:
- Точно контролировать, какие данные попадают в контекст модели.
- Уменьшать «мусорные» токены (экономия денег и скорости).
- Избегать переполнения контекстного окна.
2️⃣ Как LangChain работает с MCP?
Пока напрямую не поддерживает MCP, но решает похожие задачи своими методами:
- Фильтрация контекста:
LangChain умеет выбирать релевантные куски текста через RAG (Retrieval-Augmented Generation), что похоже на ручное управление контекстом в MCP.
- Окно контекста:
Автоматически разбивает длинные документы на чанки (например, через RecursiveCharacterTextSplitter).
- Память диалога:
Поддерживает ConversationBufferWindow, EntityMemory и другие способы хранения истории.
3️⃣ Где MCP мог бы улучшить LangChain?
Если MCP станет стандартом, LangChain сможет:
- Точнее управлять тем, какие именно части данных видит модель.
- Уменьшать избыточные токены (например, убирать повторы из истории).
- Легче интегрировать сторонние модели с разными ограничениями контекста.
4️⃣ Альтернативы прямо сейчас
LangChain использует свои механизмы для контроля контекста:
- Agents – сами решают, что передавать модели.
- VectorStores (FAISS, Pinecone) – фильтруют данные по смыслу перед отправкой в LLM.
- Custom Chains – можно вручную настраивать поток контекста.
Вывод:
Пока MCP — это больше research-направление, а LangChain предлагает готовые инструменты для управления контекстом «здесь и сейчас». Если MCP получит широкое распространение, LangChain быстро добавит его поддержку (как это было с RAG).
Пример на практике:
# LangChain уже умеет "умный" контроль контекста:
from langchain.chains import ConversationalRetrievalChain
chain = ConversationalRetrievalChain.from_llm(
llm=ChatOpenAI(),
retriever=vectorstore.as_retriever(),
memory=ConversationBufferMemory() # <- Здесь управление контекстом
)
Базы данных, с которыми работает LangChain¶
LangChain поддерживает интеграцию с разными типами баз данных для хранения, поиска и обработки данных в ИИ-приложениях.
🔍 1. Векторные базы данных (для семантического поиска)¶
Используются для хранения векторных представлений текста (эмбеддингов) и быстрого поиска по смыслу.
Поддерживаемые БД:¶
- FAISS (Facebook AI) – локальная, оптимизирована для быстрого поиска.
- Pinecone – облачная, подходит для продакшена.
- Weaviate – open-source с GraphQL-API.
- Chroma – легкая, для встраиваемых решений.
- Milvus – масштабируемая для больших данных.
- Qdrant – высокопроизводительная, с фильтрами.
- Redis (как векторная БД) – через модуль
RedisVL.
Пример (Chroma):¶
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(documents, embeddings)
🗃️ 2. Традиционные SQL/NoSQL БД¶
Для работы со структурированными данными.
Поддерживаемые БД:¶
- SQLite – встроенная, для простых проектов.
- PostgreSQL – через
pgvector(для векторов). - MySQL
- Microsoft SQL Server
- MongoDB – документоориентированная.
- Cassandra
Пример (PostgreSQL + pgvector):¶
from langchain.sql_database import SQLDatabase
from langchain.llms import OpenAI
db = SQLDatabase.from_uri("postgresql://user:pass@localhost/db")
query = "SELECT name FROM users WHERE age > 30;"
result = db.run(query)
📜 3. Документ-ориентированные БД¶
Для хранения текстовых данных (PDF, HTML, JSON и т.д.).
- Elasticsearch – полнотекстовый поиск.
- Apache Solr
- Firestore (Google Cloud)
Пример (Elasticsearch):¶
from langchain.document_loaders import ElasticsearchLoader
loader = ElasticsearchLoader(
es_url="http://localhost:9200",
index_name="docs"
)
documents = loader.load()
🔗 4. Графовые БД¶
Для работы со связанными данными (например, знаниями в корпоративных чат-ботах).
- Neo4j – популярная графовая БД.
- NebulaGraph
Пример (Neo4j):¶
from langchain.graphs import Neo4jGraph
graph = Neo4jGraph(
url="bolt://localhost:7687",
username="neo4j",
password="password"
)
graph.query("MATCH (n) RETURN n LIMIT 10;")
⚡ 5. Кэширующие БД¶
Для ускорения запросов и сокращения затрат на LLM.
- Redis – ключ-значение с TTL.
- Memcached
Пример (Redis для кэша):¶
from langchain.cache import RedisCache
import langchain
langchain.llm_cache = RedisCache(redis_url="redis://localhost:6379/0")
💡 Зачем это нужно?¶
- Векторные БД – для поиска по документам (например, чат-бот с базой знаний).
- SQL/NoSQL – для извлечения структурированных данных (отчеты, аналитика).
- Графовые БД – для сложных связей (например, рекомендательные системы).
- Кэш – чтобы не платить за повторные запросы к LLM.
Какую БД выбрать?¶
- Локальный проект → SQLite + FAISS/Chroma.
- Продакшен → PostgreSQL (pgvector) или Pinecone.
- Графовые данные → Neo4j.
- Кэширование → Redis.
LangChain универсален: подключает любую БД через интеграторы или собственные драйверы.