AISmarteasy – 시맨틱 커널 포크로 개발하기 6a – 플래너 프롬프트 템플릿

플래너는 llm이 만드는 거니 ai 애플리케이션은 플래너를 만들라고 지시하는 프롬프트 템플릿을 만들면 된다 .

시맨틱 커널은 ActionPlanner와 SequentialPlanner, StepwisePlanner를 지원한다.

 

ActionPlanner는 단일 액션으로 계획을 세우고 실행하는 플래너이다. 프롬프트 템플릿은 다음과 같이 작성한다.

플래너는  주어진 목표에 대해 사용할 수 있는 함수들에서 어떤 함수를 선택해서 실행할 지를 결정해야 한다. llm에게 플래너 역할을 하라고 지시하면 된다.

A planner takes a list of functions, a goal, and chooses which function to use.
For each function the list includes details about the input parameters.
[START OF EXAMPLES]
{{$goodExamples}}
{{$edgeCaseExamples}}
[END OF EXAMPLES]
[REAL SCENARIO STARTS HERE]
– List of functions:
{{$available_functions}}
– End list of functions.
Goal: {{ $input }}

 

available_functions는 ai 애플리케이션에 함수로 등록된 시맨틱 함수들과 네이티브 함수들이다.

 

goodExamples는 다음과 같이 작성한다.

[EXAMPLE]
– List of functions:
// Read a file.
FileIOPlugin.ReadAsync
Parameter “”path””: Source file.
// Write a file.
FileIOPlugin.WriteAsync
Parameter “”path””: Destination file. (default value: sample.txt)
Parameter “”content””: File content.
// Get the current time.
TimePlugin.Time
No parameters.
// Makes a POST request to a uri.
HttpPlugin.PostAsync
Parameter “”body””: The body of the request.
– End list of functions.
Goal: create a file called “”something.txt””.
{“”plan””:{
“”rationale””: “”the list contains a function that allows to create files””,
“”function””: “”FileIOPlugin.WriteAsync””,
“”parameters””: {
“”path””: “”something.txt””,
“”content””: null
}}}
#END-OF-PLAN

 

edgeCaseExamples는 다음과 같이 작성한다.

[EXAMPLE]
– List of functions:
// Get the current time.
TimePlugin.Time
No parameters.
// Write a file.
FileIOPlugin.WriteAsync
Parameter “”path””: Destination file. (default value: sample.txt)
Parameter “”content””: File content.
// Makes a POST request to a uri.
HttpPlugin.PostAsync
Parameter “”body””: The body of the request.
// Read a file.
FileIOPlugin.ReadAsync
Parameter “”path””: Source file.
– End list of functions.
Goal: tell me a joke.
{“”plan””:{
“”rationale””: “”the list does not contain functions to tell jokes or something funny””,
“”function””: “”””,
“”parameters””: {
}}}
#END-OF-PLAN

 

 

SequentialPlanner는 사용자 요청을 처리하기 위해 어떤 함수들을 가지고 어떤 절차로 수행할 지에 대한 계획을 세우고 이를 실행한다. 계획은 xml 형식으로 작성하도록 한다.

Create an XML plan step by step, to satisfy the goal given, with the available functions.

 

사용할 수 있는 함수들은 ai 애플리케이션에 등록된 시맨틱 함수들과 네이티브 함수들이다.

[AVAILABLE FUNCTIONS]

{{$available_functions}}

[END AVAILABLE FUNCTIONS]

 

절차를 만드는 지침도 제시해야 한다.

To create a plan, follow these steps:
0. The plan should be as short as possible.
1. From a <goal> create a <plan> as a series of <functions>.
2. A plan has ‘INPUT’ available in context variables by default.
3. Before using any function in a plan, check that it is present in the [AVAILABLE FUNCTIONS] list. If it is not, do not use it.
4. Only use functions that are required for the given goal.
5. Append an “END” XML comment at the end of the plan after the final closing </plan> tag.
6. Always output valid XML that can be parsed by an XML parser.
7. If a plan cannot be created with the [AVAILABLE FUNCTIONS], return <plan />.

 

만들어진 계획을 실행해야 하니, 계획이 어떻게 만들어져야 하는지도 언급한다.

All plans take the form of:
<plan>
<!– … reason for taking step … –>
<function.{FullyQualifiedFunctionName} … />
<!– … reason for taking step … –>
<function.{FullyQualifiedFunctionName} … />
<!– … reason for taking step … –>
<function.{FullyQualifiedFunctionName} … />
(… etc …)
</plan>
<!– END –>

 

함수를 호출할 때 따라야 하는 지침도 줘야 한다.

To call a function, follow these steps:
1. A function has one or more named parameters and a single ‘output’ which are all strings. Parameter values should be xml escaped.
2. To save an ‘output’ from a <function>, to pass into a future <function>, use <function.{FullyQualifiedFunctionName} … setContextVariable=”<UNIQUE_VARIABLE_KEY>”/>
3. To save an ‘output’ from a <function>, to return as part of a plan result, use <function.{FullyQualifiedFunctionName} … appendToResult=”RESULT__<UNIQUE_RESULT_KEY>”/>
4. Use a ‘$’ to reference a context variable in a parameter, e.g. when INPUT='world' the parameter ‘Hello $INPUT’ will evaluate to Hello world.
5. Functions do not have access to the context variables of other functions. Do not attempt to use context variables as arrays or objects. Instead, use available functions to extract specific elements or properties from context variables.DO NOT DO THIS, THE PARAMETER VALUE IS NOT XML ESCAPED:
<function.Name4 input=”$SOME_PREVIOUS_OUTPUT” parameter_name=”some value with a <!– comment in it–>”/>DO NOT DO THIS, THE PARAMETER VALUE IS ATTEMPTING TO USE A CONTEXT VARIABLE AS AN ARRAY/OBJECT:
<function.CallFunction input=”$OTHER_OUTPUT[1]”/>Here is a valid example of how to call a function “_Function_.Name” with a single input and save its output:
<function._Function_.Name input=”this is my input” setContextVariable=”SOME_KEY”/>Here is a valid example of how to call a function “FunctionName2″ with a single input and return its output as part of the plan result:
<function.FunctionName2 input=”Hello $INPUT” appendToResult=”RESULT__FINAL_ANSWER”/>Here is a valid example of how to call a function “Name3″ with multiple inputs:
<function.Name3 input=”$SOME_PREVIOUS_OUTPUT” parameter_name=”some value with a &lt;!– comment in it–&gt;”/>

 

지침을 모두 줬으니 시작하라고 하자.

Begin!

<goal>{{$input}}</goal>

 

이 정도 지시가 주어지고 llm이 이 지시에 따라 계획을 세울 수 있다는 게 놀랍다.  왜 프롬프트가 함수 작성이 되는 지 알겠다. 시맨틱 함수란 이름을 지은 사람은 이 정도 경험이 있었을까?

Stepwise Planner는 챗 방식으로 llm과 상호작용 한다. 챗을 위해 시스템 메시지와 목표 수준의 질문을 가지고 챗 이력을 작성하고 챗을 시작한다.

시스템 메시지는 다음과 같은 프롬프트 템플릿으로 작성된다.

[INSTRUCTION]
Answer the following questions as accurately as possible using the provided functions.
{{$available_functions}}

[USAGE INSTRUCTIONS]
To use the functions, specify a JSON blob representing an action. The JSON blob should contain an “action” key with the name of the function to use, and an “action_variables” key with a JSON object of string values to use when calling the function.
Do not call functions directly; they must be invoked through an action.
The keys in “action_variables” value should match the defined [PARAMETERS] of the named “action” in [AVAILABLE FUNCTIONS].
The values in “action_variables” must be of type string and represent the actual values to be passed to the function. Do not attempt to pass a variable name or other reference to a function.
If a function has no parameters, the “action_variables” key may be omitted.
Ensure that the $JSON_BLOB contains only a SINGLE action; do NOT return multiple actions.
IMPORTANT: Use only the available functions listed in the [AVAILABLE FUNCTIONS] section. Do not attempt to use any other functions that are not specified.Here is an example of a valid $JSON_BLOB:
{
“action”: “FUNCTION.NAME”,
“action_variables”: {“PARAMETER_NAME”: “some value”, “PARAMETER_NAME_2”: “42”}
}Here is an example of a valid $JSON_BLOB with no parameters:
{
“action”: “FUNCTION.NAME”
}
[END USAGE INSTRUCTIONS]

[END INSTRUCTION]

[VALID STEP LIST]
[QUESTION] – The input question I must answer
[THOUGHT] – A thought I have about the question and how to answer it.
[ACTION] – A single $JSON_BLOB representing a single action to be performed
[OBSERVATION] – The result of the action will be provided here
[FINAL ANSWER] – Once I have gathered all the necessary observations through producing thoughts and actions, I can provide the final answer in a clear and human-readable format.
[END VALID STEP LIST]

Every Question should be followed by a Thought.
Every Thought should be followed by an Action or Final Answer.
Every Action should be followed by an Observation.
Every Observation should be followed by a Thought or Final Answer.
Produce Thoughts and Actions as necessary until you have a Final Answer.

{{$input}}

 

[END VALID STEP LIST] 아래 부분을 보면, question 다음에는 thought이 나온다. llm 대응을 thougt이라고 한다는 것을 알 수 있다.

thougt을 하면, llm이 답을 하거나 직접 답을 하지 못하는 경우에는 함수나 액션이라 불리는 기능을 단계로 답변 한다. llm이 답변하면 이게 최종 답변이 되고 실행은 종료된다. action 다음에는 action 결과를 받는 observation이 온다. observation은 챗 이력의 사용자 메시지로 추가 된다. observation 다음은 llm이 하는 거니 thought이나 final answer가 온다. 최종 답이 나올 때 까지 이 과정을 반복한다.

About the Author
(주)뉴테크프라임 대표 김현남입니다. 저에 대해 좀 더 알기를 원하시는 분은 아래 링크를 참조하세요. http://www.umlcert.com/kimhn/

Leave a Reply

*