Быстрый инжиниринг
От нуля до продвинутой разработки подсказок с помощью 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, чтобы упростить установку и управление сторонними библиотеками. Если он не включен в ваш дистрибутив Python, вы можете установить Pip, следуя инструкциям на странице 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 для получения последних статей, связанных с НЛП:
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. Мы используем резюме статьи и ее уникальный идентификатор записи (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 и XNUMX 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.