Перейти к содержанию

LangChain Framework

LangChain — это фреймворк для разработки приложений с использованием больших языковых моделей (LLM), таких как ChatGPT, GPT-4, Claude и других.

Полезные ссылки:

Простыми словами, зачем он нужен:

  1. Упрощает работу с языковыми моделями
    — Вместо того чтобы писать сложный код для взаимодействия с API ChatGPT или других моделей, LangChain предоставляет удобные "обёртки" и инструменты.

  2. Позволяет подключать внешние данные
    — Например, ты можешь "скормить" модели свои документы (PDF, тексты, базы данных), и она будет отвечать на их основе. Без LangChain это пришлось бы делать вручную.

  3. Даёт память и контекст
    — Обычные LLM не запоминают прошлые вопросы. LangChain помогает сохранять историю диалога, чтобы бот мог вести осмысленные беседы.

  4. Интеграция с другими сервисами
    — Может работать с Google Search, Wikipedia, базами данных и даже Python-кодом. Например, можно сделать чат-бота, который ищет информацию в интернете и анализирует её.

  5. Готовые шаблоны для популярных задач
    — Чат-боты, аналитика текстов, генерация контента, вопросно-ответные системы — всё это можно сделать быстрее.


Примеры

Допустим, ты хочешь создать бота, который отвечает на вопросы по твоей компании. Без 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? (Коротко и ясно)

  1. 📂 Загрузка данных – PDF, Word, Excel, сайты, базы данных (без ручного парсинга).
  2. ✂️ Работа с длинными текстами – сам разбивает документы на части.
  3. 🔍 Умный поиск – находит в документах нужные фрагменты по смыслу (RAG).
  4. 🧠 Память диалога – запоминает историю разговора (как у ChatGPT).
  5. 🤖 Цепочки (Chains) – связывает ИИ с другими сервисами (Google, Python-код, API).
  6. 📊 Агенты – автономные боты, которые сами решают, какие инструменты использовать.
  7. 🛠️ Шаблоны промтов – чтобы не писать их вручную каждый раз.
  8. 🌐 Работа с разными языковыми моделями – OpenAI, Anthropic, локальные (Llama 2).
  9. 🚀 Векторные базы данных – для хранения и быстрого поиска по данным (FAISS, Pinecone).
  10. 💡 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 универсален: подключает любую БД через интеграторы или собственные драйверы.