Введение

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

LLM в целом

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

Архитектура

LLM обычно состоят из нескольких слоев нейронных сетей, слоев прямой связи, слоев внедрения и слоев внимания. Эти слои работают вместе для обработки входного текста и создания выходных прогнозов.

Токены и их максимальное количество в LLM

Токены в LLM (большие языковые модели) относятся к наименьшим единицам текста, которые обрабатывает модель. При обработке естественного языка токен может представлять собой отдельный символ, слово или даже подслово, в зависимости от используемой конкретной стратегии токенизации.

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

Например, в предложении «Я люблю кошек» токенами могут быть «я», «люблю» и «кошки», причем каждый токен представляет одно слово. Однако, если используется стратегия токенизации подслов, такая как кодирование пар байтов (BPE), токены могут быть дополнительно разделены на единицы подслов, такие как «я», «любовь» и «кошка» + «с».

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

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

В библиотеке LangChain размер контекста LLM или максимальное количество токенов, которые может обрабатывать модель, определяется конкретной реализацией LLM. В случае реализации OpenAI в LangChain максимальное количество токенов определяется используемой базовой моделью OpenAI. Чтобы найти максимальное количество токенов для модели OpenAI, обратитесь к атрибуту max_tokens, указанному в документации или API OpenAI.

Например, если вы используете модель GPT-3, максимальное количество токенов, поддерживаемых этой моделью, составляет 2049. Максимальное количество жетонов для разных моделей зависит от конкретной версии и их вариантов (например, davinci, curie, babbage или ada). Каждая версия имеет разные ограничения, более высокие версии обычно поддерживают большее количество токенов.

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

Вот пример того, как вы можете обрабатывать текст, превышающий максимальный лимит токенов для данного LLM в LangChain:

from langchain.llms import OpenAI

llm = OpenAI(model_name="text-davinci-003")

input_text = "your_long_input_text"

max_tokens = 4097

text_chunks = split_text_into_chunks(input_text, max_tokens)

results = []
for chunk in text_chunks:
    result = llm.process(chunk)
    results.append(result)

final_result = combine_results(results)

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

Обратите внимание, что разделение на несколько частей может повредить связности текста.

Распределение токенов и прогнозирование следующего токена

Большие языковые модели, такие как GPT-3 и GPT-4, проходят предварительную подготовку на огромном количестве текстовых данных и учатся предсказывать следующий токен в последовательности на основе контекста, предоставленного предыдущими токенами. В моделях семейства GPT используется моделирование каузального языка, которое предсказывает следующий токен, имея доступ только к предыдущим токенам. Этот процесс позволяет LLM генерировать контекстуально релевантный текст.

В следующем коде используется класс OpenAI LangChain для загрузки варианта Davinci GPT-3 с использованием клавиши text-davinci-003 для завершения последовательности, что приводит к ответу. Перед выполнением следующего кода сохраните свой ключ OpenAI в переменной среды OPENAI_API_KEY. Кроме того, не забудьте установить необходимые пакеты с помощью следующей команды: pip install langchain==0.0.208 deeplake openai tiktoken.

from langchain.llms import OpenAI

llm = OpenAI(model_name="text-davinci-003", temperature=0)

text = "What would be a good company name for a company that makes colorful socks?"

print(llm(text))

Выход:

Rainbow Socks Co.

Отслеживание использования токена

Вы можете использовать механизм обратного вызова библиотеки LangChain для отслеживания использования токена. В настоящее время это реализовано только для OpenAI API:

from langchain.llms import OpenAI
from langchain.callbacks import get_openai_callback

llm = OpenAI(model_name="text-davinci-003", n=2, best_of=2)

with get_openai_callback() as cb:
    result = llm("Tell me a joke")
    print(cb)

Выход:

Tokens Used: 46
    Prompt Tokens: 4
    Completion Tokens: 42
Successful Requests: 1
Total Cost (USD): $0.0009199999999999999

Обратный вызов будет отслеживать используемые токены, успешные запросы и общую стоимость.

Обучение за несколько выстрелов

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

Этот подход предполагает использование класса FewShotPromptTemplate, который принимает PromptTemplate и список нескольких примеров. Класс форматирует шаблон подсказки с помощью небольшого примера, помогая языковой модели генерировать лучший ответ. Мы можем упростить этот процесс, используя LangChain FewShotPromptTemplate для структурирования подхода:

from langchain import PromptTemplate
from langchain import FewShotPromptTemplate

examples = [
    {
        "query": "What's the weather like?",
        "answer": "It's raining cats and dogs, better bring an umbrella!"
    },
    {
        "query": "How old are you?",
        "answer": "Age is just a number, but I'm timeless."
    }
]

example_template = """
User: {query}
AI: {answer}
"""

example_prompt = PromptTemplate(
    input_variables=["query", "answer"],
    template=example_template
)

prefix = """The following are excerpts from conversations with an AI
assistant. The assistant is known for its humor and wit, providing
entertaining and amusing responses to users' questions. Here are some
examples:
"""

suffix = """
User: {query}
AI: """

few_shot_prompt_template = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix=prefix,
    suffix=suffix,
    input_variables=["query"],
    example_separator="\n\n"
)

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

Заключение

Большие языковые модели (LLM) стали мощным инструментом в области обработки естественного языка, демонстрируя замечательные возможности в создании человеческого текста. В этой статье мы рассмотрели различные аспекты LLM, в том числе их возможности быстрого обучения, распределение токенов и максимальные лимиты токенов.

LLM, такие как GPT-3 и GPT-4, представляют собой модели глубокого обучения с миллиардами параметров, которые могут выполнять широкий спектр задач обработки языка. Их архитектура состоит из нескольких слоев, которые обрабатывают входной текст и генерируют контекстно-зависимые выходные прогнозы. Эти модели превосходно справляются с такими задачами, как обобщение текста, перевод и ответы на вопросы, без необходимости тонкой настройки.

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

LLM изучают распределение токенов и предсказывают следующий токен в последовательности на основе контекста, предоставленного предыдущими токенами. Эта способность позволяет им генерировать текст, который является контекстуально релевантным и часто неотличим от текста, созданного человеком.

Хотя LLM предлагают огромный потенциал, важно знать об их ограничениях. Галлюцинации и предубеждения могут привести к неточным или вводящим в заблуждение выводам. Кроме того, необходимо тщательное рассмотрение этических последствий и компромиссов, связанных с использованием LLM.