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

Важным аспектом больших языковых моделей (LLM) является количество параметров, которые эти модели используют для обучения. Чем больше параметров у модели, тем лучше она может понять взаимосвязь между словами и фразами. Это означает, что модели с миллиардами параметров способны генерировать тексты различных творческих форматов и информативно отвечать на открытые и сложные вопросы.
LLM, такие как ChatGPT, которые используют модель Transformer, хорошо понимают и генерируют человеческий язык, что делает их полезными для приложений, требующих понимания естественного языка. Однако у них есть свои ограничения, которые включают, среди прочего, устаревшие знания, неспособность взаимодействовать с внешними системами, отсутствие понимания контекста и иногда генерирование правдоподобно звучащих, но неправильных или бессмысленных ответов.
Устранение этих ограничений требует интеграции LLM с внешними источниками данных и возможностями, что может представлять сложности и требовать обширных навыков кодирования и обработки данных. Это, в сочетании с проблемами понимания концепций ИИ и сложных алгоритмов, способствует увеличению кривой обучения, связанной с разработкой приложений с использованием LLM.
Тем не менее, интеграция LLM с другими инструментами для создания приложений на основе LLM может изменить наш цифровой ландшафт. Потенциал таких приложений огромен, включая повышение эффективности и производительности, упрощение задач, улучшение процесса принятия решений и предоставление персонализированного опыта.
В этой статье мы углубимся в эти вопросы, изучая продвинутые методы оперативной разработки с помощью Langchain, предлагая четкие объяснения, практические примеры и пошаговые инструкции по их реализации.
Langchain, передовая библиотека, обеспечивает удобство и гибкость при проектировании, реализации и настройке подсказок. По мере того, как мы будем раскрывать принципы и методы разработки подсказок, вы научитесь использовать мощные функции Langchain для максимального использования преимуществ моделей генеративного ИИ SOTA, таких как GPT-4.
Понимание подсказок
Прежде чем углубляться в технические аспекты разработки подсказок, важно понять концепцию подсказок и их значение.
А 'подсказка' представляет собой последовательность токенов, которые используются в качестве входных данных для языковой модели, предписывая ей генерировать определенный тип ответа. Подсказки играют решающую роль в управлении поведением модели. Они могут повлиять на качество сгенерированного текста, а при правильном создании могут помочь модели обеспечить проницательные, точные и зависящие от контекста результаты.
Проектирование подсказок — это искусство и наука разработки эффективных подсказок. Цель — добиться желаемого результата от языковой модели. Тщательно выбирая и структурируя подсказки, можно направить модель к генерации более точных и релевантных ответов. На практике это подразумевает тонкую настройку входных фраз с учётом особенностей обучения и структурных искажений модели.
Сложность разработки подсказок варьируется от простых методов, таких как заполнение модели соответствующими ключевыми словами, до более продвинутых методов, включающих разработку сложных структурированных подсказок, которые используют внутреннюю механику модели в своих интересах.
Langchain: самый быстрорастущий инструмент подсказок
LangChain, запущенный в октябре 2022 года компанией Харрисон Чейз, стал одним из самые высоко оцененные фреймворки с открытым исходным кодом на GitHub в 2023 году. Он предлагает упрощенный и стандартизированный интерфейс для включения больших языковых моделей (LLM) в приложения. Он также предоставляет многофункциональный интерфейс для быстрой разработки, позволяя разработчикам экспериментировать с различными стратегиями и оценивать свои результаты. Используя Langchain, вы можете более эффективно и интуитивно выполнять оперативные инженерные задачи.
ЛангФлоу служит пользовательским интерфейсом для объединения компонентов LangChain в исполняемую блок-схему, что позволяет быстро создавать прототипы и экспериментировать.

LangChain заполняет важный пробел в развитии ИИ для масс. Он позволяет использовать множество приложений НЛП, таких как виртуальные помощники, генераторы контента, системы ответов на вопросы и многое другое, для решения ряда реальных проблем.
Вместо того, чтобы быть отдельной моделью или поставщиком, LangChain упрощает взаимодействие с разнообразными моделями, расширяя возможности приложений LLM за пределы ограничений простого вызова API.
Архитектура LangChain
Основные компоненты LangChain включают в себя модель ввода-вывода, шаблоны подсказок, память, агентов и цепочки.
Модель ввода / вывода
LangChain обеспечивает беспрепятственное соединение с различными языковыми моделями, объединяя их в стандартизированный интерфейс, известный как Model I/O. Это облегчает переключение модели для оптимизации или повышения производительности. LangChain поддерживает различных поставщиков языковых моделей, в том числе OpenAI, ОбниматьЛицо, Лазурный, ФейерверкИ многое другое.
Шаблоны подсказок
Они используются для управления и оптимизации взаимодействия с 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 ниже демонстрирует шаблон ReAct. Он демонстрирует, как подсказка структурирована в 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}"""
Память
Память — важнейшая концепция в LangChain, позволяющая LLM и инструментам сохранять информацию с течением времени. Такое поведение с сохранением состояния повышает производительность приложений LangChain, сохраняя предыдущие ответы, взаимодействия с пользователем, состояние среды и цели агента. Стратегии ConversationBufferMemory и ConversationBufferWindowMemory помогают отслеживать полную или недавнюю часть диалога соответственно. Для более сложного подхода стратегия ConversationKGMemory позволяет представить диалог в виде графа знаний, который можно использовать в подсказках или для прогнозирования ответов без вызова LLM.
Агент
Агент взаимодействует с миром, выполняя действия и задачи. В LangChain агенты объединяют инструменты и цепочки для выполнения задач. Он может установить соединение с внешним миром для поиска информации, чтобы расширить знания LLM, тем самым преодолевая присущие им ограничения. Они могут решить передать вычисления калькулятору или интерпретатору Python в зависимости от ситуации.
Агенты оснащены подкомпонентами:
- Инструменты: Это функциональные компоненты.
- Toolkits: Коллекции инструментов.
- Агент Исполнители: это механизм выполнения, который позволяет выбирать между инструментами.
Агенты в LangChain также следуют шаблону Zero-shot ReAct, где решение принимается только на основе описания инструмента. Этот механизм можно расширить за счёт памяти, чтобы учитывать всю историю разговора. С ReAct вместо того, чтобы просить LLM автоматически дополнять текст, вы можете подсказать ему ответ в цикле «мысль/действие/наблюдение».
Цепи
Цепочки, как следует из этого термина, представляют собой последовательности операций, которые позволяют библиотеке LangChain беспрепятственно обрабатывать входные и выходные данные языковой модели. Эти неотъемлемые компоненты LangChain в основном состоят из ссылок, которые могут быть другими цепочками или примитивами, такими как подсказки, языковые модели или утилиты.
Представьте цепь в виде конвейерной ленты на заводе. Каждый шаг на этом поясе представляет собой определенную операцию, которая может быть вызовом языковой модели, применением функции Python к тексту или даже вызовом модели определенным образом.
LangChain разделяет свои цепочки на три типа: служебные цепочки, универсальные цепочки и цепочки комбинирования документов. Далее мы подробнее рассмотрим служебные и универсальные цепочки.
- Коммунальные сети специально разработаны для извлечения точных ответов из языковых моделей для узкоспециализированных задач. Например, рассмотрим LLMMathChain. Эта цепочка утилит позволяет языковым моделям выполнять математические вычисления. Она принимает вопрос на естественном языке, а языковая модель, в свою очередь, генерирует фрагмент кода Python, который затем выполняется для получения ответа.
- Общие цепочки, с другой стороны, служат строительными блоками для других цепочек, но не могут использоваться напрямую отдельно. Эти цепочки, такие как LLMChain, являются основополагающими и часто объединяются с другими цепочками для выполнения сложных задач. Например, LLMChain часто используется для запроса объекта языковой модели путем форматирования ввода на основе предоставленного шаблона подсказки и последующей передачи его в языковую модель.
Пошаговое внедрение Prompt Engineering с помощью Langchain
Мы проведем вас через процесс внедрения оперативного инжиниринга с использованием Langchain. Прежде чем продолжить, убедитесь, что вы установили необходимое программное обеспечение и пакеты.
Вы можете воспользоваться такими популярными инструментами, как Docker, Conda, Pip и Poetry, для настройки LangChain. Соответствующие установочные файлы для каждого из этих методов можно найти в репозитории LangChain по адресу https://github.com/benman1/generative_ai_with_langchain, Это включает в себя Dockerfile для Докера, requirements.txt для Пипа, pyproject.toml для поэзии и langchain_ai.yml файл для Конды.
В нашей статье мы будем использовать Pip, стандартный менеджер пакетов для Python, для установки и управления сторонними библиотеками. Если Pip не входит в ваш дистрибутив Python, вы можете установить его, следуя инструкциям на странице https://pip.pypa.io/.
Чтобы установить библиотеку с Pip, используйте команду pip install library_name.
Однако Pip не управляет средами самостоятельно. Для управления различными средами мы используем инструмент virtualenv.
В следующем разделе мы обсудим интеграцию моделей.
Шаг 1: Настройка ленгчейна
Во-первых, вам нужно установить пакет Langchain. Мы используем ОС Windows. Запустите следующую команду в своем терминале, чтобы установить его:
pip install langchain
Шаг 2: Импорт лангчейна и других необходимых модулей
Затем импортируйте Langchain вместе с другими необходимыми модулями. Здесь мы также импортируем библиотеку трансформаторов, которая широко используется в задачах НЛП.
import langchain from transformers import AutoModelWithLMHead, AutoTokenizer
Шаг 3: Загрузите предварительно обученную модель
Открытый ИИ
OpenAI Модели можно легко взаимодействовать с библиотекой LangChain или клиентской библиотекой OpenAI Python. В частности, OpenAI предоставляет класс Embedding для моделей встраивания текста. Две ключевые модели LLM — GPT-3.5 и GPT-4, отличающиеся главным образом длиной токена. Цены на каждую модель можно найти на веб-сайте OpenAI. Хотя существует и больше… сложные модели типа ГПТ-4-32К которые имеют более высокий уровень принятия токенов, их доступность через 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") # The LLM takes a prompt as an input and outputs a completion prompt = "who is the president of the United States of America?" completion = llm(prompt)
The current President of the United States of America is Joe Biden.
В этом примере агент инициализируется для выполнения вычислений. Агент принимает ввод, простую задачу добавления, обрабатывает его, используя предоставленную модель OpenAI, и возвращает результат.
Обнимая лицо
Обнимая лицо - это БЕСПЛАТНО Библиотека Transformers Python, совместимая с PyTorch, TensorFlow и JAX и включающая реализации таких моделей, как БЕРТ, T5, и т.д.
Hugging Face также предлагает Hugging Face Hub, платформу для размещения репозиториев кода, моделей машинного обучения, наборов данных и веб-приложений.
Чтобы использовать Hugging Face в качестве поставщика моделей, вам потребуется учётная запись и ключи API, которые можно получить на их сайте. Токен можно сделать доступным в вашей среде как HUGGINGFACEHUB_API_TOKEN.
Рассмотрим следующий фрагмент Python, в котором используется модель Flan-T5-XXL с открытым исходным кодом, разработанная Google:
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). Эта функция собирает самые последние сводки документов НЛП из arXiv и инкапсулирует их в объекты документа 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
Эта функция извлекает аннотации последних статей по естественному языку из arXiv и преобразует их в объекты LangChain Document. В качестве содержания и источника мы используем аннотацию статьи и её уникальный идентификатор записи (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?")
На выходе будет ответ на ваш вопрос с указанием источников, из которых была извлечена информация. Например:
Recent advancements in NLP include Retriever-augmented instruction-following models and a novel computational framework for solving alternating current optimal power flow (ACOPF) problems using graphics processing units (GPUs). SOURCES: 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))
Recent advancements in Natural Language Processing (NLP) include the development of retriever-augmented instruction-following models for information-seeking tasks such as question answering (QA). These models can be adapted to various information domains and tasks without additional fine-tuning. However, they often struggle to stick to the provided knowledge and may hallucinate in their responses. Another advancement is the introduction of a computational framework for solving alternating current optimal power flow (ACOPF) problems using graphics processing units (GPUs). This approach utilizes a single-instruction, multiple-data (SIMD) abstraction of nonlinear programs (NLP) and employs a condensed-space interior-point method (IPM) with an inequality relaxation strategy. This strategy allows for the factorization of the KKT matrix without numerical pivoting, which has previously hampered the parallelization of the IPM algorithm. SOURCES: http://arxiv.org/abs/2307.16877v1, http://arxiv.org/abs/2307.16830v1
Токен в GPT-4 может быть как коротким, так и длинным, как одно слово. Например, GPT-4-32K может обрабатывать до 32,000 4 токенов за один запуск, а GPT-8-3.5K и GPT-8,000-turbo — 4,000 и XNUMX токенов соответственно. Однако важно отметить, что каждое взаимодействие с этими моделями сопряжено с затратами, прямо пропорциональными количеству обработанных токенов, будь то входные или выходные данные.
В контексте нашей системы вопросов и ответов, если часть академической литературы превышает максимальное количество токенов, система не сможет обработать ее полностью, что повлияет на качество и полноту ответов. Чтобы обойти эту проблему, текст можно разбить на более мелкие части, соответствующие лимиту токенов.
FAISS (Поиск сходства с искусственным интеллектом в Facebook) Помогает быстро находить наиболее релевантные фрагменты текста, соответствующие запросу пользователя. Он создаёт векторное представление каждого фрагмента текста и использует эти векторы для определения и извлечения фрагментов, наиболее близких к векторному представлению заданного вопроса.
Важно помнить, что даже при использовании таких инструментов, как 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) # We can now use feed more data
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"]
)
Когда код завершен, у нас теперь есть мощный инструмент для запроса последней академической литературы в области НЛП.
Recent advancements in NLP include the use of deep neural networks (DNNs) for automatic text analysis and natural language processing (NLP) tasks such as spell checking, language detection, entity extraction, author detection, question answering, and other tasks. SOURCES: 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.










