ym88659208ym87991671
Разработка простого LLM-приложения | Документация для разработчиков

Разработка простого LLM-приложения

Обновлено 6 августа 2024

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

Основные понятия

В разделе рассмотрены следующие основные понятия:

Подготовка к разработке

Jupyter-блокноты

Это руководство, как и большинство других в документации, использует Jupyter-блокноты. Они отлично подходят для изучения работы с LLM-системами, так как предоставляют интерактивную среду для работы с руководствами и позволяют работать с непредвиденными ситуациями: недоступностью API, нетипичным выводом и другими.

Подробнее об установке jupyter — в официальной документации.

Установка

Для установки GigaChain выполните команду:

pip install gigachain-community

Подробнее об установке — в разделе Установка.

Работа с языковыми моделями

В первую очередь для работы использования GigaChain нужно подключить языковую модель.

Хотя GigaChain поддерживает различные языковые модели, основным преимуществом библиотеки является возможность работы с моделями GigaChat.

# | output: false
# | echo: false

from langchain.chat_models.gigachat 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. Файл будет содержать логику для развертывания приложения. Файл состоит из трех частей:

  1. Определение цепочки, которую вы создали выше.
  2. Приложение FastAPI.
  3. Определение пути для доступа к цепочки с помощью 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.chat_models.gigachat 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="MmY5ZjI0YTgtOTQ5My00MzZjLWI0NDQtZDdiMTc3NTY5MGI4OmQ4MTY2NjViLWRjYzEtNGZhOC1hNzBiLWNkMDM5NWY2NjIzNQ==", scope="GIGACHAT_API_CORP", 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, ознакомьтесь с разделами:

ПАО Сбербанк использует cookie для персонализации сервисов и удобства пользователей.
Вы можете запретить сохранение cookie в настройках своего браузера.