프롬프트 API

커뮤니티 그룹 보고서 초안,

이 문서에 대한 자세한 정보
이 버전:
https://webmachinelearning.github.io/prompt-api
이슈 추적:
GitHub
편집자:
(Google)
전 편집자:
Domenic Denicola (Google)

초록

프롬프트 API는 웹 페이지가 언어 모델에 직접 프롬프트를 보낼 수 있는 기능을 제공합니다

이 문서의 상태

이 명세는 웹 머신 러닝 커뮤니티 그룹에 의해 발행되었습니다. 이는 W3C 표준이 아니며 W3C 표준화 과정에도 포함되어 있지 않습니다. 다음 사항에 유의하십시오. W3C 커뮤니티 기여자 라이선스 계약 (CLA) 에 따라 제한적인 옵트아웃 및 기타 조건이 적용됩니다. 자세한 내용은 W3C 커뮤니티 및 비즈니스 그룹을 참조하십시오.

1. 소개

Prompt API는 웹 페이지가 브라우저가 제공하는 언어 모델에 직접 프롬프트를 보낼 수 있는 기능을 제공합니다. 이는 기반 모델의 구체적인 세부 사항(예: 템플릿 처리 또는 토큰화)을 추상화하는 통일된 JavaScript API를 제공합니다. 내장 언어 모델을 활용함으로써 민감한 데이터의 로컬 처리, 오프라인 사용, 모델 공유, 그리고 클라우드 기반 또는 자체 모델 가져오기 방식에 비해 낮은 비용과 같은 이점을 제공합니다.

2. 의존성

이 명세는 Infra Standard에 의존합니다. [INFRA]

웹 플랫폼의 나머지 부분과 마찬가지로, 이러한 API에서 인간 언어는 "ja", "en-US", "sr-Cyrl" 또는 "de-CH-1901-x-phonebk-extended"와 같은 BCP 47 언어 태그로 식별됩니다. 유효성 검사, 정규화, 언어 태그 매칭에 사용되는 구체적인 알고리즘은 ECMAScript Internationalization API Specification의 것이며, 이는 다시 처리 일부를 Unicode Locale Data Markup Language (LDML)에 위임합니다. [BCP47] [ECMA-402] [UTS35].

이러한 API는 머신 러닝 모델에 의해 구동될 것으로 예상되는 API 계열의 일부이며, 공통 API 표면 관용구와 명세 패턴을 공유합니다. 현재 이러한 공유 부분에 대한 명세 텍스트는 Writing Assistance APIs § 5 Shared infrastructure에 있으며, 공통 프라이버시 및 보안 고려사항은 Writing Assistance APIs § 6 Privacy considerationsWriting Assistance APIs § 7 Security considerations에서 논의됩니다. 이러한 API를 구현하려면 해당 공유 인프라를 구현하고, 그 프라이버시 및 보안 고려사항을 준수해야 합니다. 하지만 실제 writing assistance API를 구현하거나 노출할 필요는 없습니다. [WRITING-ASSISTANCE-APIS]

3. API

[Exposed=Window, SecureContext]
interface LanguageModel : EventTarget {
  static Promise<LanguageModel> create(optional LanguageModelCreateOptions options = {});
  static Promise<Availability> availability(optional LanguageModelCreateCoreOptions options = {});
  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  static Promise<LanguageModelParams?> params();

  // These will throw "NotSupportedError" DOMExceptions if role = "system"
  Promise<DOMString> prompt(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  ReadableStream promptStreaming(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  Promise<undefined> append(
    LanguageModelPrompt input,
    optional LanguageModelAppendOptions options = {}
  );


  Promise<double> measureContextUsage(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  readonly attribute double contextUsage;
  readonly attribute unrestricted double contextWindow;
  attribute EventHandler oncontextoverflow;

  // **DEPRECATED**: This method is only available in extension contexts.
  Promise<double> measureInputUsage(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  // **DEPRECATED**: This attribute is only available in extension contexts.
  readonly attribute double inputUsage;
  // **DEPRECATED**: This attribute is only available in extension contexts.
  readonly attribute unrestricted double inputQuota;
  // **DEPRECATED**: This attribute is only available in extension contexts.
  attribute EventHandler onquotaoverflow;

  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  readonly attribute unsigned long topK;
  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  readonly attribute float temperature;

  Promise<LanguageModel> clone(optional LanguageModelCloneOptions options = {});
};
LanguageModel includes DestroyableModel;

// **EXPERIMENTAL**: Only available in extension and experimental contexts.
[Exposed=Window, SecureContext]
interface LanguageModelParams {
  readonly attribute unsigned long defaultTopK;
  readonly attribute unsigned long maxTopK;
  readonly attribute float defaultTemperature;
  readonly attribute float maxTemperature;
};


callback LanguageModelToolFunction = Promise<DOMString> (any... arguments);

// A description of a tool call that a language model can invoke.
dictionary LanguageModelTool {
  required DOMString name;
  required DOMString description;
  // JSON schema for the input parameters.
  required object inputSchema;
  // The function to be invoked by user agent on behalf of language model.
  required LanguageModelToolFunction execute;
};

dictionary LanguageModelCreateCoreOptions {
  // Note: these two have custom out-of-range handling behavior, not in the IDL layer.
  // They are unrestricted double so as to allow +Infinity without failing.
  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  unrestricted double topK;
  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  unrestricted double temperature;

  sequence<LanguageModelExpected> expectedInputs;
  sequence<LanguageModelExpected> expectedOutputs;
  sequence<LanguageModelTool> tools;
};

dictionary LanguageModelCreateOptions : LanguageModelCreateCoreOptions {
  AbortSignal signal;
  CreateMonitorCallback monitor;

  sequence<LanguageModelMessage> initialPrompts;
};

dictionary LanguageModelPromptOptions {
  object responseConstraint;
  boolean omitResponseConstraintInput = false;
  AbortSignal signal;
};

dictionary LanguageModelAppendOptions {
  AbortSignal signal;
};

dictionary LanguageModelCloneOptions {
  AbortSignal signal;
};

dictionary LanguageModelExpected {
  required LanguageModelMessageType type;
  sequence<DOMString> languages;
};

// The argument to the prompt() method and others like it

typedef (
  sequence<LanguageModelMessage>
  // Shorthand for `[{ role: "user", content: [{ type: "text", value: providedValue }] }]`
  or DOMString
) LanguageModelPrompt;

dictionary LanguageModelMessage {
  required LanguageModelMessageRole role;

  // The DOMString branch is shorthand for `[{ type: "text", value: providedValue }]`
  required (DOMString or sequence<LanguageModelMessageContent>) content;

  boolean prefix = false;
};

dictionary LanguageModelMessageContent {
  required LanguageModelMessageType type;
  required LanguageModelMessageValue value;
};

enum LanguageModelMessageRole { "system", "user", "assistant" };

enum LanguageModelMessageType { "text", "image", "audio", "tool-call", "tool-response" };

typedef (
  ImageBitmapSource
  or AudioBuffer
  or BufferSource
  or DOMString
) LanguageModelMessageValue;

3.1. 생성

정적 create(options) 메서드 단계는 다음과 같습니다:
  1. options, "language-model", 언어 모델 옵션 유효성 검사 및 정규화, 언어 모델 옵션 가용성 계산, 언어 모델 다운로드, 언어 모델 초기화, 언어 모델 객체 생성, 그리고 false가 주어졌을 때 AI 모델 객체를 생성한 결과를 반환합니다.

LanguageModelCreateCoreOptions options가 주어졌을 때 언어 모델 옵션을 유효성 검사하고 정규화하려면, 다음 단계를 수행합니다. 이 단계는 언어 태그를 정규화하고 중복 제거하기 위해 options를 제자리에서 변경하며, 유효하지 않은 항목이 있으면 예외를 throw합니다.
  1. options["expectedInputs"]가 존재하면, options["expectedInputs"]의 각 expected에 대해 다음을 수행합니다:

    1. expected["languages"]가 존재하면, expected와 "languages"가 주어졌을 때 언어 태그를 유효성 검사하고 정규화합니다.

  2. options["expectedOutputs"]가 존재하면, options["expectedOutputs"]의 각 expected에 대해 다음을 수행합니다:

    1. expected["languages"]가 존재하면, expected와 "languages"가 주어졌을 때 언어 태그를 유효성 검사하고 정규화합니다.

  3. options["initialPrompts"]가 존재하면, 다음을 수행합니다:

    1. 존재한다면 options["expectedInputs"]를, 그렇지 않으면 빈 listexpectedInputs로 둡니다.

    2. expectedInputs가 주어졌을 때 예상 콘텐츠 타입 가져오기의 결과를 expectedInputTypes로 둡니다.

    3. options["initialPrompts"], expectedInputTypes, 그리고 false가 주어졌을 때 프롬프트를 유효성 검사하고 정규화하기를 수행합니다.

LanguageModelCreateCoreOptions options가 주어졌을 때 언어 모델을 다운로드하려면:
  1. Assert: 이 단계는 병렬로 실행되고 있습니다.

  2. options에 따라 사용자 에이전트가 언어 모델에 프롬프트를 보내는 데 필요한 모든 것에 대한 다운로드 프로세스를 시작합니다. 여기에는 기본 AI 모델, 특정 언어 또는 옵션 값에 대한 파인튜닝, 또는 기타 리소스가 포함될 수 있습니다.

  3. 어떤 이유로든 다운로드 프로세스를 시작할 수 없으면 false를 반환합니다.

  4. true를 반환합니다.

LanguageModelCreateOptions options가 주어졌을 때 언어 모델을 초기화하려면:
  1. Assert: 이 단계는 병렬로 실행되고 있습니다.

  2. options가 주어졌을 때 언어 모델 옵션 가용성 계산의 결과를 availability로 둡니다.

    1. availability가 null이거나 unavailable이면, DOMException 오류 정보를 반환합니다. 그 name은 "NotSupportedError"이고, 그 details에는 적절한 세부 정보가 포함됩니다.

  3. 사용자 에이전트의 프롬프트 기능을 뒷받침하는 AI 모델에 필요한 초기화 작업을 수행합니다.

    여기에는 options를 지원하는 데 필요한 적절한 모델 및 파인튜닝을 메모리에 로드하는 것이 포함될 수 있습니다.

    1. options["initialPrompts"]가 존재하면, 다음을 수행합니다:

      1. 존재한다면 options["expectedInputs"]를, 그렇지 않으면 빈 listexpectedInputs로 둡니다.

      2. expectedInputs가 주어졌을 때 예상 콘텐츠 타입 가져오기의 결과를 expectedInputTypes로 둡니다.

      3. options["initialPrompts"], expectedInputTypes, 그리고 false가 주어졌을 때 프롬프트를 유효성 검사하고 정규화하기의 결과를 initialMessages로 둡니다.

      4. initialMessages를 모델의 컨텍스트 윈도우에 로드합니다.

    2. options["tools"]가 존재하면, options["tools"]를 모델의 컨텍스트 윈도우에 로드합니다.

  4. options를 로드하는 과정에서 모델의 컨텍스트 윈도우를 모두 사용하게 되어 초기화가 실패한 경우, 다음을 수행합니다:

    1. options를 인코딩하는 데 필요한 컨텍스트 윈도우의 양을 requested로 둡니다. options를 입력으로 인코딩하는 방식은 구현 정의입니다.

    2. 사용자 에이전트가 지원하는 최대 컨텍스트 윈도우 크기를 maximum으로 둡니다.

    3. Assert: requestedmaximum보다 큽니다. (이것이 이 오류 분기에 도달한 방식입니다.)

    4. quota exceeded error information를 반환합니다. 그 requestedrequested이고 quotamaximum입니다.

  5. 그 밖의 이유로 초기화가 실패한 경우, DOMException 오류 정보를 반환합니다. 그 name은 "OperationError"이고, 그 details에는 적절한 세부 정보가 포함됩니다.

  6. null을 반환합니다.

realm realmLanguageModelCreateOptions options가 주어졌을 때 언어 모델 객체를 생성하려면:
  1. Assert: 이 단계는 realmsurrounding agentevent loop에서 실행되고 있습니다.

  2. 이 모델에 대해 사용자 에이전트가 사용할 수 있는 컨텍스트 윈도우의 양을 contextWindowSize로 둡니다. (이 값은 구현 정의이며, 예를 들어 사용자의 메모리나 JavaScript 문자열의 제한 외에 특정 제한이 없는 경우 +∞일 수 있습니다.)

  3. LanguageModelMessage들의 빈 listinitialMessages로 둡니다.

  4. initialMessagesUsage를 0으로 둡니다.

  5. options["initialPrompts"]가 존재하면, 다음을 수행합니다:

    1. 존재한다면 options["expectedInputs"]를, 그렇지 않으면 빈 listexpectedInputs로 둡니다.

    2. expectedInputs가 주어졌을 때 예상 콘텐츠 타입 가져오기의 결과를 expectedInputTypes로 둡니다.

    3. options["initialPrompts"], expectedInputTypes, 그리고 false가 주어졌을 때 프롬프트를 유효성 검사하고 정규화하기의 결과로 initialMessages를 설정합니다.

    4. initialMessagesoptions["signal"]가 주어졌을 때 언어 모델 컨텍스트 사용량 측정의 결과로 initialMessagesUsage를 설정합니다.

  6. realm에서 생성된 새 LanguageModel 객체를 다음과 함께 반환합니다

    초기 메시지

    initialMessages

    top K

    존재한다면 options["topK"]를, 그렇지 않으면 구현 정의 값을 사용합니다

    temperature

    존재한다면 options["temperature"]를, 그렇지 않으면 구현 정의 값을 사용합니다

    예상 입력

    존재한다면 options["expectedInputs"]를, 그렇지 않으면 빈 list를 사용합니다

    예상 출력

    존재한다면 options["expectedOutputs"]를, 그렇지 않으면 빈 list를 사용합니다

    도구

    존재한다면 options["tools"]를, 그렇지 않으면 빈 list를 사용합니다

    컨텍스트 윈도우 크기

    contextWindowSize

    현재 컨텍스트 사용량

    initialMessagesUsage

3.2. 가용성

정적 availability(options) 메서드 단계는 다음과 같습니다:
  1. options, "language-model", 언어 모델 옵션 유효성 검사 및 정규화, 그리고 언어 모델 옵션 가용성 계산이 주어졌을 때 AI 모델 가용성을 계산한 결과를 반환합니다.

LanguageModelCreateCoreOptions options가 주어졌을 때 언어 모델 옵션 가용성을 계산하려면, 다음 단계를 수행합니다. 이 단계는 Availability 값 또는 null을 반환하며, 언어 태그를 가장 적합한 매치로 업데이트하기 위해 options를 제자리에서 변경합니다.
  1. Assert: 이 알고리즘은 병렬로 실행되고 있습니다.

  2. 언어 모델 비옵션 가용성availability로 둡니다.

  3. availability가 null이면 null을 반환합니다.

  4. availability를 포함하는 listavailabilities로 둡니다.

  5. 그 언어의 텍스트로 언어 모델에 프롬프트를 보내는 목적이 주어졌을 때 언어 가용성 파티션 가져오기의 결과를 inputPartition으로 둡니다.

  6. 그 언어로 언어 모델 출력을 생성하는 목적이 주어졌을 때 언어 가용성 파티션 가져오기의 결과를 outputPartition으로 둡니다.

  7. options["expectedInputs"]가 존재하면, options["expectedInputs"]의 각 expected에 대해 다음을 수행합니다:

    1. expected["languages"]가 존재하면, 다음을 수행합니다:

      1. expected["languages"]와 inputPartition이 주어졌을 때 언어 가용성 계산의 결과를 inputLanguageAvailability로 둡니다.

      2. inputLanguageAvailabilityavailabilitiesAppend합니다.

    2. expected["type"]와 true가 주어졌을 때 언어 모델 콘텐츠 타입 가용성inputTypeAvailability로 둡니다.

    3. inputTypeAvailabilityavailabilitiesAppend합니다.

  8. options["expectedOutputs"]가 존재하면, options["expectedOutputs"]의 각 expected에 대해 다음을 수행합니다:

    1. expected["languages"]가 존재하면, 다음을 수행합니다:

      1. expected["languages"]와 outputPartition이 주어졌을 때 언어 가용성 계산의 결과를 outputLanguageAvailability로 둡니다.

      2. outputLanguageAvailabilityavailabilitiesAppend합니다.

    2. expected["type"]와 false가 주어졌을 때 언어 모델 콘텐츠 타입 가용성outputTypeAvailability로 둡니다.

    3. outputTypeAvailabilityavailabilitiesAppend합니다.

  9. availabilities가 주어졌을 때 최소 가용성을 반환합니다.

언어 모델 비옵션 가용성은 다음 단계로 주어집니다. 이 단계는 Availability 값 또는 null을 반환합니다.
  1. Assert: 이 알고리즘은 병렬로 실행되고 있습니다.

  2. 사용자 에이전트가 언어 모델에 프롬프트를 보내는 것을 지원할 수 있는지 판단하려고 시도하는 중에 어떤 오류가 있고, 사용자 에이전트가 이를 일시적인 것으로 판단하는 경우(다시 질의하면 그러한 오류가 더 이상 발생하지 않을 수 있는 경우), null을 반환합니다.

  3. 사용자 에이전트가 언어 모델에 프롬프트를 보내는 것을 현재 지원하면, "available"을 반환합니다.

  4. 사용자 에이전트가 언어 모델에 프롬프트를 보내는 것을 지원할 수 있을 것으로 믿지만, 이미 진행 중인 다운로드가 완료된 후에만 가능하다면, "downloading"을 반환합니다.

  5. 사용자 에이전트가 언어 모델에 프롬프트를 보내는 것을 지원할 수 있을 것으로 믿지만, 현재 진행 중이 아닌 다운로드를 수행한 후에만 가능하다면, "downloadable"을 반환합니다.

  6. 그렇지 않으면, "unavailable"을 반환합니다.

LanguageModelMessageType type 및 boolean isInput이 주어졌을 때 언어 모델 콘텐츠 타입 가용성은 다음 단계로 주어집니다. 이 단계는 Availability 값을 반환합니다.
  1. Assert: 이 알고리즘은 병렬로 실행되고 있습니다.

  2. isInput이 true인 경우 입력으로, isInput이 false인 경우 출력으로 사용자 에이전트가 type현재 지원하면, "available"을 반환합니다.

  3. 사용자 에이전트가 type을 그러한 용도로 지원할 수 있을 것으로 믿지만, 이미 진행 중인 다운로드가 완료된 후에만 가능하다면, "downloading"을 반환합니다.

  4. 사용자 에이전트가 type을 그러한 용도로 지원할 수 있을 것으로 믿지만, 현재 진행 중이 아닌 다운로드를 수행한 후에만 가능하다면, "downloadable"을 반환합니다.

  5. 그렇지 않으면, "unavailable"을 반환합니다.

3.3. LanguageModel 클래스

모든 LanguageModel은 생성 중에 설정되는 초기 메시지를 가집니다. 이는 LanguageModelMessage들의 list입니다.

모든 LanguageModel은 생성 중에 설정되는 unsigned long인 top K를 가집니다.

모든 LanguageModel은 생성 중에 설정되는 float인 temperature를 가집니다.

모든 LanguageModel은 생성 중에 설정되는 예상 입력을 가집니다. 이는 LanguageModelExpected들의 list입니다.

모든 LanguageModel은 생성 중에 설정되는 예상 출력을 가집니다. 이는 LanguageModelExpected들의 list입니다.

모든 LanguageModel은 생성 중에 설정되는 도구를 가집니다. 이는 LanguageModelTool들의 list입니다.

모든 LanguageModel은 생성 중에 설정되는 unrestricted double인 컨텍스트 윈도우 크기를 가집니다.

모든 LanguageModel은 처음에 0인 double인 현재 컨텍스트 사용량을 가집니다.


contextUsage getter 단계는 this현재 컨텍스트 사용량을 반환하는 것입니다.

inputUsage getter 단계는 this현재 컨텍스트 사용량을 반환하는 것입니다.

contextWindow getter 단계는 this컨텍스트 윈도우 크기를 반환하는 것입니다.

inputQuota getter 단계는 this컨텍스트 윈도우 크기를 반환하는 것입니다.

topK getter 단계는 thistop K를 반환하는 것입니다.

temperature getter 단계는 thistemperature를 반환하는 것입니다.


다음은 모든 LanguageModel 객체가 event handler IDL attributes로 지원해야 하는 이벤트 핸들러(및 그에 대응하는 이벤트 핸들러 이벤트 타입)입니다:

이벤트 핸들러 이벤트 핸들러 이벤트 타입
oncontextoverflow contextoverflow
onquotaoverflow quotaoverflow

prompt(input, options) 메서드 단계는 다음과 같습니다:
  1. options["responseConstraint"]가 존재하면 그것을, 그렇지 않으면 null을 responseConstraint로 둡니다.

  2. options["omitResponseConstraintInput"]를 omitResponseConstraintInput로 둡니다.

  3. chunkProduced, done, error, 그리고 stopProducing을 인수로 받아 다음 단계를 수행하는 알고리즘 단계를 operation으로 둡니다:

    1. this, input, omitResponseConstraintInput, responseConstraint, error, 그리고 stopProducing이 주어졌을 때 prefilling의 결과를 prefillSuccess로 둡니다.

    2. prefillSuccess가 true이면, this, responseConstraint, chunkProduced, done, error, 그리고 stopProducing이 주어졌을 때 generate를 수행합니다.

  4. this, options, 그리고 operation이 주어졌을 때 집계된 AI 모델 결과 가져오기의 결과를 반환합니다.

promptStreaming(input, options) 메서드 단계는 다음과 같습니다:
  1. options["responseConstraint"]가 존재하면 그것을, 그렇지 않으면 null을 responseConstraint로 둡니다.

  2. options["omitResponseConstraintInput"]를 omitResponseConstraintInput로 둡니다.

  3. chunkProduced, done, error, 그리고 stopProducing을 인수로 받아 다음 단계를 수행하는 알고리즘 단계를 operation으로 둡니다:

    1. this, input, omitResponseConstraintInput, responseConstraint, error, 그리고 stopProducing이 주어졌을 때 prefilling의 결과를 prefillSuccess로 둡니다.

    2. prefillSuccess가 true이면, this, responseConstraint, chunkProduced, done, error, 그리고 stopProducing이 주어졌을 때 generate를 수행합니다.

  4. this, options, 그리고 operation이 주어졌을 때 스트리밍 AI 모델 결과 가져오기의 결과를 반환합니다.

append(input, options) 메서드 단계는 다음과 같습니다:
  1. chunkProduced, done, error, 그리고 stopProducing을 인수로 받아 다음 단계를 수행하는 알고리즘 단계를 operation으로 둡니다:

    prefilling 알고리즘은 청크를 생성하지 않기 때문에 chunkProduced는 절대 호출되지 않습니다.

    1. this, input, false, null, error, 그리고 stopProducing이 주어졌을 때 prefilling의 결과를 prefillSuccess로 둡니다.

    2. prefillSuccess가 true이고 done이 null이 아니면, done을 수행합니다.

  2. this, options, 그리고 operation이 주어졌을 때 집계된 AI 모델 결과 가져오기의 결과를 반환합니다.

measureContextUsage(input, options) 메서드 단계는 다음과 같습니다:
  1. options["omitResponseConstraintInput"]가 true이고 options["responseConstraint"]가 존재하지 않으면, "TypeError" DOMException을 throw합니다.

  2. this예상 입력이 주어졌을 때 예상 콘텐츠 타입 가져오기의 결과를 expectedInputTypes로 둡니다.

  3. input, expectedInputTypes, 그리고 false가 주어졌을 때 프롬프트를 유효성 검사하고 정규화하기의 결과를 messages로 둡니다.

  4. options["responseConstraint"]가 존재하고 null이 아니며, options["omitResponseConstraintInput"]가 false이면, 구현은 모델의 동작을 안내하기 위해 구현 정의 LanguageModelMessagemessages에 삽입할 수 있습니다.

  5. stopMeasuring 인수를 받아, messagesstopMeasuring이 주어졌을 때 언어 모델 컨텍스트 사용량 측정의 결과를 반환하는 알고리즘 단계를 measureUsage로 둡니다.

  6. this, options, 그리고 measureUsage가 주어졌을 때 AI 모델 입력 사용량 측정의 결과를 반환합니다.

measureInputUsage(input, options) 메서드 단계는 다음과 같습니다:
  1. inputoptions가 주어졌을 때 measureContextUsage() 메서드 단계를 실행한 결과를 반환합니다.

clone(options) 메서드 단계는 다음과 같습니다:
  1. thisoptions가 주어졌을 때 언어 모델 복제의 결과를 반환합니다.

3.3.1. 사전 채우기 및 생성

다음이 주어졌을 때 prefill하려면:

다음 단계를 수행합니다:

  1. Assert: 이 알고리즘은 병렬로 실행되고 있습니다.

  2. model현재 컨텍스트 사용량이 0보다 크면 input, expectedInputTypes, true가, 그렇지 않으면 false가 주어졌을 때 프롬프트를 유효성 검사하고 정규화하기의 결과를 messages로 둡니다.

    이것이 예외 e를 throw하면, 다음을 수행합니다:

    1. error가 null이 아니면, enamename으로 하고 적절한 세부 정보를 포함하는 details를 가지는 DOMException 오류 정보가 주어졌을 때 error를 수행합니다.

    2. false를 반환합니다.

  3. responseConstraint가 null이 아니고 omitResponseConstraintInput이 false이면, 구현은 모델의 동작을 안내하기 위해 구현 정의 LanguageModelMessagemessages에 삽입할 수 있습니다.

  4. messagesstopPrefilling이 주어졌을 때 언어 모델 컨텍스트 사용량 측정의 결과를 requested로 둡니다.

  5. requested가 null이면 false를 반환합니다.

  6. requestederror information이면, 다음을 수행합니다:

    1. error가 null이 아니면, requested가 주어졌을 때 error를 수행합니다.

    2. false를 반환합니다.

  7. Assert: requested는 숫자입니다.

  8. model현재 컨텍스트 사용량 + requestedmodel컨텍스트 윈도우 크기보다 크면, 다음을 수행합니다:

    1. error가 null이 아니면, 다음을 수행합니다:

      1. model현재 컨텍스트 사용량 + requestedrequested로 하고, model컨텍스트 윈도우 크기quota로 하는 quota exceeded error informationerrorInfo로 둡니다.

      2. errorInfo가 주어졌을 때 error를 수행합니다.

    2. false를 반환합니다.

  9. model예상 입력이 주어졌을 때 예상 콘텐츠 타입 가져오기의 결과를 expectedInputTypes로 둡니다.

  10. 구현 정의 방식으로, messages를 포함하도록 기반 모델의 내부 상태를 갱신합니다.

    이 프로세스는 상태가 어떻게 갱신되는지를 안내하기 위해 model초기 메시지, modeltop K, modeltemperature, model예상 입력, model예상 출력, 그리고 model도구를 사용해야 합니다.

    이 프로세스는 § 4 프라이버시 고려사항§ 5 보안 고려사항에서 제공된 지침을 준수해야 합니다.

    이 프로세스 중에 stopPrefilling이 true를 반환하면 false를 반환합니다.

    사전 채우기 중에 오류가 발생한 경우:

    1. § 3.3.4 오류의 지침에 따라 오류를 error information errorInfo로 나타냅니다.

    2. error가 null이 아니면, errorInfo가 주어졌을 때 error를 수행합니다.

    3. false를 반환합니다.

  11. model현재 컨텍스트 사용량model현재 컨텍스트 사용량 + requested로 설정합니다.

  12. true를 반환합니다.

다음이 주어졌을 때 generate하려면:

다음 단계를 수행합니다:

  1. Assert: 이 알고리즘은 병렬로 실행되고 있습니다.

  2. 다음 지침의 적용을 받으며 구현 정의 방식으로, 현재 내부 상태를 기반으로 언어 모델에서 응답을 생성하는 프로세스를 시작합니다.

    이 프로세스는 모델의 동작을 안내하기 위해 model초기 메시지, modeltop K, modeltemperature, model예상 입력, model예상 출력, model도구, 그리고 responseConstraint를 사용해야 합니다.

    프롬프트 프로세스는 § 4 프라이버시 고려사항§ 5 보안 고려사항에서 제공된 지침을 준수해야 합니다.

    model도구가 비어 있지 않으면, 모델은 제공된 도구의 execute 함수를 호출하여 이를 사용할 수 있습니다.

  3. true인 동안:

    1. 다음 응답 데이터 청크가 생성되거나, 프로세스가 완료되거나, stopProducing 호출 결과가 true가 될 때까지 기다립니다.

    2. 그러한 청크가 성공적으로 생성되면:

      1. 이를 string chunk로 나타냅니다.

      2. chunkProduced가 null이 아니면, chunk가 주어졌을 때 chunkProduced를 수행합니다.

    3. 그렇지 않고 프로세스가 완료되었으면:

      1. done이 null이 아니면 done을 수행합니다.

      2. Break합니다.

    4. 그렇지 않고 stopProducing이 true를 반환하면, break합니다.

    5. 그렇지 않고 프롬프트 중에 오류가 발생했으면:

      1. § 3.3.4 오류의 지침에 따라 오류를 error information errorInfo로 나타냅니다.

      2. error가 null이 아니면, errorInfo가 주어졌을 때 error를 수행합니다.

      3. Break합니다.

3.3.2. 사용량

다음이 주어졌을 때 언어 모델 컨텍스트 사용량을 측정하려면:

다음 단계를 수행합니다:

  1. Assert: 이 알고리즘은 병렬로 실행되고 있습니다.

  2. messages가 주어졌을 때 prefill하기 위해 기반 모델로 전송될 구현 정의 입력을 inputToModel로 둡니다.

    이는 일반적으로 모든 입력의 인코딩으로 구성되며, 프롬프트 엔지니어링이나 기타 구현 정의 래퍼가 포함될 수 있습니다.

    이 프로세스 중에 stopMeasuring이 true를 반환하기 시작하면 null을 반환합니다.

    이 프로세스 중에 오류가 발생하면, § 3.3.4 오류의 지침에 따라 적절한 DOMException 오류 정보를 반환합니다.

  3. inputToModel이 기반 모델에 주어졌을 때 이를 나타내는 데 필요한 컨텍스트 사용량을 반환합니다. 정확한 계산 절차는 구현 정의이며, 다음 제약 조건의 적용을 받습니다.

    반환되는 컨텍스트 사용량은 음수가 아니어야 하며 유한해야 합니다. 이는 inputToModel 안의 데이터 양에 대략 비례해야 합니다.

    이는 언어 모델 토큰화 방식에서 입력을 표현하는 데 필요한 토큰 수일 수도 있고, 바이트 단위의 데이터 크기와 관련될 수도 있습니다.

    이 프로세스 중에 stopMeasuring이 true를 반환하기 시작하면, 대신 null을 반환합니다.

    이 프로세스 중에 오류가 발생하면, 대신 § 3.3.4 오류의 지침에 따라 적절한 DOMException 오류 정보를 반환합니다.

3.3.3. 옵션

LanguageModelExpected들의 list expectedContents가 주어졌을 때 예상 콘텐츠 타입을 가져오려면:
  1. LanguageModelMessageType들의 빈 listexpectedTypes로 둡니다.

  2. expectedContents의 각 expected에 대해 다음을 수행합니다:

    1. expectedTypesexpected["type"]를 포함하지 않으면, expected["type"]를 expectedTypesappend합니다.

  3. expectedTypes가 "text"를 포함하지 않으면, "text"를 expectedTypesappend합니다.

  4. expectedTypes를 반환합니다.

LanguageModelPrompt input, LanguageModelMessageType들의 list expectedTypes, 그리고 boolean hasAppendedInput이 주어졌을 때 프롬프트를 유효성 검사하고 정규화하려면, 다음 단계를 수행합니다. 반환 값은 "longhand" 형식의 LanguageModelMessage들의 비어 있지 않은 list가 됩니다.
  1. Assert: expectedTypes는 "text"를 contains합니다.

  2. inputstring이면, « «[ "role" → "user", "content" → « «[ "type" → "text", "value" → input ]» », "prefix" → false ]» »를 반환합니다.

  3. Assert: inputLanguageModelMessage들의 list입니다.

  4. input이 빈 list이면, « «[ "role" → "user", "content" → « «[ "type" → "text", "value" → "" ]» », "prefix" → false ]» »를 반환합니다.

  5. LanguageModelMessage들의 빈 listmessages로 둡니다.

  6. input의 각 message에 대해 다음을 수행합니다:

    1. message["content"]가 string이면, message«[ "role" → message["role"], "content" → « «[ "type" → "text", "value" → message["content"] ]» », "prefix" → message["prefix"] ]»로 설정합니다.

    2. message["prefix"]가 true이면, 다음을 수행합니다:

      1. message["role"]가 "assistant"가 아니면, "SyntaxError" DOMException을 throw합니다.

      2. messagemessages의 마지막 항목이 아니면, "SyntaxError" DOMException을 throw합니다.

    3. message["role"]가 "system"이면, 다음을 수행합니다:

      1. hasAppendedInput이 true이면, "TypeError" DOMException을 throw합니다.

    4. message["content"]가 빈 list이면, 다음을 수행합니다:

      1. «[ "type" → "text", "value" → "" ]»로 초기화된 새 LanguageModelMessageContentemptyContent로 둡니다.

      2. emptyContentmessage["content"]에 append합니다.

    5. message["content"]의 각 content에 대해 다음을 수행합니다:

      1. message["role"]가 "assistant"이고 content["type"]가 "text"가 아니면, "NotSupportedError" DOMException을 throw합니다.

      2. content["type"]가 "text"이고 content["value"]가 string이 아니면, "TypeError" DOMException을 throw합니다.

      3. content["type"]가 "image"이면, 다음을 수행합니다:

        1. expectedTypes가 "image"를 포함하지 않으면, "NotSupportedError" DOMException을 throw합니다.

        2. content["value"]가 ImageBitmapSource 또는 BufferSource가 아니면, "TypeError" DOMException을 throw합니다.

      4. content["type"]가 "audio"이면, 다음을 수행합니다:

        1. expectedTypes가 "audio"를 포함하지 않으면, "NotSupportedError" DOMException을 throw합니다.

        2. content["value"]가 AudioBuffer, BufferSource, 또는 Blob이 아니면, "TypeError" DOMException을 throw합니다.

    6. LanguageModelMessageContent들의 빈 listcontentWithContiguousTextCollapsed로 둡니다.

    7. lastTextContent를 null로 둡니다.

    8. message["content"]의 각 content에 대해 다음을 수행합니다:

      1. content["type"]가 "text"이면:

        1. lastTextContent가 null이면:

          1. contentcontentWithContiguousTextCollapsedAppend합니다.

          2. lastTextContentcontent로 설정합니다.

        2. 그렇지 않으면, lastTextContent["value"]를 lastTextContent["value"]와 content["value"]의 연결로 설정합니다.

          공백이나 다른 문자는 추가되지 않습니다. 따라서 « «[ "type" → "text", "foo" ]», «[ "type" → "text", "bar" ]» »는 « «[ "type" → "text", "foobar" ]»로 정규화됩니다.

      2. 그렇지 않으면:

        1. contentcontentWithContiguousTextCollapsedAppend합니다.

        2. lastTextContent를 null로 설정합니다.

      3. message["content"]를 contentWithContiguousTextCollapsed로 설정합니다.

    9. messagemessagesAppend합니다.

    10. hasAppendedInput을 true로 설정합니다.

  7. messages비어 있으면, "SyntaxError" DOMException을 throw합니다.

  8. messages를 반환합니다.

3.3.4. 오류

프롬프트가 실패하면, 다음 가능한 이유들이 웹 개발자에게 표면화될 수 있습니다. 이 표는 가능한 DOMException names와 구현이 이를 사용해야 하는 경우를 나열합니다:

DOMException name 시나리오
"NotAllowedError"

사용자 선택 또는 사용자 에이전트 정책에 의해 프롬프트가 비활성화되었습니다.

"NotReadableError"

모델 출력이 사용자 에이전트에 의해 필터링되었습니다. 예를 들어 유해하거나, 부정확하거나, 무의미한 것으로 감지되었기 때문입니다.

"NotSupportedError"

처리할 입력이 사용자 에이전트가 지원하지 않는 언어였거나, create() 호출에서 제대로 제공되지 않았습니다.

모델 출력이 사용자 에이전트가 지원하지 않는 언어가 되었습니다(예: 사용자 에이전트가 해당 출력 언어에 대해 충분한 품질 관리 테스트를 수행하지 않았기 때문).

"UnknownError"

사용자 에이전트가 모델에 프롬프트를 보낼 수 없고 동시에 § 4 프라이버시 고려사항 또는 § 5 보안 고려사항에 주어진 요구사항도 충족할 수 없다고 판단하는 경우를 포함한 그 밖의 모든 시나리오입니다. 또는 사용자 에이전트가 실패 이유를 공개하지 않는 것을 선호하는 경우입니다.

이 표는 prompt API에 의해 표면화될 수 있는 예외의 전체 목록을 제공하지 않습니다. 이는 특정 구현 정의 단계에서 나올 수 있는 것만 포함합니다.

LanguageModel modelLanguageModelCloneOptions options가 주어졌을 때 언어 모델을 복제하려면:
  1. modelrelevant global objectglobal로 둡니다.

  2. Assert: globalWindow 객체입니다.

  3. globalassociated Documentfully active가 아니면, "InvalidStateError" DOMException으로 거부된 promise를 반환합니다.

  4. signals를 « modeldestruction abort controllersignal »로 둡니다.

  5. options["signal"]가 존재하면, 이를 signalsappend합니다.

  6. signals가 주어졌을 때 AbortSignalmodelrelevant realm을 사용하여 dependent abort signal 생성의 결과를 compositeSignal로 둡니다.

  7. compositeSignalaborted이면, compositeSignalabort reason으로 거부된 promise를 반환합니다.

  8. options["signal"]가 존재하면 그것을, 그렇지 않으면 null을 signal로 둡니다.

  9. signal이 null이 아니고 aborted이면, signalabort reason으로 거부된 promise를 반환합니다.

  10. modelrelevant realm에서 생성된 새 promisepromise로 둡니다.

  11. abortedDuringOperation를 false로 둡니다.

    이 변수는 event loop에서 쓰이지만, 병렬로 읽힙니다.

  12. compositeSignal다음 abort 단계를 추가합니다:

    1. abortedDuringOperation를 true로 설정합니다.

    2. promisecompositeSignalabort reason으로 Reject합니다.

  13. 병렬로:

    1. 다음 단계를 수행하도록 AI task source 위에 global task를 큐에 넣습니다:

      1. abortedDuringOperation가 true이면 반환합니다.

      2. 다음을 가지는 새 LanguageModel 객체를 clonedModel로 둡니다:

      3. 구현 정의 방식으로, model에서 clonedModel로 다른 모든 상태를 복사합니다.

      4. 복사 작업이 실패하면:

        1. promise를 "OperationError" DOMException으로 Reject합니다.

        2. 반환합니다.

      5. promiseclonedModelResolve합니다.

  14. promise를 반환합니다.

3.4. 권한 정책 통합

prompt API에 대한 접근은 policy-controlled feature "language-model" 뒤에 제한되며, 이는 'self'default allowlist를 가집니다.

4. 프라이버시 고려사항

prompt API에 대한 프라이버시 고려사항 논의는 Writing Assistance APIs § 6 Privacy considerations를 참조하십시오. 이 텍스트는 § 2 의존성에 언급된 것처럼 동일한 인프라를 공유하는 모든 API에 적용되도록 작성되었습니다.

5. 보안 고려사항

prompt API에 대한 보안 고려사항 논의는 Writing Assistance APIs § 7 Security considerations를 참조하십시오. 이 텍스트는 § 2 의존성에 언급된 것처럼 동일한 인프라를 공유하는 모든 API에 적용되도록 작성되었습니다.

색인

이 명세에서 정의된 용어

참조로 정의된 용어

참고 문헌

규범적 참고 문헌

[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMA-402]
ECMAScript Internationalization API Specification. URL: https://tc39.es/ecma402/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[FileAPI]
Marijn Kruisselbrink. File API. URL: https://w3c.github.io/FileAPI/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. URL: https://w3c.github.io/webappsec-permissions-policy/
[STREAMS]
Adam Rice; et al. Streams Standard. Living Standard. URL: https://streams.spec.whatwg.org/
[WEBAUDIO-1.0]
Paul Adenot; Hongchan Choi. Web Audio API. URL: https://webaudio.github.io/web-audio-api/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/
[WRITING-ASSISTANCE-APIS]
Writing Assistance APIs. Draft Community Group Report. URL: https://webmachinelearning.github.io/writing-assistance-apis/

정보성 참고 문헌

[BCP47]
A. Phillips, Ed.; M. Davis, Ed.. Tags for Identifying Languages. September 2009. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc5646
[UTS35]
Mark Davis; et al. Unicode Locale Data Markup Language (LDML). 23 October 2020. Unicode Technical Standard #35. URL: https://www.unicode.org/reports/tr35/tr35-61/tr35.html

IDL 색인

[Exposed=Window, SecureContext]
interface LanguageModel : EventTarget {
  static Promise<LanguageModel> create(optional LanguageModelCreateOptions options = {});
  static Promise<Availability> availability(optional LanguageModelCreateCoreOptions options = {});
  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  static Promise<LanguageModelParams?> params();

  // These will throw "NotSupportedError" DOMExceptions if role = "system"
  Promise<DOMString> prompt(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  ReadableStream promptStreaming(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  Promise<undefined> append(
    LanguageModelPrompt input,
    optional LanguageModelAppendOptions options = {}
  );


  Promise<double> measureContextUsage(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  readonly attribute double contextUsage;
  readonly attribute unrestricted double contextWindow;
  attribute EventHandler oncontextoverflow;

  // **DEPRECATED**: This method is only available in extension contexts.
  Promise<double> measureInputUsage(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  // **DEPRECATED**: This attribute is only available in extension contexts.
  readonly attribute double inputUsage;
  // **DEPRECATED**: This attribute is only available in extension contexts.
  readonly attribute unrestricted double inputQuota;
  // **DEPRECATED**: This attribute is only available in extension contexts.
  attribute EventHandler onquotaoverflow;

  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  readonly attribute unsigned long topK;
  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  readonly attribute float temperature;

  Promise<LanguageModel> clone(optional LanguageModelCloneOptions options = {});
};
LanguageModel includes DestroyableModel;

// **EXPERIMENTAL**: Only available in extension and experimental contexts.
[Exposed=Window, SecureContext]
interface LanguageModelParams {
  readonly attribute unsigned long defaultTopK;
  readonly attribute unsigned long maxTopK;
  readonly attribute float defaultTemperature;
  readonly attribute float maxTemperature;
};


callback LanguageModelToolFunction = Promise<DOMString> (any... arguments);

// A description of a tool call that a language model can invoke.
dictionary LanguageModelTool {
  required DOMString name;
  required DOMString description;
  // JSON schema for the input parameters.
  required object inputSchema;
  // The function to be invoked by user agent on behalf of language model.
  required LanguageModelToolFunction execute;
};

dictionary LanguageModelCreateCoreOptions {
  // Note: these two have custom out-of-range handling behavior, not in the IDL layer.
  // They are unrestricted double so as to allow +Infinity without failing.
  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  unrestricted double topK;
  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  unrestricted double temperature;

  sequence<LanguageModelExpected> expectedInputs;
  sequence<LanguageModelExpected> expectedOutputs;
  sequence<LanguageModelTool> tools;
};

dictionary LanguageModelCreateOptions : LanguageModelCreateCoreOptions {
  AbortSignal signal;
  CreateMonitorCallback monitor;

  sequence<LanguageModelMessage> initialPrompts;
};

dictionary LanguageModelPromptOptions {
  object responseConstraint;
  boolean omitResponseConstraintInput = false;
  AbortSignal signal;
};

dictionary LanguageModelAppendOptions {
  AbortSignal signal;
};

dictionary LanguageModelCloneOptions {
  AbortSignal signal;
};

dictionary LanguageModelExpected {
  required LanguageModelMessageType type;
  sequence<DOMString> languages;
};

// The argument to the prompt() method and others like it

typedef (
  sequence<LanguageModelMessage>
  // Shorthand for `[{ role: "user", content: [{ type: "text", value: providedValue }] }]`
  or DOMString
) LanguageModelPrompt;

dictionary LanguageModelMessage {
  required LanguageModelMessageRole role;

  // The DOMString branch is shorthand for `[{ type: "text", value: providedValue }]`
  required (DOMString or sequence<LanguageModelMessageContent>) content;

  boolean prefix = false;
};

dictionary LanguageModelMessageContent {
  required LanguageModelMessageType type;
  required LanguageModelMessageValue value;
};

enum LanguageModelMessageRole { "system", "user", "assistant" };

enum LanguageModelMessageType { "text", "image", "audio", "tool-call", "tool-response" };

typedef (
  ImageBitmapSource
  or AudioBuffer
  or BufferSource
  or DOMString
) LanguageModelMessageValue;