파일에 프롬프트 저장

완료됨

이전 단원에서는 kernel.InvokePromptAsync를 호출하여 재사용 가능한 프롬프트를 만드는 방법을 알아보았습니다. 예시:

Console.WriteLine(
    await kernel.InvokePromptAsync(generateNamesOfPrompt, new() {{ "input", "fantasy characters" }})
);

인라인 프롬프트를 만드는 것이 유용하지만 대규모 프로젝트의 경우 프롬프트를 별도의 파일로 구성하고 커널로 가져올 수 있습니다. 이는 기본 제공 플러그 인이 사용되는 방식과 유사합니다. 사용자 고유의 프롬프트 플러그 인을 만들려면 프롬프트에 대해 별도의 폴더를 만드는 것이 가장 좋습니다.''

의미 체계 플러그 인을 만드는 방법

의미 체계 커널 SDK는 몇 가지 간단한 구문 규칙을 사용하여 프롬프트 템플릿 언어를 지원합니다. 코드를 작성하거나 외부 라이브러리를 가져올 필요가 없으며 중괄호 {{...}}를 사용하여 프롬프트에 식을 포함하기만 하면 됩니다.

의미 체계 플러그 인을 만들려면 skprompt.txt 파일과 config.json 파일이라는 두 개의 파일이 포함된 폴더가 필요합니다. skprompt.txt 파일에는 지금까지 작성한 모든 프롬프트와 유사한 LLM(대규모 언어 모델)에 대한 프롬프트가 포함되어 있습니다. config.json 파일에는 프롬프트에 대한 구성 세부 정보가 포함되어 있습니다.

config.json 파일은 다음 매개 변수를 지원합니다.

  • type: 프롬프트의 유형입니다. 일반적으로 채팅 완료 프롬프트 형식을 사용합니다.
  • description: 프롬프트가 수행하는 작업에 대한 설명입니다. 이 설명은 커널에서 프롬프트를 자동으로 호출하는 데 사용할 수 있습니다.
  • input_variables: 프롬프트 내에서 사용되는 변수를 정의합니다.
  • execution_settings: 완성 모델에 대한 설정입니다. OpenAI 모델의 경우 이러한 설정에는 max_tokenstemperature 속성이 포함됩니다.

예를 들어, 음악 강사 에이전트를 만든다고 가정해 보겠습니다. 잠재적인 코드 진행에 추가할 코드를 제안하는 기능을 지원할 수 있습니다. 이 경우 사용자는 시작 코드를 제공하고 플러그 인은 잘 맞는 코드를 권장합니다.

이 플러그 인을 만들려면 먼저 프로젝트에 'Prompts' 폴더를 만든 다음 'SuggestChords'라는 하위 폴더를 만듭니다. 그런 다음 'SuggestChords' 폴더에 'skprompt.txt' 및 'config.json' 파일을 추가합니다.

'skprompt.txt' 파일의 예:

<message role="system">Instructions: You are a helpful music theory assistant. 
Provide the user with several chords that they could add to a chord progression 
based on some starting chords they provide</message>
<message role="user">Am Em</message>
<message role="assistant">
C major, F major, G major, D major, E major, B minor
</message>

<message role="user"> {{$startingChords}}</message>

'config.json' 파일의 예:

{
    "schema": 1,
    "type": "completion",
    "description": "Recommends chords to the user based on starting chords",
    "execution_settings": {
        "default": {
            "max_tokens": 1000,
            "temperature": 0
        }
    },
    "input_variables": [
        {
            "name": "startingChords",
            "description": "The starting chords provided by the user",
            "required": true
        },
    ]
}

이 예제에서 temperature는 생성된 텍스트의 임의화 정도를 제어하는 매개 변수입니다. 값은 0에서 2 사이여야 합니다. 온도가 낮을수록 더 집중적이고 정확한 출력이 가능하고, 온도가 높을수록 더 다양하고 창의적인 출력이 가능합니다.

현재 모델에서 요청은 프롬프트와 완료 간에 공유되는 최대 4,097개의 토큰을 사용할 수 있습니다. 이는 프롬프트가 4,000개의 토큰인 경우 채팅 완료는 최대 97개의 토큰이 될 수 있음을 의미합니다. LLM 설명서에서 미세 조정 매개 변수에 대한 자세한 정보를 찾을 수 있습니다.

사용자 지정 의미 체계 플러그 인을 사용하려면 프롬프트 디렉터리를 커널로 가져오고 해당 폴더 이름으로 플러그 인을 호출합니다. 예시:

var plugins = kernel.CreatePluginFromPromptDirectory("Prompts");
string input = "G, C";

var result = await kernel.InvokeAsync(
    plugins["SuggestChords"],
    new() {{ "startingChords", input }});

Console.WriteLine(result);

이 예제에서 CreatePluginFromPromptDirectoryKernelPlugin 개체를 반환합니다. 이 개체는 함수 컬렉션을 나타냅니다. CreatePluginFromPromptDirectory는 지정된 플러그 인 디렉터리의 경로를 허용하며 각 하위 폴더의 이름은 함수 이름으로 사용됩니다.

예를 들어 ‘ChordProgressions’라는 폴더 내에 ‘SuggestChords’를 중첩한 경우 프롬프트 디렉터리 ‘Prompts/ChordProgressions’를 사용하고 함수 이름은 동일하게 유지됩니다. 또는 'Prompt' 디렉터리를 사용하고 'ChordProgressions/SuggestChords'를 함수 이름으로 참조할 수 있습니다.

// Example of nested prompt folders
var chordProgressionPlugin = kernel.CreatePluginFromPromptDirectory("Prompts/ChordProgressions");
string input = "G, C";

var result = await kernel.InvokeAsync(
    chordProgressionPlugin["SuggestChords"],
    new() {{ "startingChords", input }});

Console.WriteLine(result);

이 코드를 실행하면 다음 출력과 유사한 응답이 생성됩니다.

D major, A minor, E minor, B minor, F major, G7

프롬프트를 파일에 저장하는 것은 코드를 구성하고 더 쉽게 유지 관리할 수 있는 좋은 방법입니다. 또한 구성 파일을 사용하면 보다 예측 가능한 사용자 환경을 위해 프롬프트를 추가로 조정할 수 있습니다.