About Prompt Engineering : 4.프롬프트 예시
이전 섹션에서는 LLM을 확인하는 방법에 대한 기본적인 예를 소개했습니다.
이번 섹션에서는 프롬프트를 사용하여 다양한 작업을 수행하고 그 과정에서 주요 개념을 소개하는 방법에 대한 더 많은 예를 제공합니다. 아래의 몇 가지 예는 잘 만들어진 프롬프트를 사용하여 다양한 유형의 작업을 수행하는 방법을 보여줍니다.
텍스트 요약 (Text Summarization)
자연어 생성의 표준 작업 중 하나는 텍스트 요약입니다. 말 그대로 긴 문서나 글을 짧게 요약하는 작업을 말합니다. 사실, 언어 모델의 가장 유망한 응용 프로그램 중 하나는 기사와 개념을 빠르고 읽기 쉬운 요약으로 요약할 수 있는 능력입니다. 프롬프트를 사용하여 기본 요약 작업을 시도해 보겠습니다.
정릉에 대해 알고 싶다고 가정해 보겠습니다. 다음과 같은 프롬프트를 시도할 수 있습니다.
프롬프트:
정릉에 대해 설명해줘
답변:
출력:
정릉(正陵)은 대한민국 서울에 위치한 조선시대 왕들의 묘역으로, 조선 왕조의 제9대인 세종대왕부터 현종대왕까지 17명의 왕들과 왕비들, 명나라의 임금 단헌왕비 등이 묘역으로 안치되어 있습니다. 이곳은 한국의 역사와 문화를 반영하는 귀중한 유적지 중 하나로 꼽히며, 많은 관광객과 역사 애호가들이 방문하는 곳입니다.
정릉은 조선 왕조의 묘역으로, 왕의 묘와 그 왕비들의 묘가 함께 있습니다. 조선 왕은 죽은 후 태자의 위치에서 순서대로 묘를 지어주었는데, 이를 성혼이라고 합니다. 성혼은 궁궐과 비슷한 형태로 건축되었으며, 고려 시대의 왕릉 양식을 따라 만들어졌습니다. 성혼은 물과 산에 좋은 위치에 지어졌으며, 물이 언제나 흐르고 향기롭고 아름다운 경치를 자랑합니다.(생략)
프롬프트에 들어간 “답변:” 는 질문 답변에 사용하는 명시적인 프롬프트 형식입니다. 여기서 이 정보를 사용하여 모델에게 추가로 예상되는 답이 있음을 알렸습니다. 이 예에서는 사용하지 않는 것과 사용하지 않는 것이 어떤 차이가 있는지 명확하지 않지만, 나중에 나올 예시에서는 큰 차이를 느낄 수 있습니다.
gpt의 답변이 너무 많은 정보라고 가정하고 더 요약하려고 합니다. 실제로 모델에게 다음과 같이 한 문장으로 요약하도록 지시할 수 있습니다.
프롬프트:
정릉(正陵)은 대한민국 서울에 위치한 조선시대 왕들의 묘역으로, 조선 왕조의 제9대인 세종대왕부터 현종대왕까지 17명의 왕들과 왕비들, 명나라의 임금 단헌왕비 등이 묘역으로 안치되어 있습니다. 이곳은 한국의 역사와 문화를 반영하는 귀중한 유적지 중 하나로 꼽히며, 많은 관광객과 역사 애호가들이 방문하는 곳입니다.
정릉은 조선 왕조의 묘역으로, 왕의 묘와 그 왕비들의 묘가 함께 있습니다. 조선 왕은 죽은 후 태자의 위치에서 순서대로 묘를 지어주었는데, 이를 성혼이라고 합니다. 성혼은 궁궐과 비슷한 형태로 건축되었으며, 고려 시대의 왕릉 양식을 따라 만들어졌습니다. 성혼은 물과 산에 좋은 위치에 지어졌으며, 물이 언제나 흐르고 향기롭고 아름다운 경치를 자랑합니다.
위 내용을 한 문장으로 설명해줘:
출력:
정릉은 대한민국 서울에 위치한 조선시대 왕들의 묘역으로, 세종대왕부터 현종대왕까지 17명의 왕들과 왕비들, 명나라의 임금 단헌왕비 등이 묘역으로 안치된 한국의 역사와 문화를 반영하는 중요한 유적지로 많은 관광객과 역사 애호가들이 방문하는 곳입니다.
chat gpt에서는 유저와 주고받은 대화 내용을 기억하기 때문에 문서 없이 ‘한 문장으로 설명해줘’ 라고 지시해도 잘 수행 합니다. 또한 gpt로부터 응답받은 문서가 아닌, 외부의 데이터를 가지고와 input data로 넣고 요청을 해도 요약문을 잘 생성해 줄 것입니다.
프롬프에 그냥 요약을 해달라고 요청하는 것보다 내가 보고싶은 관점에 대해서 요약을 해달라고 하면, 다른 요약문이 생성됩니다. 즉, 어떻게 요약해달라고 요청하느냐에 따라 원하는 정보를 추출할 수 있습니다.
앞서서는 단락을 한 문장으로 요약하라고 했습니다. 모델은 지침에 맞게 알맞은 결과를 출력했지만, 여기서 잠시 멈추고 더 나은 결과가 나오는지 실험해 보세요
출력의 정확성에 대해서는 이후에 다룰 예정입니다.
정보 추출 (Information Extraction)
언어 모델은 자연어 생성 및 관련 작업을 수행하도록 훈련되었지만 분류 및 다양한 자연어 처리(NLP) 작업을 수행할 수도 있습니다.
다음은 주어진 단락에서 정보를 추출하는 프롬프트의 예입니다.
프롬프트:
이강인은 PSG행 급물살을 탔다. 유럽 축구 이적시장에 정통한 파브리시오 로마노는 "PSG와 이강인이 장기 계약에 대한 구두 합의에 도달했다. 메디컬 테스트도 이미 마무리됐다. 마지막 세부 사항 조율만 남았다. 이강인 PSG행 관련 모든 당사자들은 계약 성사에 자신감을 갖고 있으며 두 클럽 사이 구두 합의도 이루어졌다. 서명만 기다리는 중이다"라며 계약 성사를 뜻하는 시그니처 'here we go'를 남겼다.
프랑스 현지에선 루이스 엔리케 감독 선임 발표 이후 영입생 오피셜이 나올 거라 예상했다. 엔리케 감독은 2014-15시즌 당시 바르셀로나와 함께 스페인 라리가, 코파 델 레이, 유럽축구연맹(UEFA) 챔피언스리그(UCL) 우승으로 '트레블'을 달성했다.
엔리케 감독 선임이 확정되자 '오피셜 러시'가 이어졌다. 밀란 슈크리니아르, 마르코 아센시오, 마누엘 우가르테가 차례로 발표되면서 기대감이 점점 고조됐다. 다음 주인공은 바로 이강인이었다. 8일 오전 인천국제공항을 통해 파리로 떠난 다음 프랑스에 도착한지 얼마 지나지 않아 공식 발표가 나왔다. 발렌시아에서 방출됐던 선수가 '빅이어(UCL 우승 트로피)'를 노리는 PSG에 바이아웃으로 영입된 것이다.
위 단락에서 PSG의 감독을 언급해주세요:
출력:
위 단락에서 PSG의 감독은 루이스 엔리케입니다.
위의 결과를 개선할 수 있는 방법은 여러 가지가 있지만 이미 매우 유용합니다.
이제 모델에게 무엇을 해야 하는지 지시하는 것 만으로 다양한 작업을 수행하도록 요청할 수 있습니다.
문단 출처 : 네이버 스포츠
질문 답변 (Question Answering)
모델이 특정 답변에 응답하도록 하는 가장 좋은 방법 중 하나는 프롬프트 형식을 개선하는 것입니다. 앞에서 설명한 것처럼 프롬프트는 지침, 컨텍스트, 입력 및 출력 표시기를 결합하여 향상된 결과를 얻을 수 있습니다. 이러한 구성 요소가 꼭 필요하지는 않지만 지침을 구체화 할수록 더 좋은 결과를 얻을 수 있기 때문에 좋은 방법이 됩니다. 다음은 좀 더 체계적인 프롬프트를 실행 했을 때의 모습을 보여주는 예입니다.
프롬프트:
Answer the question based on the context below. Keep the answer short and concise. Respond "Unsure about answer" if not sure about the answer.
Context: Teplizumab traces its roots to a New Jersey drug company called Ortho Pharmaceutical. There, scientists generated an early version of the antibody, dubbed OKT3. Originally sourced from mice, the molecule was able to bind to the surface of T cells and limit their cell-killing potential. In 1986, it was approved to help prevent organ rejection after kidney transplants, making it the first therapeutic antibody allowed for human use.
Question: What was OKT3 originally sourced from?
Answer:
출력:
Mice.
갑분영어
텍스트 분류 (Text Classification)
지금까지 간단한 지침을 사용하여 작업을 수행했는데요, 우리는 프롬프트 엔지니어로서 더 나은 지침을 제공하는 것을 더 잘 할 필요가 있습니다. 또한 더 어려운 사용 사례의 경우 지침만 제공해도 충분하지 않다는 것을 알게 될 것입니다. 그 때는 상황과 프롬프트에서 사용할 수 있는 다양한 요소에 대해 더 많이 생각해야 합니다. input data또는examples을 제공해서 시연해보겠습니다.

당신은 텍스트를 분류하라는 지침을 내렸고 모델은 다음과 같이 응답했습니다. 생각했던 답이 '중립' 이 맞나요? '중립' 또한 충분히 맞는 답입니다. 하지만 당신이 '긍정' 의 감정이 나타나길 원했다면 어떻게 이를 달성할 수 있을까요? 이렇게 하는 데는 여러 가지 방법이 있습니다. 여기서는 특수성에 관심이 있으므로 프롬프트에 더 많은 정보를 제공할수록 더 좋은 결과를 얻을 수 있습니다. 예제를 제공하여 올바른 동작을 지정할 수 있습니다. 다시 시도해 보겠습니다.

같은 질문이었지만 답변이 달라졌습니다. 프롬프트에 제공된 예제는 모델의 출력을 구체화하는 데 도움이 된 것으로 보입니다.
사실 모델은 '중립' 의 레이블에 있어서 약간의 편견을 가지고 있습니다.
‘강한긍정’ 이나 ‘부정’이 없으면 거의 중립으로 분류되는 것을 테스트 해보시면 알 수 있습니다.
이런 넓은 범위의 중립을 더확실한 '중립' 의 레이블로 만들기 위해서 어떻게 수정하실 건가요? 라벨에 설명을 추가하거나 프롬프트에 예제를 더 추가할 수 있나요?
다음 섹션에서는 이것에 관련해서 몇가지 이야기를 할 예정입니다
대화 (Conversation)
프롬프트 엔지니어링을 통해 달성할 수 있는 더 흥미로운 것 중 하나는 LLM 시스템에 동작 방법, 의도 및 정체성을 지시하는 것입니다. 이것은 고객 서비스 챗봇과 같은 대화형 시스템을 구축할 때 특히 유용합니다.
예를 들어, 질문에 대한 보다 기술적이고 과학적인 답변을 생성할 수 있는 대화 시스템을 만들어 보겠습니다. 지침을 통해 어떻게 행동해야 하는지 명시적으로 알려주는 방법에 주목합니다. 이를 role prompting이라고도 합니다.
프롬프트:
다음은 우주연구원의 조수와의 대화입니다. 조수는 기술적이고 과학적입니다.
인간: 안녕하세요
AI: 안녕하세요! 저는 우주연구원의 조수입니다. 오늘 제가 어떻게 도와드릴까요?
인간: 블랙홀은 어떻게 생기는지 알려줄래요?
AI:
출력:
물론이죠! 블랙홀은 매우 특이한 천체입니다. 블랙홀은 무거운 별들이 그 특이한 질량과 중력으로 인해 끝나는 현상입니다. 별은 자신의 연소 에너지를 소모하면서 핵융합 반응을 일으킵니다. 이 반응이 지속되다가 연료가 다 소진되면, 별은 외부로 빛을 내뿜는 초신성 폭발을 일으키게 됩니다.
초신성 폭발 이후에는 남은 핵물질이 중력에 의해 별의 중심으로 무진장 무거운 질량을 압축시킵니다. 이런 과정을 "중력 붕괴"라고 합니다. 중력 붕괴가 충분히 강하면 별의 중심 부근에서 중력이 너무 강력하여 빛마저 튀어나올 수 없는 상태가 됩니다. 이렇게 빛도 빠져나올 수 없는 지역을 "이벤트 호라이즌"이라고 합니다.
이벤트 호라이즌 안에 있는 영역은 블랙홀의 질량과 크기에 따라 다양한 특성을 가지게 됩니다. 이 영역 안에서는 중력이 엄청나게 강력해져서 시공간 자체가 왜곡되고, 그 영향을 벗어날 수 없습니다. 따라서 이벤트 호라이즌을 넘어서면 블랙홀의 영향에서 벗어날 수 없다는 것이고, 이로 인해 블랙홀은 매우 특이한 우주 현상으로 알려져 있습니다.
연구원 조수의 대답이 좀 기술적으로 들리죠? 이해하기 쉬운 답변을 받을 수 있도록 지시문을 바꿔보겠습니다.
프롬프트:
다음은 우주연구원의 조수와의 대화입니다. 조수의 답안은 초등학생도 쉽게 이해할 수 있어야 합니다.
인간: 안녕하세요
AI: 안녕하세요! 저는 우주연구원의 조수입니다. 오늘 제가 어떻게 도와줄까요?
인간: 블랙홀은 어떻게 생기는지 알려줄래요?
AI:
출력:
물론이죠! 블랙홀에 대해 간단히 설명드리겠습니다. 블랙홀은 매우 무거운 별이 끝나고 무너지면서 생기는 물체입니다. 별은 자기 자신의 중력으로 인해 계속해서 수축하다가 질량이 너무 많아지면 블랙홀이 됩니다.
블랙홀은 놀라울 정도로 강한 중력을 가지고 있어서 주변에 있는 모든 물질을 흡수할 수 있습니다. 빛도 블랙홀 주변에서는 흡수되기 때문에 우리는 블랙홀을 직접 관측하기 어렵습니다.
블랙홀은 우주에 있는 여러 현상들을 이해하는데 중요한 역할을 합니다. 하지만 우리에게는 아직 많은 미스터리가 남아있는 분야이기도 합니다. 우주에 대한 더 많은 연구와 관찰을 통해서 블랙홀에 대해 더 많은 것을 알아가고 있습니다.
진전이 좀 있었습니다. 이런 식으로 예제를 더 추가하면 훨씬 더 좋은 결과를 얻을 수 있습니다.
코드 생성 (Code Generation)
생성형 ai의 꽃이라고 볼 수 있는 코드 생성입니다. Copilot과 Code Interpreter가 아주 좋은 예시이죠, 프롬프트를 통해 수행할 수 있는 코드 생성은 매우 방대합니다.
먼저 사용자에게 인사하는 간단한 프로그램을 시도해 보겠습니다.
프롬프트:
/*
사용자에게 이름을 묻고 "안녕하세요"라고 말합니다
*/
출력:
<!DOCTYPE html>
<html>
<head>
<title>인사하는 프로그램</title>
</head>
<body>
<script>
// 사용자에게 이름을 묻기 위한 prompt() 함수를 사용합니다.
var name = prompt("이름을 입력하세요:");
// 사용자의 이름을 확인하여 인사 메시지를 만듭니다.
var greeting = "안녕하세요, " + name + "님!";
alert(greeting); // 인사 메시지를 경고창으로 출력합니다.
</script>
</body>
</html>
사용할 언어를 지정할 필요도 없었습니다.
더 놀라운점은 코드를 생성해달라고 요청하지 않았는데, 주석안에 있음을 확인하고 코드를 생성해주었습니다.
레벨을 조금 바꿔보겠습니다. 아래의 예는 프롬프트를 설계하는 데 조금 더 많은 노력을 기울이면 LLM이 얼마나 강력해질 수 있는지 보여줍니다.
프롬프트:
Table departments, columns = [DepartmentId, DepartmentName]
Table students, columns = [DepartmentId, StudentId, StudentName]
Computer Science Department에서 모든 학생들을 조회하는 mysql 쿼리를 작성해주세요
출력:
SELECT s.StudentId, s.StudentName
FROM students s
JOIN departments d ON s.DepartmentId = d.DepartmentId
WHERE d.DepartmentName = 'Computer Science';
위의 경우 데이터베이스 스키마에 대한 데이터를 제공하고 유효한 MySQL 쿼리를 생성하도록 요청했습니다.
아주 기초적인 코드 생성이었지만 문제없이 코드를 출력해냈습니다. 더 복잡한 코드라도 프롬프트를 잘 설계한다면 수준급의 코드를 얻으실 수 있습니다.
Reasoning
오늘날 LLM에게 가장 어려운 작업 중 하나는 어떤 형태로든 추론이 필요한 작업입니다. 추론은 LLM에서 나타날 수 있는 복잡한 응용 프로그램의 유형으로 인해 가장 흥미로운 분야 중 하나입니다.
수학적 능력을 포함하는 작업에서 몇 가지 개선이 있었지만, 현재 LLM은 추론 작업을 수행하는 데 어려움을 겪기 때문에 이를 위해서는 훨씬 더 ‘진보’된 프롬프트 엔지니어링 기술이 필요합니다. 그러한 고급 기술들은 다음 장에서 다룰 예정입니다.


보시는 것처럼, 더 나은 지침과 예는 더 정확한 결과로 이어질 수 있습니다.
향후 가이드에서는 더 복잡한 프롬프트 엔지니어링 원칙에 대해 이야기 해보겠습니다.