Connect with us

Zero to Advanced Prompt Engineering with Langchain in Python

Промпт-инжиниринг

Zero to Advanced Prompt Engineering with Langchain in Python

mm

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

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

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

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

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

Langchain, библиотека последнего поколения, приносит удобство и гибкость в проектирование, реализацию и настройку подсказок. Когда мы разберемся в принципах и практиках инженерии подсказок, вы узнаете, как использовать мощные функции Langchain для использования сильных сторон моделей Generative AI, таких как GPT-4.

Понимание подсказок

Прежде чем приступить к техническим аспектам инженерии подсказок, важно понять концепцию подсказок и их значение.

«Подсказка» – это последовательность токенов, используемых в качестве входных данных для языковой модели, которая инструктирует ее генерировать определенный тип ответа. Подсказки играют решающую роль в управлении поведением модели. Они могут повлиять на качество сгенерированного текста, и когда они правильно составлены, могут помочь модели предоставить проницательные, точные и контекстно-специфические результаты.

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

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

Langchain: Быстрорастущий инструмент подсказок

LangChain, запущенный в октябре 2022 года ХARRISON CHASE, стал одним из наиболее высоко оцененных открытых фреймворков на GitHub в 2023 году. Он предлагает упрощенный и стандартизированный интерфейс для включения больших языковых моделей (LLM) в приложения. Он также предоставляет функциональный интерфейс для инженерии подсказок, позволяя разработчикам экспериментировать с различными стратегиями и оценивать их результаты. Используя Langchain, вы можете выполнять задачи инженерии подсказок более эффективно и интуитивно.

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

LangChain заполняет важный пробел в разработке ИИ для масс. Он позволяет создавать ряд приложений NLP, таких как виртуальные помощники, генераторы контента, системы вопросов и ответов и многое другое, для решения реальных проблем.

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

Архитектура LangChain

 

Основные компоненты LangChain включают Model I/O, Prompt Templates, Memory, Agents и Chains.

Model I/O

LangChain обеспечивает бесшовное подключение к различным языковым моделям, обертывая их стандартизированным интерфейсом, известным как Model I/O. Это позволяет легко переключаться между моделями для оптимизации или лучшей производительности. LangChain поддерживает различных поставщиков языковых моделей, включая OpenAI, HuggingFace, Azure, Fireworks и многое другое.

Prompt Templates

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

Простой пример шаблона подсказки:


from langchain.prompts import PromptTemplate
prompt = PromptTemplate(input_variables=["subject"],
template="What are the recent advancements in the field of {subject}?")
print(prompt.format(subject="Natural Language Processing"))

Когда мы продвигаемся в сложности, мы встречаем более сложные закономерности в LangChain, такие как шаблон Reason and Act (ReAct). ReAct – это важный шаблон для выполнения действий, где агент назначает задачу соответствующему инструменту, настраивает входные данные для него и парсит его выходные данные для выполнения задачи. Пример на Python ниже демонстрирует, как подсказка структурируется в LangChain, используя ряд мыслей и действий для рассуждения о проблеме и получения окончательного ответа:

PREFIX = """Answer the following question using the given tools:"""
FORMAT_INSTRUCTIONS = """Follow this format:
Question: {input_question}
Thought: your initial thought on the question
Action: your chosen action from [{tool_names}]
Action Input: your input for the action
Observation: the action's outcome"""
SUFFIX = """Start!
Question: {input}
Thought:{agent_scratchpad}"""

Memory

Память – это важная концепция в LangChain, позволяющая LLM и инструментам сохранять информацию во времени. Это поведение с сохранением состояния улучшает производительность приложений LangChain, сохраняя предыдущие ответы, взаимодействия пользователей, состояние окружения и цели агента. Стратегии ConversationBufferMemory и ConversationBufferWindowMemory помогают отслеживать полную или недавнюю часть разговора соответственно. Для более сложного подхода стратегия ConversationKGMemory позволяет кодировать разговор как граф знаний, который можно передать в подсказки или использовать для прогнозирования ответов без вызова LLM.

Agents

Агент взаимодействует с миром, выполняя действия и задачи. В LangChain агенты объединяют инструменты и цепочки для выполнения задач. Он может установить соединение с внешним миром для извлечения информации, дополняя знания LLM, тем самым преодолевая их внутренние ограничения. Они могут решить передать расчеты калькулятору или интерпретатору Python, в зависимости от ситуации.

Агенты оснащены подкомпонентами:

  • Tools: Это функциональные компоненты.
  • Toolkits: Коллекции инструментов.
  • Agent Executors: Это механизм выполнения, который позволяет выбирать между инструментами.

Агенты в LangChain также следуют шаблону Zero-shot ReAct, где решение основано только на описании инструмента. Этот механизм можно расширить с памятью, чтобы учитывать полную историю разговора. С ReAct вместо того, чтобы просить LLM дополнить текст, вы можете подсказать ему ответить в цикле мысль/действие/наблюдение.

Chains

Цепочки, как следует из названия, – это последовательности операций, которые позволяют библиотеке LangChain обрабатывать входные и выходные данные языковой модели бесшовно. Эти важные компоненты LangChain фундаментально состоят из ссылок, которые могут быть другими цепочками или примитивами, такими как подсказки, языковые модели или утилиты.

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

LangChain классифицирует свои цепочки на три типа: Utility цепочки, Generic цепочки и Combine Documents цепочки. Мы рассмотрим Utility и Generic цепочки для нашего обсуждения.

  • Utility Chains предназначены для извлечения точных ответов из языковых моделей для узко определенных задач. Например, рассмотрим LLMMathChain. Эта утилитная цепочка позволяет языковым моделям выполнять математические расчеты. Она принимает вопрос на естественном языке, и языковая модель генерирует фрагмент кода на Python, который затем выполняется для получения ответа.
  • Generic Chains, с другой стороны, служат строительными блоками для других цепочек, но не могут быть использованы самостоятельно. Эти цепочки, такие как LLMChain, являются фундаментальными и часто объединяются с другими цепочками для выполнения сложных задач. Например, LLMChain часто используется для запроса объекта языковой модели на основе предоставленного шаблона подсказки и передачи его языковой модели.

Пошаговая реализация инженерии подсказок с Langchain

Мы проведем вас через процесс реализации инженерии подсказок с помощью Langchain. Перед продолжением убедитесь, что у вас установлены необходимые программное обеспечение и пакеты.

Вы можете воспользоваться популярными инструментами, такими как Docker, Conda, Pip и Poetry, для настройки LangChain. Соответствующие файлы установки для каждого из этих методов можно найти в репозитории LangChain по адресу https://github.com/benman1/generative_ai_with_langchain. Это включает Dockerfile для Docker, requirements.txt для Pip, pyproject.toml для Poetry и файл langchain_ai.yml для Conda.

В нашей статье мы будем использовать Pip, стандартный менеджер пакетов для Python, для облегчения установки и управления библиотеками третьих сторон. Если он не включен в ваше распределение Python, вы можете установить Pip, следуя инструкциям на https://pip.pypa.io/.

Для установки библиотеки с помощью Pip используйте команду pip install library_name.

Однако Pip не управляет окружениями самостоятельно. Для обработки разных окружений мы используем инструмент virtualenv.

В следующем разделе мы будем обсуждать интеграцию моделей.

Шаг 1: Настройка Langchain

Сначала вам нужно установить пакет Langchain. Мы используем операционную систему Windows. Запустите следующую команду в вашем терминале, чтобы установить его:


pip install langchain

Шаг 2: Импорт Langchain и других необходимых модулей

Далее импортируйте Langchain вместе с другими необходимыми модулями. Здесь мы также импортируем библиотеку transformers, которая широко используется в задачах NLP.


import langchain
from transformers import AutoModelWithLMHead, AutoTokenizer

Шаг 3: Загрузка предварительно обученной модели

Open AI

OpenAI модели можно удобно взаимодействовать с библиотекой LangChain или клиентской библиотекой OpenAI для Python. Заметно, что OpenAI предоставляет класс Embedding для моделей текстового вложения. Две ключевые модели LLM – это GPT-3.5 и GPT-4, которые в основном различаются длиной токена. Цены для каждой модели можно найти на сайте OpenAI. Хотя есть более совершенные модели, такие как GPT-4-32K, которые имеют более высокую длину токена, их доступность через API не всегда гарантирована.

Доступ к этим моделям требует ключа API OpenAI. Это можно сделать, создав учетную запись на платформе OpenAI, настроив информацию о выставлении счетов и сгенерировав новый секретный ключ.


import os
os.environ["OPENAI_API_KEY"] = 'your-openai-token';

После успешного создания ключа вы можете установить его как переменную окружения (OPENAI_API_KEY) или передать его в качестве параметра во время создания экземпляра класса для вызовов OpenAI.

Рассмотрим скрипт LangChain, демонстрирующий взаимодействие с моделями OpenAI:

from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003")
# LLM принимает подсказку в качестве входных данных и выводит завершение
prompt = "who is the president of the United States of America?"
completion = llm(prompt)


Текущим президентом США является Джо Байден.

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

Hugging Face

Hugging Face – это БЕСПЛАТНАЯ библиотека Transformers для Python, совместимая с PyTorch, TensorFlow и JAX, и включает реализации моделей, таких как BERT, T5 и т. д.

Hugging Face также предлагает Hugging Face Hub, платформу для размещения репозиториев кода, моделей машинного обучения, наборов данных и веб-приложений.

Чтобы использовать Hugging Face в качестве поставщика моделей, вам понадобится учетная запись и ключи API, которые можно получить на их сайте. Токен можно сделать доступным в вашей среде как HUGGINGFACEHUB_API_TOKEN.

Рассмотрим следующий фрагмент Python, который использует открытую модель, разработанную Google, модель Flan-T5-XXL:

from langchain.llms import HuggingFaceHub

llm = HuggingFaceHub(model_kwargs={"temperature": 0.5, "max_length": 64}, repo_id="google/flan-t5-xxl")
prompt = "In which country is Tokyo?"
completion = llm(prompt)
print(completion)

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

Шаг 4: Базовая инженерия подсказок

Для начала мы сгенерируем простую подсказку и посмотрим, как модель реагирует.

prompt = 'Translate the following English text to French: "{0}"'
input_text = 'Hello, how are you?'
input_ids = tokenizer.encode(prompt.format(input_text), return_tensors='pt')

generated_ids = model.generate(input_ids, max_length=100, temperature=0.9)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))

В этом фрагменте кода мы предоставляем подсказку для перевода английского текста на французский. Языковая модель затем пытается перевести заданный текст на основе подсказки.

Шаг 5: Продвинутая инженерия подсказок

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

prompt = 'As a highly proficient French translator, translate the following English text to French: "{0}"'
input_text = 'Hello, how are you?'
input_ids = tokenizer.encode(prompt.format(input_text), return_tensors='pt')

generated_ids = model.generate(input_ids, max_length=100, temperature=0.9)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))

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

Создание системы вопросов и ответов по академической литературе с помощью Langchain

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

Сначала нам нужно настроить нашу среду. Мы устанавливаем необходимые зависимости.

pip install langchain arxiv openai transformers faiss-cpu

После установки мы создаем новый блокнот Python и импортируем необходимые библиотеки:

from langchain.llms import OpenAI
from langchain.chains.qa_with_sources import load_qa_with_sources_chain
from langchain.docstore.document import Document
import arxiv

Ядром нашей системы вопросов и ответов является способность извлекать релевантные академические работы, связанные с определенной областью, здесь мы рассматриваем обработку естественного языка (NLP), используя базу академических данных arXiv. Для этого мы определяем функцию get_arxiv_data(max_results=10). Эта функция собирает самые свежие резюме работ по NLP с arXiv и инкапсулирует их в объекты Document LangChain, используя резюме в качестве содержания и уникальный идентификатор записи в качестве источника.

Мы будем использовать API arXiv для извлечения недавних работ, связанных с NLP:

def get_arxiv_data(max_results=10):
search = arxiv.Search(
query="NLP",
max_results=max_results,
sort_by=arxiv.SortCriterion.SubmittedDate,
)

documents = []

for result in search.results():
documents.append(Document(
page_content=result.summary,
metadata={"source": result.entry_id},
))

return documents

Эта функция извлекает резюме самых свежих работ по NLP из arXiv и преобразует их в объекты Document LangChain. Мы используем резюме работы и ее уникальный идентификатор (URL работы) в качестве содержания и источника соответственно.

def print_answer(question):
print(
chain(
{
"input_documents": sources,
"question": question,
},
return_only_outputs=True,
)["output_text"]
)

Давайте определим наш корпус и настроим LangChain:

sources = get_arxiv_data(2)
chain = load_qa_with_sources_chain(OpenAI(temperature=0))

С нашей системой вопросов и ответов по академической литературе теперь готовой, мы можем протестировать ее, задав вопрос:

print_answer("What are the recent advancements in NLP?")

Выходные данные будут ответом на ваш вопрос, цитируя источники, из которых была извлечена информация. Например:


Недавние достижения в области NLP включают разработку моделей, дополненных извлечением информации, для задач поиска информации, таких как вопросы и ответы. Эти модели можно адаптировать к различным информационным доменам и задачам без дополнительной настройки. Однако они часто испытывают трудности с придерживанием предоставленным знаниям и могут галлюцинировать в своих ответах. Другим достижением является введение вычислительной основы для решения задач оптимизации потока переменного тока (ACOPF) с использованием графических процессоров (GPU). Этот подход использует абстракцию SIMD нелинейных программ (NLP) и применяет метод внутренней точки (IPM) с стратегией расслабления неравенства. Эта стратегия позволяет факторизовать матрицу ККТ без численного поворота, что ранее препятствовало параллелизации алгоритма IPM.
ИСТОЧНИКИ: http://arxiv.org/abs/2307.16877v1, http://arxiv.org/abs/2307.16830v1

Мы можем легко переключиться на другую модель или изменить систему в соответствии с нашими потребностями. Например, здесь мы переключаемся на GPT-4, который в итоге дает нам гораздо лучший и более подробный ответ.

sources = get_arxiv_data(2)
chain = load_qa_with_sources_chain(OpenAI(model_name="gpt-4", temperature=0))


Недавние достижения в области NLP включают использование глубоких нейронных сетей (DNN) для автоматического анализа текста и задач NLP, таких как проверка орфографии, обнаружение языка, извлечение сущностей, обнаружение автора, вопросы и ответы и другие задачи.
ИСТОЧНИКИ: http://arxiv.org/abs/2307.10652v1, http://arxiv.org/abs/2307.07002v1, http://arxiv.org/abs/2307.12114v1, http://arxiv.org/abs/2307.16217v1

Токен в GPT-4 может быть такой же короткий, как один символ, или такой же длинный, как одно слово. Например, GPT-4-32K может обработать до 32 000 токенов за один раз, в то время как GPT-4-8K и GPT-3.5-turbo поддерживают 8 000 и 4 000 токенов соответственно. Однако важно отметить, что каждое взаимодействие с этими моделями происходит с затратами, которые прямо пропорциональны количеству обработанных токенов, будь то входные или выходные данные.

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

FAISS (Facebook AI Similarity Search) помогает быстро находить наиболее релевантные фрагменты текста, связанные с запросом пользователя. Он создает векторное представление каждого фрагмента текста и использует эти векторы для определения и извлечения фрагментов, наиболее похожих на векторное представление данного вопроса.

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

pip install faiss-cpu langchain CharacterTextSplitter

После того, как вы убедились, что вышеуказанные библиотеки установлены, запустите

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores.faiss import FAISS
from langchain.text_splitter import CharacterTextSplitter
documents = get_arxiv_data(max_results=10) # Теперь мы можем использовать больше данных
document_chunks = []
splitter = CharacterTextSplitter(separator=" ", chunk_size=1024, chunk_overlap=0)
for document in documents:
for chunk in splitter.split_text(document.page_content):
document_chunks.append(Document(page_content=chunk, metadata=document.metadata))

search_index = FAISS.from_documents(document_chunks, OpenAIEmbeddings())

chain = load_qa_with_sources_chain(OpenAI(temperature=0))

def print_answer(question):
print(
chain(
{
"input_documents": search_index.similarity_search(question, k=4),
"question": question,
},
return_only_outputs=True,
)["output_text"]
)

Теперь у нас есть мощный инструмент для запроса последней академической литературы в области NLP.

Недавние достижения в NLP включают использование глубоких нейронных сетей (DNN) для автоматического анализа текста и задач NLP, таких как проверка орфографии, обнаружение языка, извлечение сущностей, обнаружение автора, вопросы и ответы и другие задачи.
ИСТОЧНИКИ: http://arxiv.org/abs/2307.10652v1, http://arxiv.org/abs/2307.07002v1, http://arxiv.org/abs/2307.12114v1, http://arxiv.org/abs/2307.16217v1

Заключение

Интеграция больших языковых моделей (LLM) в приложения ускоряет их принятие в различных областях, включая перевод языка, анализ настроений и поиск информации. Инженерия подсказок – это мощный инструмент для максимизации потенциала этих моделей, а Langchain ведет путь в упрощении этой сложной задачи. Его стандартизированный интерфейс, гибкие шаблоны подсказок, прочная интеграция моделей и инновационное использование агентов и цепочек обеспечивают оптимальные результаты для производительности LLM.

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

Как продемонстрировано в пошаговом руководстве, Langchain может обеспечить мощные приложения, такие как система вопросов и ответов по академической литературе. С растущим сообществом пользователей и возрастающей популярностью в открытом исходном коде Langchain обещает стать ключевым инструментом в использовании полного потенциала LLM, таких как GPT-4.

Я провел последние пять лет, погружаясь в увлекательный мир Machine Learning и Deep Learning. Моя страсть и экспертиза привели меня к участию в более чем 50 различных проектах по разработке программного обеспечения, с особым акцентом на AI/ML. Мое непрекращающееся любопытство также привело меня к Natural Language Processing, области, которую я с нетерпением жду возможности изучить более подробно.