Промпт-инжиниринг
От нуля до продвинутой инженерии подсказок с помощью Langchain на Python

Одним из важных аспектов больших языковых моделей (LLM) является количество параметров, которые эти модели используют для обучения. Чем больше параметров имеет модель, тем лучше она может понимать отношения между словами и фразами. Это означает, что модели с миллиардами параметров имеют способность генерировать различные творческие форматы текста и отвечать на открытые и сложные вопросы в информативной форме.
Модели LLM, такие как ChatGPT, которые используют модель Transformer, способны понимать и генерировать человеческий язык, что делает их полезными для приложений, требующих понимания естественного языка. Однако они не лишены ограничений, которые включают устаревшие знания, невозможность взаимодействия с внешними системами, отсутствие понимания контекста и иногда генерирование правдоподобных, но неверных или бессмысленных ответов, среди прочего.
Для решения этих ограничений необходимо интегрировать модели LLM с внешними источниками данных и возможностями, что может представлять сложности и требует обширных навыков программирования и обработки данных. Это, в сочетании с трудностями понимания концепций ИИ и сложных алгоритмов, способствует кривой обучения, связанной с разработкой приложений, использующих модели LLM.
Тем не менее, интеграция моделей LLM с другими инструментами для формирования приложений, работающих на основе моделей LLM, может переопределить наш цифровой ландшафт. Потенциал таких приложений огромен, включая улучшение эффективности и производительности, упрощение задач, улучшение принятия решений и предоставление персонализированных опытов.
В этой статье мы более подробно рассмотрим эти вопросы, изучая продвинутые техники инженерии подсказок с помощью Langchain, предлагая четкие объяснения, практические примеры и пошаговые инструкции по их реализации.
Langchain, библиотека последнего поколения, приносит удобство и гибкость в проектирование, реализацию и настройку подсказок. Когда мы разберемся в принципах и практиках инженерии подсказок, вы узнаете, как использовать мощные функции Langchain для использования сильных сторон моделей генеративного ИИ, таких как GPT-4.
Понимание подсказок
Прежде чем приступить к техническим аспектам инженерии подсказок, важно понять концепцию подсказок и их значение.
«Подсказка» — это последовательность токенов, используемых в качестве входных данных для языковой модели, инструктирующих ее генерировать определенный тип ответа. Подсказки играют решающую роль в управлении поведением модели. Они могут повлиять на качество сгенерированного текста, и когда они составлены правильно, могут помочь модели предоставить проницательные, точные и контекстно-специфические результаты.
Инженерия подсказок — это искусство и наука проектирования эффективных подсказок. Цель — получить желаемый вывод от языковой модели. Правильно выбирая и структурируя подсказки, можно направить модель на генерирование более точных и актуальных ответов. На практике это предполагает тонкую настройку входных фраз для соответствия предвзятостям модели и ее структуре.
Сложность инженерии подсказок варьируется от простых методов, таких как подача модели релевантных ключевых слов, до более продвинутых методов, включающих проектирование сложных, структурированных подсказок, которые используют внутреннюю механику модели в свою пользу.
Langchain: Быстрорастущий инструмент подсказок
LangChain, запущенный в октябре 2022 года Харрисоном Чейзом, стал одним из самых высокооцененных открытых фреймворков на 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, предоставляя краткие инструкции или примеры. Оптимизация подсказок улучшает производительность модели, а их гибкость существенно способствует процессу ввода.
Простой пример шаблона подсказки:
<p>from langchain.prompts import PromptTemplate
prompt = PromptTemplate(input_variables=[&quot;subject&quot;],
template=&quot;What are the recent advancements in the field of {subject}?&quot;)
print(prompt.format(subject=&quot;Natural Language Processing&quot;))</p>
Когда мы продвигаемся в сложности, мы сталкиваемся с более изощренными шаблонами в LangChain, такими как шаблон Reason and Act (ReAct). ReAct является важным шаблоном для выполнения действий, где агент назначает задачу соответствующему инструменту, настраивает входные данные для него и парсит его выходные данные для выполнения задачи. Приведенный ниже пример на Python демонстрирует шаблон ReAct. Он показывает, как подсказка структурирована в LangChain, используя серию мыслей и действий для рассуждения о проблеме и получения окончательного ответа:
PREFIX = &quot;&quot;&quot;Answer the following question using the given tools:&quot;&quot;&quot;
FORMAT_INSTRUCTIONS = &quot;&quot;&quot;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&quot;&quot;&quot;
SUFFIX = &quot;&quot;&quot;Start!
Question: {input}
Thought:{agent_scratchpad}&quot;&quot;&quot;
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.
<p>import langchain from transformers import AutoModelWithLMHead, AutoTokenizer
Шаг 3: Загрузка предварительно обученной модели
Open AI
OpenAI модели можно удобно взаимодействовать с библиотекой LangChain или клиентской библиотекой OpenAI. Особенно OpenAI предоставляет класс Embedding для моделей текстового вложения. Два ключевых модели LLM — это GPT-3.5 и GPT-4, которые отличаются в основном длиной токена. Цены для каждой модели можно найти на сайте OpenAI. Хотя есть более современные модели, такие как GPT-4-32K, которые имеют более высокую длину токена, их доступность через API не всегда гарантирована.

Для доступа к этим моделям требуется ключ API OpenAI. Это можно сделать, создав учетную запись на платформе OpenAI, настроив информацию о выставлении счетов и сгенерировав новый секретный ключ.
<p>import os os.environ[&quot;OPENAI_API_KEY&quot;] = 'your-openai-token'</p>
После успешного создания ключа вы можете установить его как переменную среды (OPENAI_API_KEY) или передать как параметр во время создания класса для вызовов OpenAI.
Рассмотрим сценарий LangChain, демонстрирующий взаимодействие с моделями OpenAI:
from langchain.llms import OpenAI llm = OpenAI(model_name=&quot;text-davinci-003&quot;) # LLM принимает подсказку в качестве входных данных и выдает завершение prompt = &quot;who is the president of the United States of America?&quot; completion = llm(prompt)
<p>Текущим президентом Соединенных Штатов Америки является Джо Байден.</p>
В этом примере агент инициализируется для выполнения расчетов. Агент принимает входные данные, простую задачу сложения, обрабатывает ее с помощью предоставленной модели OpenAI и возвращает результат.
Hugging
Hugging Face — это БЕСПЛАТНАЯ библиотека Transformers Python, совместимая с PyTorch, TensorFlow и JAX, и включает реализации моделей, таких как BERT, T5 и т. д.
Hugging Face также предлагает Hugging Face Hub, платформу для размещения репозиториев кода, моделей машинного обучения, наборов данных и веб-приложений.
Чтобы использовать Hugging Face в качестве поставщика моделей, вам понадобится учетная запись и ключи API, которые можно получить на их сайте. Токен можно сделать доступным в вашей среде как HUGGINGFACEHUB_API_TOKEN.
Рассмотрим следующий фрагмент Python, который использует открытую модель, разработанную Google (GOOGL ), модель Flan-T5-XXL:
from langchain.llms import HuggingFaceHub
<p>llm = HuggingFaceHub(model_kwargs={&quot;temperature&quot;: 0.5, &quot;max_length&quot;: 64},repo_id=&quot;google/flan-t5-xxl&quot;)
prompt = &quot;In which country is Tokyo?&quot;
completion = llm(prompt)
print(completion)</p>
Этот сценарий принимает вопрос в качестве входных данных и возвращает ответ, демонстрируя знания и возможности прогнозирования модели.
Шаг 4: Базовая инженерия подсказок
Для начала мы сгенерируем простую подсказку и посмотрим, как модель реагирует.
prompt = 'Translate the following English text to French: &quot;{0}&quot;'
input_text = 'Hello, how are you?'
input_ids = tokenizer.encode(prompt.format(input_text), return_tensors='pt')
<p>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: &quot;{0}&quot;'
input_text = 'Hello, how are you?'
input_ids = tokenizer.encode(prompt.format(input_text), return_tensors='pt')
<p>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:
<p>def get_arxiv_data(max_results=10):
search = arxiv.Search(
query=&quot;NLP&quot;,
max_results=max_results,
sort_by=arxiv.SortCriterion.SubmittedDate,
)</p>
documents = []
<p>for result in search.results():
documents.append(Document(
page_content=result.summary,
metadata={&quot;source&quot;: result.entry_id},
))</p>
return documents
Эта функция извлекает резюме самых свежих статей NLP из arXiv и преобразует их в объекты Document LangChain. Мы используем резюме статьи и ее уникальный идентификатор записи (URL-адрес статьи) в качестве содержимого и источника соответственно.
def print_answer(question):
print(
chain(
{
&quot;input_documents&quot;: sources,
&quot;question&quot;: question,
},
return_only_outputs=True,
)[&quot;output_text&quot;]
)
Давайте определим наш корпус и настроим LangChain:
sources = get_arxiv_data(2) chain = load_qa_with_sources_chain(OpenAI(temperature=0))
С нашей системой вопросов и ответов академической литературы теперь готовой, мы можем протестировать ее, задав вопрос:
print_answer(&quot;What are the recent advancements in NLP?&quot;)
Выходные данные будут ответом на ваш вопрос, ссылаясь на источники, из которых была извлечена информация. Например:
<p>Недавние достижения в области NLP включают разработку моделей, дополненных извлекателями, для выполнения задач поиска информации, а также введение вычислительной структуры для решения задач оптимального потока переменного тока (ACOPF) с использованием графических процессоров (GPU). ИСТОЧНИКИ: 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=&quot;gpt-4&quot;,temperature=0))
<p>Недавние достижения в области естественного языка (NLP) включают разработку моделей, дополненных извлекателями, для выполнения задач поиска информации, которые могут быть адаптированы к различным информационным доменам и задачам без дополнительной настройки. Однако они часто испытывают трудности с придерживанием предоставленной информации и могут галлюцинировать в своих ответах. Другим достижением является введение вычислительной структуры для решения задач оптимального потока переменного тока (ACOPF) с использованием графических процессоров (GPU). Этот подход использует абстракцию SIMD (одиночная инструкция, множественные данные) нелинейных программ (NLP) и применяет метод внутренней точки (IPM) с стратегией расслабления неравенства. Эта стратегия позволяет факторизовать матрицу KKT без численного поворота, что ранее препятствовало параллелизации алгоритма IPM. ИСТОЧНИКИ: http://arxiv.org/abs/2307.16877v1, http://arxiv.org/abs/2307.16830v1
Токен в GPT-4 может быть таким коротким, как один символ, или таким длинным, как одно слово. Например, GPT-4-32K может обрабатывать до 32 000 токенов за один запуск, в то время как GPT-4-8K и GPT-3.5-turbo поддерживают 8 000 и 4 000 токенов соответственно. Однако важно отметить, что каждое взаимодействие с этими моделями сопряжено с затратами, которые прямо пропорциональны количеству обработанных токенов, будь то входные или выходные данные.
В контексте нашей системы вопросов и ответов, если часть академической литературы превышает максимальный лимит токенов, система не сможет обработать ее целиком, что повлияет на качество и полноту ответов. Чтобы обойти эту проблему, текст можно разбить на более мелкие части, соответствующие лимиту токенов.
FAISS (Facebook AI Similarity Search) (META ) помогает быстро находить наиболее релевантные фрагменты текста, связанные с запросом пользователя. Он создает векторное представление каждого фрагмента текста и использует эти векторы для выявления и извлечения фрагментов, наиболее похожих на векторное представление заданного вопроса.
Важно помнить, что даже при использовании инструментов, таких как 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=&quot; &quot;, 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))
<p>search_index = FAISS.from_documents(document_chunks, OpenAIEmbeddings())</p>
<p>chain = load_qa_with_sources_chain(OpenAI(temperature=0))</p>
<p>def print_answer(question):
print(
chain(
{
&quot;input_documents&quot;: search_index.similarity_search(question, k=4),
&quot;question&quot;: question,
},
return_only_outputs=True,
)[&quot;output_text&quot;]
)
С завершением кода мы теперь имеем мощный инструмент для запроса последней академической литературы в области 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.
Взаимодействия. Как показано в пошаговом руководстве, Langchain может обеспечить мощные приложения, такие как система вопросов и ответов академической литературы. С растущим сообществом пользователей и растущей значимостью в ландшафте с открытым исходным кодом Langchain обещает стать ключевым инструментом в использовании полного потенциала моделей LLM, таких как GPT-4.














