Опубликовано: 27 января 2025 г.
Объяснитель | Интернет | Расширения | Статус Chrome | Намерение |
---|---|---|---|---|
GitHub | Вид | Намерение экспериментировать |
Одна из ключевых функций Prompt API — сеансы. Они позволяют вести один или несколько непрерывных диалогов с ИИ-моделью, не теряя при этом контекст сказанного. В этом руководстве представлены лучшие практики управления сеансами с помощью языковой модели.
Вам может потребоваться управление сеансами для одного или нескольких параллельных сеансов, если вы разрабатываете классический чат-бот, где один пользователь взаимодействует с ИИ. Или если у вас есть система управления взаимоотношениями с клиентами, где один агент службы поддержки параллельно работает с несколькими клиентами и использует ИИ, чтобы помочь ему отслеживать различные разговоры.
Инициализация сеансов с помощью начального приглашения
Начальная подсказка задаёт контекст сеанса в начале. Например, вы можете использовать её, чтобы указать модели, как ей следует реагировать.
const languageModel = await LanguageModel.create({
initialPrompts: [{
role: 'system',
content: 'You are a helpful assistant and you speak like a pirate.'
}],
});
console.log(await languageModel.prompt('Tell me a joke.'));
// 'Avast ye, matey! What do you call a lazy pirate?\n\nA **sail-bum!**\n\nAhoy
// there, me hearties! Want to hear another one? \n'
Клонировать основной сеанс
Если вы хотите начать новый сеанс после завершения предыдущего или хотите вести несколько независимых бесед параллельно, вы можете клонировать основной сеанс.
Клон наследует параметры сеанса, такие как temperature
или topK
, а также историю взаимодействия в сеансе. Это полезно, например, если вы инициализировали основной сеанс с помощью начального запроса. Таким образом, вашему приложению нужно выполнить эту работу только один раз — все клоны наследуют начальный запрос из основного сеанса.
const languageModel = await LanguageModel.create({
initialPrompts: [{
role: 'system',
content: 'You are a helpful assistant and you speak like a pirate.'
}]
});
// The original session `languageModel` remains unchanged, and
// the two clones can be interacted with independently from each other.
const firstClonedLanguageModel = await languageModel.clone();
const secondClonedLanguageModel = await languageModel.clone();
// Interact with the sessions independently.
await firstClonedLanguageModel.prompt('Tell me a joke about parrots.');
await secondClonedLanguageModel.prompt('Tell me a joke about treasure troves.');
// Each session keeps its own context.
// The first session's context is jokes about parrots.
await firstClonedLanguageModel.prompt('Tell me another.');
// The second session's context is jokes about treasure troves.
await secondClonedLanguageModel.prompt('Tell me another.');
Восстановить прошлый сеанс
С помощью начальных подсказок вы можете подготовить модель с помощью набора примеров подсказок и ответов для получения лучших результатов. Это часто используется при многократных подсказках для создания ответов, отражающих ваши ожидания.
Если вы отслеживаете текущие сеансы связи с моделью, вы можете использовать этот подход для восстановления сеанса. Например, после перезапуска браузера вы можете помочь пользователю продолжить работу с моделью с того места, где он остановился. Один из подходов — хранить историю сеанса в локальном хранилище.
// Restore the session from localStorage, or initialize a new session.
// The UUID is hardcoded here, but would come from a
// session picker in your user interface.
const uuid = '7e62c0e0-6518-4658-bc38-e7a43217df87';
function getSessionData(uuid) {
try {
const storedSession = localStorage.getItem(uuid);
return storedSession ? JSON.parse(storedSession) : false;
} catch {
return false;
}
}
let sessionData = getSessionData(uuid);
// Initialize a new session.
if (!sessionData) {
// Get the current default parameters so they can be restored as they were,
// even if the default values change in the future.
const { defaultTopK, defaultTemperature } =
await LanguageModel.params();
sessionData = {
initialPrompts: [],
topK: defaultTopK,
temperature: defaultTemperature,
};
}
// Initialize the session with the (previously stored or new) session data.
const languageModel = await LanguageModel.create(sessionData);
// Keep track of the ongoing conversion and store it in localStorage.
const prompt = 'Tell me a joke';
try {
const stream = languageModel.promptStreaming(prompt);
let result = '';
// You can already work with each `chunk`, but then store
// the final `result` in history.
for await (const chunk of stream) {
// In practice, you'd render the chunk.
console.log(chunk);
result = chunk;
}
sessionData.initialPrompts.push(
{ role: 'user', content: prompt },
{ role: 'assistant', content: result },
);
// To avoid growing localStorage infinitely, make sure to delete
// no longer used sessions from time to time.
localStorage.setItem(uuid, JSON.stringify(sessionData));
} catch (err) {
console.error(err.name, err.message);
}
Сохраните квоту сеанса, позволив пользователю остановить модель
У каждого сеанса есть контекстное окно, которое можно увидеть, открыв соответствующие поля сеанса inputQuota
и inputUsage
.
const { inputQuota, inputUsage } = languageModel;
const inputQuotaLeft = inputQuota - inputUsage;
При превышении этого контекстного окна сеанс теряет отслеживание самых старых сообщений. Это может привести к ухудшению результатов, если контекст был важен. Чтобы сохранить квоту, разрешите пользователю останавливать сеанс с помощью AbortController
, если он считает ответ модели бесполезным.
Методы prompt()
и promptStreaming()
принимают необязательный второй параметр с полем signal
, чтобы позволить пользователю остановить сеанс.
const controller = new AbortController();
stopButton.onclick = () => controller.abort();
try {
const stream = languageModel.promptStreaming('Write me a poem!', {
signal: controller.signal,
});
for await (const chunk of stream) {
console.log(chunk);
}
} catch (err) {
// Ignore `AbortError` errors.
if (err.name !== 'AbortError') {
console.error(err.name, err.message);
}
}
Удалить неиспользуемые сеансы
Каждый сеанс занимает память. Если вы запустили несколько больших сеансов, это может стать проблемой. Удалите неиспользуемые сеансы, чтобы повысить доступность ресурсов.
Демо
Посмотрите на управление сеансами ИИ в действии в демоверсии управления сеансами ИИ . Создавайте несколько параллельных диалогов с помощью Prompt API, обновляйте вкладку или даже перезапускайте браузер и продолжайте с того места, где остановились. Исходный код см. на GitHub .
Раскройте весь потенциал Prompt API
Продуманное управление сеансами ИИ с помощью этих методов и передовых практик позволит вам раскрыть весь потенциал Prompt API, создавая более эффективные, отзывчивые и ориентированные на пользователя приложения. Вы также можете комбинировать эти подходы, например, позволяя пользователю клонировать восстановленный прошлый сеанс для запуска сценариев «что если».
Благодарности
Это руководство было рецензировано Себастьяном Бенцем , Андре Бандаррой , Франсуа Бофором и Александрой Клеппер .