Опубликовано: 27 января 2025 г.
Объяснитель | Веб | Расширения | Статус Хрома | Намерение |
---|---|---|---|---|
GitHub | Вид | Намерение экспериментировать |
Одной из ключевых особенностей API Prompt являются сеансы. Они позволяют вам вести один или несколько непрерывных разговоров с моделью ИИ, не теряя при этом контекст сказанного. В этом руководстве представлены лучшие практики управления сеансами с помощью языковой модели.
Вы можете захотеть заняться управлением сеансами для одного или нескольких параллельных сеансов, если вы создаете классического чат-бота, где один пользователь взаимодействует с ИИ. Или, если у вас есть системы управления взаимоотношениями с клиентами, где один агент поддержки работает с несколькими клиентами параллельно и использует ИИ, чтобы помочь агенту поддержки отслеживать различные разговоры.
Инициализируйте сеанс с помощью начального приглашения
Начальная подсказка устанавливает контекст сеанса в начале. Например, вы можете использовать начальную подсказку, чтобы сообщить модели, как она должна реагировать.
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.');
Восстановить прошлый сеанс
С начальными подсказками вы можете подготовить модель с набором примеров подсказок и ответов, чтобы получить лучшие результаты. Это часто используется в подсказках n-shot , чтобы создавать ответы, которые отражают ваши ожидания.
Если вы отслеживаете текущие разговоры с моделью, вы можете использовать эту практику для восстановления сеанса. Например, после перезапуска браузера вы можете помочь пользователю продолжить взаимодействие с моделью с того места, где он остановился. Один из подходов — отслеживать историю сеанса в локальном хранилище.
// 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);
}
Сохраните квоту сеанса, позволив пользователю остановить модель
У каждого сеанса есть контекстное окно, которое можно увидеть, открыв соответствующие поля сеанса maxTokens
, tokensLeft
и tokensSoFar
.
const { maxTokens, tokensLeft, tokensSoFar } = languageModel;
При превышении этого контекстного окна сеанс теряет самые старые сообщения, что может быть нежелательно, поскольку этот контекст мог быть важным. Чтобы сохранить квоту, если после отправки запроса пользователь видит, что ответ не будет полезным, разрешите ему остановить языковую модель от ответа, используя 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);
}
}
Демо
Посмотрите на управление сеансами AI в действии в демонстрации управления сеансами AI . Создайте несколько параллельных разговоров с помощью API Prompt, перезагрузите вкладку или даже перезапустите браузер и продолжайте с того места, где остановились. Смотрите исходный код на GitHub .
Раскройте весь потенциал Prompt API
Продуманно управляя сеансами ИИ с помощью этих методов и лучших практик, вы можете раскрыть весь потенциал API Prompt, предоставляя более эффективные, отзывчивые и ориентированные на пользователя приложения. Вы также можете объединить эти подходы, например, позволив пользователю клонировать восстановленный прошлый сеанс, чтобы он мог запускать сценарии «что если».
Благодарности
Это руководство было рецензировано Себастьяном Бенцем , Андре Бандаррой , Франсуа Бофором и Александрой Клеппер .
,Опубликовано: 27 января 2025 г.
Объяснитель | Веб | Расширения | Статус Хрома | Намерение |
---|---|---|---|---|
GitHub | Вид | Намерение экспериментировать |
Одной из ключевых особенностей API Prompt являются сеансы. Они позволяют вам вести один или несколько непрерывных разговоров с моделью ИИ, не теряя при этом контекст сказанного. В этом руководстве представлены лучшие практики управления сеансами с помощью языковой модели.
Вы можете захотеть заняться управлением сеансами для одного или нескольких параллельных сеансов, если вы создаете классического чат-бота, где один пользователь взаимодействует с ИИ. Или, если у вас есть системы управления взаимоотношениями с клиентами, где один агент поддержки работает с несколькими клиентами параллельно и использует ИИ, чтобы помочь агенту поддержки отслеживать различные разговоры.
Инициализируйте сеанс с помощью начального приглашения
Начальная подсказка устанавливает контекст сеанса в начале. Например, вы можете использовать начальную подсказку, чтобы сообщить модели, как она должна реагировать.
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.');
Восстановить прошлый сеанс
С начальными подсказками вы можете подготовить модель с набором примеров подсказок и ответов, чтобы получить лучшие результаты. Это часто используется в подсказках n-shot , чтобы создавать ответы, которые отражают ваши ожидания.
Если вы отслеживаете текущие разговоры с моделью, вы можете использовать эту практику для восстановления сеанса. Например, после перезапуска браузера вы можете помочь пользователю продолжить взаимодействие с моделью с того места, где он остановился. Один из подходов — отслеживать историю сеанса в локальном хранилище.
// 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);
}
Сохраните квоту сеанса, позволив пользователю остановить модель
У каждого сеанса есть контекстное окно, которое можно увидеть, открыв соответствующие поля сеанса maxTokens
, tokensLeft
и tokensSoFar
.
const { maxTokens, tokensLeft, tokensSoFar } = languageModel;
При превышении этого контекстного окна сеанс теряет самые старые сообщения, что может быть нежелательно, поскольку этот контекст мог быть важным. Чтобы сохранить квоту, если после отправки запроса пользователь видит, что ответ не будет полезным, разрешите ему остановить языковую модель от ответа, используя 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);
}
}
Демо
Посмотрите на управление сеансами AI в действии в демонстрации управления сеансами AI . Создайте несколько параллельных разговоров с помощью API Prompt, перезагрузите вкладку или даже перезапустите браузер и продолжайте с того места, где остановились. Смотрите исходный код на GitHub .
Раскройте весь потенциал Prompt API
Продуманно управляя сеансами ИИ с помощью этих методов и лучших практик, вы можете раскрыть весь потенциал API Prompt, предоставляя более эффективные, отзывчивые и ориентированные на пользователя приложения. Вы также можете объединить эти подходы, например, позволив пользователю клонировать восстановленный прошлый сеанс, чтобы он мог запускать сценарии «что если».
Благодарности
Это руководство было рецензировано Себастьяном Бенцем , Андре Бандаррой , Франсуа Бофором и Александрой Клеппер .