Prompt Engineering Guide에 들어갑니다. 첫 페이지를 복사해서 나 교수에게 전해 줍니다. AI 서비스 공급자는 구글로 선택했습니다. 나 교수의 응답에서 필요한 부분만 남겨둡니다. 내용의 명확한 이해를 위해 필요한 경우 원문을 함께 인용하도록 하겠습니다.
제공된 텍스트는 “프롬프트 엔지니어링 가이드”에 대한 소개글입니다. 프롬프트 엔지니어링의 정의, 중요성, 활용 분야, 그리고 가이드의 내용과 학습 방법을 간략하게 설명하고 있습니다.
프롬프트 엔지니어링은 다양한 응용 분야와 연구 주제에서 언어 모델(LM)을 효율적으로 사용하기 위한 프롬프트를 개발하고 최적화하는 비교적 새로운 분야로 소개됩니다. LLM의 기능과 한계를 더 잘 이해하는 데 도움이 된다고 명시되어 있습니다.
메모) 저는 프롬프트를 자연어로 작성하는 프로그램이라고 생각하는 것을 좋아합니다. ‘프롬프트를 개발하고 최적화’ 맘에 드는 표현이네요.
연구자들은 질의응답 및 산술 추론과 같은 일반적이고 복잡한 작업에 대한 LLM의 능력을 향상시키기 위해 프롬프트 엔지니어링을 사용합니다. 개발자는 LLM 및 기타 도구와 인터페이스하는 강력하고 효과적인 프롬프트 기술을 설계하기 위해 사용합니다. Developers use prompt engineering to design robust and effective prompting techniques that interface with LLMs and other tools. |
메모) “잘 지시해야 잘 수행합니다. “
프롬프트 엔지니어링 – 언어 모델의 성능을 최적화하고 원하는 결과를 정확하게 얻기 위해 프롬프트를 설계하고 조정하는 과정입니다.
이는 단순히 명령어를 입력하는 것을 넘어, 언어 모델의 잠재력을 최대한 끌어내는 정교한 접근 방식이라고 할 수 있습니다.
introduction 페이지 내용을 전달합니다.
프롬프트 엔지니어링의 이론 및 실제 측면과 LLM과 상호 작용하고 구축하기 위한 최상의 프롬프팅 기술 활용 방법을 다룬다고 명시합니다.
이 서론은 프롬프트 엔지니어링의 핵심 개념과 가이드의 목적, 대상 독자(연구자, 개발자), 그리고 사용된 LLM 모델 및 설정을 명확하게 제시하고 있습니다. gpt-3.5-turbo 외 다른 모델과의 호환성을 언급함으로써 활용도를 높이고 일반적인 프롬프트 엔지니어링 원칙을 제시하려는 의도가 보입니다.
모든 예제는 특별한 언급이 없는 한 OpenAI의 Playground를 사용하여 gpt-3.5-turbo 로 테스트되었으며, 기본 설정(temperature=1 , top_p=1 )을 사용한다고 명시합니다. |
Instruction에서는 다음과 같은 것을 다룹니다.
- LLM Settings
- Basics of Prompting
- Prompt Elements,
- General Tips for Designing Prompts
- Examples of Prompts
LLM Settings 내용을 전달합니다.
이 텍스트는 LLM을 사용할 때 결과를 제어하기 위한 주요 파라미터들을 설명하고 있습니다. 각 파라미터의 기능과 사용 예시, 그리고 다른 파라미터와의 관계를 설명하여 사용자가 LLM을 효과적으로 활용할 수 있도록 안내합니다.
- Temperature
- 값이 낮을수록 확률이 가장 높은 다음 토큰을 선택하여 결과가 결정적이고 간결해집니다.
- 값이 높을수록 다양하고 창의적인 결과가 나올 가능성이 높아집니다.
- 사실 기반 질의응답에는 낮은 값, 시 생성과 같은 창의적인 작업에는 높은 값을 사용하는 것이 좋습니다.
- Top P (Nucleus Sampling): Temperature와 함께 사용되는 샘플링 기술로, 모델의 결정성을 제어합니다. 정확하고 사실적인 답변을 원하면 낮은 값, 다양한 답변을 원하면 높은 값을 사용합니다.
- 높은 top_p 값은 모델이 덜 가능성 있는 단어를 포함하여 더 많은 단어를 고려하도록 합니다
- 일반적으로 Temperature 또는 Top P 중 하나만 변경하는 것이 좋습니다.
- Max Length
- 생성되는 토큰의 최대 개수를 설정하여 긴 또는 무관한 응답을 방지하고 비용을 제어합니다.
- Stop Sequences
- 모델이 토큰 생성을 중지하는 문자열입니다.
- 응답의 길이와 구조를 제어하는 데 사용됩니다. 예를 들어, “11”을 중지 시퀀스로 추가하여 모델이 10개 이하의 항목으로 구성된 목록을 생성하도록 할 수 있습니다.
- Frequency Penalty
- 응답과 프롬프트에 이미 나타난 횟수에 비례하여 다음 토큰에 페널티를 적용합니다.
- 값이 높을수록 단어가 반복될 가능성이 낮아집니다.
- Presence Penalty
- 반복되는 토큰에 페널티를 적용하지만, Frequency Penalty와 달리 모든 반복 토큰에 동일한 페널티를 적용합니다.
- 다양하고 창의적인 텍스트 생성에는 높은 값, 주제에 집중된 텍스트 생성에는 낮은 값을 사용합니다.
- 일반적으로 Frequency Penalty 또는 Presence Penalty 중 하나만 변경하는 것이 좋습니다.
|
Basics of Prompting 내용을 전달합니다. 한 번에 다 전해주는 것보다 부분 전달해주는 게 좋을 것 같습니다.
단순한 프롬프트의 효용성을 인정하면서도, 정보의 양과 프롬프트 구성의 질이 결과의 질에 영향을 미친다는 점을 강조합니다.
프롬프트에는 모델에 전달하는 지시 또는 질문과 같은 정보뿐만 아니라 컨텍스트, 입력 또는 예시와 같은 다른 세부 정보도 포함될 수 있다고 설명합니다.
*이러한 요소들을 사용하여 모델에 더 효과적으로 지시를 내리고 결과의 질을 향상시킬 수 있다고 언급합니다. |
이 텍스트는 “The sky is”라는 프롬프트에 대한 LLM의 출력 “blue.”를 보여주는 간단한 예시입니다.
- 프롬프트: The sky is
- 출력: blue.
이 예시는 LLM이 주어진 프롬프트에 대해 예측 가능하고 일반적인 답변을 생성할 수 있음을 보여줍니다. 매우 단순한 프롬프트를 사용했지만, LLM은 문맥을 이해하고 적절한 단어를 선택하여 문장을 완성했습니다. 이를 통해 LLM의 기본적인 언어 이해 능력을 확인할 수 있습니다. |
이 텍스트는 OpenAI Playground와 같은 LLM 플랫폼에서 프롬프트를 사용하는 방법과 프롬프트 구성 요소, 그리고 프롬프트 엔지니어링의 필요성에 대해 설명합니다. 특히, OpenAI 채팅 모델에서 사용되는 system, user, assistant 역할에 대한 설명과 예시를 통해 프롬프트 엔지니어링의 기본 개념을 설명하고 있습니다.
- OpenAI 채팅 모델의 역할
gpt-3.5-turbo 또는 gpt-4 와 같은 OpenAI 채팅 모델에서 사용되는 system, user, assistant 역할을 설명합니다.
system 메시지는 필수는 아니지만 어시스턴트의 전반적인 동작 설정에 도움이 된다고 언급합니다. 예시에서는 user 메시지만 사용하여 모델에 직접 프롬프트를 입력하는 방법을 보여줍니다. 명시적으로 언급되지 않는 한, 모든 예시에서 gpt-3.5-turbo 모델에 user 메시지만 사용할 것이라고 밝히고 있습니다.
assistant 메시지는 모델 응답에 해당하며, 원하는 동작의 예시를 전달하기 위해 정의할 수 있다고 설명합니다. 채팅 모델 사용에 대한 추가 정보 링크를 제공합니다.
|
이 텍스트는 프롬프트를 개선하는 방법과 프롬프트 엔지니어링의 정의, 그리고 LLM의 가능성에 대해 설명합니다. “Complete the sentence:”라는 지시어를 추가하여 이전 예시보다 개선된 프롬프트를 제시하고, 이를 통해 프롬프트 엔지니어링의 개념을 설명합니다. 또한, 현대 LLM의 다양한 능력을 언급하여 LLM의 발전된 기능을 강조합니다.
- 프롬프트 개선
- “The sky is”라는 프롬프트에 “Complete the sentence:”라는 지시어를 추가하여 LLM이 문장을 완성하도록 명확하게 지시합니다. 이전 예시보다 더 구체적인 지시를 통해 원하는 결과를 얻는 방법을 보여줍니다.
- 개선된 출력
- 개선된 프롬프트에 대한 LLM의 출력은 “blue during the day and dark at night.”으로, 이전 출력보다 더 완전하고 의미 있는 문장입니다. 명확한 지시를 통해 LLM의 성능을 향상시킬 수 있음을 보여줍니다.
- 프롬프트 엔지니어링의 정의
- 모델이 원하는 작업을 수행하도록 효과적인 프롬프트를 설계하는 접근 방식을 프롬프트 엔지니어링이라고 정의합니다.
메모)
- 뭘 해야 할 지 상상하지 않게 합니다.
- 프롬프트를 개선하니 응답도 개선된다.
|
이 텍스트는 효과적인 프롬프트를 구성하는 핵심 요소들을 설명합니다. Instruction, Context, Input Data, Output Indicator 네 가지 요소를 제시하고, 각 요소의 역할을 간략하게 설명합니다.
- Instruction
- 모델이 수행해야 할 특정 작업이나 지시 사항입니다. 모델에게 무엇을 해야 하는지 명확하게 알려주는 역할을 합니다.
- Context
- 모델이 더 나은 응답을 생성하도록 유도하는 외부 정보 또는 추가적인 맥락입니다. 배경 지식이나 상황 정보를 제공하여 모델의 이해를 돕는 역할을 합니다.
- Input Data
- 응답을 찾고자 하는 입력 또는 질문입니다. 모델이 처리해야 할 데이터를 제공하는 역할을 합니다.
- Output Indicator
- 출력의 유형이나 형식입니다. 모델이 생성해야 하는 응답의 형태를 지정하는 역할을 합니다.
|
메모) 프롬프트 구조화 하는 대표적인 방법입니다.
프롬프트 구조화 관점에서 설명해주기를 요청했습니다.
제공하신 내용을 프롬프트 구조화 관점에서 설명드리겠습니다. 각 요소를 상세히 분석해보겠습니다.
- Instruction (지시사항)
- 정의: 모델에게 수행해야 할 구체적인 작업을 명확하게 전달하는 부분입니다.
- 목적: 모델이 원하는 작업을 정확히 이해하고 수행할 수 있도록 명확한 지침을 제공합니다.
- 특징: 간결하고, 직접적이며, 실행 가능한 언어로 작성되어야 합니다.
- Context (맥락)
- 정의: 모델이 응답을 생성할 때 참고할 수 있는 배경 정보나 추가적인 상황 설명입니다.
- 목적: 모델의 이해도를 높이고, 더 정확하고 맥락에 맞는 응답을 유도합니다.
- 특징: 관련된 배경 지식, 상황 설명, 제약 조건 등을 포함할 수 있습니다.
- Input Data (입력 데이터)
- 정의: 모델이 처리해야 할 실제 질문, 텍스트, 또는 데이터입니다.
- 목적: 모델이 분석하거나 응답해야 할 구체적인 내용을 제공합니다.
- 특징: 명확하고, 간결하며, 모호하지 않은 형태로 작성되어야 합니다.
- Output Indicator (출력 지시자)
- 정의: 모델이 생성해야 할 응답의 형식이나 유형을 지정하는 부분입니다.
- 목적: 원하는 출력 형태를 명확히 하여 모델의 응답 방향을 안내합니다.
- 특징: 출력의 길이, 스타일, 형식(예: 글머리 기호, JSON, 표 등) 등을 명시할 수 있습니다.
예시)
- [Instruction]: 주어진 텍스트를 요약하고 핵심 아이디어를 추출하세요.
- [Context]: 학술 논문의 초록이며, 기술 혁신에 관한 내용입니다.
- [Input Data]: {실제 텍스트 삽입}
- [Output Indicator]:
- – 3-4문장으로 요약
- – 글머리 기호 형식 사용
- – 전문 용어는 간단히 설명
|
이 텍스트는 앞서 설명한 프롬프트 구성 요소들을 실제 예시를 통해 자세히 설명합니다. 텍스트 분류 작업을 수행하는 프롬프트를 예시로 사용하여 Instruction, Input Data, Output Indicator 요소가 프롬프트에서 어떻게 사용되는지 보여줍니다. Context 요소는 이 예시에서는 사용되지 않았지만, 추가적인 예시를 통해 제공될 수 있다고 설명합니다.
- 프롬프트 예시
- Classify the text into neutral, negative, or positive
Text: I think the food was okay.
Sentiment:
- Instruction: “Classify the text into neutral, negative, or positive” 부분이 Instruction에 해당하며, 모델에게 텍스트를 중립, 부정, 긍정으로 분류하라는 지시를 내립니다.
- Input Data: “I think the food was okay.” 부분이 Input Data에 해당하며, 모델이 분류해야 할 텍스트 데이터입니다.
- Output Indicator: “Sentiment:” 부분이 Output Indicator에 해당하며, 모델이 생성해야 하는 출력값의 유형(감정)을 나타냅니다.
- Context (생략)
- 이 예시에서는 Context가 생략되었지만, 추가적인 예시를 프롬프트에 포함시켜 모델의 이해를 도울 수 있다고 설명합니다. 예를 들어, 다양한 감정을 나타내는 텍스트와 그에 해당하는 분류 결과를 예시로 제공할 수 있습니다.
- 프롬프트 구성 요소의 유연성
- 모든 프롬프트에 네 가지 요소가 모두 필요한 것은 아니며, 프롬프트 형식은 수행할 작업에 따라 달라진다고 설명합니다. 이후 가이드에서 더 구체적인 예시를 다룰 예정임을 밝힙니다.
|
이 텍스트는 프롬프트 설계를 시작하는 단계에서 중요한 접근 방식을 설명합니다. 단순한 프롬프트에서 시작하여 점진적으로 복잡도를 높여가는 반복적인 접근 방식을 강조하고, 큰 작업을 작은 하위 작업으로 분할하여 처리하는 전략을 제시합니다.
- 단순함에서 시작
- 프롬프트 설계는 반복적인 실험을 통해 최적의 결과를 얻는 과정임을 강조하며, OpenAI 또는 Cohere의 플레이그라운드를 활용하여 단순한 프롬프트부터 시작하는 것을 추천합니다.
- 점진적 개선
- 단순한 프롬프트에서 시작하여 더 나은 결과를 위해 요소와 컨텍스트를 추가하며 반복적으로 개선해나가는 것이 중요하다고 설명합니다. 구체성, 단순성, 간결성이 좋은 결과를 가져온다는 점을 언급합니다.
- 복잡한 작업 분할
- 큰 작업을 여러 하위 작업으로 분할하여 각 하위 작업에 대한 프롬프트를 설계하고, 점진적으로 통합하는 방식을 제시합니다. 초기 단계부터 과도하게 복잡한 프롬프트를 설계하는 것을 지양하고, 단순한 작업부터 시작하여 복잡도를 높여가는 접근 방식을 권장합니다.
|
이 텍스트는 프롬프트에서 Instruction의 역할과 효과적인 사용 방법을 설명합니다. 다양한 명령어를 사용하여 모델에게 원하는 작업을 지시하는 방법과, 실험을 통해 최적의 결과를 얻는 방법을 제시합니다. 또한, 명확한 구분자를 사용하여 Instruction과 Context를 분리하는 것을 권장하고, 번역 작업을 예시로 보여줍니다.
- Instruction의 역할
- “Write,” “Classify,” “Summarize,” “Translate,” “Order” 등의 명령어를 사용하여 모델에게 원하는 작업을 지시할 수 있다고 설명합니다.
- 실험의 중요성
- 최적의 결과를 얻기 위해 다양한 키워드, 컨텍스트, 데이터를 사용하여 여러 Instruction을 실험해 보는 것이 중요하다고 강조합니다. 작업과 관련성이 높고 구체적인 컨텍스트를 제공할수록 결과가 향상된다고 언급합니다.
- Instruction의 위치 및 구분자
- Instruction을 프롬프트의 시작 부분에 배치하고, “###”와 같은 명확한 구분자를 사용하여 Instruction과 Context를 분리하는 것을 권장합니다.
- 예시
- ### Instruction ###
Translate the text below to Spanish:
Text: hello!
|
이 텍스트는 프롬프트 설계에서 구체성(Specificity)의 중요성과 적절한 수준의 세부 정보를 제공하는 방법, 그리고 프롬프트 길이 제한에 대한 고려 사항을 설명합니다. 텍스트에서 장소 이름을 추출하는 예시를 통해 구체적인 프롬프트 작성 방법을 보여줍니다.
- 구체성의 중요성
- 명확하고 상세한 프롬프트일수록 더 나은 결과를 얻을 수 있다고 강조합니다.
- 특히 원하는 결과나 생성 스타일이 있을 경우 구체적인 설명이 중요하다고 언급합니다.
- 단순히 특정 토큰이나 키워드를 사용하는 것보다 좋은 형식과 설명적인 프롬프트를 작성하는 것이 더 중요하며, 원하는 형식의 출력을 얻기 위해 프롬프트에 예시를 제공하는 것이 효과적이라고 합니다.
- 프롬프트 길이 제한
- 프롬프트 길이 제한을 고려해야 하며, 불필요한 세부 정보를 과도하게 포함하는 것은 좋지 않다고 조언합니다.
- 세부 정보는 작업과 관련성이 있어야 하며, 많은 실험과 반복을 통해 최적의 프롬프트를 찾아야 한다고 강조합니다.
- 예시
- 텍스트에서 장소 이름을 추출하는 작업을 예시로 제시합니다.
- Extract the name of places in the following text. Desired format:
Place: <comma_separated_list_of_places>Input: “Although these developments are encouraging to researchers, much is still a mystery. “We often have a black box between the brain and the effect we see in the periphery,” says Henrique Veiga-Fernandes, a neuroimmunologist at the Champalimaud Centre for the Unknown in Lisbon. “If we want to use it in the therapeutic context, we actually need to understand the mechanism.“”
- 출력
- Place: Champalimaud Centre for the Unknown, Lisbon
|
메모) 프롬프트 엔지니어링 핵심 원칙:
메모) <comma_separated_list_of_places>는 포맷 지시어 입니다.
포맷 지시어에 대한 설명을 요청했습니다.
포맷 지시어(Format Directive)
대표적인 프롬프트 엔지니어링 기법 중 하나로, AI 모델에게 출력의 형식과 구조를 명확하게 지정하는 방법입니다. 주요 특징은 다음과 같습니다:
- 꺾쇠 괄호
< > 사이에 원하는 출력 형식을 설명합니다.
- 출력의 구조, 형식, 내용 등을 구체적으로 지정합니다.
- AI 모델이 일관되고 구조화된 응답을 생성하도록 돕습니다.
- 예를 들어:
<comma_separated_list_of_places>
<json_format>
<bullet_points>
<step_by_step_instructions>
다양한 포맷 지시어들과 그 예시를 제공하겠습니다:
- 구조화된 출력 형식
<json_format> : JSON 형식으로 출력
- 예시:
- {
“name”: “<person_name>”,
“age”: <numeric_age>,
“occupation”: “<job_title>”
}
- 리스트 형식
<numbered_list> : 번호 매긴 목록
<bullet_points> : 글머리 기호 목록
<comma_separated_list> : 쉼표로 구분된 목록
- 데이터 유형 지정
<numeric_value> : 숫자 값
<percentage> : 퍼센트 형식
<currency_value> : 화폐 값
<date_format> : 날짜 형식 (YYYY-MM-DD)
- 텍스트 스타일
<uppercase> : 대문자
<lowercase> : 소문자
<title_case> : 각 단어의 첫 글자 대문자
<camel_case> : 낙타 등 표기법
- 구체적인 출력 구조
<key_value_pairs> : 키-값 쌍
<table_format> : 표 형식
<markdown_table> : 마크다운 표
<code_block> : 코드 블록
- 길이 및 상세도 지정
<short_description> : 간단한 설명
<detailed_explanation> : 상세한 설명
<max_words:20> : 최대 단어 수
<min_words:50> : 최소 단어 수
- 감정 및 톤
<professional_tone>
<casual_tone>
<empathetic_response>
- 특정 도메인 형식
<scientific_notation>
<chemical_formula>
<programming_syntax>
실제 사용 예시
# 도시 정보 요청
프롬프트: “서울에 대해 다음 형식으로 정보를 제공하세요:
{
“name”: <city_name>,
“population”: <numeric_value>,
“founded”: <year>,
“key_attractions”: <comma_separated_list>,
“description”: <short_description>
}”
AI 응답:
{
“name”: “Seoul”,
“population”: 9776000,
“founded”: 1394,
“key_attractions”: “Gyeongbokgung Palace, N Seoul Tower, Bukchon Hanok Village, Myeongdong”,
“description”: “South Korea’s vibrant capital, blending ancient traditions with cutting-edge technology and modern urban life.”
} |
이 텍스트는 프롬프트 설계에서 모호한 표현을 피하고 명확하고 직접적인 표현을 사용하는 것의 중요성을 강조합니다. 효과적인 의사소통과 비교하며, 직접적인 표현이 메시지 전달에 더 효과적임을 설명합니다. 모호한 프롬프트와 명확한 프롬프트의 예시를 비교하여 구체성의 차이를 보여줍니다.
- 모호함 지양
- 상세하고 형식적인 프롬프트를 작성하려다 보면 불필요하게 복잡하고 모호한 표현을 사용하게 될 수 있다고 지적합니다.
- 명확하고 직접적인 표현이 더 효과적임을 강조합니다.
- 효과적인 의사소통과의 비교
- 프롬프트 작성을 효과적인 의사소통에 비유하며, 직접적인 표현일수록 메시지 전달이 더 효과적이라고 설명합니다.
- 모호한 프롬프트 예시
- “Explain the concept prompt engineering. Keep the explanation short, only a few sentences, and don’t be too descriptive.” 와 같이 문장 개수와 스타일에 대한 구체적인 지시가 없는 모호한 프롬프트를 예시로 제시합니다. 이러한 프롬프트로도 어느 정도 괜찮은 응답을 얻을 수 있지만, 최적의 결과를 얻기에는 부족하다고 설명합니다.
- 명확한 프롬프트 예시
- “Use 2-3 sentences to explain the concept of prompt engineering to a high school student.” 와 같이 문장 개수(2-3 문장), 대상 독자(고등학생)를 명확하게 지정하여 구체적이고 간결한 프롬프트를 제시합니다. 이처럼 명확한 프롬프트가 더 효과적임을 강조합니다.
|
이 텍스트는 앞서 소개된 프롬프트 작성 기법을 바탕으로 다양한 작업 유형에 대한 프롬프트 예시를 제공할 것임을 예고합니다.
예시를 통해 프롬프트 엔지니어링의 주요 개념을 학습하는 것이 효과적임을 강조하며, 텍스트 요약, 정보 추출, 질의응답 등 다양한 작업 유형을 제시합니다. |
메모) 생성형 AI 모델은 점점 강해지고 있습니다. 예시를 보고 ‘이렇게 해야 겠구나’하고 기억해 비슷한 상황에 외운걸 써야 할 필요 없습니다. 생성하기 원하는 것을 분명하게 전달하는데 신경쓰고, 챗 방식으로 하면 어떻게 될까를 고민해보고 해 보세요~
- antibiotics에 대해 설명과 한 문장 요약도 제공하세요.
- 다른 곳에서 구한 antibiotics에 대한 설명에 대해 한 문장 요약을 하려면?
- CDPE로 한다면?
- 나는 이후 antibiotics에 대한 설명을 제공할 것입니다.
제공하는 설명에 대해 한 줄 요약을 작성해 주세요.
좋은 글 감사합니다.
“Isee Idea” I/C/Id/O (Instruction, Context, Input Data, Output Indicator) 로 외웠습니다.
다음 메모에 대해 생각해 보았습니다.
메모) 생성형 AI 모델은 점점 강해지고 있습니다. 예시를 보고 ‘이렇게 해야 겠구나’하고 기억해 비슷한 상황에 외운걸 써야 할 필요 없습니다. 생성하기 원하는 것을 분명하게 전달하는데 신경쓰고, 챗 방식으로 하면 어떻게 될까를 고민해보고 해 보세요~
“antibiotics에 대해 설명과 한 문장 요약도 제공하세요.”
를 CDPE가 아니라 프롬프트 템플릿을 개발하는 느낌으로 작성해 보았습니다
(Gpt4o 사용)
https://chatgpt.com/share/674eeb1f-8fe8-800c-8349-8d7b69461c37