Гайд · TNWS AI

Как подключить LLM API к Gradio ChatInterface и сохранить контекст диалога

5 мин—

Готовый Python-шаблон чат-интерфейса для совместимого LLM API: роль history, тест двух реплик и проверка ошибок модели.

Задача и применимость

Русскоязычный вопрос: «как подключить нейросеть к gradio chatinterface с историей сообщений». Пример применим к актуальной документации Gradio ChatInterface на 20 сентября 2026 года и заранее работающему локальному OpenAI-совместимому серверу генеративной модели. Название модели извлеките из собственного сервера; демонстрационный код использует переменную окружения MODEL_ID и явный URL. Версию Gradio зафиксируйте командой pip show gradio, поскольку сайт документации обновляется без фиксации версии.

Что подтверждено производителем

ChatInterface принимает fn(message, history): первое значение — новая строка, второе — список словарей в стиле OpenAI с role и content. Возвращаемая строка становится ответом ассистента. Передача истории на бэкенд модели — обязанность вашей функции; сам интерфейс не добавляет удалённой модели память автоматически.

Порядок действий

  1. Запустите собственный модельный API на закрытом локальном адресе и выясните его точный model ID.
  2. Установите gradio и официальный клиент openai в отдельное окружение Python.
  3. Добавьте к history только нужные сообщения role/content, затем текущую реплику пользователя.
  4. Отправьте запрос модели и верните только текст ответа, предусмотрев пустой результат.
  5. В интерфейсе задайте две связанные реплики и убедитесь, что ответ на вторую использует первую.

Готовый шаблон

Сохраните пример в отдельном файле Python. В коде нет реального секрета или скрытого вызова модели: если подключён внешний API, его адрес и параметры указаны явно. Установите gradio в отдельном окружении; дополнительные пакеты требуются только там, где они импортированы в примере.

import os
import gradio as gr
from openai import OpenAI

client = OpenAI(base_url="http://127.0.0.1:8000/v1",
                api_key=os.environ.get("MODEL_API_KEY", "local-test"))
model_id = os.environ["MODEL_ID"]

def answer(message, history):
    turns = [{"role": x["role"], "content": x["content"]}
             for x in history if x.get("role") in ("user", "assistant")
             and isinstance(x.get("content"), str)]
    turns.append({"role": "user", "content": message})
    response = client.chat.completions.create(model=model_id, messages=turns)
    content = response.choices[0].message.content
    return content or "Модель не вернула текст."

gr.ChatInterface(answer, title="Тест диалога", api_name="chat").launch(server_name="127.0.0.1")

Вход и ожидаемый результат

В первой реплике введите «Мой заказ AB-17; запомни только этот артикул». Затем «Какой артикул я назвал?» Ожидается AB-17; если второй ответ не связан с первым, посмотрите фактически отправленный массив turns, а не только экранную историю. Отдельный негативный тест: новая сессия не должна знать прежний артикул.

Проверка контракта

Список history уже содержит предшествующие пары сообщений; новую реплику message надо присоединить ровно один раз. Если добавить её дважды, модель получает две одинаковые инструкции и меняет ответ. Если совсем не передать историю, каждое сообщение будет выглядеть как новая беседа. При интеграции с провайдером учитывайте ограничение контекстного окна: не отправляйте бесконечный массив без согласованной политики усечения или суммаризации. Перед запуском оцените объём реальных бесед и запас для ответа; интерфейс не заменяет такой расчёт.

Работа с данными пользователя

Структура history может включать дополнительные метаданные или мультимодальные объекты. Код намеренно пропускает нетекстовые элементы, чтобы не передать в текстовый API неизвестный тип и не превратить путь к локальному файлу в пользовательский промпт. Это означает и ограничение примера: вложения не будут частью ответа. Для файлов потребуется отдельная обработка с проверкой типа, размера, доступа и явного согласия пользователя. Не копируйте произвольные поля истории в upstream API; нормализуйте только роли, которые вы действительно допускаете.

Что проверить перед развёртыванием

Контрольная пара вопросов показывает, что цепочка сообщений доставлена, но не доказывает идеальной памяти нейросети. Проверяйте несколько сценариев: исправление пользователем собственного артикула, отрицание ранее названного факта, переполнение контекста и повторение вопроса после долгого разговора. При ошибке сети не отображайте в UI секретный ответ сервера; записывайте техническую причину в защищённый журнал, а пользователю показывайте безопасную формулировку. Код — минимальный рабочий каркас, а не готовая авторизация для публичного продукта.

Готовый системный шаблон для вашего бэкенда, если он позволяет системные сообщения: «Отвечай только на основании текущей беседы. Если артикул не был указан, скажи, что он неизвестен. Не смешивай данные разных сессий». Перед добавлением роли system проверьте, что её принимает конкретная модель и что она не ломает чат-шаблон. Если вопрос касается актуального остатка на складе, даже идеально переданная история не даёт доступа к базе: потребуется отдельное разрешённое чтение источника.

Проверка второго хода должна сохранять именно семантическую связь, а не буквальную фразу первого ответа. Для тестового набора заведите пары «начальный факт — уточнение — допустимый ответ»; по возможности фиксируйте их в автоматическом регрессионном тесте. Если оператор изменил модель, старые результаты уже не являются гарантийными. Отдельно проверяйте, не ушёл ли секретный ключ в traceback при ошибке upstream-соединения. Любое сохранение беседы на сервере добавляйте только после явной политики хранения и удаления.

Критерии приёмки

  1. Второй вопрос использует предыдущую реплику без её дублирования.
  2. Новая сессия не наследует тестовый артикул.
  3. Вызов передаёт только разрешённые строковые роли и содержимое.

Типичные ошибки и чего не делать

  • Не предполагать, что Gradio хранит диалоги у модельного API самостоятельно.
  • Не отправлять произвольные мультимодальные поля как текст.
  • Не публиковать локальный тестовый сервер без отдельной защиты.

FAQ

Передаёт ли Gradio историю сам?

В fn история доступна, но отправку модели реализуете вы.

Нужна ли роль system?

Только если её поддерживает ваш модельный API.

Почему ответ бывает пустым?

Проверьте структуру и причину остановки ответа вашего API.

Официальные источники

Частые вопросы

Передаёт ли Gradio историю сам?

В fn история доступна, но отправку модели реализуете вы.

Нужна ли роль system?

Только если её поддерживает ваш модельный API.

Почему ответ бывает пустым?

Проверьте структуру и причину остановки ответа вашего API.

Читайте также

Комментарии

Пока тихо. Скажите первое слово