3.C. 구분 기호 사용하기
3.C. 구분 기호 사용하기🔗
'구분 기호 사용'은 앞서 설명한 '명확하고 구체적인 지시'를 실현하는 중요한 기법 중 하나입니다. 이 방법은 대규모 언어 모델(LLM)과의 상호작용을 더욱 정확하고 효과적으로 만듭니다.
구분 기호의 주요 목적은 다음과 같습니다.
- 프롬프트 내에서 특정 부분을 명확히 구분하여 LLM이 정확히 참조할 수 있게 합니다.
- 원하는 답변의 특정 부분에 어떤 내용이 들어가야 할지 명확히 지정합니다.
- 답변의 서식을 지정하거나, 질문/답변의 특정 부분을 강조하여 표시합니다.
이를 통해 LLM은 사용자의 의도를 더 정확히 파악하고, 요구사항에 맞는 답변을 생성할 수 있습니다. 구분 기호를 효과적으로 사용하면 아무리 복잡한 프롬프트라도 명확하게 구조화할 수 있어, LLM과의 커뮤니케이션 품질을 크게 향상시킬 수 있습니다.
* AI 생성 이미지 with Nano Banana Pro
다음은 구분 기호를 사용하는 주요 방법들입니다. 각 방법은 대개 특정 상황에 적합하지만, 그렇다고 아주 엄격히 준수해야 하는 것은 아닙니다. 익숙한 한 가지 방법을 여러 상황에 사용할 수 있고, 동시에 여러 방법을 조합하여 사용해도 잘 동작합니다.
큰따옴표🔗
따옴표는 특정 텍스트를 구분하는 가장 간단한 방법 중 하나입니다. 간단한 예시로,
큰 따옴표로 구분된 텍스트를 요약해:
"""
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
(이하 생략)
"""
큰따옴표 세 개(""")를 사용하면 여러 줄의 텍스트를 쉽게 구분할 수 있습니다. 위 예시는 언어도 다르고 질문 자체가 짧으니 큰 따옴표를 쓰지 않더라도 크게 문제되진 않지만, 간혹 질문도 길고 지문도 긴 경우에 이들을 구분하지 않으면 LLM이 정교한 답변을 내놓기 어렵습니다.
다음 예시도 한번 보시죠.
다음 정보를 사용하여 뉴스 기사를 작성해봐. 기사는 제목, 부제목, 본문으로 구성되어야 하고, 큰 따옴표 세 개로 강조표기된 내용에 초점을 맞춰서 써.
- 주제: 인공지능 기술 고도화를 위한 정부 정책 발표
- 날짜: 2024년 7월 18일
- 주요 내용: 경량화 모델 개발, """인공지능 R&D 생태계 조성""", AI 윤리 및 안전성 강화 등
지시 사항에서 같은 중요도로 취급될 수 있는 '주요 내용'들 중에서도 강조할 주제를 특정하기 위해 큰 따옴표를 사용했고, 실행해보니 실제로 적절히 반영되어 있음을 알 수 있습니다.
📌 참고 : 어째서 큰 따옴표를 콕 집어 '세 개' 쓰라는 걸까요? 한 개나 두 개만 쓰이면 일반 문장에 쓰이는 경우와 구분이 어렵기 때문입니다. 즉 일반적인 문장 부호가 아니라 '구분자'라는 의도를 명확히 하기 위함입니다.
그런데 한 개나 두 개를 쓴다고 꼭 못 알아듣는 건 아닙니다. 구분해주려는 텍스트 안에 큰/작은 따옴표가 이미 섞여 있는 경우만 아니면 그럭저럭 동작은 할 겁니다.
작은 따옴표(
''')도 동작은 합니다만 아래에서 설명할 멀티 라인 코드 블록 표기와 '사람이' 헷갈릴 수 있어서 널리 사용되진 않습니다.
XML 태그🔗
XML 태그는 콘텐츠를 구조화하고 의미를 부여하는 데 효과적입니다. LLM에 특정 값, 명사, 또는 텍스트 뭉치를 정확히 가리키고 싶을 때 사용할 수 있습니다.
예시 - 특정 변수를 입력하는 경우 :
동물의 이름을 알려드릴게요. 그 동물이 내는 소리로 응답하세요.
<동물>고양이</동물>
또는 답변의 형식을 특별히 지정하고 싶을 때에도 사용할 수 있습니다.
예시 - 특정 형식으로 답변을 요청하는 경우 :
다음 이메일에서 주요 세부 정보를 추출하여 XML 태그로 반환해 주세요:
- <발신자></발신자> 태그의 발신자 이름
- <주제></주제> 태그의 주요 주제
- <마감일></마감일> 태그에 언급된 마감일 또는 날짜
<email>
보낸 사람 John Smith
받는 사람 Jane Doe
제목: 프로젝트 X 업데이트
안녕 Jane,
프로젝트 X에 대한 간단한 업데이트를 알려드리고자 합니다. 이번 주에 좋은 진전이 있었고 초기 마일스톤을 달성하기 위해 순조롭게 진행되고 있습니다. 하지만 8월 15일 마감일까지 최종 단계를 완료하려면 몇 가지 추가 리소스가 필요할 수 있습니다.
다음 주에 예산과 일정에 대해 더 자세히 논의할 수 있도록 미팅 일정을 잡을 수 있을까요?
감사합니다,
John
</email>
XML 태그를 쓸 때는 외부 API와 연계할 때와 같은 특별한 경우만 제외하면, 위의 예시처럼 원하는 키워드 아무거나 사용할 수 있습니다. 즉 <문서></문서>, <doc></doc>, <document></document> 모두 효과적으로 동작합니다.
XML 태그 사용 시 참고할 사항들을 정리하면 다음과 같습니다.
-
태그는 아무 명칭이나 써도 되지만,
<instruction>이나<example>,<input>등과 같이, 태그에 포함될 실제 콘텐츠를 반영하는 직관적인 이름을 사용하는 게 좋습니다. -
또한 프롬프트 전체에서 태그 이름의 일관성을 유지해야 하며, 만약 동일한 의미로 입력해준 '예시'라도 LLM 입장에선
<예시></예시>와<example></example>을 서로 다른 것으로 취급할 것입니다.💭 다른 태그들이 혼용되지 않는 상황이라면 LLM은 정황 상 동일한 것으로 취급할 수도 있습니다. 그러나 명확한 지시를 위해 구분 기호를 쓰는 마당에 굳이 LLM의 주의(?)를 분산시킬 필요가 있을까요...?
-
표준 HTML/XML 태그 중에는
<br/>,<p>등과 같이 하나만 써도 되는 태그가 있긴 하지만, 프롬프트에 사용하는 태그는 여는 태그<tag>와 닫는 태그</tag>의 쌍을 함께 사용해야 합니다. -
필요한 경우 태그 안에 다른 태그를 중첩하여 사용할 수 있지만, 프롬프트의 복잡성에 따라 약 5단계 이상으로 중첩된 태그는 제대로 동작하지 않을 수 있습니다.
JSON 형식🔗
JSON은 데이터를 구조화하는 데 XML 못지 않게 널리 사용되는 형식입니다. 프롬프트에 활용할 때는 일반적인 질문이나 문장을 표현하는데 사용하기보다, 데이터와 데이터의 구조를 함께 알려줄 때나 정해진 형식으로 LLM의 답변을 받아야 할 때 효과적인 방법입니다. 또 복잡한 지시를 여러 단계로 나눠 처리할 때 이전 단계의 답변 중 특정 값/단어를 다음 단계에 전달하기 위해 사용할 수도 있습니다.
📌 참고 : 프로그램 친화적이고 동시에 여러 값/단어를 특정하기 용이하다는 측면에서 XML 태그를 사용하는 기법과 -형식은 다르지만- 거의 같은 기법이라고 이해하면 됩니다.
예시:
{
"question": "물의 끓는 점은 몇 도야?",
"context": {
"unit": "섭씨",
"pressure": "1 기압"
}
}
XML 태그와 마찬가지로 출력문의 형식으로 지정할 수도 있으며, 방법은 다음과 같이 'JSON 형식'이라고 언급만 해도 되고,
또는 다음과 같이 특정 JSON 형식을 지정해서 요청해도 됩니다.
마크다운 서식🔗
마크다운(markdown)은 텍스트를 구조화하고 강조하는 데 유용합니다. 다른 가이드에서도 한 번 언급한 바 있습니다만 우리가 사용하는 LLM은 이미 많은 마크다운 서식의 문서들을 학습했으며, 무엇보다 LLM이 답변할 때에도 이미 마크다운 서식을 활용하고 있습니다!
📌 참고 : 심지어 이 문서 역시 마크다운 편집기로 작성 중입니다. 마크다운 형식에 대해선 다음을 참조하기 바랍니다. → 🔗위키백과, 🔗Wikipedia, 🔗ChatGPT
마크다운을 사용하면 제목(#), 강조(**), 목록(-) 등을 통해 비교적 간단히 텍스트를 구조화할 수 있습니다. 예를 들면,
# 핵심 질문
삼체 문제란게 도대체 뭐길래 화제가 되는 거야?
## 참고 사항
**다음 사항을 포함할 것:**
- 과학적인 개념, 주요 역사 및 배경 등의 해설
- 동명의 SF 소설이 '삼체 문제'를 어떻게 다루는지
위의 예시처럼 질문과 추가 지시 사항을 구분하면, LLM은 핵심 질문에 초점을 두면서도 추가 지시들을 적절히, 균형 있게 참조하여 답변을 할 수 있습니다. 강조 표기된 텍스트는 다른 텍스트보다 중요하게 인식하고, 목록으로 나열된 텍스트는 동일하거나 유사한 우선순위로 취급할 것입니다. (실행 결과는 이 곳에서 확인하기 바랍니다.)
💭 사실 이 정도 질문은 구조화하지 않아도 될 만큼 단순한 예시이고, 더 복잡하고 긴 질문/지시를 전달할 때 사용하면 상당히 효과적인 기법입니다.
참고로 마크다운 서식 중, 세 개 이상의 대시(---) 또는 별표(*)를 써서 구분선(horizontal line)을 나타내기도 하며, 이는 긴 질문을 할 때나 긴 답변을 요청할 때 효과적으로 사용할 수도 있습니다. 다음과 같이,
다음 회의록을 요약해줘. 주요 안건 별로 구분선으로 나눠줄 테니, 각각을 따로 요약해:
(회의 초반, 안건 1에 관한 회의 내용들)
---
(회의 중반, 안건 2에 관한 회의 내용들)
***
(회의 후반, 안건 3에 관한 회의 내용들)
또는,
계절별 제철 음식들을 정리해봐. 계절마다 구분선(--- 또는 ***)으로 나눠서 나열해줘.
이는 긴 지문을 시각적으로 구분해주므로 LLM보다는 사람에게 더 편리한 방법입니다.
코드 블록🔗
마크다운 서식 중 하나인 백틱(` = Esc 키 아래, 숫자 1키 왼쪽 기호)을 사용하면, 일반 텍스트 내에서 코드, 변수명, 함수명, 파일명 같은 특정 용어를 -또는 어떤 텍스트든지- 형식에 구애받지 않고 명확히 구분할 수 있습니다. 코드 블록은 두 가지 형태가 있는데, '인라인 코드 블록'과 '다중 라인 코드 블록'입니다.
인라인 코드 블록은 문장 내에서 간단히 사용하기 좋습니다. 원하는 텍스트 앞 뒤에 백틱 기호를 한 번씩 써주면 됩니다.
예시:
이렇게 하면 LLM은 print()와 print("Hello, World!")를 일반 텍스트와 구별되는 코드나 일종의 대명사처럼 조금은 특별하게 인식하고 처리할 수 있습니다.
그리고 여러 줄의 코드나 장문의 텍스트를 표시할 때는 세 개의 백틱 기호를 사용하여 다중 라인 코드 블록을 만들 수 있습니다. 이 방법은 전체 함수나 긴 스크립트를 표시할 때 유용합니다.
예시:
다음 파이썬 코드를 설명해줘:
```python
def greet(name):
"""
This function greets the person passed in as a parameter
"""
return f"Hello, {name}! How are you today?"
print(greet("Alice"))
이 방법을 사용하면 LLM이 여러 줄의 코드를 하나의 블록으로 인식하고, 코드의 구조와 들여쓰기를 유지한 채 처리할 수 있습니다.
📌 참고 :
인라인/다중 라인 코드 블록 내에서는 HTML/XML 태그나 마크다운 등 대부분의 서식이 적용되지 않으므로, 그 안의 내용이 무엇이든 있는 그대로 표현할 수 있습니다.
특히 다중 라인 코드 블록의 시작 부분에 프로그래밍 언어를 지정(예를 들면 위 코드의 첫 번째 줄의 ```python과 같이)하면, LLM이 해당 언어의 문법과 구조를 더 잘 이해할 수 있습니다. 알려진 언어의 경우 컬러 코드까지 자동으로 적용해줘서 사람에게도 가독성이 크게 향상됩니다.
또한 다중 라인 코드 블록이 사용된 부분에는 뷰어가 지원할 경우 '복사하기' 버튼도 함께 나타나서, 안에 있는 예시나 코드를 더 간편하게 복사할 수 있습니다.







