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

Від нуля до просунутого інженерного проекту промпта з Langchain на Python

mm
Додайте Unite.AI до бажаних джерел у Google

Важливим аспектом великих мовних моделей (LLM) є кількість параметрів, які ці моделі використовують для навчання. Чим більше параметрів має модель, тим краще вона може зрозуміти відносини між словами та фразами. Це означає, що моделі з мільярдами параметрів мають здатність генерувати різні творчі тексти та відповідати на відкриті та складні питання інформативним чином.

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

Для подолання цих обмежень необхідно інтегрувати LLM з зовнішніми джерелами даних та можливостями, що може представляти складності та вимагати розширених навичок програмування та обробки даних. Це, разом із складнощами розуміння концепцій штучного інтелекту та складних алгоритмів, сприяє кривій навчання, пов’язаній із розробкою застосунків, які використовують LLM.

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

У цій статті ми глибше розглянемо ці питання, досліджуючи просунуті техніки інженерії промпта з Langchain, надаючи чіткі пояснення, практичні приклади та крок за кроком інструкції щодо того, як їх реалізувати.

Langchain, бібліотека останньої генерації, надає зручність та гнучкість при проектуванні, реалізації та налаштуванні промптів. Коли ми розгортаємо принципи та практику інженерії промпта, ви дізнаєтеся, як використовувати потужні можливості Langchain для використання сильних сторін моделей генерації AI останньої генерації, таких як 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=[&amp;quot;subject&amp;quot;],
template=&amp;quot;What are the recent advancements in the field of {subject}?&amp;quot;)
print(prompt.format(subject=&amp;quot;Natural Language Processing&amp;quot;))</p>

Когда ми просунуємося у складності, ми зустрічаємо більш складні шаблони в LangChain, такі як шаблон Reason and Act (ReAct). ReAct є важливим шаблоном для виконання дій, де агент призначає завдання відповідному інструменту, налаштовує вхідні дані для нього та аналізує його вихідні дані для виконання завдання. Нижче наведений приклад Python демонструє шаблон ReAct. Він показує, як промпт структурований у LangChain, використовуючи серію думок та дій для розуміння проблеми та генерації остаточної відповіді:

PREFIX = &amp;quot;&amp;quot;&amp;quot;Answer the following question using the given tools:&amp;quot;&amp;quot;&amp;quot;
FORMAT_INSTRUCTIONS = &amp;quot;&amp;quot;&amp;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&#039;s outcome&amp;quot;&amp;quot;&amp;quot;
SUFFIX = &amp;quot;&amp;quot;&amp;quot;Start!
Question: {input}
Thought:{agent_scratchpad}&amp;quot;&amp;quot;&amp;quot;

Memory

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

Agents

Агент взаємодіє зі світом, виконуючи дії та завдання. У LangChain агенти поєднують інструменти та ланцюги для виконання завдань. Він може встановити з’єднання з зовнішнім світом для отримання інформації для доповнення знань LLM, тим самим подолавши їх внутрішні обмеження. Вони можуть вирішити передати розрахунки до калькулятора або інтерпретатора Python залежно від ситуації.

Агенти обладнані підкомпонентами:

  • Інструменти: Це функціональні компоненти.
  • Набори інструментів: Збірки інструментів.
  • Виконавці агентів: Це механізм виконання, який дозволяє вибирати між інструментами.

Агенти в LangChain також слідують шаблону Zero-shot ReAct, де рішення базується лише на описі інструменту. Цей механізм можна розширити пам’яттю, щоб врахувати всю історію розмови. З ReAct, замість того, щоб просити LLM доповнити ваш текст, ви можете просити його відповісти у циклі думки/дії/спостереження.

Ланцюги

Ланцюги, як і слово самі по собі, являють собою послідовності операцій, які дозволяють бібліотеці LangChain обробляти вхідні та вихідні дані мовної моделі безшовно. Ці інтегральні компоненти LangChain складаються з ланок, які можуть бути іншими ланцюгами або примітивами, такими як промпти, мовні моделі чи утиліти.

Уявіть ланцюг як конвеєрну стрічку на фабриці. Кожний крок на цій стрічці представляє певну операцію, яка може бути викликом мовної моделі, застосуванням функції Python до тексту або навіть промптом моделі певним чином.

LangChain класифікує свої ланцюги на три типи: Utility ланцюги, Generic ланцюги та Combine Documents ланцюги. Ми розглянемо Utility та Generic ланцюги для нашого обговорення.

  • Utility ланцюги спеціально розроблені для отримання точних відповідей з мовних моделей для вузько визначених завдань. Наприклад, розглянемо LLMMathChain. Цей утилітний ланцюг дозволяє мовним моделям виконувати математичні розрахунки. Він приймає питання природної мови, а мовна модель генерує уривок коду Python, який потім виконується для отримання відповіді.
  • Generic ланцюги, з іншого боку, служать будівельними блоками для інших ланцюгів, але не можуть бути використані самостійно. Ці ланцюги, такі як 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, для установки та управління бібліотеками третіх сторін. Якщо Pip не входить до складу вашого розподілу Python, ви можете встановити його, слідуючи інструкціям на 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 Python. Відзначимо, що OpenAI пропонує клас Embedding для моделей текстового вкладення. Дві ключові моделі LLM — GPT-3.5 та GPT-4, які відрізняються в основному довжиною токена. Ціни на кожну модель можна знайти на сайті OpenAI. Хоча є більш просунуті моделі, такі як GPT-4-32K, які мають вищу приймальність токенів, їх доступність через API не завжди гарантована.

Для доступу до цих моделей потрібно отримати ключ API OpenAI. Це можна зробити, створивши обліковий запис на платформі OpenAI, налаштував інформацію про оплату та згенерувавши новий секретний ключ.


<p>import os
os.environ[&amp;quot;OPENAI_API_KEY&amp;quot;] = &#039;your-openai-token&#039;</p>

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

Розглянемо сценарій LangChain, який демонструє взаємодію з моделями OpenAI:

from langchain.llms import OpenAI
llm = OpenAI(model_name=&amp;quot;text-davinci-003&amp;quot;)
# LLM приймає промпт як вхід та виводить завершення
prompt = &amp;quot;who is the president of the United States of America?&amp;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={&amp;quot;temperature&amp;quot;: 0.5, &amp;quot;max_length&amp;quot;: 64},repo_id=&amp;quot;google/flan-t5-xxl&amp;quot;)
prompt = &amp;quot;In which country is Tokyo?&amp;quot;
completion = llm(prompt)
print(completion)</p>

Цей сценарій приймає питання як вхід та повертає відповідь, демонструючи знання та передбачувальні можливості моделі.

Крок 4: Базова інженерія промпта

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

prompt = &#039;Translate the following English text to French: &amp;quot;{0}&amp;quot;&#039;
input_text = &#039;Hello, how are you?&#039;
input_ids = tokenizer.encode(prompt.format(input_text), return_tensors=&#039;pt&#039;)

<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 = &#039;As a highly proficient French translator, translate the following English text to French: &amp;quot;{0}&amp;quot;&#039;
input_text = &#039;Hello, how are you?&#039;
input_ids = tokenizer.encode(prompt.format(input_text), return_tensors=&#039;pt&#039;)

<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 та інкапсулює їх у об’єкти документів LangChain, використовуючи підсумок як вміст та унікальний ідентифікатор запису як джерело.

Ми використовуємо API arXiv для отримання останніх робіт, пов’язаних з NLP:


<p>def get_arxiv_data(max_results=10):
search = arxiv.Search(
query=&amp;quot;NLP&amp;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={&amp;quot;source&amp;quot;: result.entry_id},
))</p>

return documents

Ця функція збирає підсумки останніх робіт NLP з arXiv та конвертує їх у об’єкти документів LangChain. Ми використовуємо підсумок роботи та її унікальний ідентифікатор (URL до роботи) як вміст та джерело відповідно.

def print_answer(question):
print(
chain(
{
&amp;quot;input_documents&amp;quot;: sources,
&amp;quot;question&amp;quot;: question,
},
return_only_outputs=True,
)[&amp;quot;output_text&amp;quot;]
)

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

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

З нашою системою запитання-відповідь тепер готовою, ми можемо протестувати її, запитавши питання:

print_answer(&amp;quot;What are the recent advancements in NLP?&amp;quot;)

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


<p>Останні досягнення в галузі NLP включають розробку моделей виконання інструкцій з використанням великих мовних моделей. Ці моделі можуть бути адаптовані до різних інформаційних доменів та завдань без додаткового доопрацювання. Однак вони часто мають труднощі з дотриманням наданої інформації та можуть генерувати правдоподібні, але неправильні чи безглузді відповіді, серед іншого.</p>

<p>Джерела: http://arxiv.org/abs/2307.16877v1, http://arxiv.org/abs/2307.16830v1</p>

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

sources = get_arxiv_data(2)
chain = load_qa_with_sources_chain(OpenAI(model_name=&amp;quot;gpt-4&amp;quot;,temperature=0))

<p>Останні досягнення в галузі природної мови (NLP) включають розвиток моделей виконання інструкцій для завдань пошуку інформації, таких як питання-відповідь (QA). Ці моделі можна адаптувати до різних інформаційних доменів та завдань без додаткового доопрацювання. Однак вони часто мають труднощі з дотриманням наданої інформації та можуть генерувати правдоподібні, але неправильні чи безглузді відповіді, серед іншого.</p>

<p>Джерела: http://arxiv.org/abs/2307.16877v1, http://arxiv.org/abs/2307.16830v1</p>

Токен у 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=&amp;quot; &amp;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(
{
&amp;quot;input_documents&amp;quot;: search_index.similarity_search(question, k=4),
&amp;quot;question&amp;quot;: question,
},
return_only_outputs=True,
)[&amp;quot;output_text&amp;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.

Я провів останні п'ять років, занурючись у захопливий світ машинного навчання та глибокого навчання. Моя пристрасть та експертиза привели мене до внеску у понад 50 різних проектів програмної інженерії, з особливим акцентом на AI/ML. Моя тривала цікавість також привела мене до природної обробки мови, галузі, яку я бажаю дослідити далі.