드디어 졸업프로젝트가 시작되었다. 우리팀이 선정한 주제는,
AI 객체 인식을 통한 포드맵 분석과 프롬프트 엔지니어링을 활용해 맞춤형 건강 조언을 제공하는 과민대장증후군 관리 모바일 어플리케이션, BellyWelly
여러 주제에 대해 고민하던 중, 팀원 모두가 공감할 수 있고 당장 필요한 서비스를 개발하면 좋을 것 같다는 생각으로 유독 다른 사람들보다 화장실에 자주 방문하고 학교에서 배아픔을 호소하는 나와 우리 팀원들이기에, 과민대장증후군을 관리해주고, 꾸준한 기록을 통해 개선점을 제안해주는 서비스로 결정하였다!
주제에서도 나와있듯이,
과연 맞춤형 건강 조언을 제공하는 것에 있어서 GPT API을 이용하여 프롬프트 엔지니어링을 통해 개개인의 기록을 분석하고 조언을 제공해줄 수 있도록 기획하였다.
https://platform.openai.com/docs/models
OpenAI가 제공하는 모델의 정보를 확인하였을 때,
여기서 가장 최신 모델인 GPT-4.0을 이용할 예정이다.
그렇다면 프롬프트 엔지니어링이란 무엇일까?
프롬프트 엔지니어링(Prompt Engineering)은 인공지능 언어 모델을 활용하여 특정한 의도나 목적에 맞는 응답을 이끌어내기 위해 입력되는 텍스트(프롬프트)를 세심하게 설계하는 과정이다. 이는 언어 모델의 성능을 최적화하고, 특정 태스크를 수행하거나 지식을 추출하는 데 있어 핵심적인 역할을 한다.
환각증세(Hallucination)에 대해 들어본 적 있을 것이다. 대화형 AI의 고질적인 문제로 말도 안되는 이야기를 아주 그럴싸하게 말해준다! 한창 뉴스 기사에도 나왔던 '세종대왕의 맥북 프로 던짐 사건' 등이 바로 이 환각증세 중 하나이다. 이 환각 증세를 개선해주는 것이 바로 프롬프트 엔지니어링이다. 간단한 단계만 거쳐도 GPT의 답변은 훨씬 개선된다.
Zero-Shot Prompting은 추가 학습 또는 예제 데이터 없이 답변을 생성하게 하는 프레임워크로, 거대 언어 모델에게 아무런 instruction 없이 완수할 태스크를 주는 것을 의미한다.
[Zero-Shot]
Q: 과민대장증후군이란 무엇인가요?
Q: 과민대장증후군의 일반적인 증상에는 어떤 것들이 있나요?
Q: 과민대장증후군 환자가 피해야 할 음식은 무엇인가요?
Q: 과민대장증후군에 좋은 식단에는 어떤 것들이 포함되어야 하나요?
Q: 포드맵 분석이란 무엇이며, 과민대장증후군 관리에 어떻게 도움이 되나요?
Q: 과민대장증후군을 위한 일일 식단 예시를 제시해주세요.
단일 예시를 제공하여 모델이 그 맥락을 이해하고 유사한 형태의 답변을 생성하도록 유도하는 방식이다.
[One-Shot]
Q: 포드맵이란 무엇인가요?
A: 포드맵은 소화하기 어려운 특정 탄수화물을 나타내며, 이들은 과민대장증후군 증상을 유발할 수 있습니다. 포드맵 식단은 이러한 탄수화물을 제한하여 증상을 관리하는 데 도움을 줍니다.
Q: 그렇다면 저포드맵 식단에서 추천하는 아침 식사 메뉴는 무엇인가요?
여러 개의 예시를 제공하여 모델이 다양한 사례를 참고하여 보다 정교한 답변을 생성하도록 하는 방법으로, ialogue management, context modeling 과 같은 기타 NLP 기법들과 조합되어 보다 정확한 답변을 유도한다.
[Few-Shot]
Q: 과민대장증후군이란 무엇인가요?
A: 과민대장증후군(IBS)은 장의 기능 장애로, 복통, 불규칙한 배변, 팽만감 등의 증상을 일으키는 만성 질환입니다.
Q: 과민대장증후군의 일반적인 증상에는 어떤 것들이 있나요?
A: 복통, 설사 또는 변비, 가스, 팽만감 등이 일반적인 증상입니다.
Q: 과민대장증후군 환자가 피해야 할 음식은 무엇인가요?
A: 고포드맵 식품, 카페인, 지방이 많은 음식, 인공 감미료 등을 피해야 합니다.
Q: 과민대장증후군에 좋은 식단에는 어떤 것들이 포함되어야 하나요?
A: 저포드맵 식품, 섬유질이 풍부한 음식, 충분한 수분, 단백질이 풍부한 식품을 포함해야 합니다.
Q: 과민대장증후군을 위한 일일 식단 예시를 제시해주세요.
A: 아침에는 글루텐 프리 오트밀, 점심에는 샐러드와 닭가슴살, 저녁에는 구운 연어와 채소가 좋습니다.
Q: 저포드맵 식단에서 추천하는 점심 식사 메뉴는 무엇인가요?
A: 퀴노아와 잎이 많은 채소를 기반으로 한 샐러드가 좋으며, 소화가 잘 되는 단백질 출처를 추가하세요.
Q: 그렇다면 과민대장증후군에 좋은 식단에는 어떤 것들이 포함되어야 하나요?
(출처: https://angelina-yang.medium.com/feature-based-transfer-learning-vs-fine-tuning-bc8fc348a33d)
Few-Shot Prompting을 확장한 형태로, 더 많은 예제들을 제공하여 모델이 더 직접적으로 원하는 답변에 도달하게 한다. 이는 특히 복잡한 문제를 해결하는 데 유리하다.
다만, 답변에 도달하기까지 몇 단계의 추가적인 추론 과정을 거쳐야하는 보다 복잡한 문제의 경우 풀 수 없다는 한계가 있는데, 이는 CoT(Chain-of-Thought)에서 보완 가능하다!
(출처: https://www.promptingguide.ai/kr/techniques/activeprompt)
CoT (Chain-of-Thought)는 단지 답변을 내놓기 위한 것이 아닌, 답변에 도달하는 과정을 학습시키는 것을 목적으로 본 질문 전에 미리 태스크와 추론 과정을 포함한 답변 예제를 AI에게 제공하는 프레임워크이다. 이는 복잡한 문제에 대한 단계적 추론을 가능하게 하여 해결책을 도출한다.
Zero-Shot CoT (Chain of Thought)는 트리거 문장 "Let's think step by step (단계별로 생각해보자)" 을 프롬프트에 추가하여 거대 언어 모델이 단계에 따라 결과에 도달하게 하는 프레임워크이다.
[Zero-Shot CoT]
Q: 저포드맵 식단이 과민대장증후군 관리에 왜 중요한가요? 단계별로 설명해주세요.
A: 저포드맵 식단은 소화에 부담을 주는 특정 탄수화물을 줄여 과민대장증후군 증상을 완화시키는 데 도움을 줍니다. 첫째, 포드맵에 포함된 식품을 줄임으로써 장내 가스 발생을 감소시킬 수 있습니다. 둘째, 장의 팽창을 줄여 복통과 팽만감을 감소시킵니다. 셋째, 장의 움직임을 조절하여 설사나 변비와 같은 증상을 개선합니다.
Q: 과민대장증후군 환자가 외식할 때 주의해야 할 점은 무엇인가요? 단계별로 생각해봅시다.
A: 외식을 할 때 과민대장증후군 환자는 몇 가지 주의해야 할 점이 있습니다. 첫째, 메뉴를 선택할 때 고포드맵 식품을 피해야 합니다. 둘째, 식사를 할 때는 음식을 천천히 먹고 잘 씹어야 합니다. 셋째, 음식의 조리 방법이나 사용된 재료에 대해 직원에게 물어보는 것이 좋습니다. 마지막으로, 가능하다면 식단에 맞는 특별 주문을 요청해야 합니다.
Q: 저포드맵 식품을 식별하는 방법은 무엇인가요? 단계별로 알려주세요.
A: 저포드맵 식품을 식별하기 위해 몇 가지 단계를 따를 수 있습니다. 첫째, 고포드맵 식품 목록을 확인하고 해당 식품을 피하는 것입니다. 둘째, 식품 라벨을 읽어 특정 탄수화물이 포함되어 있는지 확인합니다. 셋째, 의심스러운 식품은 소량부터 시작하여 자신의 반응을 관찰합니다. 넷째, 식사 일기를 작성하여 어떤 식품이 증상을 유발하는지 기록합니다.
Self-Consistency는 CoT의 심화버전으로, 보다 다양한 추론 과정을 예제로 제공하여 AI가 일관성 있는 답변을 선택하여 생성할 수 있도록 돕는 프레임워크이다. 기존에 CoT 프레임워크와의 차이점은, 수학적 & 상식적인 추론이 요구되는 태스크 수행 능력이 향상되었다는 점이다.
[Self-Consistency CoT]
Q: 포드맵이 높은 식품을 피하는 것이 왜 중요한가요? 여러 번 생각해봅시다.
A1: 포드맵이 높은 식품은 소화과정에서 가스를 많이 발생시키고, 장을 자극하여 과민대장증후군의 증상을 악화시킬 수 있습니다. 이를 피함으로써 증상을 줄일 수 있습니다.
A2: 과민대장증후군 환자는 포드맵이 높은 식품을 소화하는 데 어려움을 겪을 수 있으므로, 이러한 식품을 제한하여 복통과 팽만감을 완화할 수 있습니다.
A3: 포드맵이 높은 식품은 장내 환경을 변화시켜 불필요한 장 운동을 유발할 수 있으므로, 피하는 것이 증상 관리에 도움이 됩니다.
- 일관된 답변: 포드맵이 높은 식품을 피하는 것은 과민대장증후군의 증상을 관리하는 데 도움이 됩니다.
Q: 저포드맵 식단을 계획할 때 어떤 과정을 따르는 것이 좋은가요? 여러 번 생각해보고 일관된 답변을 찾아봅시다.
A1: 먼저 고포드맵 식품 목록을 확인하고 이를 식단에서 제외합니다. 그 다음, 저포드맵 식품 목록을 참고하여 식사를 계획합니다.
A2: 저포드맵 식품을 포함한 식단을 구성할 때는 다양한 영양소가 포함되도록 균형을 맞추는 것이 중요합니다. 또한, 식품의 반응을 기록하여 개인에 맞는 식품을 선택합니다.
A3: 식단을 계획할 때는 식사량도 고려해야 합니다. 너무 많거나 적은 양은 증상을 악화시킬 수 있으므로 적절한 양을 섭취하는 것이 중요합니다.
- 일관된 답변: 저포드맵 식단을 계획할 때는 고포드맵 식품을 피하고, 균형 잡힌 영양 섭취를 목표로 하며, 개인의 반응을 모니터링하는 과정을 따르는 것이 좋습니다.
Generated Knowledge Prompting은 모델이 보다 정확한 답변을 산출해 내기 위해 지식이나 정보를 통합할 수 있도록 질문과 함께 관련 지식이나 정보를 함께 제공하는 기법으로, 기존 모델의 유연성은 유지하면서 상식 추론 (Commonsense Reasoning) 능력을 향상시킬 수 있는 장점이 있다.
[Generated Knowledge Prompting]
Q: 과민대장증후군과 포드맵 식단의 관계를 설명해주세요. 이를 위해 먼저 포드맵 식단의 기본 원칙을 설명해주시고, 그 다음 과민대장증후군 관리에 어떤 영향을 미치는지 분석해주세요.
A: 포드맵 식단은 소화하기 어려운 특정 탄수화물을 제한하는 것을 목표로 합니다. 기본 원칙은 발효성 올리고당, 이당류, 단당류 및 폴리올을 줄이는 것입니다. 이러한 식품들은 장에서 물을 끌어당기고 가스를 발생시킬 수 있어 과민대장증후군의 증상을 악화시킬 수 있습니다. 포드맵 식단을 따름으로써, 환자는 복통, 팽만감, 가스 및 불규칙한 배변과 같은 증상의 빈도와 강도를 감소시킬 수 있습니다.
Q: 특정 재료를 사용한 저포드맵 식사 예를 생성해주세요. 이때 해당 재료가 과민대장증후군 관리에 적합한 이유도 함께 설명해주세요.
A: 저포드맵 식사로는 구운 호박, 퀴노아, 그리고 향긋한 허브를 넣은 닭 가슴살이 좋습니다. 호박은 잘 소화되며 가스를 적게 발생시키는 섬유질의 좋은 원천입니다. 퀴노아는 글루텐이 없으며 고포드맵 곡물에 비해 장에 부드럽게 작용합니다. 닭 가슴살은 저지방 단백질로서, 과민대장증후군 환자에게 권장되는 안전한 단백질 원입니다.
Q: 과민대장증후군 환자가 일상 생활에서 포드맵 식단을 유지하는 데 도움이 되는 팁을 생성해주세요. 이 팁들이 실제 생활에서 어떻게 적용될 수 있는지 설명해주세요.
A: 과민대장증후군 환자가 포드맵 식단을 유지하기 위한 팁은 다음과 같습니다: 집에서 음식을 미리 준비하고, 외출할 때는 저포드맵 스낵을 가지고 다니며, 식당을 방문할 때는 메뉴 선택에 있어서 저포드맵 옵션이 있는지 미리 확인합니다. 이러한 팁들은 환자가 사회적 활동에 참여하면서도 증상을 관리할 수 있도록 도와줍니다.
parameter의 값을 조절하여 모델의 output을 조정할 수 있다.
성능이 높은 모델일수록 비용과 latency이 증가한다.
temperature 값이 높을수록 더 창의적이고 random한 답변을 제공한다.
데이터 추출 및 진실한 Q&A와 같은 대부분의 사실적 사용 사례의 경우에는 보통 0으로 설정한다.
(주의해야 할 점은, 이 값이 "truthfulness"과는 다르다는 점이다.)
모델이 처리할 수 있는 입력 텍스트의 최대 토큰 수를 나타내는 매개변수로, max_token 값을 설정하여 모델이 처리할 수 있는 입력의 크기를 제한할 수 있다. 큰 max_token 값을 사용할수록 더 긴 텍스트를 처리할 수 있지만, 처리 시간과 비용이 증가할 수 있다.
모델의 생성 결과에 영향을 주는 매개변수로, 텍스트 생성을 중단하는 용도로 사용된다. stop에 지정된 문자열 또는 토큰을 만나면 모델은 생성을 중단하고 결과를 반환하기 때문에 이를 활용하여 원하는 길이의 생성 결과를 제어하거나 원치 않는 내용이 생성되는 것을 방지할 수 있다.
예제를 통해 작성한 코드,
import openai
openai.api_key = {secret-api-key}
# Parameters
model = "gpt-4-0613"
temperature = 0
max_tokens = 150
stop_sequences = ["\n", "END"]
# prompt
prompt = "과민대장증후군과 포드맵 식단의 관계를 설명해주세요."
response = openai.Completion.create(
model=model,
prompt=prompt,
temperature=temperature,
max_tokens=max_tokens,
stop=stop_sequences
)
# Output the response
print(response.choices[0].text.strip())