LangChain — это фреймворк с открытым исходным кодом. Он предназначен для легкого создания приложений, использующих такие языковые модели, как GPT, LLaMA, Mistral и т. д. Одна из самых мощных особенностей LangChain — поддержка расширенного проектирования промптов.

В этом статье мы расскажем  о том, как LangChain использует промпты, шаблоны промптов, память, чат-боты и цепочки. Вы увидите примеры кода на Python и сможете самостоятельно создавать приложения, используя фреймворк LangChain на Python.

Что такое промпт-инжиниринг

У нас в блоге много информации о промпт-инжиниринге, но вкратце напомним, что это практика создания текстовых запросов, которые эффективно взаимодействуют с генеративными моделями ИИ. Промпты, написанные на естественном языке, определяют задачу для искусственного интеллекта.

Промпты могут быть самыми разнообразными по форме: от простой просьбы объяснить математическую теорему до более творческих запросов, как написание стихотворения на определенную тему. При их разработке важно не только то, что вы спрашиваете, но и то, как вы это делаете. На это влияют правильная формулировка, задание определенного тона или стиля, обеспечение необходимого контекста или даже определение роли ИИ, например, просьба ответить так, как если бы он был носителем любого языка.

В некоторых случаях промпты могут включать примеры, чтобы направить процесс обучения ИИ. Эта техника известна как «обучение за несколько кадров». Она может быть особенно эффективна при решении сложных задач.

Если речь идет о моделях, генерирующих изображения или аудио, промпты обычно подробно описывают желаемый результат: от темы и стиля до композиции и настроения конечного продукта. Искусство промпт-инжиниринга заключается в настройке этих элементов, чтобы направить ИИ на получение желаемого результата.

ОНЛАЙН-ПРАКТИКУМ
ЗАПУСК DEEPSEEK R1 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
  • Где и как применять? Потестируем модель после установки на разных задачах
  • Как дообучить модель под себя?

База, которую нужно знать о промптах

Промпты — это входные данные, предоставляемые большим языковым моделям (LLM), чтобы вызвать желаемый ответ. Хорошо продуманные промпты имеют решающее значение для получения полезных результатов от LLM. Чем тщательнее разработан промпт, тем точнее и релевантнее ответ LLM.

Хороший промпт обычно содержит следующие компоненты:

  1. Инструкции — указывают модели, что делать, как использовать предоставленную информацию, что делать с запросом и как построить ответ.
  2. Пример входных данных. Предоставьте его, чтобы продемонстрировать модели, что от нее ожидается.
  3. Один-два примера выходных данных, которые хотите получить.
  4. Запрос  — вопрос или просьба, обращенная к LLM. Это фактический входной сигнал, который вы хотите, чтобы модель обработала.

Кроме запроса, все остальное необязательно, но может существенно повлиять на качество ответа. Особенно инструкции, которые дают LLM указания по задаче и ожидаемому ответу.

Создание эффективных промптов предполагает творческое сочетание этих элементов в зависимости от решаемой проблемы.

Промпты LangChain

LangChain предлагает различные классы и функции для создания и работы с промптами. Он облегчает управление сложными задачами, связанными с языковыми моделями.

Langchain обеспечивает первоклассную поддержку конструирования промптов с помощью объекта PromptTemplate.

Шаблоны промптов служат структурированными руководствами по составлению запросов к языковым моделям. Эти шаблоны обычно включают в себя директивы, выбор примеров ввода (несколько примеров), а также специальные вопросы и контексты, подходящие для конкретных задач.

Цель LangChain — разработать шаблоны, совместимые с различными языковыми моделями, что повысит удобство переноса шаблонов между различными моделями.

Вкратце, вы можете использовать класс PromptTemplate, чтобы создать шаблон для строкового промпта.

python
from langchain.prompts import PromptTemplate


prompt_template = PromptTemplate.from_template(
 "Tell me a {adjective} joke about {content}."
)
prompt_template.format(adjective="sad", content="data scientists")

Вывод:

Tell me a sad joke about data scientists.

Наличие переменной не обязательно. Вы можете создать промпт с помощью этого класса, даже если у вас нет переменных.

python
from langchain.prompts import PromptTemplate
prompt_template = PromptTemplate.from_template("Tell me a joke")
prompt_template.format()

Вывод:

Tell me a joke

Что если вы создаете чат-приложение, в котором вам нужно сохранять и отправлять историю сообщений в LLM каждый раз, когда пользователь отправляет новое сообщение? Делать это вручную очень трудоемко.

Для поддерживаемых моделей чата вы можете использовать ChatPromptTemplate:

python
from langchain.prompts import ChatPromptTemplate


chat_template = ChatPromptTemplate.from_messages(
 [
 ("system", "You are a helpful AI bot. Your name is {name}."),
 ("human", "Hello, how are you doing?"),
 ("ai", "I'm doing well, thanks!"),
 ("human", "{user_input}"),
 ]
)


messages = chat_template.format_messages(name="Bob", user_input="What is your name?")


print(messages)

Выходные данные:

>>> [SystemMessage(content=’You are a helpful AI bot. Your name is Bob.’),

>>> HumanMessage(content=’Hello, how are you doing?’),

>>> AIMessage(content=»I’m doing well, thanks!»),

>>> HumanMessage(content=’What is your name?’)]

Зачем нужны PromptTemplates и почему нельзя напрямую передать промпт в LLM? Вот несколько веских причин использовать PromptTemplate от LangChain:

  1. Шаблоны промптов многоразовые. Это позволяет вам создать промпт один раз и использовать его в разных ситуациях. Например, при резюмировании разных статей, не переписывая подсказку каждый раз.
  2. PromptTemplates отделяют форматирование промптов от фактического вызова модели. Это делает код более модульным и позволяет независимо обновлять шаблон или модель.
  3. Использование шаблонов улучшает читабельность кода, поскольку они инкапсулируют сложную логику в более простой формат с понятными именованными переменными.
  4. Шаблоны упрощают обслуживание. Изменения в логике промптов нужно вносить только в одном центральном месте, а не в каждой отдельной подсказке.

Память LangChain

В приложениях с языковой моделью, предполагающих общение в чате, важно, чтобы система помнила прошлые разговоры.

Как и в обычном чате, система должна иметь возможность просмотреть, что было сказано ранее.

В самом простом случае это означает, что система может видеть несколько предыдущих сообщений. Но более продвинутая система будет помнить больше деталей, например, факты о различных темах и их связь.

Эта способность запоминать прошлые чаты называется «памятью». LangChain помогает добавить память в чат-боты.

Память в LangChain выполняет две основные задачи:

Перед тем как отправить запрос в LLM, система считывает информацию из своей памяти, чтобы улучшить первоначальный промпт, полученный от пользователя.

После получения ответа от LLM система записывает его в память для последующих взаимодействий, а затем возвращает окончательный результат пользователю.

Для использования функции Memory в LangChain вы можете использовать класс ConversationBufferMemory.

python
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(return_messages=True)
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("what's up?")
memory.chat_memory.add_user_message("how are you doing?")
memory.chat_memory.add_ai_message("I am fine, thank you and you?")


# to check the variables history
memory.load_memory_variables({})

Выходные данные:

>>> {‘history’: [HumanMessage(content=’hi!’),

>>> AIMessage(content=»what’s up?»),

>>> HumanMessage(content=’how are you doing?’),

>>> AIMessage(content=’I am fine, thank you and you?’)]}

Это возвращает словарь, в котором ключом по умолчанию является history. Ключ ведет к списку сообщений, причем эти сообщения могут быть как от человека (HumanMessage), так и от LLM (AIMessage).

Цепочки LangChain

Для простых задач хорошо подходит использование одной LLM (Large Language Model). Однако для более сложных задач обычно требуется цепочка из нескольких шагов и/или моделей.

Традиционным способом использования цепочек Chains в LangChain является интерфейс Chain.

Более новый и рекомендуемый метод — язык выражений LangChain (LCEL). Хотя LCEL предпочтителен для новых проектов, метод цепочек по-прежнему полезен и поддерживается.

python
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema import StrOutputParser


model = ChatOpenAI(openai_api_key = “...”)


prompt = ChatPromptTemplate.from_messages(
 [
 (
 "system",
 "You're a expert data scientist and machine learning engineer who offer its expertise and responds to the point and accurately.",
 ),
 ("human", "{question}"),
 ]
)
runnable = prompt | model | StrOutputParser()


for chunk in runnable.stream({"question": "How is machine learning different than deep learning?"}):
 print(chunk, end="", flush=True)

Вывод:

>>> Machine learning and deep learning are subfields of artificial intelligence (AI) that involve training models to make predictions or decisions based on data. While there is an overlap between the two, they ……..

Способ создания runnable не совсем стандартен для Python, но этот | является оператором конвейера (pipe-оператором). Prompt | model | StrOutputParser() означает, что Prompt передается через модель, а ее вывод — через StrOutputParser(). Каждый сегмент в цепочке различным образом преобразует данные.

LangChain-агенты

Фундаментальная концепция агентов заключается в использовании языковой модели для выбора серии действий.

В отличие от цепочек, где последовательность действий заранее определена и заложена в код, агенты используют языковую модель в качестве инструмента принятия решений для определения подходящих действий и их последовательности.

У Agents LangChain есть три ключевых понятия:

  1. Инструменты — описания доступных инструментов для LLM
  2. Пользовательский ввод — высокоуровневая цель задачи
  3. Промежуточные шаги — любые пары (действие, выход инструмента), выполненные ранее для достижения входных данных пользователя.

Инструменты представляют собой функциональные возможности, которые агент может активировать. Два важнейших аспекта разработки инструментов включают:

  • Обеспечение доступа агента к соответствующим инструментам.
  • Определение инструментов таким образом, чтобы максимизировать их полезность для агента.

Для выполнения различных рутинных действий агенту требуется набор взаимосвязанных инструментов. Чтобы решить эту проблему, LangChain вводит идею наборов инструментов и предлагает их для начала работы.

Узнать больше об агентах можно в официальном руководстве по LangChain. Некоторые примеры в этой статье были сгенерированы с использованием официальной документации LangChain.

Заключение

Предлагая структурированный подход к разработке подсказок, LangChain не только упрощает процесс взаимодействия с различными языковыми моделями, но и максимизирует эффективность и релевантность их результатов. Такие функции, как PromptTemplate и Memory, в LangChain демонстрируют продуманную интеграцию гибкости и точности в проектировании подсказок, позволяя решать широкий спектр задач: от простых запросов до сложных разговорных контекстов.

Расширенные возможности Chains и Agents LangChain расширяют потенциал приложений, которые можно построить с помощью фреймворка всего за несколько строк кода с любым базовым LLM, а их существует множество.

Будь то простые задачи или сложные приложения, подход LangChain к промпт-инжинирингу довольно прост, понятен и легко применим.

Большой практикум
ЗАМЕНИ ВСЕ НЕЙРОСЕТИ НА ОДНУ — PERPLEXITY
ПОКАЖЕМ НА КОНКРЕТНЫХ КЕЙСАХ
  • Освой Perplexity и узнай, как пользоваться функционалом остальных ИИ в одном
  • УЧАСТВОВАТЬ ЗА 0 РУБ.
  • Расскажем, как получить подписку (240$) бесплатно
Участвовать бесплатно
ОНЛАЙН-ПРАКТИКУМ
ЗАПУСК DEEPSEEK R1 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
Участвовать бесплатно