01. 프롬프트 작성 지침

이 장에서는 프롬프트 작성의 지침에 대해 다룹니다. 이 장에서는 프롬프트 작성에 대한 두 가지 주요 원칙과 관련 전략들을 소개하며, 이 두 가지 원칙을 기반으로 효과적인 프롬프트를 작성하는 방법을 연습해보게 될 것입니다. 이를 통해 LLM을 효율적이고 편리하게 사용할 수 있습니다.

환경 설정

이 튜토리얼에서는 OpenAI의 ChatGPT API를 사용합니다. 따라서 먼저 ChatGPT의 API_KEY가 필요합니다(공식 웹사이트에서 직접 온라인 테스트도 가능합니다). 그런 다음, openai를 위한 서드 파티 라이브러리를 설치해야 합니다.

먼저 필요한 서드 파티 라이브러리를 설치합시다:

openai:

pip install openai

dotenv:

pip install -U python-dotenv

자신의 API-KEY를 시스템 환경 변수로 가져옵니다.

!export OPENAI_API_KEY='api-key'
import openai
import os

# 서드 파티 라이브러리를 가져옵니다
from dotenv import load_dotenv, find_dotenv

# 시스템의 환경 변수를 읽어옵니다
_ = load_dotenv(find_dotenv())

# API_KEY를 설정합니다
openai.api_key  = os.getenv('OPENAI_API_KEY')

이후 강좌에서는 OpenAI가 제공하는 ChatCompletion API의 사용 방법에 대해 자세히 살펴볼 것입니다. 여기서는 먼저 함수로 감싸서 사용해 보겠습니다. 이 함수의 내부 메커니즘을 알 필요는 없으며, 이 함수에 프롬프트를 입력하면 해당 프롬프트에 대한 완성본을 반환한다는 것만 알면 됩니다.

# OpenAI 인터페이스를 감싸는 함수, 매개변수는 프롬프트, 반환 값은 해당 결과
def get_completion(prompt, model="gpt-3.5-turbo"):
    '''
    prompt: 해당 프롬프트
    model: 사용되는 모델, 기본 값은 gpt-3.5-turbo(ChatGPT), 베타 테스트에 참여한 사용자는 gpt-4를 선택할 수 있습니다.
    '''
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0, # 모델 출력의 온도 계수, 출력의 랜덤성을 제어합니다
    )
    # OpenAI의 ChatCompletion 인터페이스를 호출합니다
    return response.choices[0].message["content"]

프롬프트 작성 원칙

  • 원칙 1: 명확하고 구체적인 지시문 작성
  • 원칙 2: 모델에게 “생각”할 시간을 주기

원칙 1: 명확하고 구체적인 지시를 작성하십시오

당신은 모델이 수행할 작업을 가능한 한 명확하고 구체적으로 표현하기 위해 지시를 제공해야 합니다. 이것은 모델이 올바른 출력을 내도록 유도하며, 불필요하거나 부정확한 응답을 받는 가능성을 줄입니다. 명확한 지시를 작성한다는 것은 반드시 짧은 지시를 작성한다는 의미는 아닙니다. 많은 경우, 더 긴 프롬프트는 사실 더 명확하고 더 많은 컨텍스트를 제공하며, 이는 실제로 더 자세하고 관련성이 높은 출력을 낼 수 있습니다.

전략 1: 구분 기호를 사용하여 입력의 다른 부분을 명확하게 나타냅니다.

구분 기호는 ,"",<>,<tag>,<\tag> 등이 될 수 있습니다.

특정 텍스트 부분을 프롬프트의 나머지 부분과 분리하기 위해 명백한 구두점을 사용할 수 있습니다. 이는 모델이 그것이 별도의 부분임을 명확하게 알 수 있도록 하는 어떠한 표시가 될 수 있습니다. 구분 기호를 사용하는 것은 프롬프트 주입을 피할 수 있는 유용한 기법입니다. 프롬프트 주입이란, 사용자가 일부 입력을 프롬프트에 추가하면, 모델에게 당신이 원하는 작업과 충돌하는 지시를 제공할 수 있으며, 이는 모델이 충돌하는 지시를 따르는 것이 아니라 당신이 원하는 작업을 수행하도록 만들 수 있습니다. 즉, 입력에 다른 지시가 포함되어 있을 수 있으며, 이는 당신의 지시를 덮어쓸 수 있습니다. 이에 대해, 구분 기호를 사용하는 것은 좋은 전략입니다.

다음은 한 예입니다. 우리는 한 문장을 제공하고 GPT에게 요약하도록 요청합니다. 이 예에서 우리는 ```를 구분 기호로 사용합니다.

text = f"""
모델이 수행하도록 하고 싶은 작업을 표현하려면 최대한 명확하고 구체적인 지시를 제공해야 합니다.\
이렇게 하면 모델은 원하는 출력 방향으로 유도되고, 무관하거나 잘못된 응답을 받을 가능성이 줄어듭니다.\
명확한 프롬프트를 작성한다는 것은 짧은 프롬프트를 작성한다는 것과 혼동하지 마십시오.\
많은 경우에서, 더 긴 프롬프트는 모델에게 더 많은 명확성과 컨텍스트를 제공하며, 이로 인해 더 상세하고 관련 있는 출력이 나올 수 있습니다.
"""
# 요약해야 하는 텍스트 내용
prompt = f"""
```으로 구분된 텍스트를 한 문장으로 요약하십시오.
```{text}```
"""

response = get_completion(prompt)
print(response)

출력 결과 입니다.

모델을 원하는 출력 방향으로 유도하기 위해서는 명확하고 구체적인 지시를 제공해야 합니다. 더 긴 프롬프트는 모델에게 더 많은 명확성과 컨텍스트를 제공하여, 더 상세하고 관련 있는 출력을 생성할 수 있습니다.

명확하고 구체적인 지시를 제공하여 모델이 원하는 출력 방향으로 유도되고, 무관하거나 잘못된 응답을 받는 것을 방지하십시오. 명확한 프롬프트와 짧은 프롬프트를 혼동하지 마십시오. 더 긴 프롬프트는 더 많은 명확성과 컨텍스트를 제공하여 더 상세하고 관련 있는 출력을 만들 수 있습니다.

전략 2: 구조화된 출력을 요구하십시오. 이는 Json, HTML 등의 형식일 수 있습니다.

두 번째 전략은 구조화된 출력을 생성하도록 요구하는 것으로, 이를 통해 우리는 모델의 출력을 더 쉽게 파싱할 수 있습니다. 예를 들어, 파이썬에서는 이를 딕셔너리나 리스트로 읽어올 수 있습니다.

아래 예시에서, 우리는 GPT에게 책 제목, 저자, 장르를 포함한 3권의 가상의 책 리스트를 생성하도록 요구하고 있습니다. 우리는 GPT에게 Json 형식으로 이를 반환하도록 요청하며, 파싱을 용이하게 하기 위해 Json 키를 지정하였습니다.

prompt = f"""
저자와 장르를 포함한 세 권의 허구적인 책 제목을 생성하십시오.
다음 키를 사용하여 JSON 형식으로 제공하십시오: book_id, title, author, genre.
"""
response = get_completion(prompt)
print(response)

출력 결과 입니다.

[
  {
    "book_id": 1,
    "title": "바람의 이름",
    "author": "패트릭 로푸스",
    "genre": "판타지"
  },
  {
    "book_id": 2,
    "title": "은하수를 여행하는 히치하이커를 위한 안내서",
    "author": "더글라스 애덤스",
    "genre": "과학 소설"
  },
  {
    "book_id": 3,
    "title": "그림자의 바람",
    "author": "카를로스 루이스 사폰",
    "genre": "미스터리"
  }
]

전략 3: 모델이 조건을 충족하는지 확인하도록 요구하기

작업에서 가정이 반드시 충족되지 않을 수 있다면, 모델에게 이러한 가정을 먼저 확인하도록 요구할 수 있습니다. 가정이 충족되지 않을 경우, 그것을 지시하고 실행을 중단하도록 할 수 있습니다. 또한 예외적인 상황이나 결과를 피하기 위해, 모델이 이러한 상황을 어떻게 처리해야 하는지 고려해 볼 수 있습니다.

다음 예시에서, 차를 만드는 단계와 명확한 단계가 없는 텍스트 두 가지를 모델에게 제공합니다. 텍스트에 명령어 시퀀스가 포함되어 있다면, 주어진 형식에 따라 명령어를 재작성하도록 모델에 요구하고, 그렇지 않다면 단계가 제공되지 않았음을 답하도록 합니다.

# 단계가 있는 텍스트
text_1 = f"""
차 한 잔을 만드는 것은 쉽습니다! 먼저 물을 끓여야 합니다. \
그 동안에 찻잔을 준비하고 차 주머니를 넣습니다. \
물이 충분히 뜨거워지면, 차 주머니 위에 물을 부어주세요. \
잠시 동안 차가 우려지도록 두세요. \
몇 분 후에 차 주머니를 빼내세요. \
원한다면 설탕이나 우유를 알맞게 넣어 맛을 조절할 수 있습니다. \
그런 다음 완성된 맛있는 차를 즐기면 됩니다!
"""
prompt = f"""
\"\"\"로 둘러싸인 텍스트가 제공됩니다. 
해당 텍스트에 일련의 지시사항이 포함되어 있다면, \
아래의 형식에 따라 해당 지시사항을 재작성하세요:

Step 1 - ...
Step 2 - …
…
Step N - …

해당 텍스트에 일련의 지시사항이 포함되어 있지 않다면, \
간단히 \"단계가 제공되지 않았습니다.\"라고 작성하세요.

\"\"\"{text_1}\"\"\"
"""
response = get_completion(prompt)
print("Text 1 의 요약:")
print(response)

출력 결과 입니다.

Text 1 의 요약:
Step 1 - 물을 끓이세요.
Step 2 - 찻잔을 준비하고 차 주머니를 넣으세요.
Step 3 - 물이 충분히 뜨거워지면, 차 주머니 위에 물을 부어주세요.
Step 4 - 잠시 동안 차가 우려지도록 두세요.
Step 5 - 몇 분 후에 차 주머니를 빼내세요.
Step 6 - 원한다면 설탕이나 우유를 알맞게 넣어 맛을 조절하세요.
Step 7 - 완성된 맛있는 차를 즐기세요.
# 단계가 없는 텍스트
text_2 = f"""
오늘은 햇살이 밝게 빛나고, 새들이 노래하고 있습니다. \
이런 멋진 날씨에 공원에서 산책하는 것이 좋습니다. \
꽃들이 피어나고, 나무들은 바람에 은은하게 흔들리고 있습니다. \
사람들이 밖으로 나와 좋은 날씨를 즐기고 있습니다. \
일부는 피크닉을 즐기고, 다른 일부는 게임을 하거나 그냥 잔디밭에서 휴식을 취하고 있습니다. \
자연의 아름다움을 감상하며 야외에서 시간을 보내기에 완벽한 날입니다.
"""
prompt = f"""
\"\"\"로 둘러싸인 텍스트가 제공됩니다. 
해당 텍스트에 일련의 지시사항이 포함되어 있다면, \
아래의 형식에 따라 해당 지시사항을 재작성하세요:

Step 1 - ...
Step 2 - …
…
Step N - …

해당 텍스트에 일련의 지시사항이 포함되어 있지 않다면, \
간단히 \"단계가 제공되지 않았습니다.\"라고 작성하세요.

\"\"\"{text_2}\"\"\"
"""
response = get_completion(prompt)
print("Text 2 의 요약:")
print(response)

출력 결과 입니다.

Text 2 의 요약:
단계가 제공되지 않았습니다.

전략 4: 소량의 예제 제공하기

실제 작업을 수행하도록 모델에 요구하기 전에, 성공적으로 작업을 수행한 소량의 예를 제공하는 것입니다.

예를 들어, 다음의 예시에서는 모델에게 일관된 스타일로 답변하는 것이 그것의 작업임을 알립니다. 그리고 아이와 할아버지 사이의 대화 예시를 하나 제공합니다. 아이가 “나에게 인내심을 가르쳐줘”라고 말하면, 할아버지는 이러한 비유로 답합니다. 그래서 이제 “나에게 회복력을 가르쳐줘”라고 요청하면, 모델은 제공된 소량의 예제를 기반으로 비슷한 스타일로 다음 작업에 대해 답합니다.

prompt = f"""
당신의 작업은 일관된 스타일로 답하는 것입니다.

<아이>: 나에게 인내심에 대해 가르쳐줘.

<할아버지>: 가장 깊은 계곡을 파는 강은 소박한 봄에서 흘러나옵니다; \
가장 웅장한 교향곡은 단 한 개의 음표에서 시작됩니다; \
가장 복잡한 태피스트리는 외로운 한 가닥의 실로 시작됩니다.

<아이>: 나에게 회복력에 대해 가르쳐줘.
"""
response = get_completion(prompt)
print(response)

출력 결과 입니다.

<할아버지>: 회복력은 바람에 흔들리지만 결코 부러지지 않는 나무와 같습니다. 
그것은 어려움에 직면했을 때도 탄력적으로 다시 돌아오는 능력입니다. 
폭풍을 견디며 강해지는 나무처럼, 회복력도 시간이 지남에 따라 개발되고 강화될 수 있는 품질입니다.

원칙 2: 모델에게 생각할 시간을 주기

때로는 모델이 급하게 잘못된 결론을 내리는 것을 볼 수 있습니다. 이런 경우, 최종적인 답변을 제공하기 전에 일련의 관련 추론을 하도록 쿼리를 재구성하는 것이 필요할 수 있습니다. 다시 말해, 모델에게 매우 짧은 시간이나 소량의 텍스트만으로 해결할 수 없는 작업을 부여하면, 모델은 잘못된 추측을 할 수 있습니다. 이런 상황은 사람에게도 마찬가지입니다. 복잡한 수학 문제를 풀도록 요구하는데 충분한 시간을 주지 않으면, 사람들도 실수를 할 수 있습니다. 따라서 이런 경우, 문제에 대해 더 많은 시간을 투자하도록 모델에게 지시할 수 있습니다. 이것은 곧 작업에 더 많은 컴퓨팅 자원을 소비하게 됨을 의미합니다.

전략 1: 필요한 과제를 완료하기 위한 단계 지정

이 절에서는 복잡한 과제에 대한 단계별 지시를 통해 이 전략이 어떻게 작동하는지 보여드리겠습니다.

우리는 먼저 Jack과 Jill에 대한 이야기를 서술하고, 그에 대한 특정 명령을 내립니다. 이 명령은 다음과 같은 작업을 수행하는 것입니다.

  1. 세 개의 역따옴표(“`)로 묶인 텍스트를 한 문장으로 요약합니다.
  2. 요약문을 프랑스어로 번역합니다.
  3. 프랑스어로 번역된 요약에서 각 이름을 나열합니다.
  4. ‘프랑스어로 번역된 요약’과 ‘이름의 수’라는 키를 가진 JSON 객체를 출력합니다.

그 후 우리는 답변을 줄바꿈 문자로 분리해야 합니다.

text = f"""
매력적인 마을에서, 형제인 잭과 질은 언덕 위의 우물에서 물을 얻기 위한 탐색을 시작했습니다.\
그들이 즐겁게 노래하며 오르던 중, 불행이 닥쳤습니다 - 잭은 돌에 걸려 넘어져 언덕에서 굴러 내려갔고, 질도 그를 따라갔습니다.\
비록 약간 다쳤지만, 그들은 집으로 돌아와 위로의 포옹을 받았습니다. 사고에도 불구하고, \
그들의 모험심은 흐려지지 않았고, 그들은 즐거움으로 계속 탐험을 계속했습니다.
"""
# 예제 1
prompt_1 = f"""
다음과 같은 작업을 수행하세요: 
1 - 세 개의 역따옴표(```)로 구분된 다음 텍스트를 한 문장으로 요약합니다.
2 - 요약문을 프랑스어로 번역합니다.
3 - 프랑스어로 번역된 요약에서 각 이름을 나열합니다.
4 - '프랑스어로 번역된 요약'과 '이름의 수'라는 키를 가진 JSON 객체를 출력합니다.

답변은 줄바꿈 문자로 구분하세요.

텍스트:
```{text}```
"""
response = get_completion(prompt_1)
print("예제 1에 대한 완성:")
print(response)

출력 결과 입니다.

예제 1에 대한 완성:
형제인 잭과 질은 언덕 위의 우물에서 물을 가져오기 위한 모험을 떠나지만, 불행히도 그들 모두가 언덕에서 굴러 내려와 약간 다쳤지만, 그들의 모험심은 그대로 남아 있습니다.

"Deux frères et sœurs, Jack et Jill, partent en quête d'eau d'un puits sur une colline, mais un malheur frappe et ils tombent tous les deux de la colline, rentrant chez eux légèrement meurtris mais avec leurs esprits aventureux intacts. 
이름: Jack, Jill.

{
  "french_summary": "Deux frères et sœurs, Jack et Jill, partent en quête d'eau d'un puits sur une colline, mais un malheur frappe et ils tombent tous les deux de la colline, rentrant chez eux légèrement meurtris mais avec leurs esprits aventureux intacts.",
  "num_names": 2
}

이 출력에는 여전히 문제가 있습니다. 예를 들어, ‘이름’ 키는 프랑스어로 대체됩니다. 그래서 우리는 더 나은 Prompt를 제공합니다. 이 Prompt는 출력 형식을 지정합니다.

prompt_2 = f"""
다음 작업을 수행하세요: 
1 - <>로 구분된 다음 텍스트를 한 문장으로 요약하세요.
2 - 요약문을 프랑스어로 번역하세요.
3 - 프랑스어로 번역된 요약에서 각 이름을 나열하세요.
4 - '프랑스어 요약'과 '이름의 수'라는 키가 포함된 JSON 객체를 출력하세요.

다음 형식을 사용하세요:
텍스트: <요약할 텍스트>
요약: <요약>
번역: <요약 번역>
이름: <프랑스어 요약에서의 이름 목록>
JSON 출력: <요약과 이름 수가 포함된 json>

텍스트: <{text}>
"""
response = get_completion(prompt_2)
print("\n예제 2에 대한 완성:")
print(response)

출력 결과 입니다.

예제 2에 대한 완성:
요약: 언덕 위의 우물에서 물을 얻으려는 도중 사고가 발생한 형제인 잭과 질이지만, 그들은 모험심을 잃지 않고 계속 탐험을 진행합니다.
번역: "Jack et Jill, deux frères et sœurs, ont eu un accident en allant chercher de l'eau dans un puits de montagne, mais ils ont continué à explorer avec un esprit d'aventure."
이름: Jack, Jill
JSON 출력: {"french_summary": "Jack et Jill, deux frères et sœurs, ont eu un accident en allant chercher de l'eau dans un puits de montagne, mais ils ont continué à explorer avec un esprit d'aventure.", "num_names": 2}

전략 2: 모델이 결론을 내리기 전에 자신의 해결책을 찾아내도록 지시하기

모델에게 결정을 내리기 전에 해결책을 고민하라고 명확히 지시하는 경우, 때때로 더 좋은 결과를 얻을 수 있습니다.

이제 우리는 한 가지 문제와 학생의 해답을 제시하고, 모델이 그 해답이 정확한지 판단하도록 요청할 것입니다.

prompt = f"""
학생의 해결책이 올바른지 판단하세요.

문제:
태양광 발전 설치를 계획하고 있으며, 재정 계산에 도움이 필요합니다. 
- 토지는 평방 피트당 $100입니다.
- 태양광 패널을 평방 피트당 $250에 구입할 수 있습니다.
- 연간 $100,000의 유지 보수 비용을 추가로, 평방 피트당 $10의 계약을 협상했습니다.
첫 해의 운영 비용은 평방 피트 수에 따라 얼마인가요?

학생의 해결책:
x를 설치 크기(평방 피트)라고 가정합시다.
비용:
1. 토지 비용: 100x
2. 태양광 패널 비용: 250x
3. 유지 보수 비용: 100,000 + 10x
총 비용: 100x + 250x + 100,000 + 10x = 360x + 100,000
"""
response = get_completion(prompt)
print(response)

학생의 해결책이 잘못되었습니다. 유지 보수 비용을 계산할 때 10x가 아닌 100x로 계산해야 합니다. 따라서 올바른 총 비용은 450x + 100,000입니다.

이 문제를 해결하기 위해, 우리는 모델에게 먼저 자신의 해결책을 찾아내도록 가이드 할 수 있습니다.

다음 프롬프트에서는 모델에게 먼저 이 문제를 해결하도록 요청하고, 그 자신의 해결책을 바탕으로 학생의 해결책과 비교하여 학생의 해결책이 올바른지 판단하게 합니다. 동시에, 우리는 출력 형식의 요구 사항을 제시합니다. 명확한 단계를 통해 모델에게 더 많은 생각의 시간을 주면 때때로 더 정확한 결과를 얻을 수 있습니다. 이 예에서 학생의 답변은 잘못되었지만, 우리가 먼저 모델에게 스스로 계산하도록 요청하지 않았다면, 학생이 올바르게 답했다고 오해할 수 있습니다.

prompt = f"""
학생의 해결책이 맞는지 판단하십시오. 다음 단계를 통해 이 문제를 해결하십시오:

단계:

    먼저, 직접 문제를 해결하십시오.
    그 다음, 당신의 해결책을 학생의 해결책과 비교하고 학생의 해결책이 맞는지 평가하십시오. 문제를 직접 해결하기 전에는 학생의 해결책이 맞는지 결정하지 마십시오.

다음 형식을 사용하십시오:

    문제: 문제 텍스트
    학생의 해결책: 학생의 해결책 텍스트
    실제 해결책 및 단계: 실제 해결책 및 단계 텍스트
    학생의 해결책과 실제 해결책이 같은가: 예 또는 아니오
    학생의 성적: 맞음 또는 틀림

문제:

    저는 태양광 발전소를 건설하고 있고, 재무 계산에 도움이 필요합니다.
    - 토지 비용은 평방 피트당 100달러입니다.
    - 태양광 패널을 평방 피트당 250달러에 구입할 수 있습니다.
    - 유지 보수 계약을 협상하여 매년 10만 달러의 고정 비용과 추가로 평방 피트당 10달러를 지불해야 합니다.
    평방 피트 수에 따른 첫 해 운영 총 비용은 얼마인가요.

학생의 해결책:

    발전소의 크기를 x라고 가정하고 (단위: 평방 피트).
    비용:
    1. 토지 비용: 100x
    2. 태양광 패널 비용: 250x
    3. 유지 보수 비용: 100,000 + 100x
    총 비용: 100x + 250x + 100,000 + 100x = 450x + 100,000

실제 해결책 및 단계:
"""
response = get_completion(prompt)
print(response)

출력 결과 입니다.

정확한 해결책과 단계는 다음과 같습니다:

1. 토지 비용 계산: 100달러/평방 피트 X x평방 피트 = 100x달러
2. 태양광 패널 비용 계산: 250달러/평방 피트 X x평방 피트 = 250x달러
    3. 유지 보수 비용 계산: 10만 달러 + 10달러/평방 피트 X x평방 피트 = 10만 달러 + 10x달러
    4. 총 비용 계산: 100x달러 + 250x달러 + 10만 달러 + 10x달러 = 360x + 10만 달러

학생의 해결책과 실제 해결책이 같은가: 아니오

학생의 성적: 틀림

한계

가짜 지식: 모델은 때때로 실제적으로는 사실이 아니지만 참으로 보이는 정보를 생성합니다.

모델이 훈련 과정에서 많은 양의 정보를 접하더라도, 그것이 본 모든 정보를 완전히 기억하고 있지는 않습니다. 이로 인해 모델은 자신의 지식의 경계를 명확하게 인식하지 못합니다. 이는 모델이 불분명한 주제에 대한 질문에 답하려고 시도하면서 들리는 것은 합리적이지만 실제로는 틀린 답변을 만들어 낼 수 있다는 것을 의미합니다. 이러한 가짜 생각을 ‘환각’이라고 부릅니다.

예를 들어, 아래 예제에서 우리는 Boie 회사가 생산한 AeroGlide UltraSlim Smart Toothbrush 제품에 대한 정보를 요청합니다. 사실, 이 회사는 실제로 존재하지만 제품은 가짜입니다. 그럼에도 불구하고, 모델은 우리에게 이 가짜 정보를 매우 진지하게 전달합니다.

prompt = f"""
Boie의 AeroGlide UltraSlim Smart Toothbrush에 대해 알려주세요
"""
response = get_completion(prompt)
print(response)

출력 결과 입니다.

Boie의 AeroGlide UltraSlim Smart Toothbrush는 첨단 초음파 기술을 사용하여 깊고 철저한 치아 청결을 제공하는 고급 칫솔입니다. 슬림하고 세련된 디자인으로 쉽게 잡고 움직일 수 있으며, 브러싱 루틴을 최적화하는 데 도움이 되는 다양한 스마트 기능이 포함되어 있습니다.

AeroGlide UltraSlim Smart Toothbrush의 핵심 기능 중 하나는 고주파 진동을 이용하여 치아와 잇몸의 잔류물과 세균을 분해하는 첨단 초음파 기술입니다. 이 기술은 가장 어려운 얼룩과 축적물까지 제거하는 데 매우 효과적이어서 치아가 깨끗하고 상쾌하게 느껴집니다.

초음파 기술 외에도 AeroGlide UltraSlim Smart Toothbrush에는 권장되는 2분 동안 칫솔질을 하도록 돕는 내장 타이머와 너무 세게 칫솔질하면 알려주는 압력 센서와 같은 브러싱 루틴을 최적화하는 데 도움이 되는 다양한 스마트 기능이 포함되어 있습니다.

전반적으로, Boie의 AeroGlide UltraSlim Smart Toothbrush는 구강 위생을 한 단계 업그레이드하고자 하는 모든 사람에게 이상적인 첨단하고 효과적인 칫솔입니다. 첨단 초음파 기술과 스마트 기능을 통해 깊고 철저한 청결감을 제공하여 치아가 상쾌하고 건강하게 느껴지게 합니다.