Это пошаговое руководство будет состоять из ряда шагов с кодом, написанным на Python. Мы также будем использовать OpenAI GPT3.5 в качестве нашего основного LLM (позже я объясню, почему мы можем захотеть использовать дополнительный LLM). Существует несколько вариантов программирования для взаимодействия с LLM OpenAI через их API; вы можете использовать прямую реализацию API OpenAI или использовать LangChain, или для этого руководства мы будем использовать библиотеку Python с открытым исходным кодом под названием PanML. Вы можете найти GitHub PanML и документацию здесь: https://github.com/Pan-ML/panml

Шаг 1. Настройте ключ API OpenAI

Если вы еще этого не сделали, для создания ключа API OpenAI требуется учетная запись OpenAI. Процесс регистрации и создание ключа API выполняются относительно быстро.

Просто зайдите на их веб-сайт: https://platform.openai.com/, и после создания учетной записи щелкните значок своего профиля в правом верхнем углу страницы, а затем выберите Просмотреть ключи API. Далее вы должны увидеть опцию создания ключа + Создать новый секретный ключ. Вы можете скопировать этот ключ и обязательно сохраните его. Вам нужно будет использовать этот ключ на последнем шаге.

Шаг 2. Установите PanML

pip install -U panml

Шаг 3. Настройте LLM с помощью API OpenAI

lm = ModelPack(model="text-davinci-003", source="openai", api_key="Your key")

Мы создаем экземпляр LLM, используя серверную часть API OpenAI, используя ключ API в качестве входных данных для аргумента функции api_key.

Шаг 4. Протестируйте

lm.predict("How to improve my fitness?", max_length=600)["text"]
1. Start with a goal: Decide what you want to achieve with your fitness program. 
Do you want to lose weight, build muscle, or improve your overall health? 
2. Make a plan: Create a plan that outlines how you will reach your goal. 
...

Шаг 5. Измените приглашение

# Set the prompt modifier
prompts = [
    {"prepend": "As a runner, tell me:"},
]

lm.predict("How to improve my fitness?", 
           prompt_modifier=prompts, max_length=600)["text"]
1. Increase your mileage gradually. Start by adding a few miles to your 
weekly runs and build up gradually over time. 
2. Incorporate interval training into your runs. Interval training involves 
alternating between periods of high-intensity running and periods of rest 
or low-intensity running.
...

На этом шаге мы добавили дополнительный текст: «Как бегун, скажи мне», который стоит перед начальным запросом: «Как улучшить свою физическую форму?». Это приводит к другому ответу, а контекст становится более конкретным и релевантным для бегуна, что имеет смысл.

Вы могли заметить, что мы ввели аргумент функции: prompt_modifier. prompt_modifier — это переменная списка Python, предназначенная для включения подсказок, которые мы хотим включить в наш программный контекст цикла подсказок. Вы можете думать о каждом элементе в списке как о надстройке подсказки, которая соответствует позиции последовательности нашего программного цикла подсказки.

Шаг 5. Измените подсказку, добавив последовательность подсказок

# Set the prompt modifier
prompts = [
    {"prepend": "As a runner, tell me:"},
    {"prepend": "What tools can I use to support each point:"}
]

lm.predict("How to improve my fitness?", 
           prompt_modifier=prompts, max_length=600)["text"]
Tools: 
1. A running app to track your mileage and progress. 
2. A timer to help you keep track of your intervals.
...

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

Шаг 6. Измените приглашение для фильтрации вывода

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

Рассмотрим сценарий, в котором вы делаете заявку LLM о кулинарии и образе жизни. Во время использования пользователь может взаимодействовать с LLM, выдвигая различные запросы, и, вероятно, будут некоторые запросы, выходящие за рамки предполагаемой цели вашего приложения LLM. Например:

# Query the LLM
queries = [
    "What is the best way to cook steak?",
    "How do you vote in the US election?",
]

output = lm.predict(queries, max_length=600)
print("\n\n".join(output))
 The best way to cook steak is to use a combination of high heat and 
short cooking time. Start by preheating a heavy skillet or grill over 
high heat. Season the steak with salt and pepper and then add it to the 
hot pan. Sear the steak for 1-2 minutes per side, then reduce the heat 
to medium-high and cook for an additional 3-4 minutes per side, or 
until the steak reaches the desired doneness. Let the steak rest for 
5 minutes before serving. 

 In the United States, voting in federal elections is done through a 
state-run process. To vote in a federal election, you must be a U. S. citizen, 
at least 18 years old on Election Day, and a resident of the state in which 
you are voting. You must also register to vote in your state before you can 
cast a ballot. Registration requirements vary by state, so you should check 
with your local election office for specific information. 

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

# Custom keyword filter function
def my_keyword_filter(text):
    keywords_to_refuse = ["politic", "election"]
    text = text.lower()
    refuse = [word for word in keywords_to_refuse if word in text]
    
    # Set responses based on keywords
    if len(refuse) == 0:
        return f"Break into details: {text}"
    else:
        return "Produce response to politely say I can't answer"
    
# Set the prompt modifier
prompts = [
    {},
    {'transform': my_keyword_filter},
]

# Query the LLM
queries = [
    "What is the best way to cook steak?",
    "How do you vote in the US election?",
]

output = lm.predict(queries, prompt_modifier=prompts, max_length=600)
print('\n\n'.join(output))
1. Preheat a heavy skillet or grill over high heat. 
2. Season the steak with salt and pepper. 
3. Add the steak to the hot pan. 
4. Sear the steak for 1-2 minutes per side. 
5. Reduce the heat to medium-high. 
6. Cook for an additional 3-4 minutes per side. 
7. Check the steak for desired doneness. 
8. Let the steak rest for 5 minutes before serving.

I'm sorry, I'm not able to answer that at this time. 

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

Шаг 7. Измените запрос на фильтрацию выходных данных с помощью LLM

В качестве разновидности описанного выше подхода к фильтрации мы можем добиться аналогичного результата, используя LLM, чтобы помочь отфильтровать темы, на которые мы не хотим отвечать. Здесь мы используем возможности LLM в семантическом понимании, чтобы, как мы надеемся, обеспечить более эффективное покрытие в соответствии с целью нашего фильтра. Мы проверяем это, удаляя ключевое слово «выборы» из наших тем, предполагая, что наша оценка LLM будет определять запросы о выборах как похожие на «политику», а затем отфильтровывать их в окончательном ответе.

Во-первых, нам нужно будет настроить LLM для оценки. В этом примере мы выбрали модель FLAN-T5 от Google (большая). Вы можете поэкспериментировать с другими моделями или моделями меньшего размера (при условии, что это достаточно хорошо для целей классификации тем):

# Set the evaluation LLM
lm_eval = ModelPack(model="google/flan-t5-large", source="huggingface")
# Custom topic filter function
def my_topic_filter(text):
    topics_to_refuse = ["politics"]
    
    # Use LLM to evaluate topic similarity
    topics = lm_eval.predict(f"Identify one word topics in:\n {text}")['text'].split(',')
    refuse = 'no'
    for topic in topics:
        for refuse_topic in topics_to_refuse:
            refuse = lm_eval.predict(f"Answer yes or no. Is {topic} similar to {refuse_topic}?")['text'].lower()
            if refuse == 'yes':
                break
                
    # Set responses based on LLM evaluations
    if refuse == 'no':
        return f"Break into details: {text}"
    else: 
        return "Produce response to politely say I can't answer"

# Set the prompt modifier
prompts = [
    {},
    {'transform': my_topic_filter},
]

# Query the LLM
queries = [
    "What is the best way to cook steak?",
    "How do you vote in the US election?",
]

output = lm.predict(queries, prompt_modifier=prompts, max_length=600)
print('\n\n'.join(output))
1. Preheat a heavy skillet or grill over high heat. 
2. Season the steak with salt and pepper. 
3. Add the steak to the hot pan. 
4. Sear the steak for 1-2 minutes per side. 
5. Reduce the heat to medium-high. 
6. Cook for an additional 3-4 minutes per side. 
7. Check the steak for desired doneness. 
8. Let the steak rest for 5 minutes before serving. 

I'm sorry, I'm not able to answer that at this time.

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

Заключение

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

И последнее замечание: PanML — это высокоуровневая библиотека Python с открытым исходным кодом, разработанная, чтобы помочь специалистам по данным и инженерам по машинному обучению экспериментировать и с легкостью запускать LLM в своей локальной среде. Ссылки на код и документацию к библиотеке следующие:

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

Want to Connect?

You can find my profiles on LinkedIn and Twitter.