게시일: 2025년 1월 27일
Prompt API는 Chrome팀에서 살펴보고 있는 기본 제공 AI API 중 하나입니다. 사전 미리보기 프로그램에 참여하여 앱에서 로컬로 테스트하거나 Chrome 확장 프로그램용 Prompt API 출처 체험판에 가입하여 Chrome 확장 프로그램에서 프로덕션으로 테스트할 수 있습니다. Prompt API의 주요 기능 중 하나는 세션입니다. 이를 통해 AI 모델과 하나 이상의 대화를 진행할 수 있으며, 모델이 대화의 맥락을 놓치지 않습니다. 이 가이드에서는 언어 모델을 사용한 세션 관리에 관한 권장사항을 소개합니다.
하나 이상의 동시 세션에 대한 세션 관리의 사용 사례는 한 사용자가 AI와 상호작용하는 기존 챗봇, 한 명의 고객 지원 담당자가 여러 고객을 동시에 처리하고 AI를 활용하여 다양한 대화를 추적하는 고객 관계 관리 시스템을 들 수 있습니다.
시스템 프롬프트로 세션 초기화
먼저 알아야 할 개념은 시스템 프롬프트입니다. 세션 시작 시 세션의 전반적인 컨텍스트를 설정합니다. 예를 들어 시스템 프롬프트를 사용하여 모델에 응답 방법을 지시할 수 있습니다.
// Make this work in web apps and in extensions.
const aiNamespace = self.ai || chrome.aiOriginTrial || chrome.ai;
const languageModel = await aiNamespace.languageModel.create({
systemPrompt: '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
와 같은 세션 매개변수와 잠재적인 세션 상호작용 기록을 상속합니다.
이는 예를 들어 시스템 프롬프트로 기본 세션을 초기화한 경우에 유용합니다. 이렇게 하면 앱에서 이 작업을 한 번만 실행하면 되며 모든 클론은 기본 세션에서 상속받습니다.
// Make this work in web apps and in extensions.
const aiNamespace = self.ai || chrome.aiOriginTrial || chrome.ai;
const languageModel = await aiNamespace.languageModel.create({
systemPrompt: '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샷 프롬프팅에 사용하는 것입니다. 즉, n개의 예시 프롬프트와 응답으로 모델을 준비하여 실제 프롬프트에 대한 응답이 더 정확해지도록 하는 것입니다. 모델과의 대화가 진행 중인 경우 세션을 복원하는 초기 프롬프트 개념을 '악용'하여(예: 브라우저를 다시 시작한 후) 사용자가 중단한 부분부터 모델을 계속 사용할 수 있습니다. 다음 코드 스니펫은 localStorage에서 세션 기록을 추적한다고 가정하여 이 문제를 해결하는 방법을 보여줍니다.
// Make this work in web apps and in extensions.
const aiNamespace = self.ai || chrome.aiOriginTrial || chrome.ai;
// 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 aiNamespace.languageModel.capabilities();
sessionData = {
systemPrompt: '',
initialPrompts: [],
topK: defaultTopK,
temperature: defaultTemperature,
};
}
// Initialize the session with the (previously stored or new) session data.
const languageModel = await aiNamespace.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 세션 관리가 작동하는 모습을 확인하세요. Prompt API로 여러 대화목록을 동시에 만들고, 탭을 새로고침하거나 브라우저를 다시 시작하고, 중단한 부분부터 계속 진행하세요. GitHub의 소스 코드를 참고하세요.
결론
이러한 기법과 권장사항을 사용하여 AI 세션을 신중하게 관리하면 Prompt API의 잠재력을 최대한 활용하여 더 효율적이고 반응이 빠르며 사용자 중심의 애플리케이션을 제공할 수 있습니다. 이러한 접근 방식을 결합할 수도 있습니다. 예를 들어 사용자가 복원된 이전 세션을 클론하여 '가정' 시나리오를 실행할 수 있도록 허용할 수 있습니다. 즐겁게 프롬프트를 작성해 보시기를 바랍니다.