Разработка простого LLM-приложения
В этом разделе показан пример разработки LLM-приложения, которое переводит текст с английского языка на другой язык. Итоговое приложение включает всего один вызов LLM плюс некоторую работу с промптами. Это довольно простое приложение, но оно показывает, что множество функций можно реализовать только с помощью промптов и вызова LLM.
Основные понятия
В разделе рассмотрены следующие основные понятия:
- использование языковых моделей;
- использование шаблонов промптов и парсеров вывода;
- объединение в цепочку шаблона промптов + LLM + парсера вывода с помощью GigaChain;
- развертывание вашего приложения с GigaServe.
Подготовка к разработке
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!', response_metadata={'token_usage': Usage(prompt_tokens=22, completion_tokens=3, total_tokens=25), 'model_name': 'GigaChat:3.1.25.3', 'finish_reason': 'stop'}, id='run-61e07c28-4b05-469c-97be-472b0f4e990f-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='Переведи следующий текст на английский:'), HumanMessage(content='привет')])
Шаблон возвращает объект ChatPromptValue
, который состоит из двух сообщений.
Доступ к сообщениям можно получить с помощью метода .to_messages()
:
result.to_messages()
[SystemMessage(content='Переведи следующий текст на английский:'),
HumanMessage(content='привет')]
Соединение всех компонентов вместе
Теперь объедините все три компонента вместе: шаблон, модель и парсер вывода с помощью оператора |
.
chain = prompt_template | model | parser
chain.invoke({"language": "английский", "text": "привет"})
'Hello'
Это простой пример использования LangChain Expression Language (LCEL) для соединения вместе модулей GigaChain. В таком подходе есть ряд преимуществ. В частности, он обеспечивает оптимизированную работу с потоковой передачей.
Развертывание с GigaServe
GigaServe помогает разворачивать цепочки GigaChain в виде REST API. Использовать GigaServe для работы с GigaChain необязательно.
Пример ниже показывает, как вы можете развернуть приложение с помощью GigaServe. Пример использует Python-файл, работа с которым выполняется с помощью командной строки.
Установка GigaServe:
pip install "gigaserve[all]"
Сервер
Для создания сервера для приложения создайте файл serve.py
.
Файл будет содержать логику для развертывания приложения.
Файл состоит из трех частей:
- Определение цепочки, которую вы создали выше.
- Приложение FastAPI.
- Определение пути для доступа к цепочки с помощью
langserve.add_routes
.
#!/usr/bin/env python
from typing import List
from fastapi import FastAPI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_gigachat.chat_models import GigaChat
from langserve import add_routes
# 1. Создание шаблона промпта
system_template = "Переведи следующий текст на {language}:"
prompt_template = ChatPromptTemplate.from_messages([
('system', system_template),
('user', '{text}')
])
# 2. Создание модели
model = GigaChat(credentials="<ключ_авторизации>", scope="GIGACHAT_API_PERS", model="GigaChat-Pro", verify_ssl_certs=False)
# 3. Создание парсера
parser = StrOutputParser()
# 4. Создание цепочки
chain = prompt_template | model | parser
# 5. Определение приложения
app = FastAPI(
title="GigaChain Server",
version="1.0",
description="Простой сервер API, использующий Runnable-интерфейсы GigaChain.",
)
# 6. Добавление пути цепочки
add_routes(
app,
chain,
path="/chain",
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="localhost", port=8000)
Запустите файл:
python serve.py
Вы увидите, что ваша цепочка доступна по адресу http://localhost:8000
.
Песочница
Приложения GigaServe предоставляют доступ к простому пользовательскому интерфейсу для настройки и вызова приложения с потоковым выводом и отображением промежуточных шагов.
Вы можете попробовать его по адресу http://localhost:8000/chain/playground/
.
Задай такие же входные данные — {"language": "английский", "text": "привет"}
— приложение должно ответить как и раньше.
Клиент
Для настройки клиентской части используйте langserve.RemoteRunnable
.
Это даст возможность взаимодействовать с доступной цепочкой так, как если бы она выполнялась на стороне клиента.
from langserve import RemoteRunnable
remote_chain = RemoteRunnable("http://localhost:8000/chain/")
remote_chain.invoke({"language": "английский", "text": "привет"})
'Hello'
Подробнее — в документации GigaServe.
Смотрите также
Чтобы глубже погрузиться в разработку приложений с помощью GigaChain, ознакомьтесь с разделами: