Разработка простого LLM-приложения
В этом разделе показан пример разработки LLM-приложения, которое переводит текст с английского языка на другой язык. Итоговое приложение включает всего один вызов LLM плюс некоторую работу с промптами. Это довольно простое приложение, но оно показывает, что множество функций можно реализовать только с помощью промптов и вызова LLM.
Подготовка к разработке
Jupyter-блокноты
Это руководство, как и большинство других в документации, использует Jupyter-блокноты. Они отлично подходят для изучения работы с LLM-системами, так как предоставляют интерактивную среду для работы с руководствами и позволяют работать с непредвиденными ситуациями: недоступностью API, нетипичным выводом и другими.
Подробнее об установке jupyter — в официальной документации.
Установка
Для установки GigaChain выполните команду:
pip install langchain-gigachat
Подробнее об установке — в разделе Установка.
Работа с языковыми моделями
В первую очередь для работы использования GigaChain нужно подключить языковую модель.
Хотя GigaChain поддерживает различные языковые модели, основным преимуществом библиотеки является возможность работы с моделями GigaChat.
# | output: false
# | echo: false
from langchain_gigachat.chat_models import GigaChat
model = GigaChat(
credentials="ключ_авторизации",
scope="GIGACHAT_API_PERS",
model="GigaChat",
verify_ssl_certs=False,
)
Объект GigaChat принимает параметры:
credentials
— ключ авторизации для обмена сообщениями с GigaChat API. О том, как получить ключ авторизации — в разделе Быстрый старт.scope
— необязательный параметр, в котором можно указать версию API, к которой нужно обратиться. Возможные значения:GIGACHAT_API_PERS
— версия API для физических лиц;GIGACHAT_API_CORP
— версия API для ИП и юрлиц.
По умолчанию запросы передаются в версию для физических лиц.
model
— необязательный параметр, в котором можно явно задать модель GigaChat.verify_ssl_certs
— необязательный параметр, с помощью которого можно отключить проверку сертификатов НУЦ Минцифры.
Попробуйте обратиться к модели напрямую.
Объекты ChatModel
— это экземпляры Runnable-интерфейса GigaChain.
Все экземпляры Runnable предоставляют стандартный интерфейс для взаимподействия.
Так, чтобы обратиться к модели, достаточно вызвать метод .invoke()
со списком сообщений.
from langchain_core.messages import HumanMessage, SystemMessage
messages = [
SystemMessage(content="Переведи следующее сообщение с русского на английский"),
HumanMessage(content="привет!"),
]
model.invoke(messages)
AIMessage(content='Hello!', additional_kwargs={}, response_metadata={'token_usage': Usage(prompt_tokens=24, completion_tokens=3, total_tokens=27), 'model_name': 'GigaChat:1.0.26.15', 'finish_reason': 'stop'}, id='run-18c3ad4a-677f-4a2e-836f-e9751c83f825-0')
Парсеры вывода OutputParsers
Ответ модели возвращается в форме сообщения AIMessage
.
Он содержит сгенерированный текст и дополнительную информацию, например, количество затраченных токенов.
Зачастую для работы достаточно сгенерированного текста.
Чтобы получить ответ отдельно, используйте парсер вывода.
Импортируйте простой парсер вывода.
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
Парсер можно использовать отдельно. Например, вы можете сохранить результат вызова модели и затем передать его в парсер.
result = model.invoke(messages)
parser.invoke(result)
'Hello!'
Но чаще вам будет нужно соединять в цепочку парсер вывода и модель. В таких случаях парсер вызывается каждый раз при обращении к цепочке. Итоговая цепочка будет принимать на вход тип данных модели (строку или список сообщений) и возвращать тип данных парсера вывода (строка).
Вы можете создать цепочку с помощью оператора |
, который используется в GigaChain для собъединения двух и более компонетов.
chain = model | parser
chain.invoke(messages)
'Hello!'
Шаблоны промптов
Сейчас список сообщений в примере передается напрямую в модель. Сам список сообщений, как правило, формируется логикой приложения из ввода пользователя. Обычно такая логика принимает необработанный ввод и преобразует его в список сообщений, готовых для передачи в языковую модель. Типичные преобразования включают добавление системного сообщения или изменение шаблона с учетом ввода пользователя.
Шаблоны промптов (PromptTemplates) — это конструкции GigaChain, которые принимают необработанный ввод пользователя и возвращают данные (промпт), готовые для передачи в языковую модель.
Создайте шаблон промпта, который будет принимать две пользовательские переменные:
language
— язык, на который нужно перевести текст;text
— текст для перевода.
Для этого импортируйте ChatPromptTemplate
:
from langchain_core.prompts import ChatPromptTemplate
Создайте строку, которая будет оформлена как системное сообщение:
system_template = "Переведи следующий текст на {language}:"
Теперь вы можете создать шаблон промпта.
Он будет состоять из комбинации system_template
и шаблона для ввода текста.
prompt_template = ChatPromptTemplate.from_messages(
[("system", system_template), ("user", "{text}")]
)
Входными данными для этого шаблона является словарь. Вы можете поэкспериментировать с этим шаблоном, чтобы увидеть, что он делает сам по себе.
result = prompt_template.invoke({"language": "английский", "text": "привет"})
result
ChatPromptValue(messages=[SystemMessage(content='Переведи следующий текст на английский:', additional_kwargs={}, response_metadata={}), HumanMessage(content='привет', additional_kwargs={}, response_metadata={})])
Шаблон возвращает объект ChatPromptValue
, который состоит из двух сообщений.
Доступ к сообщениям можно получить с помощью метода .to_messages()
:
result.to_messages()
[SystemMessage(content='Переведи следующий текст на английский:', additional_kwargs={}, response_metadata={}),
HumanMessage(content='привет', additional_kwargs={}, response_metadata={})]
Соединение всех компонентов вместе
Теперь объедините все три компонента вместе: шаблон, модель и парсер вывода с помощью оператора |
.
chain = prompt_template | model | parser
chain.invoke({"language": "английский", "text": "привет"})
'Hello'
Это простой пример использования LangChain Expression Language (LCEL) для соединения вместе модулей GigaChain. В таком подходе есть ряд преимуществ. В частности, он обеспечивает оптимизированную работу с потоковой передачей.
Смотрите также
Чтобы глубже погрузиться в разработку приложений с помощью GigaChain, ознакомьтесь с разделами: