Intelligent Conversational Software Development – Prompt (5/) – Semantic-Kernel – Prompt Engineering(1/)

프롬프트는 중요하다. 프롬프트는 llm에게 전달되는 입력이고, 이 입력에 따라 llm이 응답한다.

Prompts play a crucial role in communicating and directing the behavior of Large Language Models (LLMs) AI. They serve as inputs or queries that users can provide to elicit specific responses from a model.

 

프롬프트는 잘 작성하는 것은 쉽지 않다. 디자인이 필요하다.

Effective prompt design is essential to achieving desired outcomes with LLM AI models. Prompt engineering, also known as prompt design, is an emerging field that requires creativity and attention to detail. It involves selecting the right words, phrases, symbols, and formats that guide the model in generating high-quality and relevant texts.

As a prompt engineer, you must find the right balance between specificity and relevance.

 

llm이 어떻게 응답할 것인지에 대한 설정들이 있다. temperature, top-k, top-p, frequency penalty, presence penalty

 

ai앱은 모델이나 설정과 프롬프트를 바꿔가면서 그 결과들을 비교하면서 최적의 모델과 설정과 프롬프트를 정해야 한다. 시맨틱 커널은 이런 과정을 좀 더 쉽게 할 수 있도록 한다.

 

프롬프트는 구체적으로 작성해야 함으로 유스케이스 보다 시나리오에 가깝다. 시스템 구성요소로는 컬레보레이션에 해당하는 semantic function에 대한 것과 그렇지 않은 것(native function)이 구분되어야 하고  외부 기능과 연계될 수 있도록 커넥터가 필요하다. 필요한 데이터를 관리하기 위한 메모리가 필요하다. 바운더리, 컨트롤러(RSM Collaboration – Semantic Function, Native Function), 엔티티(RSM Manager – Memory), Connector

llm 설정 값들은 유스케이스  항목으로  작성한다.

Additional tips for prompt engineering

Becoming a skilled prompt engineer requires a combination of technical knowledge, creativity, and experimentation. Here are some tips to excel in prompt engineering:

  • Understand LLM AI models: Gain a deep understanding of how LLM AI models work, including their architecture, training processes, and behavior.
  • Domain knowledge: Acquire domain-specific knowledge to design prompts that align with the desired outputs and tasks.
  • Experimentation: Explore different parameters and settings to fine-tune prompts and optimize the model’s behavior for specific tasks or domains.
  • Feedback and iteration: Continuously analyze the outputs generated by the model and iterate on prompts based on user feedback to improve their quality and relevance.
  • Stay updated: Keep up with the latest advancements in prompt engineering techniques, research, and best practices to enhance your skills and stay ahead in the field.

Prompt engineering is a dynamic and evolving field, and skilled prompt engineers play a crucial role in harnessing the capabilities of LLM AI models effectively.

프롬프트 작성하기

  1. 뭘 하려고 하는가? 태스크가 뭐야?
    1. 케이크를 만들어야 한다.
  2. 그 태스크를 하는데 generative ai가 필요한 부분은? 뭘 해 주기 원하는가(goal)?
    1. generative ai에게 케이크를 만들어 달라고는 안 할거고, 텍스트 생성에 해당하는 레시피를 제공해 달라고 하겠지. 어떤 케이크인지를 좀 더 구체화해 보면, 초콜렛 케이크이고.
      1.  I want to make a cake. Give me the best chocolate cake recipe you can think of.
        1. 밑 줄 친 부분은 없어도 llm이 할 일에는 영향이 없어 보인다.

 

  1. 뭘 하려고 하는가? 태스크가 뭐야?
    1. New York City에 있는 자신의 apparel shop에 대한 마케팅 슬로건을 작성해야 한다.
  2. 그 태스크를 하는데 generative ai가 필요한 부분은? 뭘 해 주기 원하는가(goal)?
    1. New York City에 있는 자신의 apparel shop에 대한 마케팅 슬로건을 작성해라.
      1. Write me a marketing slogan for my apparel shop in New York City with a focus on how affordable we are without sacrificing quality.
        1. 좀 더 구체적으로. 마케팅 슬로건 작성에 대해 뭔가는 알고 있어야(일에 대한 도메인 지식이 있어야) 시킬 일을 좀 더 구체화할 수 있다. 구체화한다는 것은 제한을 둔다는 거다.
        2. 도메인 지식이 부족하다면, 마케팅 슬로건 작성에 대한 것을 llm에 물은 후 응답을 통해서 구체화할 수도 있다.

 

요약과 같은 부분은 일반화될 수 있다.

요약해 줘(이 내용에 대해, 이런 조건들을 만족해서)

Summarize the following text in two sentences or less.

시맨틱 커널에서 프롬프트는 시맨틱 함수가 된다. 시맨틱 함수는 플러그인 디렉토리에 하위 디렉토리로 작성됩니다. 플러그인들은 일반적으로 Plugins 디텍토리 하위에 작성된다.

We specifically refer to semantic functions when LLM AI prompts are used; and when conventional programming code is used we say native functions.

슬로건 작성 함수를 SloganMaker라고 하면,  SloganMaker 디렉토리가 만들어지고, 프롬프트는 skprompt.txt로 작성된다.

SloganMaker 함수를 포함하는 플러그인을 TestPlugin이라고 하고, 플러그인들을 포함하는 디렉토리를 Plugins라고 하면 디렉토리 계층은 Plugins – TestPlugin – SloganMaker 가 되고, 이에 대한 호출은 TestPlugin.SloganMaker()가 된다.

함수 실행 방식은(llm 설정 포함) 함수 디렉토리에 config.json으로 작성한다.

프롬프트를 재사용하기 위해 템플릿을 도입한다. 특정 값으로 대체되는 부분(hook)은 “{{“와 “}}” 사이에 작성한다. 특정 값으로 대체 된다는 것은 템플릿에서 변할 수 있는 부분으로 변수로 작성한다. 변수 이름 앞에 변수 임을 알 수 있도록 $를 작성한다.

  • Write me a marketing slogan for my {{$INPUT}} in New York City with a focus on how affordable we are without sacrificing quality.
    • {{$INPUT}}부분이  INPUT 변수 값으로 대체
  • Write me a marketing slogan for my {{$INPUT}} in {{$CITY}} with a focus on {{$SPECIALTY}} we are without sacrificing quality.
    • {{$INPUT}}부분이  INPUT 변수 값으로 대체
    • {{$CITY}}부분이  CITY변수 값으로 대체
    • {{$SPECIALTY}}부분이  SPECIALTY변수 값으로 대체

 

함수 호출 결과를 사용해서 대체될 부분을 작성할 수도 있다. 함수에 매개변수가 있으면 이에 대한 전달도 필요하다.

{{namespace.functionName}}

The weather today is {{weather.getForecast $input}}.

 

To call an external function and pass a parameter to it, use the {{namespace.functionName $varName}} and {{namespace.functionName “value”}} syntax.

The weather today in {{$city}} is {{weather.getForecast $city}}의 경우 city가 Schio이면 다음과 같이 프롬프트 템플릿이 되어, 함수가 호출 된다. The weather today in Schio is {{weather.getForecast “Schio”}}.

Semantic function templates are text files, so there is no need to escape special chars like new lines and tabs. However, there are two cases that require a special syntax:

  1. Including double curly braces in the prompt templates
  2. Passing to functions hardcoded values that include quotes

 

{{ “{{” }} and {{ “}}” }} are special SK sequences.

will render to:

{{ and }} are special SK sequences.

 

Values can be enclosed using single quotes and double quotes.

To avoid the need for special syntax, when working with a value that contains single quotes, we recommend wrapping the value with double quotes. Similarly, when using a value that contains double quotes, wrap the value with single quotes.

…text… {{ functionName “one ‘quoted’ word” }} …text…

…text… {{ functionName ‘one “quoted” word’ }} …text…

 

 

For those cases where the value contains both single and double quotes, you will need escaping, using the special «\» symbol.

When using double quotes around a value, use «\”» to include a double quote symbol inside the value:

… {{ “quotes’ \”escaping\” example” }} …

and similarly, when using single quotes, use «\’» to include a single quote inside the value:

… {{ ‘quotes\’ “escaping” example’ }} …

 

Both are rendered to:

… quotes’ “escaping” example …

Note that for consistency, the sequences «\’» and «\”» do always render to «’» and «”», even when escaping might not be required.

For instance:

… {{ ‘no need to \”escape” ‘ }} …

is equivalent to:

… {{ ‘no need to “escape” ‘ }} …

and both render to:

… no need to “escape” …

In case you may need to render a backslash in front of a quote, since «\» is a special char, you will need to escape it too, and use the special sequences «\\\’» and «\\\”».

For example:

{{ ‘two special chars \\\’ here’ }}

is rendered to:

two special chars \’ here

Similarly to single and double quotes, the symbol «\» doesn’t always need to be escaped. However, for consistency, it can be escaped even when not required.

For instance:

… {{ ‘c:\\documents\\ai’ }} …

is equivalent to:

… {{ ‘c:\documents\ai’ }} …

and both are rendered to:

… c:\documents\ai …

Lastly, backslashes have a special meaning only when used in front of «’», «”» and «\».

In all other cases, the backslash character has no impact and is rendered as is. For example:

{{ “nothing special about these sequences: \0 \n \t \r \foo” }}

is rendered to:

nothing special about these sequences: \0 \n \t \r \foo

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

Leave a Reply

*