A Prompt Pattern Catalog to Enhance Prompt Engineering with chatgpt

개발자 생존기·2023년 9월 5일
1

Langchain정리

목록 보기
1/1

배경

노마드코더의 "ChatGPT 를 200% 활용하는 방법! feat. 프롬프트 엔지니어링" 유튜브를 보고 더 나은 chatgpt 사용을 위한 대안들에 대해 생각해보게 되었습니다.

과연 chatgpt를 잘 사용하고 있는가에 대한 질문이 항상 있었습니다. 사용하다보면 자연스럽게 그 노하우가 늘어나기도 하지만 어떤 것은 역치 이상의 노력을 해야 체득할 수 있습니다. 이 기회에 시간을 들여서 chatgpt의 사용 패턴을 자세하게 살펴보고 단단하게 체득해나가고자 작성하였습니다.

참고한 유튜브와 논문 주소는 아래와 같습니다.

작성 방법

논문은 각 프롬프트 패턴을 아래 순서대로 설명하고 있습니다.

  1. Intent and Context
    • Prompt Pattern 이 해결하려고하는 문제를 정의하고 달성하는 목표를 설명합니다.
  2. Motivation
    • 문제에 대한 근거(rational)를 제공하고, 문제 해결이 중요한 이유를 설명합니다.
  3. The structure and key Ideas
    • 패턴의 기본 구조를 설명합니다.
  4. Example
    • 해당 패턴에 대한 사례를 설명합니다.
  • 해당 글에서는 Intent and Context와 Motivation을 Intent로 통일하였습니다. 설명이 중복되는 부분도 있고, 같이 설명하는 것이 더 자연스럽다고 생각했습니다.

  • 또한 Example은 논문 예시나 실제 해당 패턴을 바탕으로 제가 작성한 결과를 첨부하였습니다. 실행은 뤼튼과 chatgpt를 활용했습니다.

  • 패턴 설명 순서를 논문에서 작성된 순서가 아니라 중요도(제가 생각하는..) 순으로 변경하였습니다.

Pattern Category

해당 논문은 Prompt Pattern을 6가지 카테고리로 분류하였습니다. 이에 대해서 간략하게 설명하면 아래와 같습니다.

1. Input Semantics

이 카테고리는 LLM이 어떻게 Input을 이해하고 Output을 생성하는데 활용할까에 대해 초점을 맞추고 있습니다.

1.1 Meta Language Creation

LLM이 그래프 등과 같은 대체 언어를 쉽게 이해하는데 초점을 맞추고 있습니다.

2. Output Customization

이 카테고리는 LLM에 의해 생성되는 Output의 type, format, structure 등을 제한하거나 맞춤화하는데 중점을 둡니다.

2.1 Output Automater

Output의 일부로 스크립트 또는 기타 자동화 아티팩트를 자동으로 생성합니다.

2.2 Persona 👀

Output을 생성할 때 LLM에게 페르소나 역할을 부여합니다.

2.3 Visualization Generator

이 패턴의 목적은 텍스트 생성을 사용하여 시각화를 만드는 것입니다.

2.4 Recipe 👀

사용자는 부분적으로 알려진 정보 또는 제약 조건과 함께 명시된 최종 결과를 실현하기 위한 일련의 과정 또는 action을 얻을 수 있습니다.

2.5 Template

LLM이 생성하는 Output의 Template에 대해 지정(Sepcify)할 수 있습니다.

3. Error Identification

LLM에서 생성된 Output의 오류를 식별하고 해결하는데 중점을 둡니다.

3.1 Fact Check List

LLM이 점검해야 하는 Fact List를 생성하도록 요구합니다.

3.2 Reflection

LLM이 내부적으로 Ouput을 점검하고 오류를 식별할 수 있도록 합니다.

4. Prompt Improvement

Input과 Output의 품질 향상에 초점을 맞춥니다.

4.1 Question Refine

LLM이 항상 사용자가 더 나은 버전의 질문을 할 수 있도록 보장합니다.

4.2 Alternative apporachs

LLM이 사용자가 지정한 작업을 수행하는 것에 대한 대안을 제시해야 합니다.

4.3 Cognitive Verifier

원래 질문에 추가적인 세부 질문을 생성하고 사용자에게 이를 답변하도록 요구합니다. 이 답변을 통해 보다 나은 답을 할 수 있도록 유도합니다.

4.4 Refusal Breaker

LLM이 답변 생성을 거부할 때 사용자의 질문을 다시 쓰도록 요구합니다.

5. Interaction

사용자와 LLM 간의 상호 작용에 초점을 맞춥니다.

5.1 Flipped Interaction 👀

LLM에게 출력을 생산하는대신 질문하도록 요구합니다.

5.2 Game Play

LLM이 게임 형태로 출력을 생성해야 합니다.

5.3 Infinite Generation

LLM이 output을 무한 생성하도록 요구합니다. 사용자는 매번 생성기 프롬프트를 다시 입력할 필요가 없습니다.

6.Context Control

LLM이 작동하는 Context 정보를 제어하는데 중점을 둡니다.

6.1 Context Manager

사용자가 output 의 context를 지정하는 것을 허용합니다.

Prompt Pattern 1 (개발자에게 유용한 패턴)

1 Recipe Pattern 👀

Intent

이 패턴은 "내 냉장고에 있는 재료들을 고려하여, 저녁 요리법을 제공하라"는 예를 일반화한 것입니다

  • 다시 말하면 케이크를 만들고 싶은데, 밀가루, 물, 설탕 등이 있다. 그리고 이를 섞어야 한다는 것도 아는데 어떻게 어떤 순서로 해야 하는지는 모른다. 이런 경우 매우 유용하다.

달성하고 싶은 목표가 있고, 이를 위해 달성하기 위한 지식(재료)는 어느 정도 알고 있지만 완벽하지 않습니다. 이런 경우 필요한 재료를 제공하면서 이를 조합하는 방법(레서피)을 찾아내는데 유용합니다.

특히 개발자에게 유용한 패턴입니다. 개발자는 최대한 자신의 지식과 의도를 정확히 전달하고, LLM은 이를 재료로 훌륭한 코드를 만들 수 있습니다.

Structure and Key Ideas

  1. I would like to achieve X
  2. I know that I need to perform step A,B,C
  3. Provied a complte sequence of steps for me
  4. Fill in any missing steps
  5. Identify any unnecessary steps

Example

  1. 데이터를 암호화하는 Java프로그램을 작성하려고 합니다.
  2. 사용자 입력을 받고, 유효성을 검사하고, 암호화하고, 암호화된 데이터를 반환해야 한다는 것을 알고 있습니다.
  3. 이를 위해 전체 단계 순서를 알려주고
  4. 누락된 단계를 채우고
  5. 불필요한 단계가 있는지 확인해주세요.

2 Persona 👀👀

Intent

많은 경우 사용자는 LLM 출력이 항상 특정 관점을 취하기를 원합니다. 예를 들어, LLM이 보안 전문가인 것처럼 코드 검토를 수행하는 것이 유용할 수 있습니다.

이러한 패턴의 의도는 LLM이 어떤 유형의 출력을 생성하고 어떤 세부 사항에 초점을 맞출 것인지를 선택하는 데 도움이 되는 "페르소나"를 제공하는 것입니다.

사용자는 LLM이 주어진 작업을 달성하기 위해 어떤 유형의 출력 또는 세부 정보에 중점을 두어야 하는지 모를 수 있습니다.

그러나 사용자는 이런 것들에 대한 도움을 받기 위해 필요한 사람의 유형을 알고 있을지도 모릅니다.

페르소나 패턴을 사용하면 사용자가 필요한 출력의 정확한 세부 정보를 알지 않고도 도움이 필요한 내용을 표현할 수 있습니다.

Structure and key ideas

1 Act as persona X
2 Provide outputs that persona X would create

Example

  1. LLM에게 특정 페르소나 부여
  • 개선 전 코드는 아래와 같습니다.

  • LLM에게 보안전문가 역할을 부여하여 코드를 개선시켜 보았습니다. 이전 보다 보안 관점에서 코드가 개선된 것을 확인할 수 있습니다.

  1. 사용자에게 특정 페르소나 부여

  2. 페르소나를 변경하여 결과 생성

  • 정직하게 물어본다면 원하는 답을 얻을 수 없습니다.

  • 교사의 경우, 원하는 답변을 얻을 수 있습니다.

3 The Flipped Interaction Pattern 👀👀

대화의 주도권을 사람이 아닌 chatgpt에게 준다.

Intent

Chatgpt에게 원하는 정보를 얻고자 할 때, 우리는 질문은 어떻게 구성할지 어떤 정보를 포함할지 많은 고민을 하게 됩니다.

이 패턴은 반대로 원하는 것을 달성할 때까지 chatgpt가 우리에게 질문하도록 합니다. 목표를 알고 있지만, 그 목표를 달성하기 위한 단계를 모르거나, 그 목표를 달성하기 위해 ChatGPT가 어떤 정보를 필요하는지 모를 때 유용합니다.

Structure and Key Ideas

  1. I would like you to ask me questions to achieve X.
  2. You should ask questions until this condition is met or to ahieve this goal (alternatively, forever)

Examples

AWS에 있는 웹서버에 Rust 바이너리를 배포하기 위한 질문을 나에게 하세요. 필요한 모든 정보를 얻으면, 배포를 자동화하는 bash 스크립트를 작성하세요.

4 Reflection 👀

Intent

이 패턴의 목적은 모델이 사용자에게 주어진 답변의 배경이 되는 근거를 자동으로 설명하도록 요청하는 것입니다.

이 패턴을 통해 사용자는 출력의 유효성을 더 잘 평가할 수 있을 뿐만 아니라 LLM이 특정 답변에 도달한 방법을 사용자에게 알려줄 수 있습니다.

혼란의 지점을 명확히 하고, 근본적인 가정을 밝히며, 지식이나 이해의 차이를 드러낼 수 있습니다.

Structure and Key Ideas

  1. Whenever you generate an answer
  2. Explain the reasoning and assumption behind your answer
  3. (Optional) ... so that I can improve my question.

Examples

질문 전에 아래 메세지를 추가합니다. chatgpt는 이를 반영하여 보다 상세한 답변을 제공합니다.

답변을 제공할 때, 답변의 근거와 가정을 설명하세요. 선택한 사항을 설명하고 잠재적인 제한 사항이나 엣지 케이스를 설명하세요.
When you provide an answer, please explain the reasoning and assumptions behind your answer. Explain your choice and address any potentail limitations or edge cases.

  1. 백엔드 엔지니어에게 Flutter와 React Native 둘 중 무엇이 좋을까에 대해 질문
  • Reflection 적용 전
  • Reflection 적용 후
  1. 외부망이 차단된 경우, 주어진 위경도를 가지고 대륙 정보를 반환하는 코드를 작성

Prompt Pattern 2 (평소 유용하게 쓸 수 있어보이는 것들)

1 Meta Language Creation 👀

Intent

사용자는 LLM과의 대화를 그래프, 상태값, 신속한 자동화를 위한 명령 세트 등과 같은 대체 언어(Meta Language)를 통해 프롬프트를 생성하려고 합니다. 위를 대체 언어를 기반으로 출력을 생성하기 위해서는 LLM이 언어의 의미론을 이해해야 합니다.

Structure and Key Ideas

  1. When I say X, I mean Y (or would like you to do Y)

Example

그래프에 대한 텍스트 단축 표기법을 통해, 그래프를 훨씬 더 간략하고 효과적으로 전달할 수 있습니다.

From now on, whenever I type two identifiers separated by a “->”, I am describing a graph.
For example, “a -> b” is describing a graph with nodes “a” and “b” and an edge between them.

2 Template 👀

Intent

패턴의 목적은 LLM의 출력이 구조 측면에서 정확한 템플릿을 따르도록 하는 것입니다.
정량화된 답변을 제공하기 위해서 해당 프롬프트 패턴이 유용할 수 있습니다.

Structure and Key Ideas

  1. I am going to provie a template for your output.
  2. X is my placeholder for content
  3. Try to fit the output into one or more of the placeholder that i list.
  4. Please preserve the formatting and overall template that I provide.
  5. This is the template: PATTERN with PLACEHOLDERS

Example

“I am going to provide a template for your output.
Everything in all caps is a placeholder.
Any time that you generate text, try to fit it into one of the placeholders that I list.
Please preserve the formatting and overall template that I provide at
https://myapi.com/NAME/profile/JOB”

api 호출시 파라메터를 동적으로 변경

chatgpt에서 특정 템플릿에 맞춰서 답변하도록 적용

3 Cognitive Verifier

Context

패턴의 의도는 기존 질문에 추가 질문을 더하여 질문을 세분화하도록 강제하여 원래 질문의 답보다 더 나은 답을 제공하는 데 사용하는 것입니다.

Cognitive Verifier 패턴의 동기는 두 가지입니다:
1. 도메인에 대한 생소함, 질문의 올바른 표현이 무엇인지 확신할 수 없기 때문에 인간은 추가적인 후속 조치 없이는 너무 높은 수준의 질문을 처음에 할 수 있습니다.
2. 연구에 따르면 LLM은 세분화된 질문을 사용할 때 종종 더 나은 수행을 할 수 있다고 합니다.

Structure and Key Ideas

  1. When you are asked a question, follow these rules
  2. Generate a number of additional questions that would help more accurately answer the question
  3. Combine the answers to the individual questions to produce the final answer to the overall question

Example

“When I ask you a question, generate three additional questions that would help you give a more accurate answer. When I have answered the three questions, combine the answers to produce the final answers to my original question.”

4 Question Refinement

Intent

이 패턴을 사용하면 LLM은 사용자가 정확한 답변을 얻기 위해 질문할 올바른 질문을 찾을 수 있도록 도와줍니다.

Structure and Key Ideas

  1. Whitin scope X, suggest a better version of the question to use instead.

Examples

"이제부터 A에 대한 질문을 할 때마다 B의 관점에서 보다 나은 버전의 질문을 제안하고 대신 사용할 수 있는지 물어보세요."
“From now on, whenever I ask a question about a A, suggest a better version of the question to use that incorporates information specific to B that I am using instead and ask me if I would like to use your question instead.”

개선 전

which is better? flutter or react native or what else?

개선 후

"What are the key differences between Flutter and React Native, and which one would be more suitable for my specific mobile app development project?"

5 Alternative Approaches

Intent

패턴의 목적은 LLM이 대안적인 방법을 제공하여 사용자가 익숙한 접근 방식만을 추구하지 않도록 하는 것입니다.

사용자가 인지 편향을 해소함으로써 문제를 해결할 수 있는 더 나은 접근 방식을 선택하기 위한 대체 접근 방식을 알고 있는지 확인하는 것입니다.

Structure and Key Ideas

  1. Within scope X, if there are alternative ways to accomplish the same thing, list the best alternate approaches
  2. (Optional) compare/contrast the pros and cons of each approach
  3. (Optional) include the original way that I asked
  4. (Optional) prompt me for which approach I would like to use

범위 X 내에서 동일한 작업을 수행할 수 있는 대체 방법이 있는 경우 최선의 대체 방법을 나열합니다.

Example

“If there are alternative services to accomplish the same thing with X, list the best alternative services and then compare/contrast the pros and cons of each approach with respect to cost, availability, and maintenance effort and include the original way that I asked. Then ask me which approach I would
like to proceed with.”

Public API를 EC2 인스턴스로 만드는 것 외에 대안이 있다면 이를 비교해 보도록 한다.

6 Fact Check List

Intent

이 패턴의 목적은 사실 확인이 필요한 목록을 출력하게 만드는 것입니다. 사실 목록은 사용자에게 출력이 기초한 사실(또는 가정)을 알려주는 데 도움이 됩니다.

그런 다음 사용자는 이러한 사실/가정에 대해 적절한 실사를 수행하여 출력의 정확성을 확인할 수 있습니다.

Structure and Key Ideas

  1. Generate a set of facts that are contained in the output.
  2. The set of facts be inserted in a specfic point in the output.
  3. The set of facts should be fundamental facts that could undermine the veracity of the output if any of them are incoreect.

Example

"지금부터 답변을 생성할 때는 사실 확인이 필요한 것들을 작성하세요. 이 사실들을 출력 말미에 나열해야 합니다. ~에 관련된 사실들만 포함해야 합니다."

7 Refusal Breaker

Intent

LLM은 필요한 지식을 가지고 있지 않거나 질문이 이해할 수 없는 방식으로 표현되었기 때문에 때때로 질문에 대답하기를 거부할 수 있습니다.

이 결과는 답을 찾고 있는 사용자에게 좌절감을 줄 수 있습니다. 따라서 일부 상황에서는 거부 차단기 패턴이 사용자가 질문을 다시 말하거나 LLM이 답변할 수 있도록 더 나은 다른 질문을 할 수 있는 방법을 찾을 수 있습니다.

예를 들어 LLM이 답변을 제공하지 못하는 특정한 이유가 있을 수 있으므로 질문이 거부된 이유에 대해 명확히 설명해 달라고 요청할 수 있습니다.

Structure and Key Ideas

  1. Whenever you can't answer a question.
  2. Explain why you can't answer the question
  3. Provide one or more alternatives wordings of the question that you could answer.

Examples

질문에 답변할 수 없을 때마다, 질문에 답할 수 없는 이유를 설명하세요. 답변할 수 있는 질문의 대체 표현을 하나 이상 제공하세요.
Whenever you can't answer a question, explain why you can't answer the question. Provide one or more altanative wordings of the questions that you could answer.



8 Context Manager

Context

이 패턴의 목적은 사용자가 LLM과의 대화를 위해 대화의 맥락을 지정하거나 제거할 수 있도록 하는 것입니다. 즉 대화의 초점을 특정 주제에 맞추거나 관련이 없는 주제는 고려 대상에서 제외하는 것입니다.

Structure and Key Ideas

  1. Within scope X
  2. Please consider Y
  3. Please ignozre Z
  4. (Optional) start over

Example

Context 지정

“When analyzing the following pieces of code, consider security aspects and ignore formatting or naming conventions"

Context 지정 종료

“Ignore everything that we have discussed. Start over.”

Prompt Pattern 3 (흠..)

1 Infinite Generation

Context

이 패턴의 목적은 매번 제너레이터 프롬프트를 다시 입력할 필요 없이(무한하게 나타날 수 있음) 일련의 출력을 자동으로 생성하는 것입니다

무한 생성 패턴을 사용하면 사용자는 추가 입력 여부에 관계없이 프롬프트를 반복적으로 적용하여 미리 정의된 제약 조건 집합을 사용하여 다중 출력 생성을 자동화할 수 있습니다

Structure and Key Ideas

  1. I would like you to generate output forever, X output(s)
    at a time.
  2. (Optional) here is how to use the input I provide between outputs
  3. (Optional) stop when I ask you to

Example

템플릿 패턴과 조합하여 사용하면 유용하다.

From now on, I want you to generate a name and job until I say stop. I am going to provide a template for your output. Everything in all caps is a placeholder.
Any time that you generate text, try to fit it into one of the placeholders that I list. Please
preserve the formatting and overall template that I
provide: https://myapi.com/NAME/profile/JOB”

2 Output Automator

Context

LLM은 스크립트 또는 기타 자동화 아티팩트를 생성하여 출력의 일부로 권장하는 모든 단계를 자동으로 수행할 수 있습니다. 이는 LLM 출력 권장 사항을 구현하는 데 필요한 수동 작업을 줄이는 것을 목표로 합니다.
--> 출력의 일부로 스크립트 또는 기타 자동화 아티팩트를 자동으로 생성합니다.

이 부분은 개념보다는 예시로 직관적으로 이해하였습니다.

  • 아티팩트는 Maven에서 빌드 결과로 나오는 개발 산출물로 이해하시면 됩니다. 따라서 코드를 생성하거나 결과를 출력할 때마다 이러한 아티팩트나 연관되는 스크립트를 자동으로 생성하는 것으로 이해했습니다.

Structure and Key Ideas

  1. Whenever you produce an output that has at least one step to take and the following properties (alternatively, always do this)
  2. Produce an executable artifact of type X that will automate these steps

Example

From now on, automatically generate python requiremnt.txt file that includes any modules that the code you generated.

3 Visualization Generator

Intent

이 패턴의 목적은 텍스트 생성을 사용하여 시각화를 만드는 것입니다.
구체적으로 다른 출력과 연관된 이미지를 생성하는 경로를 만드는 것입니다.

이 패턴은 DALL-E와 같이 텍스트를 입력으로 사용하는 다른 잘 알려진 시각화 도구에 대한 입력을 생성하여 시각화를 생성할 수 있습니다.
이러한 패턴은 텍스트 생성 및 시각화 도구의 장점을 결합하여 보다 포괄적이고 효과적인 정보 전달 방법을 제공할 수 있습니다.

예를 들어, LLM에서는 그래프를 설명하기 위한 다이어그램을 그릴 수 없습니다. 시각화 생성기 패턴은 올바른 형식의 텍스트 입력을 생성하여 올바른 다이어그램을 생성하는 다른 도구에 연결함으로써 이 한계를 극복합니다.

Structure and Key Ideas

  1. Generate an X that I can provide to tool Y to visualize it

Example

알파카를 그려주세요.

“Whenever I ask you to visualize something, please create either a Graphviz Dot file or DALL-E prompt that I can use to create the visualization. Choose the appropriate tools based on what needs to be visualized.”

4 Gameplay

Intent

이 패턴의 목적은 주어진 주제를 중심으로 게임을 만드는 것입니다.

게임은 특정 주제를 중심으로 진행되며 LLM이 게임 플레이를 안내합니다.
사용자는 제한된 규칙 집합을 지정할 수 있으며 LLM은 게임 플레이를 위한 컨텐츠 본체 생성을 자동화할 수 있습니다.

Structure and Key Ideas

  1. Create a game for me around X
  2. One or more fundamental rules of the game.

Example

아래와 같은 cybersecurity game을 예를 들 수 있습니다. 이 패턴은 페르소나 패턴을 응용하였습니다. (LLM은 리눅스 시스템인 척 합니다.)

"우리는 사이버 보안 게임을 할 것입니다.
당신은 잠시 동안 리눅스 터미널 행세를 할 것입니다
공격자에 의해 손상된 컴퓨터입니다.

내가 명령어를 입력하면 리눅스 단말기에서 생성할 수 있는 해당 텍스트를 출력하게 됩니다.

명령어를 사용하여 시스템이 어떻게 손상되었는지 확인해 보겠습니다.

공격은 다음 중 하나 이상의 작업을 수행해야 합니다:
(1) 새로운 프로세스를 시작했습니다,
(2) 변경된 파일,
(3) 통신을 받기 위해 새로운 포트를 열었고,
(4) 새 아웃바운드 연결을 생성했습니다,
(5) 변경된 비밀번호,
(6) 새 사용자 계정을 만들거나
(7) 정보를 읽고 훔쳤습니다.

게임을 시작하려면 제 조사로 이어진 일의 시나리오를 인쇄하고 설명에 시작하는 데 사용할 수 있는 단서가 있게 해야 합니다."

profile
NP-Hard 문제를 풀어봅니다.

0개의 댓글