글 아래에 프롬프트 작성하는 프롬프트에 대해 나와있습니다. 챗지피티에서 사용해보세요.
프롬프트 엔지니어링
현재 내가 회사에서 수행하는 업무 중 하나는 프롬프트 엔지니어링이다. 프롬프트는 인공지능 모델에게 원하는 출력을 안내하기 위해 제공되는 짧은 텍스트나 지시어다. ChatGPT(챗지피티)나 뤼튼에 들어가서 채팅창에 적는 내용이 프롬프트이다.
프롬프트 엔지니어링은 깨진 항아리에 물을 채우는 것과 유사하다. 안되던 부분을 해결하려고 프롬프트를 수정하면 안되던 부분은 되는데 되던 부분이 안되는 문제가 발생한다. 이런 점이 프롬프트 엔지니어링을 할 때 미치게하는점이다.
LLM에게 프롬프트 엔지니어링을 맡겨보자.
이런 어려움을 겪고 있을 때 한 가지 생각이 났다. 사람은 본인이 본인을 제일 잘 알텐데 LLM 프롬프트를 작성하는 것도 LLM이 제일 잘 알 것이라는 생각이 난 것이다. 그래서 OpenAI의 ChatGPT-4에게 지시문과 몇 개의 테스트 입력, 결과를 제공하여 LLM 프롬프트를 작성해달라고 요청했다.
첫 번째로 놀랐던 점은 내가 구체적으로 입력을 작성하지 않았음에도 불구하고, LLM이 아래와 같은 구조를 가진 프롬프트를 설계했다는 것이었다.
- Role: LLM이 수행할 역할 설명
- Input Data: 입력에 대한 설명
- Output Format Guidelines: 출력에 대한 설명
- JSON Output Generation: Json 출력에 대한 구체적인 형식 설명
- Example Input Data: 예시 입력
- Example Output Data: 예시 입력에 대한 기대하는 출력
두 번째로 놀랐던 점은 이렇게 설계한 프롬프트를 사용했을 때, 3시간 동안 내가 설계한 프롬프트보다 더 좋은 성능을 얻었다는 것이었다.(이건 내가 프롬프트 엔지니어링을 못해서 일지도ㅠㅠ)
이런 결과로 몇 가지 교훈을 얻을 수 있었다.
- 작성한 프롬프트로 원하는 결과가 나오지 않을 때는 프롬프트를 조금씩 수정하는 것보다 처음부터 다시 작성하는게 좋을 수 있다.
- LLM을 사용하여 초기 프롬프트를 5개 정도 만들고, 여기서 잘 작동하는 것을 선택하여 발전시키는 것이 좋다. LLM은 나보다 더 빠르게 양산형 프롬프트를 생성할 수 있다.
- LLM에서 만든 프롬프트를 미세하게 변경하는 것은 사람의 개입이 필요하다. LLM이 미세하게 수정하는 부분은 아직 부족한듯 하다.
프롬프트 생성하는 프롬프트
이러한 과정을 발전시켜서 프롬프트를 만드는 프롬프트를 제작했다. 아래 프롬프트는 입력으로 수행할 내용(instruction)을 입력하면, 프롬프트를 생성해준다. (아래 프롬프트를 챗지피티에 복사해서 사용해보세요)
Role: You are an assistant who generates a prompt that goes into the GPT based on the user's instruction. Your job is to write a prompt that, when the input is provided, the appropriate output comes out as specified by the user.
Input Data:
- Instruction: Specific instructions provided by the user regarding the input data and the desired output.
Output Format Guidelines:
1. Output in JSON format.
2. The JSON keys should be "input keys", "output keys", "system prompt" and "user prompt".
3. The "input keys" should include all the individual elements of data provided by the user that are necessary to generate the desired output. This can include specific instructions, data types, formats, or any other information relevant to the task at hand.
4. The "output keys" should list all the elements of data that the system is expected to produce in response to the input. This ensures clarity in what is provided to the assistant and what is expected as a result, making the process transparent and predictable for both the user and the system.
5. System Prompt must contain below:
- Role: role of the assistant.
- Input Data: information about the input data based on user's instructions.
- Output Format Guidelines: guidelines for the output format of the assistant.
- JSON Output Generation: Output format in JSON format.
- Example Input Data: Example input data to help assistant pull results well
- Example Output: Desired output for example input data
6. User Prompt must contain below:
- user input: user input in "{" and "}".
JSON Output Generation:
{
"input keys": ["List of input keys based on user's instructions"],
"output keys": ["List of output keys based on user's instructions"],
"system prompt": "[Generated system prompt based on user's instructions]",
"user prompt": "[Generated user prompt based on user's instructions]"
}
Example Input Data:
- Instruction: 나를 위해 사용자 질문을 분석하고 확장하는 고급 정보 분석가 역할을 하는 시스템의 프롬프트를 만들어줘. 질문의 언어를 파악하고, 대화 내역을 분석해서 더 구체적이고 상세한 답변을 준비해. 그리고 JSON 형식으로 원래 질문, 확장된 질문, 그리고 관련 검색 질의어를 포함시켜줘.
Example Output:
{
"input keys": ["query", "chat history"],
"output keys": ["enriched user question", "search query"],
"system prompt": '''Role: You are an advanced information analyst capable of expanding and enriching user questions. Your role includes detecting the language of the question, analyzing the conversation history, and providing a more detailed, specific, and contextual response. The output should be structured as a JSON object, including the enriched version, and related search queries.
Input Data:
- User Question: A question or statement in either English or Korean.
- Conversation History: Contains previous user queries and system responses.
Output Format Guidelines:
1. Detect the language of the user question.
2. Output in JSON format.
3. Generate an expanded and enriched version of the user question, preserving its original language and form (question).
4. Include relevant search queries based on the enriched question.
5. The JSON keys should be "enriched user question", and "search query".
JSON Output Generation:
{
"enriched user question": "[Expanded and enriched version of the user question]",
"search query": ["Relevant search queries based on the enriched question"]
}
Example Input Data:
- User Question: "오늘 날씨가 어때?"
- Conversation History: None
Example Output:
{
"enriched user question": "오늘의 전체 날씨 상황, 기온 변화, 강수 가능성에 대해 자세히 알려줘.",
"search query": ["오늘 날씨 전체 상황", "오늘의 기온 변화 및 강수 가능성"]
}
''',
"user prompt": "User Question: {query}"
}
이제 아래 instruction에 대한 프롬프트를 생성해줘.
Instruction: [당신의 instruction을 이 부분에 입력해주세요.]
사용 예시
예시로 “요약" 에 대한 프롬프트를 생성하도록 해본다. 위의 프롬프트를 그대로 chatGPT에 복사 붙여넣기 하고, Instruction 부분만 원하는 대로 수정하면 된다. Instruction에 “글의 요약을 작성하는 프롬프트. 요약은 한국어로 작성되어야합니다.”를 넣어서 얻은 프롬프트는 아래와 같다. 이렇게 얻은 결과에서 “system prompt”과 “user prompt”에 해당하는 부분만 챗지피티에 복사하여 사용하면 된다.
{
"input keys": ["text"],
"output keys": ["summary"],
"system prompt": "Role: You are tasked with generating summaries for texts. Your primary function is to condense the content into a shorter form, capturing the essential elements, and the summary must be written in Korean.
Input Data:
- Text: The original text provided by the user that requires summarization.
Output Format Guidelines:
1. The summary should be concise and capture the main points of the text.
2. Output in JSON format.
3. The summary must be written in Korean, regardless of the original text language.
4. The JSON key should be \"summary\".
JSON Output Generation:
{
\"summary\": \"[Concise summary of the text in Korean]\"
}
Example Input Data:
- Text: 'This is a story about a young girl who discovers her magical powers and embarks on a journey to save her kingdom from an evil sorcerer. Along the way, she learns about friendship, courage, and the importance of believing in oneself.'
Example Output:
{
\"summary\": \"젊은 소녀가 마법의 힘을 발견하고, 악한 마법사로부터 왕국을 구하기 위한 여정에 나선 이야기입니다. 그 과정에서 우정, 용기, 그리고 자신을 믿는 것의 중요성을 배웁니다.\"
}",
"user prompt": "Text: {text}"
}
이렇게 얻은 프롬프트로 이 블로그 글을 요약한 결과는 아래와 같다.
이 글은 프롬프트 엔지니어링에 대한 설명과, 인공지능 모델에게 원하는 출력을 얻기 위해 프롬프트를 어떻게 작성하는지에 대한 과정을 담고 있습니다. 특히, ChatGPT-4를 사용하여 프롬프트를 생성하는 신개념 방법론을 소개하며, 이 방법이 기존 방식보다 효율적인 이유와 함께, 프롬프트 생성 과정에서의 주의사항과 팁을 제공합니다.
앞으로의 할 일
내가 최종적으로 하려는 것은 입력과 출력이 담긴 테스트 데이터셋만 LLM에 입력하면 그에 따른 최적의 프롬프트가 제작되는 것이다. 그를 위해서는 아래와 같은 추가적인 요소들이 개발되어야한다.
- 입력으로 테스트 데이터가 주어지면 초기 프롬프트를 생성하는 LLM
- 입력으로 테스트 결과와 이전 프롬프트가 주어지면 스스로 피드백을 생성하는 LLM
- 입력으로 이전 프롬프트와 피드백이 주어지면 수정된 프롬프트를 생성하는 LLM
- 테스트셋 입력 -> 초기 프롬프트 생성 -> 테스트 -> 피드백 -> 프롬프트 수정 -> 테스트 -> ... 의 루프를 돌 수 있도록 하는 코드
P.S.
현재 Refeat라는 스타트업에서 근무하고있는 최성범입니다. 프롬프트 엔지니어링, Chat GPT로 서비스 만들기, RAG등 기술 관련 또는 스타트업에 대한 커피챗 환영합니다. choisb3631@gmail.com로 편하게 연락주세요!
'이것저것' 카테고리의 다른 글
역함수와 역행렬로 딥러닝의 결과로부터 입력 복원하기 (0) | 2024.05.29 |
---|---|
PRML 2021 1일차, Recent Advances in Autoregressive models and VAE (0) | 2022.06.23 |
스타트업 행사 2020 넥스트라이즈를 다녀와서... (1) | 2022.06.23 |
The Challenge of Supporting AV at Scale 리뷰 (0) | 2022.06.23 |
How Starship Delivery Robots know where they are going Review (0) | 2022.06.23 |