diff --git a/00-course-setup/translations/ko/README.md b/00-course-setup/translations/ko/README.md new file mode 100644 index 000000000..180f51c47 --- /dev/null +++ b/00-course-setup/translations/ko/README.md @@ -0,0 +1,137 @@ +# 코스 시작하기 + +이 코스를 시작하시게 되어 정말 기쁩니다. 여러분이 Generative AI와 함께 무엇을 영감받아 만들어낼지 기대됩니다! + +여러분들의 시간을 성공적으로 보내기 위해, 코스 환경 설정, 기술적 요구사항, 도움이 필요한 경우 어떻게 도움을 받을 수 있는지 안내하는 페이지를 만들었습니다. + +## 코스 환경 설정하기 + +이 과정을 시작하려면 다음 단계를 완료해야 합니다. + + +### 1. 레포지토리 포크하기 + +[레포지토리를 포크](https://github.com/microsoft/generative-ai-for-beginners/fork?WT.mc_id=academic-105485-koreyst) 하여 자신의 Github 계정에 업로드하여 코드를 변경하고 과제를 완료할 수 있습니다. 또한 [레포지토리에 스타 (🌟)를 추가](https://docs.github.com/en/get-started/exploring-projects-on-github/saving-repositories-with-stars?WT.mc_id=academic-105485-koreyst) 하여 쉽게 찾아볼 수 있도록 할 수 있습니다. + +### 2. Codespace 만들기 + +코드를 실행하는 동안 의존성 문제를 피하기 위해 Github codepsace를 활용하여 코스를 진행하는 것을 추천합니다. + +이를 위해 포크한 레포지토리에서 `Code` 옵션을 선택하고 **Codespaces** 옵션을 선택하여 생성할 수 있습니다. + +### 3. API 키 저장하기 + +어떠한 종류의 어플리케이션을 개발하든지 API 키를 안전하게 보관하는 것은 중요합니다. 코드에 직접 API 키를 저장하지 않는 것을 권장하며, 이들을 public 레포지토리에 커밋하는 것은 예상치 못한 비용 및 문제를 초래할 수 있습니다. + +![Dialog showing buttons to create a codespace](../../images/who-will-pay.webp?WT.mc_id=academic-105485-koreyst) + +## 로컬 컴퓨터에서 실행하는 방법 + +컴퓨터에서 로컬로 코드를 실행하려면 [Python](https://www.python.org/downloads/?WT.mc_id=academic-105485-koreyst)이 설치되어 있어야 합니다. + +이후 레포지토리를 사용하려면 이를 클론해야 합니다. + +```shell +git clone https://github.com/microsoft/generative-ai-for-beginners +cd generative-ai-for-beginners +``` + +이제 학습을 시작하고 코드와 작업을 진행할 수 있습니다. + +### miniconda 설치하기 (선택) +[miniconda](https://conda.io/en/latest/miniconda.html?WT.mc_id=academic-105485-koreyst)를 설치하면 여러 이점이 있습니다. - 이는 상대적으로 가벼운 설치로 다양한 Python **가상 환경**에 대한 `conda` 패키지 매니저를 지원합니다. `conda`는 다른 Python 버전 및 패키지 간에 쉽게 설치 및 전환할 수 있으며, `pip`를 통해 사용할 수 없는 패키지도 쉽게 설치할 수 있습니다. + +miniconda를 설치한 후, 레포지토리를 clone하고, 이 코스에 사용할 가상 환경을 생성해야 합니다. + +아래 단계를 실행하기 전에 먼저 *environment.yml*이 있는지 확인하세요. *environment.yml* 파일은 필요한 의존성이 포함된 conda 환경을 만드는데 사용되며, 다음과 같이 제공될 수 있습니다. + +```yml +name: +channels: + - defaults +dependencies: +- python= +- openai +- python-dotenv +``` + +``을 여러분의 conda 환경 이름으로 바꿀 수 있으며, ``에는 사용하고 싶은 Python 버전을 기입하면 됩니다. 생성한 *environment.yml* 파일을 레포지토리의 *.devcontainer* 폴더 안에 위치하도록 하세요. + +이제 *environment.yml*을 만들었다면, 다음 명령을 사용하여 conda 환경을 생성할 수 있습니다. + +```bash +conda env create --name ai4beg --file .devcontainer/environment.yml +conda activate ai4beg +``` + +문제가 발생하면 [conda 환경 생성](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html?WT.mc_id=academic-105485-koreyst)에 대한 링크를 참고하세요. + +### 파이썬 Extension과 함께 Visual Studio Code 사용하기 + +Probably the best way to use the curriculum is to open it in [Visual Studio Code](http://code.visualstudio.com/?WT.mc_id=academic-105485-koreyst) with [Python Extension](https://marketplace.visualstudio.com/items?itemName=ms-python.python&WT.mc_id=academic-105485-koreyst). + +> **Note**: “VS Code에서 디렉토리를 클론하고 열면 자동으로 Python 확장을 설치하라는 제안이 나타납니다. 또한 위에서 설명한대로 miniconda도 설치해야 합니다. + +> **Note**: VS Code가 컨테이너에서 저장소를 다시 열 것을 제안하면, 로컬 파이썬 설치를 사용하기 위해 거절해야 합니다. + +### 브라우저에서 Jupyter 사용하기 + +브라우저에서 직접 자신의 컴퓨터에서 Jupyter 환경을 사용할 수도 있습니다. 기존 Jupyter와 Jupyter Hub 모두 자동 완성, 코드 강조 등을 제공하는 매우 편리한 개발 환경을 제공합니다. + +Jupyter를 로컬에서 시작하려면, 코스의 디렉토리로 이동하고 다음을 실행하십시오: + +```bash +jupyter notebook +``` + +또는 + +```bash +jupyterhub +``` + +그런 다음 .ipynb 파일 중 어느 것으로든 이동하여 열고 작업을 시작할 수 있습니다. + +### 컨테이너에서 실행하기 + +Python 설치의 대안으로 컨테이너에서 코드를 실행할 수 있습니다. 저장소에는 이 저장소에 대한 컨테이너를 구축할 수 있는 특별한 `.devcontainer` 폴더가 포함되어 있기 때문에, VS Code는 코드를 컨테이너에서 다시 열 것을 제안할 것입니다. 이것은 Docker 설치를 필요로 하며, 또한 더 복잡할 수 있으므로, 우리는 이것을 더 경험 있는 사용자들에게 추천합니다. + +GitHub Codespaces를 사용할 때 API 키를 안전하게 유지하는 가장 좋은 방법 중 하나는 Codespace Secrets를 사용하는 것입니다. 해당 가이드를 따라서 [코드스페이스에 대한 secrets을 관리](https://docs.github.com/en/codespaces/managing-your-codespaces/managing-secrets-for-your-codespaces?WT.mc_id=academic-105485-koreyst)하는 방법을 알아보세요. + +## 수업과 기술 요구 사항 + +해당 코스에는 6개의 개념 수업와 6개의 코딩 수업이 있습니다. + +코딩 수업에서는 Azure OpenAI 서비스를 사용합니다. 이 코드를 실행하려면 Azure OpenAI 서비스에 접근할 수 있어야 하고 API 키가 필요합니다. [양식](https://azure.microsoft.com/products/ai-services/openai-service?WT.mc_id=academic-105485-koreyst)을 작성하여 접근 권한을 신청할 수 있습니다. + +신청이 처리되기를 기다리는 동안, 각 코딩 수업에는 코드와 출력을 볼 수 있는 `README.md` 파일이 포함되어 있습니다. + +## 처음으로 Azure OpenAI 서비스를 사용하기 + + Azure OpenAI 서비스를 처음 사용하는 경우, [Azure OpenAI 서비스 리소스를 생성하고 배포하는 방법](https://learn.microsoft.com/azure/ai-services/openai/how-to/create-resource?pivots=web-portal&WT.mc_id=academic-105485-koreyst)에 대한 가이드를 따라 주세요. + +## 다른 학습자들 만나기 + +[공식 AI 커뮤니티 디스코드 서버](https://aka.ms/genai-discord?WT.mc_id=academic-105485-koreyst)에 다른 학습자들과 만날 수 있는 채널을 만들었습니다. 여기서 같은 마음을 가진 창업가, 빌더, 학생, 그리고 생성형 AI에서 한 단계 더 나아가고자 하는 모든 사람들과 네트워킹할 수 있습니다. + +[![Join discord channel](https://dcbadge.vercel.app/api/server/ByRwuEEgH4)](https://aka.ms/genai-discord?WT.mc_id=academic-105485-koreyst) + +프로젝트 팀도 해당 디스코드 서버에 있어서 어떤 학습자든 도와드릴 수 있습니다. + +## 기여하기 + +해당 코스는 오픈 소스로 관리됩니다. 개선할 부분이나 문제가 있으면 [Pull Request](https://github.com/microsoft/generative-ai-for-beginners/pulls?WT.mc_id=academic-105485-koreyst)를 생성하거나 [Github issue](https://github.com/microsoft/generative-ai-for-beginners/issues?WT.mc_id=academic-105485-koreyst)를 기록해 주세요. + +프로젝트 팀은 모든 기여를 추적하고 있으며, 오픈 소스에 기여하는 것은 생성형 AI 분야에서 커리어를 구축하는 데 훌륭한 방법입니다. + +대부분의 기여는 CLA(Contributor License Agreement)에 동의해야 합니다. CLA는 귀하가 귀하의 기여를 사용할 권리가 있으며 실제로 그렇게 하는 것에 동의한다고 선언하는 것입니다. 자세한 내용은 [CLA, Contributor License Agreement 웹사이트](https://cla.microsoft.com?WT.mc_id=academic-105485-koreyst)를 방문하세요. + +중요: 이 저장소의 텍스트를 번역할 때 기계 번역을 사용하지 마세요. 커뮤니티를 통해 번역을 검증할 것이므로, 귀하가 능숙한 언어로만 번역에 자원해 주세요. + +풀 리퀘스트를 제출하면 CLA-bot이 자동으로 귀하가 CLA를 제공해야 하는지 여부를 결정하고 적절하게 PR을 꾸며줍니다(예: 레이블, 코멘트). 봇이 제공하는 지침을 따르기만 하면 됩니다. CLA를 사용하는 모든 저장소에서 한 번만 이 작업을 수행하면 됩니다. + +해당 프로젝트는 Microsoft 오픈 소스 행동 강령을 따릅니다. 자세한 내용은 행동 강령 FAQ를 읽거나 추가적인 질문이나 의견이 있으면 [Email opencode](opencode@microsoft.com)으로 연락하세요. + +## 시작해봅시다 + +해당 코스에 필요한 단계를 모두 완료했으니, [생성형 AI와 LLM 소개](../../../01-introduction-to-genai/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)를 통해 시작해 보세요. \ No newline at end of file diff --git a/01-introduction-to-genai/translations/ko/README.md b/01-introduction-to-genai/translations/ko/README.md new file mode 100644 index 000000000..add1126b1 --- /dev/null +++ b/01-introduction-to-genai/translations/ko/README.md @@ -0,0 +1,145 @@ +# 생성형 AI와 대형 언어 모델 (LLM) 소개 + +[![Introduction to Generative AI and Large Language Models](../../images/01-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://youtu.be/vf_mZrn8ibc?WT.mc_id=academic-105485-koreyst) + +*(이미지를 클릭하면 이 수업의 비디오를 볼 수 있습니다)* + +생성형 AI는 텍스트, 이미지 및 기타 유형의 콘텐츠를 생성할 수 있는 인공지능입니다. 이것이 훌륭한 기술인 이유는 AI를 민주화하기 때문입니다. 누구나 자연어로 작성된 문장인 텍스트 프롬프트만으로 이를 사용할 수 있습니다. Java나 SQL과 같은 언어를 배울 필요가 없으며, 당신이 원하는 것을 말하면 AI 모델에서 제안이 나옵니다. 이것의 응용 프로그램과 영향은 엄청나며, 보고서를 작성하거나 이해하고, 애플리케이션을 작성하고, 그 이상의 것들을 몇 초 만에 할 수 있습니다. + +해당 커리큘럼에서는 우리의 스타트업이 교육 세계에서 새로운 시나리오를 개척하기 위해 생성형 AI를 어떻게 활용하는지, 그리고 그 응용과 기술 한계에 따른 불가피한 도전을 어떻게 해결하는지 살펴볼 것입니다. + +## 소개 + +수업은 다음 내용을 다룹니다: + +* 비즈니스 시나리오 소개: 우리의 스타트업 아이디어와 미션. +* 생성형 AI와 우리가 현재 기술 환경에 도달한 방법. +* 대형 언어 모델의 내부 작동 방식. +* 대형 언어 모델의 주요 기능과 실용적인 사용 사례. + +## 학습 목표 + +이 수업을 완료하면 다음을 이해하게 됩니다: + +* 생성형 AI가 무엇인지, 대형 언어 모델이 어떻게 작동하는지. +* 교육 시나리오를 중심으로 다양한 사용 사례에 대형 언어 모델을 어떻게 활용할 수 있는지. + +## 시나리오: 우리의 교육 스타트업 + +생성형 인공지능(AI)은 AI 기술의 정점을 나타내며, 한때 불가능하다고 생각되었던 것의 한계를 뛰어넘습니다. 생성형 AI 모델은 여러 가지 기능과 응용 프로그램을 가지고 있지만, 이 커리큘럼에서는 가상의 스타트업을 통해 교육을 혁신하는 방법을 살펴볼 것입니다. 이 스타트업을 *우리 스타트업*이라고 부르겠습니다. 우리 스타트업은 교육 분야에서 다음과 같은 야심찬 미션을 가지고 작업하고 있습니다. + +> *전 세계적으로 학습의 접근성을 향상시키고, 교육에 대한 공정한 접근을 보장하며, 각 학습자의 필요에 따라 개인화된 학습 경험을 제공한다.* + +우리 스타트업 팀은 이 목표를 달성하기 위해 현대의 가장 강력한 도구 중 하나인 대형 언어 모델(LLM)을 활용하지 않고는 불가능할 것임을 인식하고 있습니다. + +생성형 AI는 우리가 오늘날 배우고 가르치는 방식을 혁신할 것으로 예상되며, 학생들은 하루 24시간 가상의 선생님을 이용할 수 있게 되어 방대한 양의 정보와 예제를 제공하고, 선생님들은 학생들을 평가하고 피드백을 주는 데 혁신적인 도구를 활용할 수 있게 될 것입니다. + +![Five young students looking at a monitor - image by DALLE2](../../images/students-by-DALLE2.png?WT.mc_id=academic-105485-koreyst) + +시작하기 위해, 이 커리큘럼에서 사용할 기본 개념과 용어를 정의하겠습니다. + +## 우리는 어떻게 생성형 AI를 얻게 되었나요? + +최근 생성형 AI 모델의 발표로 인해 발생한 놀라운 *확장*에도 불구하고, 이 기술은 수십 년 동안 만들어져 왔으며, 최초의 연구 노력은 60년대에 거슬러 올라갑니다. 우리는 이제 인간의 인지 능력을 가진 AI에 도달했습니다. 예를 들어 [OpenAI ChatGPT](https://openai.com/chatgpt)나 [Bing Chat](https://www.microsoft.com/edge/features/bing-chat?WT.mc_id=academic-105485-koreyst)과 같은 대화가 가능한 AI입니다. Bing Chat은 웹 검색 Bing 대화를 위해 GPT 모델을 사용합니다. + +조금 뒤로 돌아가 보면, 최초의 AI 프로토타입은 전문가 그룹에서 추출한 지식 베이스를 컴퓨터에 표현하고, 입력 텍스트에 나타나는 키워드에 의해 지식 베이스의 답변이 트리거되는 typewritten 챗봇으로 구성되었습니다. 그러나 typewritten 챗봇을 사용하는 이러한 접근 방식은 잘 확장되지 않는다는 것이 곧 분명해졌습니다. + +### AI에 대한 통계적 접근: 머신러닝 + +90년대에 도래한 전환점은 텍스트 분석에 통계적 접근법을 적용한 것이었습니다. 이로 인해 새로운 알고리즘들이 개발되었는데, 이를 머신러닝이라고 부릅니다. 이 알고리즘들은 명시적으로 프로그래밍되지 않아도 데이터로부터 패턴을 학습할 수 있습니다. 이 접근법은 기계가 인간의 언어 이해를 모방하게 해줍니다: 통계 모델은 텍스트-레이블 쌍에 대해 학습하며, 이를 통해 모델은 알려지지 않은 입력 텍스트를 메시지의 의도를 나타내는 사전 정의된 레이블로 분류할 수 있게 됩니다. + +### 신경망과 현대의 가상 어시스턴트 + +최근에는 더 많은 양의 데이터를 처리하고 더 복잡한 계산을 수행할 수 있는 하드웨어의 기술적 진화가 AI 분야의 연구를 촉진시켰고, 이로 인해 고급 머신러닝 알고리즘인 신경망 또는 딥러닝 알고리즘이 개발되었습니다. + +신경망(특히 순환 신경망 - RNN)은 자연어 처리를 크게 향상시켜, 단어의 문맥을 고려하여 텍스트의 의미를 더 의미있게 표현할 수 있게 하였습니다. + +이 기술은 새로운 세기의 첫 10년 동안 탄생한 가상 어시스턴트를 구동하였으며, 이들은 인간의 언어를 해석하고, 필요성을 파악하고, 그것을 만족시키기 위한 행동을 수행하는 데 매우 능숙했습니다. 예를 들어, 사전에 정의된 스크립트로 답변하거나 3rd party 서비스를 사용하는 등의 작업을 수행하였습니다. + +### 현재의 생성형 AI + +이것이 현재의 생성형 AI에 이르게 된 과정입니다. 생성형 AI는 딥러닝의 하위 분야로 볼 수 있습니다. + +![AI, ML, DL and Generative AI](../../images/AI-diagram.png?WT.mc_id=academic-105485-koreyst) + +AI 분야에서 수십 년간의 연구 끝에 새로운 모델 구조인 *Transformer*가 RNN의 한계를 극복했습니다. Transformer는 입력받은 텍스트의 순서에 관계없이 가장 중요한 정보가 집중된 곳에 ’더 많은 주의’를 기울일 수 있도록 모델에 다른 가중치를 부여하는 attention 메커니즘에 기반합니다. + +텍스트 입력과 출력으로 작동하는 대형 언어 모델(Large Language Models, LLMs)이라고도 불리는 최근의 생성형 AI 모델들은 대부분 이 구조에 기반합니다. 이 모델들은 책, 기사, 웹사이트 등 다양한 출처로부터 수많은 양의 라벨이 없는 데이터로 훈련되었습니다. 이 모델들의 흥미로운 점은 다양한 작업에 활용할 수 있고, 문법적으로 올바르고 창의적인 텍스트를 생성할 수 있다는 것입니다. 즉, 기계가 입력 텍스트를 ’이해’하는 능력을 엄청나게 향상시키뿐만 아니라, 인간의 언어로 원본 응답을 생성하는 능력을 가능하게 했습니다. + +## 대형 언어 모델이 작동하는 방식 + +다음 장에서는 다양한 유형의 생성형 AI 모델을 살펴볼 것입니다. 하지만 지금은 OpenAI GPT (Generative Pre-trained Transformer) 모델을 중심으로 대형 언어 모델이 작동하는 방식에 대해 알아보겠습니다. + +* **토크나이저, 텍스트를 숫자로 변환**: 대형 언어 모델은 텍스트를 입력으로 받아 텍스트를 출력합니다. 하지만 통계적 모델이기 때문에 텍스트 시퀀스보다는 숫자로 작업하는 것이 훨씬 더 잘 됩니다. 그래서 모델의 핵심 부분이 사용하기 전에 모든 입력은 토크나이저에 의해 처리됩니다. 토큰은 텍스트의 조각으로, 일정한 수의 문자로 구성됩니다. 그래서 토크나이저의 주요 작업은 입력을 토큰 배열로 분할하는 것입니다. 그런 다음 각 토큰은 토큰 인덱스와 매핑됩니다. 토큰 인덱스는 원래 텍스트 조각의 정수 인코딩입니다. + +![Example of tokenization](../../images/tokenizer-example.png?WT.mc_id=academic-105485-koreyst) + +* **출력 토큰 예측하기**: n개의 토큰을 입력으로 받으면(최대 n은 모델마다 다름) 모델은 하나의 토큰을 출력으로 예측할 수 있습니다. 이 토큰은 다음 반복의 입력에 확장 윈도우 패턴을 통해 더 나은 사용자 경험을 제공하여 하나(또는 여러) 문장을 답변으로 얻을 수 있습니다. 이를 통해 ChatGPT을 사용한 적이 있다면 때때로 문장 중간에 멈춰 있는 것처럼 보이는 이유를 설명할 수 있습니다. + +* **선택 과정, 확률 분포**: 출력 토큰은 현재 텍스트 시퀀스 다음에 발생할 확률에 따라 모델에 의해 선택됩니다. 이는 모델이 훈련을 기반으로 가능한 ’다음 토큰’에 대한 확률 분포를 예측하기 때문입니다. 그러나 항상 결과 분포에서 가장 높은 확률을 가진 토큰이 선택되는 것은 아닙니다. 이 선택에는 일정한 무작위성이 추가되어, 모델이 비결정적인 방식으로 작동합니다 - 즉, 동일한 입력에 대해 정확히 동일한 출력을 얻지 않습니다. 이 무작위성의 정도는 창의적 사고 과정을 시뮬레이션하기 위해 추가되며, temperature라는 모델 매개변수를 사용하여 조정할 수 있습니다. + +## 우리 스타트업이 대형 언어 모델을 어떻게 활용할 수 있을까요? + +이제 우리는 대형 언어 모델의 내부 작동 방식에 대해 더 잘 이해하게 되었으니, 그들이 잘 수행할 수 있는 가장 일반적인 작업들의 실제 예시를 살펴보면서 우리 비즈니스 시나리오에 대한 고려사항을 살펴보겠습니다. 앞서 말했듯이, 대형 언어 모델의 주요 능력은 *자연어로 작성된 텍스트 입력을 시작으로, 텍스트를 처음부터 생성하는 것입니다.* + +그러나 어떤 종류의 텍스트 입력과 출력이 있을까요? 대형 언어 모델의 입력은 프롬프트(prompt) 라고 알려져 있고, 출력은 completion이라고 알려져 있습니다. 이는 모델이 현재 입력을 완성하기 위해 다음 토큰을 생성하는 메커니즘을 가리킵니다. 우리는 프롬프트가 무엇인지, 그리고 어떻게 설계해야 모델에서 최대의 효과를 얻을 수 있는지에 대해 깊이 파고들 것입니다. 하지만 지금은, 프롬프트가 다음을 포함할 수 있다고만 말하겠습니다: + +* **지시 (instruction)** 를 통해 모델로부터 기대하는 출력 유형을 지정할 수 있습니다. 지시는 때때로 일부 예시나 추가 데이터를 포함할 수 있습니다. + + 1. 기사, 책, 제품 리뷰 등의 요약, 더불어 비구조화된 데이터로부터 인사이트를 추출합니다. + + ![Example of summarization](../../images/summarization-example.png?WT.mc_id=academic-105485-koreyst) + +
+ + 2. 기사, 에세이, 과제 등의 창의적인 아이디어 제안과 디자인. + + ![Example of creative writing](../../images/creative-writing-example.png?WT.mc_id=academic-105485-koreyst) + +
+ +* **질문 (question)** 을 통해 대화 형식으로 에이전트에게 질문을 물어볼 수 있습니다. + +![Example of conversation](../../images/conversation-example.png?WT.mc_id=academic-105485-koreyst) + +
+ +* **완성해야 할 텍스트**를 제공함으로써 암시적으로 글쓰기 도움을 요청할 수 있습니다. + +![Example of text completion](../../images/text-completion-example.png?WT.mc_id=academic-105485-koreyst) + +
+ +* **코드**에서 그것을 설명하고 문서화하라는 요청을 하거나 특정 작업을 수행하는 코드 조각을 생성할 수 있습니다. + + + +![Coding example](../../images/coding-example.png?WT.mc_id=academic-105485-koreyst) + +
+ +위의 예시들은 매우 간단한 것들이며, 대형 언어 모델의 능력을 철저하게 보여주려는 것이 아닙니다. 단지 생성형 AI를 사용하는 잠재력이 교육적인 맥락에 한정되지 않는 것을 보여주기 위함입니다. + +또한, 생성형 AI 모델의 출력은 완벽하지 않으며 때때로 모델의 창의성이 오히려 인간 사용자가 현실의 왜곡으로 해석할 수 있는 단어들의 조합이나, 불쾌할 수 있는 출력을 만들어낼 수 있습니다. 생성형 AI는 지능적이지 않습니다 - 적어도 비판적이고 창의적인 추론 또는 감정 지능을 포함하는 지능의 보다 포괄적인 정의에서는요; 생성형 AI는 결정론적이지 않으며, 신뢰할 수 없습니다, 왜냐하면 허구, 예를 들어 잘못된 참조, 내용, 그리고 명제들이 올바른 정보와 결합될 수 있고, 설득력 있고 자신감 있어보이게 제시될 수 있기 때문입니다. 다음 수업에서, 우리는 이러한 모든 제한 사항들을 다루게 될 것이며, 그것들을 완화하기 위해 우리가 무엇을 할 수 있는지 살펴볼 것입니다. + +## 과제 + +당신의 과제는 [생성형 AI]((https://en.wikipedia.org/wiki/Generative_artificial_intelligence?WT.mc_id=academic-105485-koreyst))에 대해 더 많이 읽어보고, 현재 생성형 AI가 없는 영역에서 어디에 생성형 AI를 활용할 것인지를 파악하는 것입니다. "옛날 방식"과 비교했을 때 영향력은 어떻게 달라질까요, 이전에 할 수 없었던 것을 할 수 있게 되었나요, 아니면 더 빨라졌나요? “문제”, “AI를 어떻게 사용할 것인가”, “영향력” 그리고 선택적으로 비즈니스 계획을 포함한 헤더를 사용하여 꿈의 AI 스타트업이 어떤 모습일지에 대한 300단어 요약을 작성해보세요. + +이 과제를 수행하면, 여러분은 Microsoft의 인큐베이터인 [Microsoft for Startups Founders Hub](https://www.microsoft.com/startups?WT.mc_id=academic-105485-koreyst)에 지원할 준비가 되어있을지도 모릅니다. 우리는 Azure, OpenAI, 멘토링 등에 대한 크레딧을 제공하며, 더 많은 것들을 확인해보세요! + +## 지식 확인 + +대형 언어 모델에 대해 어떤 것이 사실인가요? + +1. 매번 정확히 같은 응답을 받습니다. +2. 완벽하게 작동하며, 숫자를 더하는 것, 작동하는 코드를 생성하는 것 등에 탁월합니다. +3. 동일한 프롬프트를 사용하더라도 응답은 다양할 수 있습니다. 또한 텍스트나 코드 등, 무언가의 첫 번째 초안을 잘 제공합니다. 하지만 결과를 개선해야 합니다. + +정답: 3, 대형 언어 모델(LLM)은 비결정론적이므로 응답이 다양하며, 그 변동성은 temperature 설정을 통해 조절할 수 있습니다. 또한 완벽하게 작동한다고 기대해서는 안됩니다. LLM은 여러분을 위해 대부분의 작업을 수행해주지만, 이는 종종 여러분이 점차 개선해야 할 좋은 첫 시도를 얻게 된다는 것을 의미합니다. + +## 잘하셨습니다! 여정을 계속하세요 + +이 강의를 완료한 후에는 [Generative AI 학습 컬렉션](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)을 확인하여 Generative AI 지식을 계속 향상시켜 보세요! + +Lesson 2로 이동하여 [다양한 LLM 유형 탐색 및 비교](../../../02-exploring-and-comparing-different-llms/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)하는 방법을 살펴보겠습니다! \ No newline at end of file diff --git a/02-exploring-and-comparing-different-llms/translations/ko/README.md b/02-exploring-and-comparing-different-llms/translations/ko/README.md new file mode 100644 index 000000000..de7e41561 --- /dev/null +++ b/02-exploring-and-comparing-different-llms/translations/ko/README.md @@ -0,0 +1,192 @@ +# 다양한 LLM 탐색과 비교 + +[![Exploring and comparing different LLMs](../../images/02-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://youtu.be/J1mWzw0P74c?WT.mc_id=academic-105485-koreyst) + +> *위의 이미지를 클릭하여 이 레슨의 비디오를 시청하세요.* + +이전 레슨에서 우리는 생성형 AI가 기술적인 환경을 변화시키고, 대형 언어 모델 (LLM)이 어떻게 작동하는지, 그리고 우리 스타트업과 같은 비즈니스가 그들을 사용하여 사용 사례를 적용하고 성장할 수 있는지를 보았습니다. 이 장에서는 다른 유형의 대형 언어 모델인 LLM을 비교하고 대조하여 그들의 장단점을 이해하기 위해 탐색할 것입니다. + +우리 스타트업의 여정에서 다음 단계는 현재의 대형 언어 모델 (LLM) 환경을 탐색하고 우리의 사용 사례에 적합한 모델을 이해하는 것입니다. + +## 소개 + +이 레슨에서는 다음을 다룰 것입니다: + +- 현재 풍경에서 다양한 유형의 LLM. +- Azure에서 사용 사례에 대한 다른 모델을 테스트, 반복 및 비교하는 방법. +- LLM을 배포하는 방법. + +## 학습 목표 + +이 레슨을 마치면 다음을 할 수 있게 될 것입니다: + +- 사용 사례에 적합한 적절한 모델 선택. +- 모델의 테스트, 반복 및 성능 개선 방법 이해. +- 비즈니스가 모델을 배포하는 방법 알기. + +## 다양한 유형의 LLM 이해하기 + +대형 언어 모델 (LLM)은 아키텍처, 훈련 데이터 및 사용 사례에 따라 여러 가지 범주로 나뉠 수 있습니다. 이러한 차이점을 이해하면 우리 스타트업이 시나리오에 맞는 올바른 모델을 선택하고 성능을 테스트, 반복 및 개선하는 방법을 이해할 수 있습니다. + +LLM 모델에는 텍스트, 오디오, 비디오, 이미지 생성 등을 위한 다양한 유형이 있습니다. 모델 선택은 사용 목적, 데이터, 비용 등에 따라 달라집니다. + +- **오디오 및 음성 인식**. 이를 위해 Whisper 유형의 모델은 음성 인식을 위해 훌륭한 선택입니다. 일반적인 용도로 사용되며, 다양한 오디오로 훈련되어 다국어 음성 인식을 수행할 수 있습니다. [여기에서 Whisper 유형 모델에 대해 자세히 알아보세요](https://platform.openai.com/docs/models/whisper?WT.mc_id=academic-105485-koreyst). + +- **이미지 생성**. 이미지 생성을 위해 DALL-E와 Midjourney는 매우 잘 알려진 선택지입니다. DALL-E는 Azure OpenAI에서 제공됩니다. [DALL-E에 대해 더 알아보세요](https://platform.openai.com/docs/models/dall-e?WT.mc_id=academic-105485-koreyst) 및 이 커리큘럼의 9장에서도 자세히 다룹니다. + +- **텍스트 생성**. 대부분의 모델은 텍스트 생성을 위해 훈련되었으며, GPT-3.5에서 GPT-4까지 다양한 선택지가 있습니다. 각 모델은 다른 비용이 발생하며, GPT-4가 가장 비싸다는 점을 유념해야 합니다. 능력과 비용 측면에서 어떤 모델이 가장 적합한지 평가하기 위해 [Azure Open AI playground](https://oai.azure.com/portal/playground?WT.mc_id=academic-105485-koreyst)을 살펴보는 것이 좋습니다. + +모델을 선택하면 기본 기능을 얻을 수 있지만, 종종 회사별 데이터를 LLM에게 알려줘야 할 필요가 있습니다. 이에 대한 접근 방식에는 몇 가지 다른 선택지가 있으며, 이후 섹션에서 자세히 알아보겠습니다. + +### Foundation Models VS LLMs + +Foundation Model이라는 용어는 [스탠포드 연구원들에 의해 만들어졌으며](https://arxiv.org/abs/2108.07258?WT.mc_id=academic-105485-koreyst), 다음과 같은 기준을 따르는 AI 모델을 의미합니다: + +- **비지도 학습 또는 자기 지도 학습을 사용하여 훈련됩니다**, 즉, 레이블이 없는 멀티 모달 데이터로 훈련되며, 훈련 과정에서 인간의 주석 또는 데이터 레이블링이 필요하지 않습니다. +- **매우 큰 모델**로, 수십억 개의 매개변수로 훈련된 매우 깊은 신경망을 기반으로 합니다. +- **일반적으로 다른 모델을 위한 '기반'으로 사용됩니다**, 즉, 다른 모델을 구축하기 위한 출발점으로 사용될 수 있으며, 이는 세밀한 조정을 통해 이루어질 수 있습니다. + +![Foundation Models versus LLMs](../../images/FoundationModel.png?WT.mc_id=academic-105485-koreyst) + +이미지 출처: [Essential Guide to Foundation Models and Large Language Models | by Babar M Bhatti | Medium +](https://thebabar.medium.com/essential-guide-to-foundation-models-and-large-language-models-27dab58f7404) + +이 구분을 더 명확히 하기 위해 ChatGPT를 예로 들어보겠습니다. ChatGPT의 첫 번째 버전을 구축하기 위해 GPT-3.5라는 모델이 Foundation Model로 사용되었습니다. 이는 OpenAI가 일부 채팅 관련 데이터를 사용하여 GPT-3.5의 튜닝된 버전을 만들었으며, 이 모델은 채팅봇과 같은 대화 시나리오에서 잘 동작하는 것에 특화되었습니다. + +![Foundation Model](../../images/Multimodal.png?WT.mc_id=academic-105485-koreyst) + +이미지 출처: [2108.07258.pdf (arxiv.org)](https://arxiv.org/pdf/2108.07258.pdf?WT.mc_id=academic-105485-koreyst) + +### 오픈 소스 VS 독점 모델 (Proprietary Models) + +LLM을 분류하는 또 다른 방법은 오픈 소스인지 독점 모델인지에 따라 나눌 수 있습니다. + +오픈 소스 모델은 일반에 공개되어 누구나 사용할 수 있는 모델입니다. 이러한 모델은 일반적으로 해당 모델을 개발한 회사나 연구 커뮤니티에 의해 제공됩니다. 이러한 모델은 검토, 수정 및 사용 사례에 맞게 사용자 정의할 수 있습니다. 그러나 이러한 모델은 항상 프로덕션 환경에 최적화되지 않을 수 있으며, 독점 모델만큼 성능이 우수하지 않을 수도 있습니다. 또한, 오픈 소스 모델의 자금 지원은 제한적일 수 있으며, 장기적으로 유지되지 않거나 최신 연구로 업데이트되지 않을 수도 있습니다. 대표적인 오픈 소스 모델로는 [Alpaca](https://crfm.stanford.edu/2023/03/13/alpaca.html?WT.mc_id=academic-105485-koreyst), [Bloom](https://sapling.ai/llm/bloom?WT.mc_id=academic-105485-koreyst) 및 [LLaMA](https://sapling.ai/llm/llama?WT.mc_id=academic-105485-koreyst)이 있습니다. + +독점 모델 (Proprietary models)은 회사에 소유되어 일반에 공개되지 않는 모델입니다. 이러한 모델은 일반적으로 프로덕션 환경에 최적화되어 있습니다. 그러나 이러한 모델은 사용자가 검토, 수정 또는 사용 사례에 맞게 사용자 정의할 수 없습니다. 또한, 이러한 모델은 항상 무료로 제공되지 않을 수 있으며, 사용을 위해 구독 또는 결제가 필요할 수 있습니다. 또한, 사용자는 모델을 훈련하는 데 사용되는 데이터를 제어할 수 없으므로 데이터 프라이버시와 AI의 책임있는 사용을 보장하기 위해 모델 소유자에게 의존해야 합니다. 대표적인 독점 모델로는 [OpenAI 모델](https://platform.openai.com/docs/models/overview?WT.mc_id=academic-105485-koreyst), [Google Bard](https://sapling.ai/llm/bard?WT.mc_id=academic-105485-koreyst) 및 [Claude 2](https://www.anthropic.com/index/claude-2?WT.mc_id=academic-105485-koreyst)가 있습니다. + +### 임베딩 VS 이미지 생성 VS 텍스트 및 코드 생성 + +LLM은 생성하는 출력에 따라 다양한 범주로 분류될 수 있습니다. + +임베딩은 텍스트를 숫자 형태로 변환하는 모델의 집합으로, 입력 텍스트의 수치적 표현인 임베딩을 생성합니다. 임베딩은 기계가 단어나 문장 간의 관계를 이해하기 쉽게 만들어주며, 분류 모델이나 클러스터링 모델과 같은 다른 모델의 입력으로 사용될 수 있습니다. 임베딩 모델은 전이 학습(transfer learning)에 자주 사용되며, 풍부한 데이터가 있는 대리 과제를 위해 모델이 구축되고, 그런 다음 모델 가중치(임베딩)가 다른 하위 작업에 재사용됩니다. 이 범주의 예로는 [OpenAI embeddings](https://platform.openai.com/docs/models/embeddings?WT.mc_id=academic-105485-koreyst)가 있습니다. + +![Embedding](../../images/Embedding.png?WT.mc_id=academic-105485-koreyst) + +이미지 생성 모델은 이미지를 생성하는 모델입니다. 이러한 모델은 이미지 편집, 이미지 합성 및 이미지 변환에 자주 사용됩니다. 이미지 생성 모델은 대규모 이미지 데이터셋(예: [LAION-5B](https://laion.ai/blog/laion-5b/?WT.mc_id=academic-105485-koreyst))으로 훈련되며, 새로운 이미지를 생성하거나 인페인팅, 초해상도 및 색상화 기술을 사용하여 기존 이미지를 편집하는 데 사용될 수 있습니다. 예시로는 [DALL-E-3](https://openai.com/dall-e-3?WT.mc_id=academic-105485-koreyst)와 [Stable Diffusion 모델](https://github.com/Stability-AI/StableDiffusion?WT.mc_id=academic-105485-koreyst)이 있습니다. + +![이미지 생성](../../images/Image.png?WT.mc_id=academic-105485-koreyst) + +텍스트 및 코드 생성 모델은 텍스트나 코드를 생성하는 모델입니다. 이러한 모델은 텍스트 요약, 번역 및 질문에 대한 답변과 같은 작업에 자주 사용됩니다. 텍스트 생성 모델은 대규모 텍스트 데이터셋(예: [BookCorpus](https://www.cv-foundation.org/openaccess/content_iccv_2015/html/Zhu_Aligning_Books_and_ICCV_2015_paper.html?WT.mc_id=academic-105485-koreyst))으로 훈련되며, 새로운 텍스트를 생성하거나 질문에 답변하는 데 사용될 수 있습니다. 코드 생성 모델인 [CodeParrot](https://huggingface.co/codeparrot?WT.mc_id=academic-105485-koreyst)과 같은 모델은 대규모 코드 데이터셋(예: GitHub)으로 훈련되며, 새로운 코드를 생성하거나 기존 코드의 버그를 수정하는 데 사용될 수 있습니다. + + ![Text and code generation](../../images/Text.png?WT.mc_id=academic-105485-koreyst) + +### 인코더-디코더 (Encoder-Decoder) VS 디코더 전용 (Decoder-only) + +LLM의 다양한 아키텍처에 대해 이야기하기 위해 비유를 사용해보겠습니다. + +상사가 학생들을 위한 퀴즈 작성 과제를 주었습니다. 두 명의 동료가 있습니다. 한 명은 콘텐츠 작성을 담당하고 다른 한 명은 검토를 담당합니다. + +콘텐츠 작성자는 디코더 전용 (Decoder-only) 모델과 비슷합니다. 그들은 주제를 살펴보고 이미 작성된 내용을 확인한 후에 그에 기반하여 코스를 작성할 수 있습니다. 그들은 매력적이고 유익한 콘텐츠 작성에 능숙하지만, 주제와 학습 목표를 이해하는 데는 그리 능숙하지 않습니다. GPT-3와 같은 GPT 계열 모델이 디코더 모델의 예입니다. + +검토자는 인코더 전용 모델과 비슷합니다. 그들은 작성된 코스와 답변을 살펴보고 그들 사이의 관계를 인지하며 문맥을 이해하지만, 콘텐츠 생성에는 능숙하지 않습니다. 인코더 전용 모델의 예로는 BERT가 있습니다. + +퀴즈를 작성하고 검토할 수 있는 사람이 있다고 상상해보세요. 이것이 인코더-디코더 (Encoder-Decoder) 모델입니다. BART와 T5가 그 예입니다. + +### 서비스 VS 모델 + +이제 서비스와 모델의 차이에 대해 이야기해보겠습니다. 서비스는 클라우드 서비스 제공업체가 제공하는 제품으로, 종종 모델, 데이터 및 기타 구성 요소의 조합입니다. 모델은 서비스의 핵심 구성 요소이며, 종종 LLM과 같은 기반 모델입니다. + +서비스는 종종 프로덕션 사용에 최적화되어 있으며, 그래픽 사용자 인터페이스를 통해 모델보다 쉽게 사용할 수 있습니다. 그러나 서비스는 항상 무료로 제공되지 않을 수 있으며, 서비스를 사용하기 위해 구독 또는 결제가 필요할 수 있습니다. 이는 서비스 소유자의 장비와 리소스를 활용하여 비용을 최적화하고 쉽게 확장할 수 있도록 하는 대가입니다. Azure OpenAI 서비스는 이러한 예로, 사용자는 서비스를 사용한 양에 비례하여 비용을 지불하는 pay-as-you-go 요금제를 제공합니다. 또한, Azure OpenAI 서비스는 모델의 기능에 더해 기업용 보안 및 책임 있는 AI 프레임워크를 제공합니다. + +모델은 매개변수, 가중치 등을 포함한 신경망 자체입니다. 회사는 이러한 모델을 로컬에서 실행할 수 있지만, 장비를 구매하고 확장할 구조를 구축하고 라이선스를 구매하거나 오픈 소스 모델을 사용해야 합니다. LLaMA와 같은 모델은 계산 성능이 필요하며, 모델을 실행하기 위해 컴퓨팅 자원이 필요합니다. + +## Azure에서 성능을 이해하기 위해 다른 모델로 테스트하고 반복하는 방법 + +팀은 현재 LLMs의 현황을 조사하고 시나리오에 적합한 몇 가지 좋은 후보 모델을 식별한 후, 다음 단계는 해당 데이터와 작업 부하에서 이들을 테스트하는 것입니다. 이는 실험과 측정을 통해 반복적으로 수행되는 과정입니다. +이전 단락에서 언급한 대부분의 모델들(OpenAI 모델, Llama2와 같은 오픈 소스 모델, Hugging Face transformers)은 [Azure Machine Learning studio](https://ml.azure.com/?WT.mc_id=academic-105485-koreyst)의 [Foundation Models](https://learn.microsoft.com/azure/machine-learning/concept-foundation-models?WT.mc_id=academic-105485-koreyst) 카탈로그에서 사용할 수 있습니다. + +[Azure Machine Learning](https://azure.microsoft.com/products/machine-learning/?WT.mc_id=academic-105485-koreyst)은 데이터 과학자와 ML 엔지니어를 위해 설계된 클라우드 서비스로, ML 수명주기 전체(학습, 테스트, 배포 및 MLOps 처리)를 단일 플랫폼에서 관리할 수 있도록 지원합니다. Machine Learning studio는 이 서비스에 대한 그래픽 사용자 인터페이스를 제공하며 사용자가 다음을 수행할 수 있도록 합니다: + +- 카탈로그에서 관심 있는 Foundation Model을 태스크, 라이선스 또는 이름으로 필터링하여 찾을 수 있습니다. 카탈로그에 아직 포함되지 않은 새로운 모델을 가져올 수도 있습니다. +- 상세한 설명과 코드 샘플을 포함한 모델 카드를 검토하고, 샘플 프롬프트를 제공하여 결과를 테스트하는 샘플 추론 위젯을 사용하여 모델을 테스트할 수 있습니다. + +![Model card](../../images/Llama1.png?WT.mc_id=academic-105485-koreyst) + +- 특정 작업 부하와 입력으로 제공된 특정 데이터 세트에 대한 객관적인 평가 메트릭을 사용하여 모델 성능을 평가할 수 있습니다. + +![Model evaluation](../../images/Llama2.png?WT.mc_id=academic-105485-koreyst) + +- Azure Machine Learning의 실험 및 추적 기능을 활용하여 특정 작업 부하에서 모델 성능을 개선하기 위해 사용자 지정 훈련 데이터로 모델을 세밀하게 조정할 수 있습니다. + +![Model fine-tuning](../../images/Llama3.png?WT.mc_id=academic-105485-koreyst) + +- 원래의 사전 훈련된 모델 또는 세밀하게 조정된 버전을 원격 실시간 추론 또는 배치 엔드포인트에 배포하여 응용 프로그램에서 사용할 수 있도록 할 수 있습니다. + +![Model deployment](../../images/Llama4.png?WT.mc_id=academic-105485-koreyst) + +## LLM 결과 개선하기 + +우리 스타트업 팀은 다양한 종류의 LLM과 Cloud Platform (Azure Machine Learning)을 탐색하여 다른 모델을 비교하고, 테스트 데이터로 평가하고, 성능을 개선하고, 추론 엔드포인트에 배포할 수 있는 기능을 활용했습니다. + +그러나 언제 모델을 fine-tuning하여 사전 훈련된 모델 대신 사용해야 할까요? 특정 작업 부하에서 모델 성능을 개선하기 위한 다른 접근 방식이 있을까요? + +비즈니스가 LLM에서 필요한 결과를 얻기 위해 사용할 수 있는 여러 가지 접근 방식이 있습니다. 다양한 수준의 훈련을 거친 다른 유형의 모델을 선택할 수 있으며, 복잡성, 비용 및 품질이 다른 LLM을 프로덕션에 배포할 수 있습니다. 다음은 몇 가지 다른 접근 방식입니다: + +- **컨텍스트를 고려한 프롬프트 엔지니어링**. 프롬프트할 때 충분한 컨텍스트를 제공하여 필요한 응답을 얻을 수 있도록 하는 것입니다. + +- **검색 증강 생성 (Retrieval Augmented Generation), RAG**. 데이터가 데이터베이스나 웹 엔드포인트에 존재할 수 있습니다. 프롬프트할 때 해당 데이터 또는 그 일부를 포함하도록하여 관련 데이터를 가져와 사용자의 프롬프트의 일부로 만들 수 있습니다. + +- **파인튜닝 모델**. 여기서는 자체 데이터로 모델을 추가로 훈련시켜 모델이 더 정확하고 사용자의 요구에 더 잘 대응하지만 비용이 발생할 수 있습니다. + +![LLMs deployment](../../images/Deploy.png?WT.mc_id=academic-105485-koreyst) + +이미지 출처: [Four Ways that Enterprises Deploy LLMs | Fiddler AI Blog](https://www.fiddler.ai/blog/four-ways-that-enterprises-deploy-llms?WT.mc_id=academic-105485-koreyst) + +### 컨텍스트를 고려한 프롬프트 엔지니어링 + +사전 훈련된 LLM은 일반적인 자연어 작업에서 매우 잘 작동합니다. 짧은 프롬프트(문장을 완성하거나 질문하는 것과 같은)로도 호출하면 "제로샷" 학습이라고 할 수 있습니다. + +그러나 사용자가 자세한 요청과 예제를 포함한 "컨텍스트"로 쿼리를 구성할수록 정확도가 높아지고 사용자의 기대에 가장 가까워집니다. 이 경우, 프롬프트에 하나의 예제만 포함되어 있다면 "원샷" 학습이라고 하며, 여러 개의 예제가 포함되어 있다면 "퓨샷" 학습이라고 합니다. +컨텍스트를 고려한 프롬프트 엔지니어링은 가장 비용 효율적인 접근 방식입니다. + +### 검색 증강 생성 (Retrieval Augmented Generation, RAG) + +LLM은 훈련 과정에서 사용된 데이터만을 사용하여 답변을 생성할 수 있는 제한이 있습니다. 이는 LLM이 훈련 과정 이후에 발생한 사실에 대해 알지 못하며, 회사 데이터와 같은 비공개 정보에 접근할 수 없다는 것을 의미합니다. +이러한 제한은 RAG를 통해 극복할 수 있습니다. RAG는 프롬프트를 외부 데이터로 확장하는 기술로, 문장 길이 제한을 고려하여 문서의 일부인 청크 형태로 외부 데이터를 프롬프트 컨텍스트에 추가합니다. 이는 벡터 데이터베이스 도구(예: [Azure Vector Search](https://learn.microsoft.com/azure/search/vector-search-overview?WT.mc_id=academic-105485-koreyst))에 의해 지원되며, 다양한 사전 정의된 데이터 소스에서 유용한 청크를 검색하여 프롬프트에 추가합니다. + +이 기술은 비즈니스가 충분한 데이터, 충분한 시간 또는 리소스가 없어 LLM을 fine-tuning하는 것이 어려운 경우에 매우 유용합니다. 특정 작업 부하에서 성능을 개선하고 현실의 왜곡이나 유해한 콘텐츠의 위험을 줄이기 위해 사용됩니다. + +### Fine-tuning된 모델 + +Fine-tuning은 전이 학습을 활용하여 모델을 '적응(adapt)'시켜 다운스트림 작업을 수행하거나 특정 문제를 해결하는 과정입니다. Few-shot learning과 RAG와는 달리, 가중치와 편향이 업데이트된 새로운 모델이 생성됩니다. 이는 다음 경우에 선호되는 접근 방식입니다: + +- **Fine-tuned 모델 사용**. 비즈니스가 고성능 모델 대신 임베딩 모델과 같은 능력이 덜한 모델을 사용하고자 하는 경우로, 더 비용 효율적이고 빠른 솔루션을 얻을 수 있습니다. + +- **지연 시간 고려**. 특정 사용 사례에서 지연 시간이 중요하므로 매우 긴 프롬프트를 사용할 수 없거나 모델에서 학습해야 할 예제 수가 프롬프트 길이 제한과 일치하지 않는 경우입니다. + +- **최신 상태 유지**. 비즈니스가 많은 양의 고품질 데이터와 실제 레이블을 보유하고 있으며, 이러한 데이터를 시간이 지나도 최신 상태로 유지하기 위해 필요한 리소스를 갖추고 있는 경우입니다. + +### 훈련된 모델 + +LLM을 처음부터 훈련하는 것은 의심할 여지없이 가장 어렵고 복잡한 접근 방식으로, 대량의 데이터, 숙련된 리소스 및 적절한 컴퓨팅 파워가 필요합니다. 이 옵션은 비즈니스가 도메인 특정 사용 사례와 대량의 도메인 중심 데이터를 보유한 경우에만 고려해야 합니다. + +## 지식 확인 + +LLM 완성 결과를 개선하기 위한 좋은 접근 방식은 무엇일까요? + +1. 컨텍스트를 고려한 프롬프트 엔지니어링 +1. RAG +1. 파인튜닝된 모델 + +A:3, 시간과 리소스, 고품질 데이터가 있는 경우, 파인튜닝은 최신 상태를 유지하기 위한 더 나은 옵션입니다. 그러나 시간이 부족하고 개선을 고려하는 경우에는 RAG를 먼저 고려하는 것이 좋습니다. + +## 🚀 도전과제 + +비즈니스에 [RAG를 사용하는 방법](https://learn.microsoft.com/azure/search/retrieval-augmented-generation-overview?WT.mc_id=academic-105485-koreyst)에 대해 더 알아보세요. + +## 수고하셨습니다. 학습을 계속하세요! + +이 레슨을 완료한 후 [Generative AI 학습 컬렉션](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)을 확인하여 Generative AI 지식을 계속 향상시킬 수 있습니다! + +Lesson 3로 이동하여 [책임감 있게 생성형 AI 사용하기 ](../../../03-using-generative-ai-responsibly/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)을 살펴보세요! diff --git a/03-using-generative-ai-responsibly/translations/ko/README.md b/03-using-generative-ai-responsibly/translations/ko/README.md new file mode 100644 index 000000000..a476ac701 --- /dev/null +++ b/03-using-generative-ai-responsibly/translations/ko/README.md @@ -0,0 +1,132 @@ +# 책임감 있게 생성형 AI 사용하기 + +[![Using Generative AI Responsibly](../../images/03-lesson-banner.png?WT.mc_id=academic-105485-koreyst)]() + +> **비디오 제공 예정** + +AI 및 특히 생성형 AI에 매료되는 것은 쉽지만, 우리는 책임 있는 사용 방법을 고려해야 합니다. 즉, 출력물이 공정하고, 해를 끼치지 않도록 하는 등을 어떻게 보장할지에 대해 고려해야 합니다. 이 장에서는 '책임 있는 AI'가 나오게 된 상황과, 이를 위해 고려해야할 사항 및 AI 사용을 개선하기 위해 적극적인 단계를 취하는 방법을 알려주는 것을 목표로 합니다 + +## 소개 + +이 장은 다음과 같은 것을 다룹니다: + +- 생성형 AI 애플리케이션을 개발할 때 '책임 있는 AI(Responsible AI)'를 우선적으로 고려해야 하는 이유. +- '책임 있는 AI'의 핵심 원칙과 그것들이 어떻게 생성형 AI와 관련되어 있는지. +- 전략과 도구를 통해 '책임 있는 AI'의 원칙을 실천하는 방법. + +## 학습 목표 + +이 장이 끝나면 다음을 이해하게 될 것입니다: + +- 생성형 AI 애플리케이션을 개발할 때 '책임 있는 AI'의 중요성. +- 생성형 AI 애플리케이션을 개발할 때 '책임 있는 AI'의 핵심 원칙을 언제 생각하고 적용해야 하는지. +- '책임 있는 AI' 개념을 실천하기 위해 사용 가능한 도구와 전략. + +## '책임 있는 AI' 원칙 + +생성형 AI에 대한 흥미는 전례 없이 높습니다. 이 흥미는 이 분야에 새로운 개발자, 주목, 자금을 많이 유치하게 되었습니다. 이러한 상황은 생성형 AI를 사용하여 제품과 기업을 만들려는 모든 이에게는 매우 긍정적인 상황이지만, 동시에 이를 책임 있게 진행하는 것도 중요합니다. + +이 코스의 전반에 걸쳐 우리는 스타트업과 AI 교육 제품을 만드는데 중점을 두고 있습니다. 우리는 '공정성, 포용성, 안정성/안전성, 보안 및 개인 정보 보호, 투명성 및 책임성'의 책임 있는 AI 원칙을 사용할 것입니다. 이러한 원칙들을 통해 제품에서 생성형 AI를 사용하는 방법과의 관련성을 탐구할 것입니다. + +## 왜 '책임 있는 AI'를 우선시해야 하는가 + +제품을 만드는 것에 있어, 사용자의 이익을 최우선으로 하는 인간 중심적인 접근 방식은 가장 좋은 결과를 가져옵니다. + +생성형 AI의 특별한 점은 사용자에게 도움이 되는 답변, 정보, 지침 및 콘텐츠를 만들 수 있는 능력입니다. 이러한 것은 매뉴얼 단계를 많이 거치지 않아도 인상적인 결과를 얻을 수 있습니다. 하지만 적절한 계획과 전략이 없으면 사용자, 제품, 그리고 사회 전체에게 해로운 결과를 끼칠 수도 있습니다. + +이에 대해 몇가지(전체가 아님) 잠재적으로 해로운 결과를 살펴보겠습니다: + +### 환각 (Hallucinations) + +환각 (Hallucinations)은 LLM이 완전히 비논리적이거나, 잘못되거나 다른 정보 출처를 기반으로 일반적으로 알고 있는 것과 다른 내용을 생성할 때 사용하는 용어입니다. + + +예를 들어 우리 스타트업의 기능 중 하나로 학생들이 모델에게 역사와 관련한 질문을 할 수 있도록 하는 경우를 생각해 보겠습니다. 학생이 '타이타닉의 유일한 생존자는 누구였나요?'라는 질문을 한 경우 모델은 아래와 같이 응답할 수 있습니다: + +![Prompt saying "Who was the sole survivor of the Titanic"](../../../03-using-generative-ai-responsibly/images/ChatGPT-titanic-survivor-prompt.webp?WT.mc_id=academic-105485-koreyst) + +> *(Source: [Flying bisons](https://flyingbisons.com?WT.mc_id=academic-105485-koreyst))* + +이 대답은 매우 확신에 차있고 철저합 답변처럼 느껴지지만, 불행하게도 부정확한 답변입니다. 조사를 아주 조금만 해보더라도 우리는 타이타닉에서 생존한 사람은 한명 이상임을 찾을 수 있습니다. 그러나 이 주제를 처음 조사하기 시작하는 학생에게는 이 답변은 충분히 설득력이 있는 것처럼 보이고, 의심하지 않고 사실처럼 생각할 수도 있습니다. 이러한 결과들은 AI 시스템을 불안정하고 신뢰할 수 없게 만들어 우리의 스타트업의 평판에 부정적인 영향을 미칠수도 있습니다. + +각 LLM의 반복마다 Hallucination을 최소화하는 성능 향상이 있었지만, 이러한 개선에도 불구하고 응용 프로그램 빌더 및 사용자로서 이러한 제한에 대해 계속 알아야 합니다. + +### 유해한 콘텐츠 + +이전 섹션에서 우리는 LLM이 부정확하거나 비논리적인 응답을 생성할 때를 다뤘습니다. 또 다른 리스크는 모델이 유해한 콘텐츠로 응답할 때 발생합니다. + +유해한 콘텐츠는 다음과 같이 정의될 수 있습니다: + +- 자해 또는 특정 그룹에 대한 피해를 유도하거나 권장하는 지침을 제공. +- 혐오스럽거나 또는 모독적인 내용. +- 모든 유형의 공격이나 폭력 행위를 계획하도록 안내. +- 불법 콘텐츠를 찾거나 불법 행위를 저지르도록 하는 지침을 제공. +- 성적으로 유해한 콘텐츠 표시. + +스타트업에서는 학생들이 이러한 유형의 콘텐츠를 보지 못하도록 방지하기 위한 적절한 도구와 전략이 갖추어져 있어야 합니다. + +### 공정성 부족 + +공정성은 "AI 시스템이 편견과 차별이 없으며 모든 사람을 공정하고 동등하게 대우한다는 것을 보장하는 것"으로 정의됩니다. 생성형 AI의 세계에서는 모델의 출력이 특정 그룹의 배타적인 세계관을 강화하지 않도록 해야 합니다. + +이러한 종류의 출력물은 사용자에게 부정적인 제품 경험을 만드는 것에 일조할 뿐 아니라 사회적 피해까지 초래합니다. 응용 프로그램 빌더로서 우리는 생성형 AI를 사용하여 솔루션을 개발할 때 항상 넓고 다양한 사용자 베이스를 고려해야 합니다. + +## 생성형 AI를 책임 있게 사용하는 방법 + +책임 있는 생성형 AI의 중요성에 대해 배웠으므로 이제 생성형 AI의 답변들을 책임 있게 만드는 4가지 단계에 대해 배워봅시다. + +![Mitigate Cycle](../../images/mitigate-cycle.png?WT.mc_id=academic-105485-koreyst) + +### 잠재적 피해 측정 + +소프트웨어 테스트에 있어 우리는 애플리케이션에서 사용자의 예상되는 행동을 테스트합니다. 마찬가지로 사용자가 사용할 가능성이 높은 다양한 프롬프트를 테스트하는 것은 잠재적인 피해를 측정하는 좋은 방법입니다 + +우리의 스타트업이 교육용 제품을 만들고 있기 때문에 교육 관련 프롬프트의 리스트를 준비하는 게 좋을 것입니다. 이것은 특정 주제들, 역사적 사실들, 그리고 학생의 삶에 관한 프롬프트 등을 포함할 것입니다. + +### 잠재적 피해 완화 + +이제 모델 및 해당 응답이 일으킬 수 있는 잠재적 피해를 방지하거나 제한할 수 있는 방법을 찾아보겠습니다. 이를 4가지 다른 레이어로 살펴볼 수 있습니다: + +![Mitigation Layers](../../images/mitigation-layers.png?WT.mc_id=academic-105485-koreyst) + +- **모델**. 올바른 사용 사례에 적합한 모델 선택. GPT-4와 같이 크고 복잡한 모델은 더 작고 구체적인 사용 사례에 적용할 때 유해한 콘텐츠의 위험을 더 많이 초래할 수 있습니다. 훈련 데이터를 사용하여 세밀하게 조정하면 해로운 콘텐츠의 위험을 줄일 수 있습니다. + +- **안전 시스템**. 안전 시스템은 플랫폼에 있는 도구와 구성의 모음으로 모델이 해로운 콘텐츠 생산하는 것을 막습니다. Azure OpenAI 서비스의 콘텐츠 필터링 시스템이 이것에 대한 예시입니다. 안전 시스템은 또한 탈옥 공격 및 봇의 요청과 같은 활동을 감지해야 합니다. + +- **메타프롬프트**. 메타프롬프트와 그라운딩은 특정 행동 및 정보를 기반으로 모델을 제한하거나 안내하는 방법입니다. 이것은 시스템 입력을 사용하여 모델의 특정 한계를 정의하거나 시스템의 범위나 도메인과 관련이 더 있는 출력을 제공할 수 있습니다. + +또한 Retrieval Augmented Generation (RAG)과 같은 방법을 사용하여 모델이 검증된 출처들에서 선택하여 정보를 가져올 수 있도록 할 수 있습니다. 추후에 이에 관한 수업이 있습니다. [검색 애플리케이션 구축](../../../08-building-search-applications/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) + +- **사용자 경험**. 최종 레이어는 사용자가 모델과 어떤 방식으로든 응용 프로그램 인터페이스를 통해 직접 상호 작용하는 곳입니다. 이를 통해 UI/UX를 디자인하여 사용자가 모델로 보낼 수 있는 입력 유형과 사용자에게 표시되는 텍스트 또는 이미지를 제한할 수 있습니다. AI 애플리케이션을 배포할 때에는 또한 생성형 AI 애플리케이션이 무엇을 할 수 있고 할 수 없는지에 대해 투명하게 밝혀야 합니다. + +이에 관한 전체 내용을 담은 수업이 있습니다. [AI 애플리케이션을 위한 UX 디자인](../../../12-designing-ux-for-ai-applications/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) + +- **모델 평가**. LLM 모델과 작업하는 것은 모델이 학습하는 데이터를 우리가 항상 제어할 수는 없기 때문에 어려울 수 있습니다. 그럼에도 불구하고 우리는 모델의 성능과 출력을 항상 평가해야 합니다. 모델의 정확도, 유사성, 기초 특성 및 출력의 관련성을 측정하는 것은 여전히 중요하고, 이는 이해관계자 및 사용자에게 투명성과 신뢰를 제공합니다. + +### 책임 있는 생성형 AI 솔루션 운영 + +당신의 AI 애플리케이션을 중심으로 운영적인 실천 방안을 마련하는 것이 최종 단계입니다. 이에는 법적 및 보안 측면에서 스타트업의 다른 부분과 협력하여 모든 규제 정책을 준수하는 것이 포함됩니다. 그리고 출시전에는 제공, 사건 처리 및 사용자에게 피해가 가지 않도록 롤백할 수 있는 계획을 수립해야 합니다. + +## 도구들 + +책임 있는 AI 솔루션을 개발하는 작업은 많아 보일 수 있지만 그 노력은 확실히 가치 있는 작업입니다. 생성형 AI의 영역이 넓어질 수록 개발자가 책임을 효율적으로 통합할 수 있는 도구들이 많이 생기게 될 것 입니다. 예를 들어 [Azure AI Content Safety](https://learn.microsoft.com/azure/ai-services/content-safety/overview?WT.mc_id=academic-105485-koreyst )는 유해한 콘텐츠 및 이미지를 API 요청을 통해 감지하는 데 도움이 될 수 있습니다. + +## 문제 + +문제: 책임 있는 AI 사용을 보장하기 위해 고려해야 할 사항은 무엇인가요? + +1. 답변이 정확한가? +2. 유해한 사용, 즉 AI가 범죄 목적으로 사용되지 않도록 하는 것. +3. AI가 편견과 차별에서 자유로운지 확인하는 것. + +정답: 2번, 3번. 책임 있는 AI는 어떻게 유해한 효과와 편견, 차별들을 완화할지에 대한 도움을 줍니다. + +## 🚀 도전 + +[Azure AI Content Saftey](https://learn.microsoft.com/azure/ai-services/content-safety/overview?WT.mc_id=academic-105485-koreyst)를 읽어보고 사용할 수 있는 내용이 무엇인지 확인해보세요. + +## 수고하셨습니다. 학습을 계속하세요! + +이 수업을 마치고 나서 [Generative AI 학습 컬렉션](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)를 확인하여 생성형 AI에 관련한 지식을 더욱 쌓을 수 있습니다! + +4번 수업으로 이동하여 [프롬프트 엔지니어링 기초](../../../04-prompt-engineering-fundamentals/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)를 살펴보세요! diff --git a/04-prompt-engineering-fundamentals/translations/ko/README.md b/04-prompt-engineering-fundamentals/translations/ko/README.md new file mode 100644 index 000000000..ef2ef9174 --- /dev/null +++ b/04-prompt-engineering-fundamentals/translations/ko/README.md @@ -0,0 +1,392 @@ +# 프롬프트 엔지니어링 기초 + +[![Prompt Engineering Fundamentals](../../images/04-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://youtu.be/r2ItK3UMVTk?WT.mc_id=academic-105485-koreyst) + +LLM에게 어떻게 프롬프트를 작성하는지는 중요합니다. 신중하게 작성된 프롬프트는 그렇지 않은 프롬프트보다 더 좋은 결과를 얻을 수 있습니다. 그런데 이런 개념들, 프롬프트, 프롬프트 엔지니어링이 무엇인지, 그리고 LLM에게 보내는 것을 어떻게 개선할 수 있는지에 대한 질문들은 바로 이 장과 다가올 장에서 답변하려고 합니다. + +_생성형 AI_ 는 사용자의 요청에 응답하여 새로운 콘텐츠(예: 텍스트, 이미지, 오디오, 코드 등)를 생성할 수 있는 능력을 가지고 있습니다. 이는 OpenAI의 GPT("Generative Pre-trained Transformer") 시리즈와 같은 _대형 언어 모델_ (LLMs)을 사용하여 자연어와 코드를 통해 이를 달성합니다. + +사용자들은 이제 채팅과 같은 친숙한 패러다임을 사용하여 이러한 모델과 상호작용할 수 있으며, 기술적 전문지식이나 훈련 없이도 이를 사용할 수 있습니다. 이 모델들은 _프롬프트 기반_ 입니다 - 사용자들은 텍스트 입력(프롬프트, prompt)을 보내고 AI의 응답(완성, completion)을 받습니다. 그런 다음 사용자들은 다중 턴 대화에서 반복적으로 "AI와 대화"를 할 수 있으며, 응답이 그들의 기대에 부합할 때까지 프롬프트를 정제할 수 있습니다. + +"프롬프트"는 이제 생성형 AI 앱의 주요 _프로그래밍 인터페이스_ 가 되어, 모델에게 무엇을 해야 하는지 알려주고 반환된 응답의 품질에 영향을 미칩니다. "프롬프트 엔지니어링"은 프롬프트의 _디자인과 최적화_ 에 초점을 맞춘 빠르게 성장하는 연구 분야로, 대규모로 일관성 있고 품질 좋은 응답을 제공합니다. + +## 학습 목표 + +이번 강의에서는 프롬프트 엔지니어링이 무엇인지, 왜 중요한지, 그리고 주어진 모델과 애플리케이션 목표에 대해 더 효과적인 프롬프트를 어떻게 작성할 수 있는지에 대해 배웁니다. 프롬프트 엔지니어링에 대한 핵심 개념과 모범 사례를 이해하고, 이러한 개념들이 실제 예제에 적용되는 것을 볼 수 있는 인터랙티브한 Jupyter 노트북 "샌드박스" 환경에 대해 알아봅니다. + +이번 강의가 끝날 즈음에는 우리는 다음과 같은 내용들을 할 수 있게 될 것입니다: + +1. 프롬프트 엔지니어링이 무엇인지 그리고 왜 중요한지 설명할 수 있습니다. +2. 프롬프트의 구성 요소들을 설명하고 어떻게 사용하는지 알 수 있습니다. +3. 프롬프트 엔지니어링에 대한 모범 사례와 기법들을 배울 수 있습니다. +4. 배운 기법들을 OpenAI 엔드포인트를 이용해 실제 예제에 적용할 수 있습니다. + +## 샌드박스 학습하기 + +현재 프롬프트 엔지니어링은 과학보다는 예술에 가깝습니다. 이에 대한 직관을 향상시키는 가장 좋은 방법은 _더 많이 연습하는 것_ 이며, 응용 분야 전문 지식과 결합하여 추천 기법과 모델에 특화된 최적화를 시행착오(trial-and-error)하는 것입니다. + +이번 수업에 따른 Jupyter 노트북은 배운 내용을 시도해볼 수 있는 _샌드박스_ 환경을 제공합니다. 여기서는 각 단계에서 또는 마지막의 코드 도전 과제에서 배운 것을 시도해볼 수 있습니다. 연습문제를 실행하려면 다음이 필요합니다: + +1. Azure OpenAI API 키 - 배포된 LLM의 서비스 엔드포인트입니다. +2. 파이썬 런타임 - 노트북을 실행할 수 있는 환경입니다. + +이 저장소는 Python 3 런타임이 포함된 _dev 컨테이너_ 로 구성되어 있습니다. GitHub 코드스페이스에서 저장소를 열거나 로컬 Docker 데스크톱에서 열면 런타임이 자동으로 활성화됩니다. 그런 다음 노트북을 열고 Python 3.x 커널을 선택하여 노트북을 실행 준비합니다. + +기본 노트북은 Azure OpenAI 서비스 리소스와 함께 사용하도록 설정되어 있습니다. 폴더의 루트에 있는 `.env.copy` 파일을 `.env`로 복사하고 `AZURE_OPENAI_API_KEY=` 및 `AZURE_OPENAI_API_ENDPOINT=` 줄에 API 키와 엔드포인트를 업데이트하면 됩니다. +[Azure 포털](https://portal.azure.com?WT.mc_id=academic-105485-koreyst)에서 자신의 Azure OpenAI 리소스로 이동한 후 왼쪽 메뉴의 _Keys and Endpoints_ 탭을 열어 자신의 자격증명을 확인할 수 있습니다. +또한, 배포를 생성할 때 할당한 모델의 이름을 `AZURE_OPENAI_DEPLOYMENT` 변수에 추가해 주세요. 이 연습에 추천하는 모델은 'gpt-35-turbo'입니다. + +노트북에는 _starter_ 연습문제가 포함되어 있지만, 더 많은 예제나 아이디어를 시도해보고 프롬프트 디자인에 대한 직관력을 키우기 위해 자신만의 _마크다운_ (설명) 및 _코드_ (프롬프트 요청) 섹션을 추가하는 것이 좋습니다. + +## 우리 스타트업 + +이제, _본 주제_ 가 우리 스타트업의 [교육에 AI 혁신을 가져오기](https://educationblog.microsoft.com/2023/06/collaborating-to-bring-ai-innovation-to-education?WT.mc_id=academic-105485-koreyst) 미션과 어떻게 관련되는지에 대해 이야기해보겠습니다. 우리는 _개인화된 학습_ (personalized learning)의 AI 기반 응용 프로그램을 구축하고자 합니다. 그러니 애플리케이션 목표와 모델에 대한 다양한 사용자들이 프롬프트를 "디자인" 할 수 있는 방법에 대해 생각해보겠습니다: + +- **관리자** 는 AI가 _커리큘럼 데이터를 분석하여 부족한 부분을 식별_ 하도록 요청할 수 있습니다. AI는 결과를 요약하거나 코드로 시각화할 수 있습니다. +- **교육자** 는 _대상 그룹과 주제에 대한 레슨 계획을 생성_ 하도록 AI에게 요청할 수 있습니다. AI는 지정된 형식으로 개인화된 계획을 작성할 수 있습니다. +- **학생** 들은 _어려운 주제를 가르쳐 달라고 AI에게 요청_ 할 수 있습니다. 이제 AI는 학생의 수준에 맞게 수업, 힌트 및 예제를 안내할 수 있습니다. + +이것은 빙산의 일각에 불과합니다. [Prompts For Education](https://github.com/microsoft/prompts-for-edu/tree/main?WT.mc_id=academic-105485-koreyst)를 확인해보세요 - 교육 전문가들이 선별한 오픈 소스 프롬프트 라이브러리로, 더 다양한 가능성을 알 수 있습니다! _샌드박스에서 이러한 프롬프트 중 일부를 실행하거나 OpenAI Playground를 사용하여 결과를 확인해보세요!_ + + + +## 프롬프트 엔지니어링이란 무엇인가요? + +이 레슨에서는 **프롬프트 엔지니어링**을 주어진 애플리케이션 목표와 모델에 대해 일관되고 품질 좋은 응답을 제공하기 위해 텍스트 입력(프롬프트)를 _디자인하고 최적화하는_ 과정으로 정의했습니다. 이는 2단계 프로세스로 생각할 수 있습니다: + +- 주어진 모델과 목표에 대한 초기 프롬프트를 _디자인_ 하는 것 +- 응답의 품질을 향상시키기 위해 프롬프트를 _반복적으로 개선_ 하는 것 + +이는 최적의 결과를 얻기 위해 사용자의 직관과 노력이 필요한 시행착오적인 과정입니다. 그렇다면 왜 중요한 것일까요? 이 질문에 답하기 위해서는 세 가지 개념을 먼저 이해해야 합니다: + +- _토큰화_ = 모델이 프롬프트를 "보는" 방식 +- _Base LLMs_ = 파운데이션 모델이 프롬프트를 "처리"하는 방식 +- _Instruction-Tuned LLMs_ = 모델이 "작업"을 인식하는 방식 + +### 토큰화 + +LLM은 프롬프트를 _토큰들의 시퀀스_ 로 인식하며, 다른 모델(또는 모델의 버전)은 동일한 프롬프트를 다른 방식으로 토큰화할 수 있습니다. LLM은 토큰에 대해 훈련되기 때문에(원시 텍스트가 아닌) 프롬프트의 토큰화 방식은 생성된 응답의 품질에 직접적인 영향을 미칩니다. + +토큰화가 어떻게 작동하는지 직관을 얻기 위해 아래와 같은 [OpenAI Tokenizer](https://platform.openai.com/tokenizer?WT.mc_id=academic-105485-koreyst)와 같은 도구를 사용해보세요. 프롬프트를 복사하여 붙여넣고, 공백 문자와 구두점이 어떻게 처리되는지 주의깊게 살펴보세요. 이 예시는 오래된 LLM(GPT-3)을 보여주므로, 새로운 모델로 시도하면 다른 결과가 나올 수 있습니다. + +![토큰화](../../images/04-tokenizer-example.png?WT.mc_id=academic-105485-koreyst) + +### 개념: Foundation 모델 + +프롬프트가 토큰화되면, ["Base LLM"](https://blog.gopenai.com/an-introduction-to-base-and-instruction-tuned-large-language-models-8de102c785a6?WT.mc_id=academic-105485-koreyst) (또는 Foundation 모델)의 주요 기능은 해당 시퀀스에서 토큰을 예측하는 것입니다. LLM은 대량의 텍스트 데이터셋으로 훈련되었기 때문에 토큰 간의 통계적 관계에 대한 좋은 감각을 가지고 있으며, 이 예측을 어느 정도의 확신으로 수행할 수 있습니다. 그러나 LLM은 프롬프트나 토큰의 "의미"를 이해하지 않습니다. 그들은 그들의 다음 예측으로 "완성"할 수 있는 패턴만을 볼 뿐입니다. 사용자의 개입이나 미리 설정된 조건에 의해 종료될 때까지 시퀀스를 계속 예측할 수 있습니다. + +프롬프트 기반 완성이 어떻게 작동하는지 보고 싶으신가요? 위의 프롬프트를 Azure OpenAI Studio의 [_Chat Playground_](https://oai.azure.com/playground?WT.mc_id=academic-105485-koreyst)에 입력하고 기본 설정으로 실행해보세요. 시스템은 프롬프트를 정보 요청으로 처리하도록 구성되어 있으므로 이와 관련된 완성을 볼 수 있을 것입니다. + +하지만 사용자가 특정한 기준이나 작업 목표를 충족하는 내용을 보고 싶어한다면 어떻게 해야 할까요? 이때 _instruction-tuned_ LLM이 등장합니다. + +![Base LLM Chat Completion](../../images/04-playground-chat-base.png?WT.mc_id=academic-105485-koreyst) + +### 개념: Instruction Tuned LLMs + +[Instruction Tuned LLM](https://blog.gopenai.com/an-introduction-to-base-and-instruction-tuned-large-language-models-8de102c785a6?WT.mc_id=academic-105485-koreyst)은 Foundation 모델로 시작하여 예제나 입력/출력 쌍(예: 다중 턴 "메시지")로 세밀하게 튜닝되며, 명확한 지시사항을 포함할 수 있으며, AI의 응답은 해당 지시를 따르도록 시도합니다. + +이는 Reinforcement Learning with Human Feedback (RLHF)와 같은 기법을 사용하여 모델이 _지시를 따르고_ _피드백을 통해 학습_ 하여 실제 응용 프로그램에 더 적합하고 사용자의 목표와 관련성이 더 높은 응답을 생성할 수 있도록 합니다. + +이제 이를 시도해보세요 - 위의 프롬프트를 다시 방문하되, _시스템 메시지_ 를 다음과 같은 지시사항으로 변경하여 실행해보세요: + +> _제공된 내용을 초등학교 2학년 학생을 위해 요약해주세요. 3-5개의 항목으로 이루어진 한 단락으로 결과를 유지하세요._ + +결과가 원하는 목표와 형식을 반영하도록 조정된 것을 보실 수 있나요? 교육자는 이제 이 응답을 해당 수업의 슬라이드에 직접 사용할 수 있습니다. + +![Instruction Tuned LLM Chat Completion](../../images/04-playground-chat-instructions.png?WT.mc_id=academic-105485-koreyst) + +## 왜 프롬프트 엔지니어링이 필요한가요? + +이제 LLM이 프롬프트를 처리하는 방식을 알았으니, _왜_ 프롬프트 엔지니어링이 필요한지 이야기해봅시다. 답은 현재의 LLM이 _신뢰할 수 있고 일관된 완성_ 을 얻기 위해서는 프롬프트 구성과 최적화에 노력을 기울여야 하는 여러 가지 도전 과제를 가지고 있다는 사실에 있습니다. 예를 들어: + +1. **모델 응답은 확률적입니다.** _동일한 프롬프트_ 는 다른 모델이나 모델 버전에서 다른 응답을 생성할 가능성이 높습니다. 또한 _동일한 모델_ 에서도 _다른 시간에_ 다른 결과를 생성할 수 있습니다. _프롬프트 엔지니어링 기법은 더 나은 가드레일을 제공하여 이러한 변동을 최소화하는 데 도움을 줄 수 있습니다._ + +2. **모델은 응답을 가짜로 만들 수 있습니다.** 모델은 _대규모이지만 유한한_ 데이터셋으로 사전 훈련되기 때문에 훈련 범위를 벗어난 개념에 대한 지식이 부족합니다. 결과적으로, 모델은 정확하지 않거나 상상력이 풍부하거나 알려진 사실과 직접적으로 모순되는 완성을 생성할 수 있습니다. _프롬프트 엔지니어링 기법은 AI에게 인용문이나 추론을 요청함으로써 이러한 가짜 응답을 식별하고 완화하는 데 도움을 줄 수 있습니다._ + +3. **모델의 능력은 다양할 수 있습니다.** 새로운 모델이나 모델 세대는 더 풍부한 기능을 가지지만, 비용과 복잡성에서 독특한 특징과 트레이드 오프를 가져올 수도 있습니다. _프롬프트 엔지니어링은 차이를 추상화하고 모델별 요구 사항에 맞게 조정하는 최상의 방법과 워크플로우를 개발하는 데 도움을 줄 수 있습니다._ + +OpenAI 또는 Azure OpenAI Playground에서 이를 실제로 확인해보세요: + +- 동일한 프롬프트를 다른 LLM 배포(예: OpenAI, Azure OpenAI, Hugging Face)와 함께 사용해보세요 - 변화를 보셨나요? +- 동일한 프롬프트를 _동일한_ LLM 배포(예: Azure OpenAI Playground)에서 반복해서 사용해보세요 - 이러한 변화는 어떻게 다른가요? + +### Fabrications 예시 + +이 강좌에서는 LLM이 훈련 제약이나 다른 제약으로 인해 사실적이지 않은 정보를 생성하는 현상을 가리키는 **"fabrication"** 이라는 용어를 사용합니다. 일반적인 기사나 연구 논문에서는 이를 _"환각(hallucination)"_ 이라고 부르기도 합니다. 그러나 우리는 기계적으로 생성된 결과에 인간과 유사한 특성을 부여하는 것을 방지하기 위해 _"fabrication"_ 이라는 용어를 사용하는 것을 강력히 권장합니다. 이는 또한 용어 관점에서 [책임 있는 AI 가이드라인](https://www.microsoft.com/ai/responsible-ai?WT.mc_id=academic-105485-koreyst)을 강화하며, 일부 상황에서 논란이 될 수 있는 모욕적이거나 포용되지 않는 용어를 제거합니다. + +fabrication이 어떻게 작동하는지 알아보고 싶으신가요? 훈련 데이터셋에서 찾을 수 없는 존재하지 않는 주제에 대한 내용을 AI에게 생성하도록 지시하는 프롬프트를 생각해보세요. 예를 들어 - 저는 다음과 같은 프롬프트를 시도해보았습니다: + +> **프롬프트:** 2076년의 화성 전쟁에 대한 수업 계획을 생성하세요. + +웹 검색을 통해 2076년의 화성 전쟁에 대한 허구의 설명(예: TV 시리즈나 책)이 있음을 알 수 있었습니다. 그러나 2076년은 _미래_ 이기 때문에 실제 사건과 관련될 수 없다는 상식도 우리에게 알려줍니다. + +그렇다면 이 프롬프트를 다른 LLM 제공업체에서 실행하면 어떻게 될까요? + +> **응답 1**: OpenAI Playground (GPT-35) + +![응답 1](../../images/04-fabrication-oai.png?WT.mc_id=academic-105485-koreyst) + +> **응답 2**: Azure OpenAI Playground (GPT-35) + +![응답 2](../../images/04-fabrication-aoai.png?WT.mc_id=academic-105485-koreyst) + +> **응답 3**: Hugging Face Chat Playground (LLama-2) + +![응답 3](../../images/04-fabrication-huggingchat.png?WT.mc_id=academic-105485-koreyst) + +예상대로, 각 모델(또는 모델 버전)은 확률적인 동작과 모델 능력의 차이로 인해 약간 다른 응답을 생성합니다. 예를 들어, 하나의 모델은 8학년 학생을 대상으로 하고 다른 모델은 고등학생을 가정합니다. 그러나 세 모델 모두 미지식 사용자를 설득할 수 있는 실제 사건인 것처럼 보이는 응답을 생성했습니다. + +_메타프롬프팅(meta-prompting)_ 과 _temperature 설정_ 과 같은 프롬프트 엔지니어링 기법은 일부 fabrication을 줄일 수 있습니다. 새로운 프롬프트 엔지니어링 _아키텍처_ 는 이러한 효과를 완화하거나 줄이기 위해 새로운 도구와 기법을 프롬프트 플로우에 매끄럽게 통합합니다. + +## 사례 연구: GitHub Copilot + +이 섹션을 마무리하기 전에, 실제 세계 솔루션에서 프롬프트 엔지니어링이 어떻게 사용되는지 알아보기 위해 한 가지 사례 연구인 [GitHub Copilot](https://github.com/features/copilot?WT.mc_id=academic-105485-koreyst)을 살펴봅시다. + +GitHub Copilot은 "AI 동료 프로그래머"로, 텍스트 프롬프트를 코드 완성으로 변환하며 개발 환경(예: Visual Studio Code)에 통합되어 원활한 사용자 경험을 제공합니다. 아래의 블로그 시리즈에서 문서화된 바와 같이, 초기 버전은 OpenAI Codex 모델을 기반으로 하였으며, 엔지니어들은 빠르게 모델을 세밀하게 튜닝하고 프롬프트 엔지니어링 기법을 개발하여 코드 품질을 개선해야 함을 깨달았습니다. 7월에는 [더 빠른 제안을 위해 Codex를 넘어선 개선된 AI 모델을 선보였습니다](https://github.blog/2023-07-28-smarter-more-efficient-coding-github-copilot-goes-beyond-codex-with-improved-ai-model/?WT.mc_id=academic-105485-koreyst). + +학습 과정을 따라가기 위해 게시물을 순서대로 읽어보세요. + +- **2023년 5월** | [GitHub Copilot이 코드 이해 능력을 향상시키는 방법](https://github.blog/2023-05-17-how-github-copilot-is-getting-better-at-understanding-your-code/?WT.mc_id=academic-105485-koreyst) +- **2023년 5월** | [GitHub Copilot 뒤의 LLMs와의 작업](https://github.blog/2023-05-17-inside-github-working-with-the-llms-behind-github-copilot/?WT.mc_id=academic-105485-koreyst). +- **2023년 6월** | [GitHub Copilot을 위한 더 나은 프롬프트 작성 방법](https://github.blog/2023-06-20-how-to-write-better-prompts-for-github-copilot/?WT.mc_id=academic-105485-koreyst). +- **2023년 7월** | [.. GitHub Copilot이 개선된 AI 모델로 Codex를 넘어섭니다](https://github.blog/2023-07-28-smarter-more-efficient-coding-github-copilot-goes-beyond-codex-with-improved-ai-model/?WT.mc_id=academic-105485-koreyst) +- **2023년 7월** | [프롬프트 엔지니어링과 LLM에 대한 개발자 가이드](https://github.blog/2023-07-17-prompt-engineering-guide-generative-ai-llms/?WT.mc_id=academic-105485-koreyst) +- **2023년 9월** | [GitHub Copilot에서 배운 기업용 LLM 앱 개발 방법](https://github.blog/2023-09-06-how-to-build-an-enterprise-llm-application-lessons-from-github-copilot/?WT.mc_id=academic-105485-koreyst) + +더 많은 예시와 기법이 실제 세계 응용 프로그램에 적용되는 방법을 보여주는 [이 게시물](https://github.blog/2023-09-27-how-i-used-github-copilot-chat-to-build-a-reactjs-gallery-prototype/?WT.mc_id=academic-105485-koreyst)과 같은 게시물을 찾아보기 위해 [Engineering 블로그](https://github.blog/category/engineering/?WT.mc_id=academic-105485-koreyst)를 참조할 수도 있습니다. + +--- + + + +## 프롬프트 구성 + +프롬프트 엔지니어링이 왜 중요한지 알아보았으니, 이제 프롬프트가 어떻게 _구성_ 되는지 이해하고 더 효과적인 프롬프트 디자인을 위한 다양한 기법을 평가해보겠습니다. + +### 기본 프롬프트 + +먼저 기본 프롬프트부터 시작해보겠습니다. 이는 다른 맥락 없이 모델에게 보내지는 텍스트 입력입니다. 예를 들어, OpenAI [Completion API](https://platform.openai.com/docs/api-reference/completions?WT.mc_id=academic-105485-koreyst)에 미국 국가 애국가의 처음 몇 단어를 보내면 모델은 즉시 다음 몇 줄을 포함한 응답을 _완성_ 합니다. 이는 기본적인 예측 동작을 보여줍니다. + +| 프롬프트 (입력) | 완성 (출력) | +| :----------------- | :----------------------------------------------------------------------------------------------------------------------------------------- | +| Oh say can you see | "The Star-Spangled Banner"라는 미국의 국가 애국가 가사를 시작하고 있는 것 같습니다. 전체 가사는 ... | + +### 복잡한 프롬프트 + +이제 그 기본 프롬프트에 맥락과 지침을 추가해보겠습니다. [Chat Completion API](https://learn.microsoft.com/azure/ai-services/openai/how-to/chatgpt?WT.mc_id=academic-105485-koreyst)를 사용하면 _사용자_ 입력과 _어시스턴트_ 응답을 반영하는 입력/출력 쌍과 어시스턴트의 동작이나 성격을 설정하는 시스템 메시지로 구성된 복잡한 프롬프트를 만들 수 있습니다. + +아래의 요청은 _토큰화_ 를 통해 맥락과 대화에서 관련 정보를 효과적으로 포착합니다. 이제 시스템 맥락을 변경하는 것은 사용자 입력과 마찬가지로 완성 품질에 큰 영향을 미칠 수 있습니다. + +```python +response = openai.ChatCompletion.create( + model="gpt-3.5-turbo", + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Who won the world series in 2020?"}, + {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."}, + {"role": "user", "content": "Where was it played?"} + ] +) +``` + +### 지시 프롬프트 (Instruction Prompt) + +위의 예시에서 사용자 프롬프트는 정보 요청으로 해석될 수 있는 간단한 텍스트 쿼리였습니다. _지시_ 프롬프트를 사용하면 해당 텍스트를 사용하여 AI에게 더 자세한 작업을 지정하여 더 나은 안내를 제공할 수 있습니다. 다음은 예시입니다: + +| 프롬프트 (입력) | 완성 (출력) | 지시 유형 | +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------- | :------------------ | +| 시민 전쟁에 대한 설명을 작성하세요. | _간단한 단락을 반환합니다._ | 간단한 | +| 시민 전쟁에 대한 설명을 작성하세요. 주요 날짜와 사건을 제공하고 그들의 의미를 설명하세요. | _단락 다음에 주요 사건 날짜와 설명이 포함된 목록을 반환합니다._ | 복잡한 | +| 시민 전쟁에 대한 설명을 1단락으로 작성하세요. 주요 날짜와 그들의 의미를 가진 3개의 불릿 포인트를 제공하세요. 또한 주요 역사 인물과 그들의 기여를 가진 3개의 불릿 포인트를 제공하세요. 결과를 JSON 파일로 반환하세요 | _텍스트 상자에 더 많은 세부 정보를 JSON 형식으로 반환합니다. 파일로 복사하여 필요에 따라 유효성을 검사할 수 있습니다._ | 복잡한. 형식화됨. | + +## 주요 콘텐츠 (Primary Content) + +위의 예시에서 프롬프트는 여전히 상당히 개방적이어서 LLM이 사전 훈련된 데이터셋 중 어떤 부분이 관련 있는지를 결정할 수 있었습니다. _주요 콘텐츠(primary)_ 디자인 패턴을 사용하면 입력 텍스트를 두 부분으로 나눌 수 있습니다: + +- 지시사항 (동작) +- 관련 콘텐츠 (동작에 영향을 주는) + +다음은 "이를 2문장으로 요약하세요"라는 지시사항이 있는 예시입니다. + +| 프롬프트 (입력) | 완성 (출력) | +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 주피터는 태양으로부터 다섯 번째 행성이며 태양계에서 가장 큰 행성입니다. 이는 태양의 천분의 일 질량을 가진 가스 행성으로, 태양계의 다른 행성들의 질량의 2.5배입니다. 주피터는 밤하늘에서 맨 눈으로 볼 수 있는 가장 밝은 물체 중 하나이며, 기록된 역사 이전부터 고대 문명에 알려져 있습니다. 이는 로마 신 주피터에게 이름을 따왔습니다. 지구에서 볼 때, 주피터는 반사된 빛이 가시적인 그림자를 만들 정도로 충분히 밝으며, 달과 금성 이후 밤하늘에서 평균적으로 세 번째로 밝은 천체입니다.
**이를 2문장으로 요약하세요** | 주피터는 태양계에서 가장 큰 행성으로 밤하늘에서 가장 밝은 물체 중 하나입니다. 로마 신 주피터에게 이름을 따온 이 가스 행성은 태양계의 다른 행성들의 질량의 2.5배입니다. | + +주요 콘텐츠 세그먼트는 더 효과적인 지시사항을 만들기 위해 다양한 방법으로 사용될 수 있습니다: + +- **예시** - 명시적인 지시사항으로 모델에게 무엇을 해야 하는지 알려주는 대신, 원하는 출력의 예시를 제공하고 패턴을 추론하게 합니다. +- **단서** - 지시사항 뒤에 "단서"를 추가하여 완성을 사전에 준비하고 모델을 더 관련성 높은 응답으로 이끌 수 있습니다. +- **템플릿** - 이는 플레이스홀더(변수)가 있는 프롬프트를 위한 반복 가능한 '레시피'로, 특정 사용 사례에 맞게 데이터로 사용자 정의할 수 있습니다. + +이를 실제로 살펴보겠습니다. + +### 예시 사용 + +이는 주요 콘텐츠를 사용하여 지시사항에 대한 원하는 출력의 몇 가지 예시를 모델에게 "전달"하는 접근 방식입니다. 제공된 예시의 수에 따라 제로-샷 (zero-shot)프롬프팅, 원-샷(one-shot) 프롬프팅, 퓨-샷(few-shot) 프롬프팅 등이 가능합니다. + +프롬프트는 이제 세 가지 구성 요소로 이루어집니다: + +- 작업 설명 +- 원하는 출력의 몇 가지 예시 +- 새로운 예시의 시작 (암묵적인 작업 설명이 됨) + +| 학습 유형 | 프롬프트 (입력) | 완성 (출력) | +| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------- | +| 제로-샷 | "The Sun is Shining". 스페인어로 번역 | "El Sol está brillando". | +| 원-샷 | "The Sun is Shining" => ""El Sol está brillando".
"It's a Cold and Windy Day" => | "Es un día frío y ventoso". | +| 퓨-샷 | The player ran the bases => 야구
The player hit an ace => 테니스
The player hit a six => 크리켓
The player made a slam-dunk => | 농구 | +| | | | + +제로샷 프롬프팅에서는 명시적인 지시사항("스페인어로 번역")을 제공해야 했지만, 원샷 프롬프팅 예시에서는 추론됩니다. 퓨샷 예시는 더 많은 예시를 추가함으로써 추가 지시사항 없이 모델이 더 정확한 추론을 할 수 있는 방법을 보여줍니다. + +### 프롬프트 힌트 + +기본 콘텐츠를 사용하는 또 다른 기법은 예시 대신 _힌트_ 를 제공하는 것입니다. 이 경우, 우리는 원하는 응답 형식을 반영하는 스니펫으로 모델을 _시작시킴_ 으로써 모델을 올바른 방향으로 이끄는 역할을 합니다. 그럼 모델은 그 힌트를 받아들여 해당 방향으로 계속 진행합니다. + +| 힌트 수 | 프롬프트 (입력) | 완성 (출력) | +| :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 0 | 주피터는 태양으로부터 다섯 번째 행성이며 태양계에서 가장 큰 행성입니다. 이는 태양의 천분의 일 질량을 가진 가스 행성으로, 태양계의 다른 행성들의 질량의 2.5배입니다. 주피터는 밤하늘에서 맨 눈으로 볼 수 있는 가장 밝은 물체 중 하나이며, 기록된 역사 이전부터 고대 문명에 알려져 있습니다.
**이를 요약하세요** | 주피터는 태양계에서 가장 큰 행성으로 밤하늘에서 가장 밝은 물체 중 하나입니다. 로마 신 주피터에게 이름을 따온 이 가스 행성은 태양계의 다른 행성들의 질량의 2.5배입니다. | +| 1 | 주피터는 태양으로부터 다섯 번째 행성이며 태양계에서 가장 큰 행성입니다. 이는 태양의 천분의 일 질량을 가진 가스 행성으로, 태양계의 다른 행성들의 질량의 2.5배입니다. 주피터는 밤하늘에서 맨 눈으로 볼 수 있는 가장 밝은 물체 중 하나이며, 기록된 역사 이전부터 고대 문명에 알려져 있습니다.
**이를 요약하세요**
우리가 배운 것은 주피터 | 는 태양으로부터 다섯 번째 행성이며 태양계에서 가장 큰 행성입니다. 이는 태양의 천분의 일 질량을 가진 가스 행성으로, 태양계의 다른 행성들의 질량의 2.5배입니다. 맨 눈으로 볼 수 있으며 고대 문명부터 알려져 왔습니다. | +| 2 | 주피터는 태양으로부터 다섯 번째 행성이며 태양계에서 가장 큰 행성입니다. 이는 태양의 천분의 일 질량을 가진 가스 행성으로, 태양계의 다른 행성들의 질량의 2.5배입니다. 주피터는 밤하늘에서 맨 눈으로 볼 수 있는 가장 밝은 물체 중 하나이며, 기록된 역사 이전부터 고대 문명에 알려져 있습니다.
**이를 요약하세요**
우리가 배운 상위 3가지 사실: | 1. 주피터는 태양으로부터 다섯 번째 행성이며 태양계에서 가장 큰 행성입니다.
2. 이는 태양의 천분의 일 질량을 가진 가스 행성입니다...
3. 주피터는 고대부터 맨 눈으로 볼 수 있었습니다 ... | +| | | | + +### 프롬프트 템플릿 + +프롬프트 템플릿은 필요에 따라 저장하고 재사용할 수 있는 _프롬프트를 위한 미리 정의된 레시피_입니다. 가장 간단한 형태에서는 [OpenAI의 예시](https://platform.openai.com/examples?WT.mc_id=academic-105485-koreyst)와 같이 상호작용 프롬프트 구성 요소(사용자 및 시스템 메시지)와 API 기반 요청 형식을 모두 제공하여 재사용을 지원합니다. + +[LangChain의 예시](https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/?WT.mc_id=academic-105485-koreyst)와 같이 더 복잡한 형태에서는 _플레이스홀더_ 를 포함하여 다양한 소스(사용자 입력, 시스템 컨텍스트, 외부 데이터 소스 등)의 데이터로 교체하여 동적으로 프롬프트를 생성할 수 있습니다. 이를 통해 규모에 맞게 일관된 사용자 경험을 **프로그래밍 방식**으로 구현할 수 있는 재사용 가능한 프롬프트 라이브러리를 만들 수 있습니다. + +마지막으로, 템플릿의 실제 가치는 이제 프롬프트 템플릿이 응용 프로그램별 컨텍스트나 응용 프로그램 특정 예시를 반영하여 응답을 더 관련성 있고 정확하게 만드는 _프롬프트 라이브러리_ 를 생성하고 게시할 수 있는 능력에 있습니다. [Prompts For Edu](https://github.com/microsoft/prompts-for-edu?WT.mc_id=academic-105485-koreyst) 저장소는 이 접근 방식의 훌륭한 예로, 교육 분야에 대한 프롬프트 라이브러리를 선별하여 수업 계획, 커리큘럼 설계, 학생 지도 등과 같은 주요 목표에 중점을 둡니다. + +## 보조 콘텐츠 + +프롬프트 구성을 지시사항(작업)과 대상(주요 콘텐츠)으로 생각한다면, _보조 콘텐츠_ 는 출력을 **어떤 방식으로 영향을 주기 위해** 추가적인 컨텍스트를 제공하는 것입니다. 이는 모델이 원하는 사용자 목표나 기대에 맞게 응답을 조정하는 데 도움이 되는 튜닝 매개변수, 형식 지침, 주제 분류 등일 수 있습니다. + +예를 들어: 커리큘럼의 모든 사용 가능한 과목에 대한 상세한 메타데이터(이름, 설명, 수준, 메타데이터 태그, 강사 등)가 있는 과목 카탈로그가 있다고 가정해 봅시다. + +- "2023년 가을 학기 과목 카탈로그를 요약하세요"라는 지시사항을 정의할 수 있습니다. +- 원하는 출력의 몇 가지 예시를 제공하기 위해 주요 콘텐츠를 사용할 수 있습니다. +- 보조 콘텐츠를 사용하여 관심 있는 상위 5개 "태그"를 식별할 수 있습니다. + +이제 모델은 몇 가지 예시에 표시된 형식으로 요약을 제공할 수 있지만, 결과에 여러 태그가 있는 경우 보조 콘텐츠에서 식별된 5개의 태그를 우선시할 수 있습니다. + +--- + + + +## 프롬프트 엔지니어링의 모범 사례 + +프롬프트가 어떻게 _구성_ 될 수 있는지 알았으니, 이제 모범 사례를 반영하기 위해 어떻게 _디자인_ 할지 생각해볼 수 있습니다. 이를 두 가지로 나누어 생각해볼 수 있습니다 - 올바른 _마인드셋_ 을 가지고 적용하는 올바른 _기법_ 입니다. + +### 프롬프트 엔지니어링 마인드셋 + +프롬프트 엔지니어링은 시행착오 과정이므로 다음과 같은 세 가지 넓은 지침 요소를 염두에 두세요: + +1. **도메인 이해가 중요합니다.** 응답의 정확성과 관련성은 응용 프로그램이나 사용자가 작동하는 _도메인_ 의 함수입니다. 직관과 도메인 전문 지식을 적용하여 기법을 더욱 **맞춤화**하세요. 예를 들어, 시스템 프롬프트에서 _도메인별 특성_ 을 정의하거나 사용자 프롬프트에서 _도메인별 템플릿_ 을 사용하세요. 도메인별 컨텍스트를 반영하는 보조 콘텐츠를 제공하거나 _도메인별 단서와 예시_ 를 사용하여 모델을 익숙한 사용 패턴으로 이끌어보세요. + +2. **모델 이해가 중요합니다.** 모델은 본질적으로 확률적입니다. 그러나 모델 구현은 사용하는 훈련 데이터셋(미리 훈련된 지식), 제공하는 기능(API 또는 SDK를 통해) 및 최적화된 콘텐츠 유형(코드 vs. 이미지 vs. 텍스트 등)에 따라 다를 수 있습니다. 사용하는 모델의 강점과 한계를 이해하고, 그 지식을 활용하여 작업을 _우선순위_ 를 정하거나 모델의 기능에 최적화된 _맞춤형 템플릿_ 을 구축하세요. + +3. **반복과 검증이 중요합니다.** 모델은 빠르게 진화하고, 프롬프트 엔지니어링 기법도 마찬가지입니다. 도메인 전문가로서, 다른 컨텍스트나 기준이 _특정 응용 프로그램_ 에 적용되지 않을 수 있습니다. 프롬프트 엔지니어링 도구와 기법을 사용하여 프롬프트 구성을 "우선 시작"하고, 직관과 도메인 전문 지식을 활용하여 결과를 반복적으로 검증하세요. 통찰력을 기록하고, 미래의 빠른 반복을 위해 다른 사람들이 사용할 수 있는 **지식 기반**(프롬프트 라이브러리 등)을 만들어보세요. + +## 모범 사례 + +이제 [Open AI](https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api?WT.mc_id=academic-105485-koreyst)와 [Azure OpenAI](https://learn.microsoft.com/azure/ai-services/openai/concepts/prompt-engineering#best-practices?WT.mc_id=academic-105485-koreyst) 전문가들이 권장하는 일반적인 모범 사례를 살펴보겠습니다. + +| 항목 | 이유 | +| :-------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| 최신 모델 평가하기 | 새로운 모델 세대는 향상된 기능과 품질을 가질 가능성이 높지만, 더 높은 비용이 발생할 수도 있습니다. 영향을 평가한 후 이동 결정을 내립니다. | +| 지시사항과 컨텍스트 분리하기 | 모델/공급자가 지시사항, 주요 콘텐츠 및 보조 콘텐츠를 명확하게 구분하기 위한 _구분자_ 를 정의하는지 확인하세요. 이는 모델이 토큰에 더 정확한 가중치를 할당할 수 있도록 도와줍니다. | +| 구체적이고 명확하게 작성하기 | 원하는 컨텍스트, 결과, 길이, 형식, 스타일 등에 대해 더 많은 세부 정보를 제공하세요. 이는 응답의 품질과 일관성을 높일 것입니다. 재사용 가능한 템플릿으로 레시피를 작성하세요. | +| 상세 설명과 예시 사용하기 | 모델은 "보여주고 설명하기" 접근법에 더 잘 반응할 수 있습니다. 지시사항만 제공하는 `zero-shot` 접근법으로 시작한 다음, 원하는 출력의 몇 가지 예시를 제공하는 `few-shot`으로 세부 조정해보세요. 유추법을 사용하세요. | +| 시작 단어나 구문을 사용하여 완성 시작하기 | 응답의 시작점으로 사용할 수 있는 몇 가지 선행 단어나 구문을 제공하여 원하는 결과로 모델을 유도하세요. | +| 반복하기 | 때로는 모델에게 반복해서 지시해야 할 수도 있습니다. 주요 콘텐츠 앞뒤로 지시사항을 제공하거나, 지시사항과 시작 단어를 함께 사용하는 등의 방법을 사용하세요. 작동하는지 확인하기 위해 반복적으로 검증하세요. | +| 순서가 중요합니다 | 모델에 정보를 제공하는 순서는 출력에 영향을 줄 수 있습니다. 최근성 편향을 통해 학습 예제에서도 다른 옵션을 시도해보세요. | +| 모델에 "탈출구"를 제공하기 | 모델이 작업을 완료할 수 없는 경우 제공할 수 있는 _대체_ 완성 응답을 제공하세요. 이렇게 하면 모델이 잘못된 또는 가짜 응답을 생성할 가능성이 줄어듭니다. | +| | | + +모든 모범 사례와 마찬가지로, 모델, 작업 및 도메인에 따라 _결과가 달라질 수 있습니다._ 이를 시작점으로 사용하고, 가장 잘 작동하는 방법을 찾기 위해 반복적으로 개선하세요. 새로운 모델과 도구가 사용 가능해질 때마다 프롬프트 엔지니어링 프로세스를 지속적으로 재평가하고, 프로세스의 확장성과 응답 품질에 초점을 맞추세요. + + + +## 과제 + +축하합니다! 레슨의 끝까지 도달했습니다! 이제 실제 예제를 사용하여 몇 가지 개념과 기법을 테스트해 보는 시간입니다! + +과제를 위해 상호작용적으로 완료할 수 있는 Jupyter Notebook을 사용할 것입니다. 또한 아이디어와 기법을 탐색하기 위해 자체적으로 Markdown 및 Code 셀을 추가하여 Notebook을 확장할 수도 있습니다. + +### 시작하기 전에, 레포지토리를 포크한 다음 + +- (권장) GitHub Codespaces를 시작하세요. +- (대안) 레포지토리를 로컬 장치에 복제하고 Docker Desktop을 사용하세요. +- (대안) 선호하는 Notebook 실행 환경에서 Notebook을 열어보세요. + +### 다음으로, 환경 변수를 구성하세요 + +- 레포지토리 루트에 있는 `.env.copy` 파일을 `.env`로 복사하고 `AZURE_OPENAI_KEY`, `AZURE_OPENAI_ENDPOINT`, `AZURE_OPENAI_DEPLOYMENT` 값을 채워넣으세요. [Learning Sandbox section](./04-prompt-engineering-fundamentals#learning-sandbox)에서 자세한 내용을 확인하세요. + +### 다음으로, Jupyter Notebook을 열어보세요 + +- 런타임 커널을 선택하세요. 옵션 1 또는 2를 사용하는 경우, 개발 컨테이너에서 제공하는 기본 Python 3.10.x 커널을 선택하면 됩니다. + +이제 연습문제를 실행할 준비가 되었습니다. 여기서는 _정답과 오답_이 없습니다. 대신, 시행착오를 통해 옵션을 탐색하고, 주어진 모델과 응용 프로그램 도메인에 대한 직관을 구축하는 것입니다. + +_이러한 이유로 이 레슨에는 코드 솔루션 세그먼트가 없습니다. 대신, 노트북에는 "My Solution:"이라는 제목의 Markdown 셀이 있어 참고용으로 한 가지 예시 출력을 보여줍니다._ + + + +## 지식 확인 + +다음 중 합리적인 모범 사례를 따르는 좋은 프롬프트는 무엇입니까? + +1. 빨간색 차의 이미지를 보여주세요. +2. 일몰이 진 절벽 옆에 주차된 볼보 제조사와 모델이 XC90인 빨간색 차의 이미지를 보여주세요. +3. 볼보 제조사와 모델이 XC90인 빨간색 차의 이미지를 보여주세요. + +A: 2번입니다. 이 프롬프트는 "무엇"에 대한 세부 정보를 제공하며 (어떤 차가 아니라 특정 제조사와 모델의 차), 전반적인 설정에 대한 설명도 포함하고 있습니다. 3번은 두 번째로 좋은 프롬프트입니다. 많은 설명이 포함되어 있습니다. + +## 🚀 도전과제 + +프롬프트 "볼보 제조사와 빨간색 차의 이미지를 보여주세요"를 "단서" 기법과 함께 활용해보세요. 어떤 응답이 나오고, 어떻게 개선할 수 있을까요? + +## 훌륭합니다! 계속해서 학습하세요 + +다양한 프롬프트 엔지니어링 개념에 대해 더 알고 싶으신가요? [계속해서 학습하기 페이지](../../../13-continued-learning/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)에서 이 주제에 대한 다른 훌륭한 자료를 찾아보세요. + +5번 레슨으로 이동하여 [고급 프롬프트 생성](../../../05-advanced-prompts/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)을 살펴보세요! diff --git a/05-advanced-prompts/translations/ko/README.md b/05-advanced-prompts/translations/ko/README.md new file mode 100644 index 000000000..2f3b6fdf6 --- /dev/null +++ b/05-advanced-prompts/translations/ko/README.md @@ -0,0 +1,622 @@ +# 고급 프롬프트 생성 + +[![Creating Advanced Prompts](../../images/05-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://youtu.be/32GBH6BTWZQ?WT.mc_id=academic-105485-koreyst) + +이전 장에서 배운 내용을 간단히 되짚어보겠습니다: + +> 프롬프트 엔지니어링은 **모델이 더 관련성 있는 응답을 할 수 있도록** 더 유용한 지시사항이나 문맥을 제공하여 모델을 안내하는 과정입니다. + +프롬프트 작성에는 두 가지 단계가 있습니다. 첫 번째는 관련 문맥을 제공하여 프롬프트를 구성하는 것이고, 두 번째는 프롬프트를 점진적으로 개선하는 _최적화_ 입니다. + +이 시점에서 우리는 프롬프트를 작성하는 방법에 대해 기본적인 이해를 갖고 있지만, 더 깊게 파고들어야 합니다. 이 장에서는 다양한 프롬프트를 시도해보고, 왜 한 프롬프트가 다른 프롬프트보다 더 좋은지 이해하는 방법을 배우게 될 것입니다. 모든 LLM에 적용할 수 있는 몇 가지 기본 기술을 사용하여 프롬프트를 구성하는 방법을 배우게 될 것입니다. + +## 소개 + +이 장에서는 다음과 같은 주제를 다룰 것입니다: + +- 다양한 기법을 적용하여 프롬프트 엔지니어링에 대한 지식을 확장합니다. +- 출력을 다양하게 하도록 프롬프트를 구성합니다. + +## 학습 목표 + +이 레슨을 완료한 후에는 다음을 할 수 있게 될 것입니다: + +- 프롬프트 엔지니어링 기법을 적용하여 프롬프트의 결과를 개선합니다. +- 다양하거나 결정론적인 프롬프트를 수행합니다. + +## 프롬프트 엔지니어링 + +프롬프트 엔지니어링은 원하는 결과를 얻을 수 있는 프롬프트를 생성하는 과정입니다. 텍스트 프롬프트를 작성하는 것 이상이 있습니다. 프롬프트 엔지니어링은 엔지니어링 학문이 아니라 원하는 결과를 얻기 위해 적용할 수 있는 기술의 집합입니다. + +### 프롬프트의 예 + +> 지리에 대해 10개의 질문을 생성하세요. + +이 프롬프트에서 여러 가지 다른 프롬프트 기법을 적용하고 있습니다. + +자세히 살펴보겠습니다. + +- **문맥**, "지리"에 대한 내용을 지정합니다. +- **출력 제한**, 10개 이상의 질문을 원하지 않습니다. + +### 단순한 프롬프트의 한계 + +원하는 결과를 얻을 수도 있고, 얻지 못할 수도 있습니다. 질문은 생성되지만, 지리는 큰 주제이며 원하는 내용을 얻지 못할 수 있습니다. 이는 다음과 같은 이유로 인해 발생할 수 있습니다: + +- **큰 주제**, 국가, 수도, 강 등에 대한 질문인지 알 수 없습니다. +- **형식**, 질문을 특정한 방식으로 포맷을 지정하고 싶은 경우 어떻게 해야 할까요? + +프롬프트를 작성할 때 고려해야 할 사항이 많다는 것을 알 수 있습니다. + +지금까지 간단한 프롬프트 예제를 살펴보았지만, 생성형 AI는 다양한 역할과 산업에서 사람들을 돕기 위해 더 많은 것을 할 수 있습니다. 다음에는 몇 가지 기본 기술을 살펴보겠습니다. + +### 프롬프트 기법 + +먼저, 프롬프트는 LLM의 _비롯된_ 특성이라는 점을 이해해야 합니다. 이는 모델에 내장된 기능이 아니라 모델을 사용하면서 우리가 발견하는 것입니다. + +LLM을 프롬프트하기 위해 몇 가지 기본적인 기법을 사용할 수 있습니다. 이제 그것들을 살펴보겠습니다. + +- **퓨 샷 프롬프트 (Few-shot prompting)**, 이것은 가장 기본적인 프롬프트 형태입니다. 몇 가지 예제와 함께 한 개의 프롬프트로 구성됩니다. +- **생각의 사슬 (Chain-of-thought)**, 이 유형의 프롬프트는 LLM에게 문제를 단계별로 해결하는 방법을 알려줍니다. +- **생성된 지식 (Generated knowledge)**, 프롬프트의 응답을 개선하기 위해 프롬프트 외에도 생성된 사실이나 지식을 제공할 수 있습니다. +- **작은 것부터 크게 (Least to most)**, 생각의 사슬와 마찬가지로, 이 기법은 문제를 일련의 단계로 분해하고 이 단계들을 순서대로 수행하도록 요청하는 것입니다. +- **자기 개선 (Self-refine)**, 이 기법은 LLM의 출력을 비판하고 개선하도록 요청하는 것입니다. +- **Maieutic prompting**, 여기서 원하는 것은 LLM의 답변이 정확한지 확인하고, 답변의 다양한 부분을 설명하도록 요청하는 것입니다. 이는 Self-refine의 한 형태입니다. + +### 퓨 샷 프롬프트 (Few-shot prompting) + +이 프롬프트 스타일은 매우 간단하며, 단일 프롬프트와 몇 가지 예제로 구성될 수 있습니다. 이 기법은 LLM에 대해 배우기 시작하는 단계에서 사용할 것입니다. 다음은 예시입니다: + +- 프롬프트: "대수학이란 무엇인가요?" +- 답변: "대수학은 수학 기호와 이러한 기호를 조작하는 규칙을 연구하는 수학의 한 분야입니다." + +### 생각의 사슬 (Chain-of-thought) + +Chain-of-thought는 LLM을 일련의 단계를 거쳐 가르치는 매우 흥미로운 기술입니다. 이 아이디어는 LLM에게 어떻게 해야 하는지 이해시키는 방법입니다. 다음 예시를 고려해보세요. Chain-of-thought를 사용하는 경우와 그렇지 않은 경우를 비교해보세요: + + - 프롬프트: "앨리스는 사과를 5개 가지고 있습니다. 3개의 사과를 던지고, 2개를 밥에게 주었고, 밥이 하나를 다시 돌려줬을 때, 앨리스는 몇 개의 사과를 가지고 있을까요?" + - 답변: 5 + +LLM은 5라고 답했지만, 이는 잘못된 답입니다. 정답은 계산에 따라 (5 - 3 - 2 + 1 = 1) 1개의 사과입니다. + +그렇다면 어떻게 LLM에게 올바르게 계산하는 방법을 가르칠 수 있을까요? + +Chain-of-thought를 시도해보겠습니다. Chain-of-thought를 적용하는 방법은 다음과 같습니다: + +1. LLM에게 비슷한 예제를 제공합니다. +2. 계산 방법과 올바르게 계산하는 방법을 보여줍니다. +3. 원래의 프롬프트를 제공합니다. + +다음과 같이 해보겠습니다: + +- 프롬프트: "리사는 사과를 7개 가지고 있습니다. 1개의 사과를 던지고, 4개의 사과를 바트에게 주고, 바트가 하나를 다시 돌려줍니다: + 7 - 1 = 6 + 6 - 4 = 2 + 2 + 1 = 3 + 앨리스는 사과를 5개 가지고 있습니다. 3개의 사과를 던지고, 2개를 밥에게 주고, 밥이 하나를 다시 돌려준다면, 앨리스는 몇 개의 사과를 가지고 있을까요?" +- 답변: 1 + +비슷한 예제, 계산 방법, 그리고 원래의 프롬프트를 포함한 긴 프롬프트를 작성하고, 올바른 답인 1에 도달합니다. + +Chain-of-thought는 매우 강력한 기술임을 알 수 있습니다. + +### 생성된 지식 (Generated knowledge) + +회사의 데이터를 사용하여 프롬프트를 구성하고 싶을 때가 많습니다. 프롬프트의 일부는 회사에서 가져온 내용이어야 하고, 다른 일부는 실제로 관심 있는 프롬프트여야 합니다. + +예를 들어, 보험업을 하는 경우 프롬프트는 다음과 같이 구성될 수 있습니다: + + ```text + {{company}}: {{company_name}} + {{products}}: + {{products_list}} + 다음 예산과 요구 사항에 따라 보험을 제안해주세요: + 예산: {{budget}} + 요구 사항: {{requirements}} + ``` + +위에서는 템플릿을 사용하여 프롬프트가 구성되는 방법을 볼 수 있습니다. 템플릿에는 `{{변수}}`로 표시된 여러 변수가 있으며, 이 변수들은 회사 API에서 실제 값으로 대체될 것입니다. + +회사의 내용으로 변수가 대체된 프롬프트 예시를 살펴보겠습니다: + + ```text + 보험 회사: ACME Insurance + 보험 상품 (월 별 비용): + - 자동차, 저렴함, 500 USD + - 자동차, 비쌈, 1100 USD + - 주택, 저렴함, 600 USD + - 주택, 비쌈, 1200 USD + - 생명, 저렴함, 100 USD + + 다음 예산과 요구 사항에 따라 보험을 제안해주세요: + 예산: $1000 + 요구 사항: 자동차, 주택 + ``` + +이 프롬프트를 LLM에 적용하면 다음과 같은 응답이 생성됩니다: + + ```output + , and Life insurance + + 예산과 요구 사항에 따라 ACME 보험으로부터 다음과 같은 보험 패키지를 제안합니다: + - 자동차, 저렴함, 500 USD + - 주택, 저렴함, 600 USD + - 생명, 저렴함, 100 USD + 총 비용: $1,200 USD + ``` + +보시다시피, 이는 생명 보험도 제안하는데, 그렇게 되면 안 됩니다. 이 결과는 우리가 원하는 결과를 얻기 위해 프롬프트를 최적화해야 함을 나타냅니다. _시행착오_ 를 거쳐 다음과 같은 프롬프트로 도달합니다: + + ```text + 보험 회사: ACME Insurance + 보험 상품 (월 별 비용): + - 유형: 자동차, 저렴함, 비용: 500 USD + - 유형: 자동차, 비쌈, 비용: 1100 USD + - 유형: 주택, 저렴함, 비용: 600 USD + - 유형: 주택, 비쌈, 비용: 1200 USD + - 유형: 생명, 저렴함, 비용: 100 USD + + 다음 비용과 요구 사항에 따라 보험을 제안해주세요: + 예산: $1000, 자동차, 주택 유형으로 선택 범위 제한 + ``` + +_유형_ 과 _비용_ 를 추가하고 _제한_ 키워드를 사용하는 것이 어떻게 우리가 원하는 바를 LLM에게 이해시키는 데 도움이 되는지 주목하세요. + +이제 우리는 다음과 같은 응답을 얻습니다: + + ```output + 예산과 요구 사항에 따라, 월 별 500 USD인 자동차, 저렴한 보험을 제안합니다. + ``` + +이 예시의 목적은 _Generated knowledge_ 과 같은 기본적인 기술을 사용하더라도 대부분의 경우 원하는 결과를 얻기 위해 프롬프트를 최적화해야 한다는 것을 보여주는 것이었습니다. + +### 작은 것부터 크게 (Least to most) + +Least-to-most 프롬프팅은 큰 문제를 작은 하위 문제로 분할하여 해결 방법을 안내하는 것입니다. 이렇게 하면 LLM에게 큰 문제를 "정복"하는 방법을 안내할 수 있습니다. 데이터 과학의 좋은 예로, LLM에게 다음과 같이 문제를 분할하도록 요청할 수 있습니다: + +> 프롬프트: 5단계로 데이터 과학을 수행하는 방법은 무엇인가요? + +AI 어시스턴트의 답변: + +1. 데이터 수집 +2. 데이터 정제 +3. 데이터 분석 +4. 데이터 시각화 +5. 데이터 프레젠테이션 + +### 자기 개선, 결과 비판 (Self-refine, critique the results) + +생성 모델과 LLM을 사용할 때, 출력에 절대적으로 신뢰할 수 없습니다. 반드시 검증해야 합니다. LLM은 단지 다음으로 가장 가능성이 높은 답변을 제시할 뿐이지, 정확한 답변을 제공하는 것은 아닙니다. 따라서, LLM에게 자기 비판을 요청하여 자기 개선 기법에 도달할 수 있습니다. + +이 기법은 다음과 같은 단계를 따릅니다: + +1. LLM에게 문제 해결을 요청하는 초기 프롬프트 +2. LLM의 답변 +3. 답변을 비판하고 AI에게 개선을 요청 +4. LLM이 비판을 고려하여 다시 답변하고 제안한 해결책을 제시 + +이 과정을 원하는 만큼 반복할 수 있습니다. + +이 기술을 사용한 예시는 다음과 같습니다: + +> 프롬프트: "products와 customers라는 라우트를 가진 Python 웹 API를 생성하세요" + +AI 답변: + + ```python + import flask + app = Flask(__name__) + + @app.route('/products') + def products(): + return 'Products' + + @app.route('/customers') + def customers(): + return 'Customers' + ``` + +> 프롬프트: 위의 코드를 개선할 세 가지 제안을 해주세요. + +AI 답변: + + ```text + 물론, 다음은 코드를 개선하기 위한 세 가지 제안입니다: + + 올바른 모듈을 가져오세요: 첫 번째 줄은 flask 대신에 Flask를 가져와야 합니다. 올바른 import 문은 from flask import Flask여야 합니다. + + main 함수를 추가하세요: 파일이 실행될 때 애플리케이션을 실행하기 위해 if __name__ == '__main__': 블록을 파일의 끝에 추가하세요. + + f-strings를 사용하세요: route 함수에서 반환문을 포맷팅하기 위해 f-strings를 사용하세요. 예를 들어, return 'Products'를 return f'This is the {request.path} page'로 변경할 수 있습니다. + ``` + + ```python + from flask import Flask, request + + app = Flask(__name__) + + @app.route('/products') + def products(): + return f'This is the {request.path} page' + + @app.route('/customers') + def customers(): + return f'This is the {request.path} page' + + if __name__ == '__main__': + app.run() + ``` + +위의 AI 응답은 첫 번째 답변을 비판함으로써 첫 번째 제안된 코드를 개선하고 있음을 확인할 수 있습니다. + +### Maieutic prompting + +Maieutic prompting은 자기 개선 (Self-refine)과 유사한 기술이지만, LLM에게 스스로를 설명하도록 요청하는 것입니다. 목표는 LLM의 출력에서 일관성을 줄여 올바른 답변에 도달하는 것입니다. 따라서 다음과 같은 워크플로우를 따릅니다: + +1. LLM에게 질문에 대한 답변을 요청합니다. +2. 답변의 각 부분에 대해 LLM에게 더 자세히 설명하도록 요청합니다. +3. 일관성이 없는 부분이 있다면, 일관성이 없는 부분을 제외합니다. + +2와 3을 반복하여 모든 부분을 확인하고 답변에 만족할 때까지 진행합니다. + +다음은 예시 프롬프트입니다: + +> 프롬프트: 5단계로 팬데믹을 완화하기 위한 위기 대응 계획을 어떻게 작성할 수 있을까요? + +LLM 답변: + + ```text + 1. 위험 요소 식별 + 1. 이해 관계자 식별 + 1. 자원 식별 + 1. 조치 사항 식별 + 1. 의사 소통 채널 식별 + ``` + +5단계가 식별되었지만, 이것이 맞는지 확인할 수 있을까요? 각 단계를 설명하도록 LLM에게 요청해봅시다: + +> 프롬프트: 첫 번째 단계를 더 자세히 설명해주세요. 팬데믹에서의 위험은 무엇이며 자세히 설명해주세요? + + ```text + 다음은 위험 요소입니다: + + - 생명의 손실 + - 사업의 손실 + - 평판의 손실 + - 고객의 손실 + - 직원의 손실 + ``` + +이 시점에서, 우리는 LLM이 올바른지 확인하고자 첫 번째 위험을 더 자세히 설명하도록 요청하고, 위의 답변과 일관성이 있는지 확인합니다: + +> 프롬프트: 팬데믹에서 가장 큰 위험은 무엇이며 그 이유는 무엇인가요? + + ```text + 가장 큰 위험은 생명의 손실입니다. 왜냐하면 가장 중요한 것을 보호해야 하기 때문입니다. + ``` + +> 팬데믹에서 가장 큰 위험은 무엇인가요? + + ```text + 팬데믹에서 가장 큰 위험은 생명의 손실과 사업의 손실입니다. + ``` + +이 시점에서, LLM은 일관성이 있으며 "생명"과 "사업"을 최상위 두 가지 위험으로 언급합니다. 이제 다음 단계로 진행하고 상당히 확신을 갖을 수 있습니다. 그러나 LLM을 맹목적으로 신뢰해서는 안 되며, 항상 출력을 확인해야 합니다. + +## 출력 다양성 조절하기 + +LLM은 본질적으로 결정론적이지 않으므로, 동일한 프롬프트를 실행할 때마다 다른 결과를 얻게 됩니다. 예를 들어 다음 프롬프트를 시도해보세요: + +> "파이썬 웹 API를 위한 코드 생성" + + ```python + # 필요한 라이브러리 가져오기 + import flask + from flask import request, jsonify + + # Flask 앱 인스턴스 생성 + app = flask.Flask(__name__) + + # API를 위한 엔드포인트 생성 + @app.route('/api', methods=['GET']) + def api(): + # 요청 데이터 가져오기 + data = request.args + + # 데이터 처리 + result = process_data(data) + + # 결과를 JSON 형식으로 반환 + return jsonify(result) + + # 데이터 처리 함수 + def process_data(data): + # 데이터 처리 수행 + result = data + 1 + + # 결과 반환 + return result + + # 앱 실행 + if __name__ == '__main__': + app.run() + + ``` + +동일한 프롬프트를 다시 실행하면 약간 다른 응답이 생성됩니다: + + ```text + # 필요한 패키지 가져오기 + import flask + from flask import request, jsonify + + # Flask 앱 생성 + app = flask.Flask(__name__) + app.config["DEBUG"] = True + + # 책 목록 생성 + books = [ + {'id': 0, + 'title': 'A Fire Upon the Deep', + 'author': 'Vernor Vinge', + 'first_sentence': 'The coldsleep itself was dreamless.', + 'year_published': '1992'}, + {'id': 1, + 'title': 'The Ones Who Walk Away From Omelas', + 'author': 'Ursula K. Le Guin', + 'first_sentence': 'With a clamor of bells that set the swallows soaring, the Festival of Summer came to the city Omelas, bright-towered by the sea.', + 'published': '1973'}, + {'id': 2, + 'title': 'Dhalgren', + 'author': 'Samuel R. Delany', + 'first_sentence': 'to wound the autumnal city.', + 'published': '1975'} + ] + + # API를 위한 엔드포인트 생성 + @app.route('/', methods=['GET']) + def home(): + return '''

Books API

+

책을 검색하기 위한 프로토 타입 API입니다.

''' + + # 모든 책 반환을 위한 엔드포인트 생성 + @app.route('/api/v1/resources/books/all', methods=['GET']) + def api_all(): + return jsonify(books) + + # 단일 책 반환을 위한 엔드포인트 생성 + @app.route('/api/v1/resources/books', methods=['GET']) + def api_id(): + # URL의 일부로 ID가 제공되었는지 확인 + # ID가 제공되면 변수에 할당 + # ID가 제공되지 않으면 오류 메시지 표시 + if 'id' in request.args: + id = int(request.args['id']) + else: + return "오류: ID 필드가 제공되지 않았습니다. ID를 지정해주세요." + + # 결과를 저장할 빈 리스트 생성 + results = [] + + # 데이터를 반복하며 요청된 ID와 일치하는 결과 찾기 + # ID는 고유하지만 다른 필드는 여러 결과를 반환할 수 있음 + for book in books: + if book['id'] == id: + results.append(book) + + # Flask의 jsonify 함수를 사용하여 Python 사전의 리스트를 JSON 형식으로 변환 + return jsonify(results) + + app.run() + ``` + +> 그렇다면 출력 다양성은 문제가 될까요? + +그것은 당신이 무엇을 하려는지에 달려있습니다. 특정한 응답을 원한다면 문제가 될 수 있습니다. "지리학에 관한 3개의 질문을 생성하세요"와 같이 다양한 출력을 원한다면 문제가 되지 않습니다. + +### temperature를 사용하여 출력 다양성 조절하기 + +우리는 출력을 더 예측 가능하고 결정적으로 제한하고 싶다고 결정했습니다. 그렇다면 어떻게 해야 할까요? + +temperature는 0과 1 사이의 값으로, 0은 가장 결정적이고 1은 가장 다양한 출력을 생성합니다. 기본값은 0.7입니다. 같은 프롬프트를 temperature를 0.1로 설정하여 두 번 실행해 보겠습니다: + +> "파이썬 웹 API를 생성하는 코드를 생성하세요" + + ```python + # 필요한 라이브러리 가져오기 + import flask + from flask import request, jsonify + + # Flask 앱 생성 + app = flask.Flask(__name__) + + # API를 위한 엔드포인트 생성 + @app.route('/api/v1/endpoint', methods=['GET']) + def api_endpoint(): + # 요청 데이터 가져오기 + data = request.get_json() + + # 데이터 처리 + result = process_data(data) + + # 결과 반환 + return jsonify(result) + + # 데이터 처리 함수 정의 + def process_data(data): + # 데이터 처리 + result = {'result': 'success'} + + # 결과 반환 + return result + + # Flask 앱 실행 + if __name__ == '__main__': + app.run() + + ``` + +프롬프트를 다시 실행하면 다음과 같은 결과가 나옵니다: + + ```python + # 필요한 라이브러리 가져오기 + import flask + from flask import request, jsonify + + # Flask 앱 생성 + app = flask.Flask(__name__) + + # API를 위한 엔드포인트 생성 + @app.route('/api', methods=['GET']) + def api_call(): + # 요청 데이터 가져오기 + data = request.get_json() + + # 데이터 처리 + result = process_data(data) + + # 결과 반환 + return jsonify(result) + + # 데이터 처리 함수 정의 + def process_data(data): + # 데이터 처리 + result = data + 1 + + # 결과 반환 + return result + + # Flask 앱 실행 + if __name__ == '__main__': + app.run() + + ``` + +이 두 출력 사이에는 아주 작은 차이만 있습니다. 이번에는 반대로 temperature를 0.9로 설정해 보겠습니다: + + ```python + # 필요한 라이브러리 가져오기 + import flask + from flask import request, jsonify + + # Flask 앱 생성 + app = flask.Flask(__name__) + + # API를 위한 엔드포인트 생성 + @app.route('/api', methods=['GET']) + def api_call(): + # 요청 데이터 가져오기 + data = request.args + + # 데이터 처리 + result = process_data(data) + + # 결과 반환 + return jsonify(result) + + # 데이터 처리 함수 정의 + def process_data(data): + # 데이터 처리 + result = data + 1 + + # 결과 반환 + return result + + # Flask 앱 실행 + if __name__ == '__main__': + app.run() + + ``` + +그리고 temperature 값을 0.9로 설정한 두 번째 시도: + + ```python + import flask + from flask import request, jsonify + + # Flask 앱 생성 + app = flask.Flask(__name__) + app.config['DEBUG'] = True + + # 테스트 데이터 생성 + books = [ + {'id': 0, 'title': 'A Fire Upon The Deep', 'author': 'Vernor Vinge', 'first_sentence': 'The coldsleep itself was dreamless.', 'year_published': '1992'}, + {'id': 1, 'title': 'The Ones Who Walk Away From Omelas', 'author': 'Ursula K. Le Guin', 'first_sentence': 'With a clamor of bells that set the swallows soaring, the Festival of Summer came to the city Omelas, bright-towered by the sea.', 'published': '1973'}, + {'id': 2, 'title': 'Dhalgren', 'author': 'Samuel R. Delany', 'first_sentence': 'to wound the autumnal city.', 'published': '1975'} + ] + + # 엔드포인트 생성 + @app.route('/', methods=['GET']) + def home(): + return '''

도서 API에 오신 것을 환영합니다!

''' + + @app.route('/api/v1/resources/books + + ``` + +보시다시피, 결과는 매우 다양합니다. + +> 참고로, 출력 다양성을 변화시키기 위해 변경할 수 있는 다른 매개변수들도 있습니다. 예를 들어, top-k, top-p, 반복 패널티, 길이 패널티, 다양성 패널티 등이 있지만 이러한 내용은 이 커리큘럼의 범위를 벗어납니다. + +## 모범 사례 + +원하는 결과를 얻기 위해 적용할 수 있는 다양한 사례들이 있습니다. 프롬프팅을 더 많이 사용하면서 자신만의 스타일을 찾아갈 것입니다. + +우리가 다룬 기술들 외에도, LLM을 프롬프팅할 때 고려해야 할 좋은 사례들이 있습니다. + +다음은 고려해야 할 좋은 사례 몇 가지입니다: + +- **문맥 명시하기**. 문맥은 중요합니다. 도메인, 주제 등과 같이 가능한 한 구체적으로 명시할수록 좋습니다. +- 출력 제한하기. 특정 개수의 항목이나 특정 길이를 원한다면 명시하세요. +- **무엇과 어떻게를 모두 명시하기**. 원하는 것과 원하는 방식을 모두 언급해야 합니다. 예를 들어 "3개의 파일로 나누어 제품과 고객을 위한 Python 웹 API를 생성하세요"와 같이 말이죠. +- **템플릿 사용하기**. 종종 회사의 데이터로 프롬프트를 보강하고 싶을 때가 있습니다. 이를 위해 템플릿을 사용하세요. 템플릿에는 실제 데이터로 대체할 변수가 포함될 수 있습니다. +- **맞춤법 확인하기**. LLM은 올바른 응답을 제공할 수 있지만, 맞춤법을 올바르게 사용하면 더 좋은 응답을 받을 수 있습니다. + +## 과제 + +다음은 Flask를 사용하여 간단한 API를 구축하는 Python 코드입니다: + + ```python + from flask import Flask, request + + app = Flask(__name__) + + @app.route('/') + def hello(): + name = request.args.get('name', 'World') + return f'Hello, {name}!' + + if __name__ == '__main__': + app.run() + ``` + +GitHub Copilot이나 ChatGPT와 같은 AI 어시스턴트를 사용하여 "자기 개선 (self-refine)" 기법을 적용하여 코드를 개선해보세요. + +## 해답 + +코드에 적절한 프롬프트를 추가하여 과제를 해결하려고 시도해보세요. + +> [!TIP] +> 개선 사항을 요청하는 프롬프트를 작성하는 것이 좋습니다. 개선 사항의 수를 제한하는 것도 좋은 아이디어입니다. 또한 아키텍처, 성능, 보안 등 특정한 방식으로 개선을 요청할 수도 있습니다. + +[해답](../../solution.py?WT.mc_id=academic-105485-koreyst) + +## 지식 확인 + +왜 생각의 사슬 (chain-of-thought) 프롬프팅을 사용해야 할까요? 올바른 응답 1개와 잘못된 응답 2개를 보여주세요. + +1. A, 문제를 해결하는 방법을 LLM에게 가르치기 위해. +2. B, 코드에서 오류를 찾는 방법을 LLM에게 가르치기 위해. +3. C, 다양한 해결책을 생각해내기 위해 LLM에게 지시하기 위해. + +A: 1, 생각의 사슬 (chain-of-thought) 는 LLM에게 문제를 해결하는 방법을 보여주는 것으로, 일련의 단계와 유사한 문제 및 그들이 어떻게 해결되었는지를 제공합니다. + +## 🚀 도전과제 + +과제에서 자기 개선 (self-refine) 기법을 사용했습니다. 구축한 프로그램을 가져와서 적용할 개선 사항을 고려해보세요. 그리고 자기 개선 기법을 사용하여 제안된 변경 사항을 적용해보세요. 결과는 어떠셨나요, 더 좋아졌나요 아니면 더 나빠졌나요? + +## 잘 하셨습니다! 계속해서 학습하세요 + +이 레슨을 완료한 후 [Generative AI 학습 컬렉션](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)을 확인하여 Generative AI 지식을 계속 향상시킬 수 있습니다! + +[6번 레슨](../../../06-text-generation-apps/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)으로 이동하여 Prompt Engineering 지식을 적용하여 텍스트 생성 앱을 구축해보세요. diff --git a/06-text-generation-apps/translations/ko/README.md b/06-text-generation-apps/translations/ko/README.md new file mode 100644 index 000000000..276299feb --- /dev/null +++ b/06-text-generation-apps/translations/ko/README.md @@ -0,0 +1,656 @@ +# 텍스트 생성 애플리케이션 개발 + +[![Building Text Generation Applications](../../images/06-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://youtu.be/5jKHzY6-4s8?WT.mc_id=academic-105485-koreyst) + +> *(위의 이미지를 클릭하여 이 수업의 동영상을 시청하세요.)* + +지금까지 이 커리큘럼을 통해 프롬프트와 "프롬프트 엔지니어링"이라는 전체적인 개념과 같은 핵심 개념들을 보셨습니다. ChatGPT, Office 365, Microsoft Power Platform 등 다양한 도구들은 프롬프트를 사용하여 어떤 작업을 수행하는 데 도움을 주는 것을 확인하실 수 있습니다. + +앱에 이러한 경험을 추가하려면 프롬프트, completion(완성어) 및 작업할 라이브러리와 관련된 개념을 이해해야 합니다. 이것이 바로 이번 장에서 배우게 될 내용입니다. + +## 소개 + +이번 장에서는 다음을 하게 될 것입니다: + +- OpenAI 라이브러리와 그 핵심 개념에 대해 학습합니다. +- OpenAI를 사용하여 텍스트 생성 앱을 개발합니다. +- 프롬프트, temperature(언어 생성 모델에서 생성된 텍스트의 다양성을 조절하는 하이퍼파라미터), 토큰과 같은 개념을 사용하여 텍스트 생성 앱을 구축하는 방법을 이해합니다. + +## 학습 목표 + +이 장을 학습하고 나면 다음을 할 수 있게 될 것입니다: + +- 텍스트 생성 앱이 무엇인지를 설명합니다. +- OpenAI를 사용하여 텍스트 생성 앱을 개발합니다. +- 앱을 더 많거나 더 적은 토큰을 사용하도록 구성하고, 또한 다양한 출력을 얻기 위해 temperature를 조절합니다. + +## 텍스트 생성 애플리케이션이 무엇인가요? + +일반적으로 앱을 개발할 때 다음과 같은 종류의 인터페이스가 있습니다: + +- 명령 기반(Command-based): 콘솔 앱은 명령을 입력하고 해당 작업을 수행하는 전형적인 앱입니다. 예를 들어 git은 명령 기반 앱의 한 예입니다. +- 사용자 인터페이스 (UI): 일부 앱은 그래픽 사용자 인터페이스 (GUI)를 갖고 있습니다. 여기서는 버튼을 클릭하거나 텍스트를 입력하고 옵션을 선택하는 등의 작업을 수행합니다. + +### 콘솔 및 UI 앱은 제한적입니다 + +명령 기반 앱에서 명령을 입력하는 것과 비교해보세요: + +- **제한적입니다**. 모든 명령을 입력할 수 있는 것이 아니라, 앱이 지원하는 명령만 입력할 수 있습니다. +- **특정 언어에 한정됩니다**. 일부 앱은 여러 언어를 지원하지만, 기본적으로 앱은 특정 언어를 위해 구축되며, 추가적인 언어 지원이 가능한 경우에도 해당 언어에 한정됩니다. + +### 텍스트 생성 앱의 장점 + +그렇다면 텍스트 생성 앱은 어떻게 다를까요? + +텍스트 생성 앱에서는 더 많은 유연성을 가지며, 일련의 명령이나 특정 입력 언어에 제한되지 않습니다. 대신에 자연어를 사용하여 앱과 상호작용할 수 있습니다. 또 다른 장점은 이미 방대한 정보 코퍼스(말뭉치)로 훈련된 데이터 소스와 상호작용하고 있기 때문에, 전통적인 앱이 데이터베이스에 제한되는 것과는 달리 더 많은 가능성을 가집니다. + +### 텍스트 생성 앱으로 무엇을 만들 수 있을까요? + +많은 것들을 만들 수 있습니다. 예를 들어: + +- **챗봇**. 회사와 제품에 대한 질문에 답변하는 챗봇을 만들 수 있습니다. +- **도움이 되는 도구**. LLM은 텍스트 요약, 텍스트에서 통찰력 얻기, 이력서와 같은 텍스트 생성 등에 뛰어납니다. +- **코드 어시스턴트**. 사용하는 언어 모델에 따라 코드 작성을 도와주는 코드 어시스턴트를 만들 수 있습니다. 예를 들어, GitHub Copilot과 ChatGPT와 같은 제품을 사용하여 코드 작성을 도와줄 수 있습니다. + +## 어떻게 시작할 수 있을까요? + +LLM과 통합하는 방법을 찾아야 합니다. 일반적으로 다음 두 가지 접근 방식을 사용합니다: + +- API 사용. 여기서는 프롬프트와 함께 웹 요청을 생성하고 생성된 텍스트를 받아옵니다. +- 라이브러리 사용. 라이브러리는 API 호출을 캡슐화하고 사용하기 쉽게 만들어줍니다. + +## 라이브러리/SDK + +LLM과 작업하기 위해 몇 가지 잘 알려진 라이브러리가 있습니다: + +- **openai**, 이 라이브러리는 모델에 연결하고 프롬프트를 보내는 것을 쉽게 만들어줍니다. + +또한 다음과 같이 더 높은 수준에서 작동하는 라이브러리도 있습니다: + +- **Langchain**. Langchain은 잘 알려진 라이브러리로, Python을 지원합니다. +- **Semantic Kernel**. Semantic Kernel은 Microsoft에서 지원하는 C#, Python, Java 등의 언어를 지원하는 라이브러리입니다. + +## openai를 사용한 앱 개발 + +우리는 앱을 만드는 방법, 앱을 만들기 위해 어떤 라이브러리가 얼마나 필요한지 등을 살펴보겠습니다. + +### openai 설치 + +OpenAI 또는 Azure OpenAI와 상호작용하기 위한 다양한 라이브러리가 있습니다. 그리고 이러한 다양한 라이브러리에서는 C#, Python, JavaScript, Java 등 다양한 프로그래밍 언어를 사용할 수도 있습니다. 저희는 `openai` Python 라이브러리를 사용하기로 선택했으므로, `pip`를 사용하여 설치하겠습니다. + +```bash +pip install openai +``` + +### 리소스 생성 + +다음 단계를 수행해야 합니다: + +- Azure에 계정을 만듭니다. [https://azure.microsoft.com/free/](https://azure.microsoft.com/free/?WT.mc_id=academic-105485-koreyst)에서 계정을 만드세요. +- Azure Open AI에 액세스 권한을 얻으세요. [https://learn.microsoft.com/azure/ai-services/openai/overview#how-do-i-get-access-to-azure-openai](https://learn.microsoft.com/azure/ai-services/openai/overview#how-do-i-get-access-to-azure-openai?WT.mc_id=academic-105485-koreyst)로 이동하여 액세스를 요청하세요. + +> [!NOTE] +> 작성 시점에서 Azure Open AI에 대한 액세스 신청이 필요합니다. + +- Python을 설치합니다. +- Azure OpenAI 서비스 리소스를 생성했습니다. [리소스 생성 가이드](https://learn.microsoft.com/azure/ai-services/openai/how-to/create-resource?pivots=web-portal?WT.mc_id=academic-105485-koreyst)를 참조하세요. + +### API 키와 엔드포인트 찾기 + +이 시점에서 `openai` 라이브러리에 사용할 API 키를 알려야 합니다. API 키를 찾으려면 Azure Open AI 리소스의 "Keys and Endpoint" 섹션으로 이동하고 "Key 1" 값을 복사하세요. + +![Azure Portal의 Keys and Endpoint 리소스 블레이드](https://learn.microsoft.com/azure/ai-services/openai/media/quickstarts/endpoint.png?WT.mc_id=academic-105485-koreyst) + +이제 이 정보를 복사했으니, 라이브러리에 사용하도록 지시합시다. + +> [!NOTE] +> API 키를 코드와 분리하는 것이 좋습니다. 이를 위해 환경 변수를 사용할 수 있습니다. +> +> - 환경 변수 `OPENAI_API_KEY`를 API 키로 설정하세요. +> `export OPENAI_API_KEY='sk-...'` + +### Azure 설정 구성 + +Azure Open AI를 사용하는 경우, 다음과 같이 설정을 구성할 수 있습니다: + +```python +openai.api_type = 'azure' +openai.api_key = os.environ["OPENAI_API_KEY"] +openai.api_version = '2023-05-15' +openai.api_base = os.getenv("API_BASE") +``` + +위에서는 다음과 같이 설정하고 있습니다: + +- `api_type`을 `azure`로 설정합니다. 이는 라이브러리가 OpenAI가 아닌 Azure Open AI를 사용하도록 지시합니다. +- `api_key`는 Azure Portal에서 찾을 수 있는 API 키입니다. +- `api_version`은 사용하려는 API의 버전입니다. 작성 시점에서 최신 버전은 `2023-05-15`입니다. +- `api_base`는 API의 엔드포인트입니다. API 키 옆에 Azure Portal에서 찾을 수 있습니다. + +> [!NOTE] +> `os.getenv`는 환경 변수를 읽는 함수입니다. `OPENAI_API_KEY`와 `API_BASE`와 같은 환경 변수를 읽을 때 사용할 수 있습니다. 이러한 환경 변수는 터미널에서 설정하거나 `dotenv`와 같은 라이브러리를 사용하여 설정할 수 있습니다. + +## 텍스트 생성 + +텍스트를 생성하는 방법은 `Completion` 클래스를 사용하는 것입니다. 다음은 예시입니다: + +```python +prompt = "Complete the following: Once upon a time there was a" + +completion = openai.Completion.create(model="davinci-002", prompt=prompt) +print(completion.choices[0].text) +``` + +위의 코드에서는 완성 객체를 생성하고 사용할 모델과 프롬프트를 전달합니다. 그런 다음 생성된 텍스트를 출력합니다. + +### 채팅 completions + +지금까지 `Completion`을 사용하여 텍스트를 생성하는 방법을 살펴보았습니다. 그러나 챗봇에 더 적합한 `ChatCompletion`이라는 다른 클래스도 있습니다. 다음은 사용 예시입니다: + +```python +import openai + +openai.api_key = "sk-..." + +completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Hello world"}]) +print(completion.choices[0].message.content) +``` + +이 기능에 대한 자세한 내용은 다음 장에서 다룰 예정입니다. + +## 연습 - 첫 번째 텍스트 생성 앱 + +이제 openai를 설정하고 구성하는 방법을 배웠으니, 첫 번째 텍스트 생성 앱을 만들어 보는 시간입니다. 앱을 만들기 위해 다음 단계를 따르세요: + +1. 가상 환경을 생성하고 openai를 설치하세요: + + ```bash + python -m venv venv + source venv/bin/activate + pip install openai + ``` + +> [!NOTE] +> Windows를 사용하는 경우 `source venv/bin/activate` 대신 `venv\Scripts\activate`를 입력하세요. + +> [!NOTE] +> Azure Open AI 키를 찾으려면 [https://portal.azure.com/](https://portal.azure.com/?WT.mc_id=academic-105485-koreyst)로 이동하여 `Open AI`를 검색한 다음 `Open AI 리소스`를 선택하고 `Keys and Endpoint`를 선택하고 `Key 1` 값을 복사하세요. + +1. *app.py* 파일을 생성하고 다음 코드를 추가하세요: + + ```python + import openai + + openai.api_key = "" + + openai.api_type = 'azure' + openai.api_version = '2023-05-15' + openai.api_base = "" + deployment_name = "" + + # add your completion code + prompt = "Complete the following: Once upon a time there was a" + + # make completion + completion = openai.Completion.create(engine= deployment_name, model="davinci-002", prompt=prompt) + + # print response + print(completion.choices[0].text) + ``` + +> [!NOTE] +> Azure Open AI를 사용하는 경우, `api_type`을 `azure`로 설정하고 `api_key`를 Azure Open AI 키로 설정해야 합니다. + + 다음과 같은 출력을 볼 수 있어야 합니다: + + ```output + very unhappy _____. + + Once upon a time there was a very unhappy mermaid. + ``` + +## 서로 다른 유형의 프롬프트를, 서로 다른 용도에 맞게 + +이제 프롬프트를 사용하여 텍스트를 생성하는 방법을 보았습니다. 심지어 다양한 유형의 텍스트를 생성하기 위해 수정하고 변경할 수 있는 프로그램이 작동 중입니다. + +프롬프트는 다양한 작업에 사용할 수 있습니다. 예를 들어: + +- **텍스트 유형 생성**. 시, 퀴즈 질문 등을 생성할 수 있습니다. +- **정보 조회**. '웹 개발에서 CORS는 무엇을 의미하는가?'와 같은 정보를 조회하는 데 프롬프트를 사용할 수 있습니다. +- **코드 생성**. 이메일 유효성 검사에 사용되는 정규식 또는 웹 앱과 같은 전체 프로그램을 생성하는 데 프롬프트를 사용할 수 있습니다. + +## 더 실용적인 사용 사례: 레시피 생성기 + +가정에 있는 재료로 무언가 요리하고 싶을 때 레시피가 필요합니다. 레시피를 찾는 방법은 검색 엔진을 사용하거나 LLM을 사용할 수도 있습니다. + +다음과 같은 프롬프트를 작성할 수 있습니다: + +> "닭, 감자, 당근을 사용한 요리 5개를 보여주세요. 각 레시피에 사용된 모든 재료를 나열해주세요." + +위의 프롬프트를 주면 다음과 유사한 응답을 받을 수 있습니다: + +```output +1. Roasted Chicken and Vegetables: +Ingredients: +- 4 chicken thighs +- 2 potatoes, cut into cubes +- 2 carrots, cut into cubes +- 2 tablespoons olive oil +- 2 cloves garlic, minced +- 1 teaspoon dried thyme +- 1 teaspoon dried oregano +- Salt and pepper, to taste + +2. Chicken and Potato Stew: +Ingredients: +- 2 tablespoons olive oil +- 1 onion, diced +- 2 cloves garlic, minced +- 2 chicken breasts, cut into cubes +- 2 potatoes, cut into cubes +- 2 carrots, cut into cubes +- 1 teaspoon dried oregano +- 1 teaspoon dried thyme +- 1 cup chicken broth +- Salt and pepper, to taste + +3. Chicken and Potato Bake: +Ingredients: +- 2 tablespoons olive oil +- 2 chicken breasts, cut into cubes +- 2 potatoes, cut into cubes +- 2 carrots, cut into cubes +- 1 onion, diced +- 2 cloves garlic, minced +- 1 teaspoon dried oregano +- 1 teaspoon dried thyme +- 1 cup chicken broth +- Salt and pepper, to taste + +4. Chicken and Potato Soup: +Ingredients: +- 2 tablespoons olive oil +- 1 onion, diced +- 2 cloves garlic, minced +- 2 chicken breasts, cut into cubes +- 2 potatoes, cut into cubes +- 2 carrots, cut into cubes +- 1 teaspoon dried oregano +- 1 teaspoon dried thyme +- 4 cups chicken broth +- Salt and pepper, to taste + +5. Chicken and Potato Hash: +Ingredients: +- 2 tablespoons olive oil +- 2 chicken breasts, cut into cubes +- 2 potatoes, cut into cubes +- 2 carrots, cut into cubes +- 1 onion, diced +- 2 cloves garlic, minced +- 1 teaspoon dried oregano +``` + +이 결과는 훌륭합니다. 무엇을 요리할지 알게 되었습니다. 이제 유용한 개선 사항은 다음과 같습니다: + +- 싫어하는 재료나 알레르기가 있는 재료를 걸러내기. +- 재료가 부족한 경우를 대비해 쇼핑 목록을 작성하기. + +위의 경우에 대해 추가적인 프롬프트를 추가해 보겠습니다: + +> "대파를 대체할 다른 재료로 대체하고, 알레르기가 있는 사람을 위해 마늘이 포함된 레시피를 제거해주세요. 또한, 닭고기, 감자, 당근은 이미 집에 있으므로 쇼핑 목록을 작성해주세요." + +이제 새로운 결과가 있습니다: + +```output +1. Roasted Chicken and Vegetables: +Ingredients: +- 4 chicken thighs +- 2 potatoes, cut into cubes +- 2 carrots, cut into cubes +- 2 tablespoons olive oil +- 1 teaspoon dried thyme +- 1 teaspoon dried oregano +- Salt and pepper, to taste + +2. Chicken and Potato Stew: +Ingredients: +- 2 tablespoons olive oil +- 1 onion, diced +- 2 chicken breasts, cut into cubes +- 2 potatoes, cut into cubes +- 2 carrots, cut into cubes +- 1 teaspoon dried oregano +- 1 teaspoon dried thyme +- 1 cup chicken broth +- Salt and pepper, to taste + +3. Chicken and Potato Bake: +Ingredients: +- 2 tablespoons olive oil +- 2 chicken breasts, cut into cubes +- 2 potatoes, cut into cubes +- 2 carrots, cut into cubes +- 1 onion, diced +- 1 teaspoon dried oregano +- 1 teaspoon dried thyme +- 1 cup chicken broth +- Salt and pepper, to taste + +4. Chicken and Potato Soup: +Ingredients: +- 2 tablespoons olive oil +- 1 onion, diced +- 2 chicken breasts, cut into cubes +- 2 potatoes, cut into cubes +- 2 carrots, cut into cubes +- 1 teaspoon dried oregano +- 1 teaspoon dried thyme +- 4 cups chicken broth +- Salt and pepper, to taste + +5. Chicken and Potato Hash: +Ingredients: +- 2 tablespoons olive oil +- 2 chicken breasts, cut into cubes +- 2 potatoes, cut into cubes +- 2 carrots, cut into cubes +- 1 onion, diced +- 1 teaspoon dried oregano + +Shopping List: +- Olive oil +- Onion +- Thyme +- Oregano +- Salt +- Pepper +``` + +이것이 당신의 다섯 가지 레시피입니다. 마늘은 포함되지 않았으며, 집에 이미 있는 재료를 고려한 쇼핑 목록도 있습니다. + +## 연습 - 레시피 생성기 만들기 + +이제 우리가 시나리오를 플레이했으니, 해당 시나리오와 일치하는 코드를 작성해 봅시다. 다음 단계를 따라주세요: + +1. 기존의 *app.py* 파일을 시작점으로 사용합니다. +2. `prompt` 변수를 찾아서 다음과 같이 코드를 변경합니다: + + ```python + prompt = "Show me 5 recipes for a dish with the following ingredients: chicken, potatoes, and carrots. Per recipe, list all the ingredients used" + ``` + + 코드를 실행하면 다음과 유사한 출력이 표시됩니다: + + ```output + -Chicken Stew with Potatoes and Carrots: 3 tablespoons oil, 1 onion, chopped, 2 cloves garlic, minced, 1 carrot, peeled and chopped, 1 potato, peeled and chopped, 1 bay leaf, 1 thyme sprig, 1/2 teaspoon salt, 1/4 teaspoon black pepper, 1 1/2 cups chicken broth, 1/2 cup dry white wine, 2 tablespoons chopped fresh parsley, 2 tablespoons unsalted butter, 1 1/2 pounds boneless, skinless chicken thighs, cut into 1-inch pieces + -Oven-Roasted Chicken with Potatoes and Carrots: 3 tablespoons extra-virgin olive oil, 1 tablespoon Dijon mustard, 1 tablespoon chopped fresh rosemary, 1 tablespoon chopped fresh thyme, 4 cloves garlic, minced, 1 1/2 pounds small red potatoes, quartered, 1 1/2 pounds carrots, quartered lengthwise, 1/2 teaspoon salt, 1/4 teaspoon black pepper, 1 (4-pound) whole chicken + -Chicken, Potato, and Carrot Casserole: cooking spray, 1 large onion, chopped, 2 cloves garlic, minced, 1 carrot, peeled and shredded, 1 potato, peeled and shredded, 1/2 teaspoon dried thyme leaves, 1/4 teaspoon salt, 1/4 teaspoon black pepper, 2 cups fat-free, low-sodium chicken broth, 1 cup frozen peas, 1/4 cup all-purpose flour, 1 cup 2% reduced-fat milk, 1/4 cup grated Parmesan cheese + + -One Pot Chicken and Potato Dinner: 2 tablespoons olive oil, 1 pound boneless, skinless chicken thighs, cut into 1-inch pieces, 1 large onion, chopped, 3 cloves garlic, minced, 1 carrot, peeled and chopped, 1 potato, peeled and chopped, 1 bay leaf, 1 thyme sprig, 1/2 teaspoon salt, 1/4 teaspoon black pepper, 2 cups chicken broth, 1/2 cup dry white wine + + -Chicken, Potato, and Carrot Curry: 1 tablespoon vegetable oil, 1 large onion, chopped, 2 cloves garlic, minced, 1 carrot, peeled and chopped, 1 potato, peeled and chopped, 1 teaspoon ground coriander, 1 teaspoon ground cumin, 1/2 teaspoon ground turmeric, 1/2 teaspoon ground ginger, 1/4 teaspoon cayenne pepper, 2 cups chicken broth, 1/2 cup dry white wine, 1 (15-ounce) can chickpeas, drained and rinsed, 1/2 cup raisins, 1/2 cup chopped fresh cilantro + ``` + + > 참고: LLM은 결정론적이지 않으므로 프로그램을 실행할 때마다 다른 결과를 얻을 수 있습니다. + + 좋아요, 어떻게 개선할 수 있는지 알아봅시다. 개선하기 위해 코드가 유연하도록 만들어야 합니다. 따라서 재료와 레시피 수를 개선하고 변경할 수 있어야 합니다. + +1. 다음과 같이 코드를 변경해 봅시다: + + ```python + no_recipes = input("No of recipes (for example, 5: ") + + ingredients = input("List of ingredients (for example, chicken, potatoes, and carrots: ") + + # interpolate the number of recipes into the prompt an ingredients + prompt = f"Show me {no_recipes} recipes for a dish with the following ingredients: {ingredients}. Per recipe, list all the ingredients used" + ``` + + 코드를 테스트 실행하면 결과가 다음과 같을 수 있습니다: + + ```output + No of recipes (for example, 5: 3 + List of ingredients (for example, chicken, potatoes, and carrots: milk,strawberries + + -Strawberry milk shake: milk, strawberries, sugar, vanilla extract, ice cubes + -Strawberry shortcake: milk, flour, baking powder, sugar, salt, unsalted butter, strawberries, whipped cream + -Strawberry milk: milk, strawberries, sugar, vanilla extract + ``` + +### 필터와 쇼핑 목록 추가로 개선하기 + +이제 우리는 레시피를 생성할 수 있는 작동하는 앱을 가지고 있으며, 이 앱은 사용자의 입력에 의존하여 레시피 수와 사용되는 재료를 유연하게 조정할 수 있습니다. + +그리고 더 개선하기 위해 다음을 추가하고 싶습니다: + +- **재료 필터링**. 싫어하는 재료나 알레르기 반응이 있는 재료를 필터링할 수 있도록 하고 싶습니다. 이 변경을 위해 기존의 프롬프트를 수정하여 끝에 필터 조건을 추가할 수 있습니다: + + ```python + filter = input("Filter (for example, vegetarian, vegan, or gluten-free: ") + + prompt = f"Show me {no_recipes} recipes for a dish with the following ingredients: {ingredients}. Per recipe, list all the ingredients used, no {filter}" + ``` + + 위에서는 프롬프트 끝에 `{filter}`를 추가하고 사용자로부터 필터 값을 입력받도록 합니다. + + 프로그램을 실행하는 예시 입력은 다음과 같을 수 있습니다: + + ```output + No of recipes (for example, 5: 3 + List of ingredients (for example, chicken, potatoes, and carrots: onion,milk + Filter (for example, vegetarian, vegan, or gluten-free: no milk + + 1. French Onion Soup + + Ingredients: + + -1 large onion, sliced + -3 cups beef broth + -1 cup milk + -6 slices french bread + -1/4 cup shredded Parmesan cheese + -1 tablespoon butter + -1 teaspoon dried thyme + -1/4 teaspoon salt + -1/4 teaspoon black pepper + + Instructions: + + 1. In a large pot, sauté onions in butter until golden brown. + 2. Add beef broth, milk, thyme, salt, and pepper. Bring to a boil. + 3. Reduce heat and simmer for 10 minutes. + 4. Place french bread slices on soup bowls. + 5. Ladle soup over bread. + 6. Sprinkle with Parmesan cheese. + + 2. Onion and Potato Soup + + Ingredients: + + -1 large onion, chopped + -2 cups potatoes, diced + -3 cups vegetable broth + -1 cup milk + -1/4 teaspoon black pepper + + Instructions: + + 1. In a large pot, sauté onions in butter until golden brown. + 2. Add potatoes, vegetable broth, milk, and pepper. Bring to a boil. + 3. Reduce heat and simmer for 10 minutes. + 4. Serve hot. + + 3. Creamy Onion Soup + + Ingredients: + + -1 large onion, chopped + -3 cups vegetable broth + -1 cup milk + -1/4 teaspoon black pepper + -1/4 cup all-purpose flour + -1/2 cup shredded Parmesan cheese + + Instructions: + + 1. In a large pot, sauté onions in butter until golden brown. + 2. Add vegetable broth, milk, and pepper. Bring to a boil. + 3. Reduce heat and simmer for 10 minutes. + 4. In a small bowl, whisk together flour and Parmesan cheese until smooth. + 5. Add to soup and simmer for an additional 5 minutes, or until soup has thickened. + ``` + + 보시다시피, 우유가 들어간 레시피는 필터링되었습니다. 그러나 유당 불내증이 있다면 치즈가 들어간 레시피도 필터링하고 싶을 수 있으므로 명확하게 해야합니다. + + +- **쇼핑 목록 생성**. 우리는 이미 집에 있는 재료를 고려하여 쇼핑 목록을 생성하고 싶습니다. + + 이 기능을 위해 우리는 하나의 프롬프트에서 모든 것을 해결하려고 시도할 수도 있고, 두 개의 프롬프트로 나눠서 해결할 수도 있습니다. 후자의 접근 방식을 시도해 보겠습니다. 여기서는 추가적인 프롬프트를 추가하는 것을 제안하고 있습니다. 그러나 이를 위해 이전 프롬프트의 결과를 후자의 프롬프트에 컨텍스트로 추가해야 합니다. + + 코드에서 첫 번째 프롬프트의 결과를 출력하는 부분을 찾아서 다음 코드를 아래에 추가하세요: + + ```python + old_prompt_result = completion.choices[0].text + prompt = "Produce a shopping list for the generated recipes and please don't include ingredients that I already have." + + new_prompt = f"{old_prompt_result} {prompt}" + completion = openai.Completion.create(engine=deployment_name, prompt=new_prompt, max_tokens=1200) + + # print response + print("Shopping list:") + print(completion.choices[0].text) + ``` + + 다음 사항을 주목하세요: + + 1. 첫 번째 프롬프트의 결과를 새로운 프롬프트에 추가하여 새로운 프롬프트를 구성합니다: + + ```python + new_prompt = f"{old_prompt_result} {prompt}" + ``` + + 2. 첫 번째 프롬프트에서 요청한 토큰 수를 고려하여 새로운 요청을 만듭니다. 이번에는 `max_tokens`을 1200으로 설정합니다. + + ```python + completion = openai.Completion.create(engine=deployment_name, prompt=new_prompt, max_tokens=1200) + ``` + + Taking this code for a spin, we now arrive at the following output: + + ```output + No of recipes (for example, 5: 2 + List of ingredients (for example, chicken, potatoes, and carrots: apple,flour + Filter (for example, vegetarian, vegan, or gluten-free: sugar + + + -Apple and flour pancakes: 1 cup flour, 1/2 tsp baking powder, 1/2 tsp baking soda, 1/4 tsp salt, 1 tbsp sugar, 1 egg, 1 cup buttermilk or sour milk, 1/4 cup melted butter, 1 Granny Smith apple, peeled and grated + -Apple fritters: 1-1/2 cups flour, 1 tsp baking powder, 1/4 tsp salt, 1/4 tsp baking soda, 1/4 tsp nutmeg, 1/4 tsp cinnamon, 1/4 tsp allspice, 1/4 cup sugar, 1/4 cup vegetable shortening, 1/4 cup milk, 1 egg, 2 cups shredded, peeled apples + Shopping list: + -Flour, baking powder, baking soda, salt, sugar, egg, buttermilk, butter, apple, nutmeg, cinnamon, allspice + ``` + +## 설정 개선하기 + +지금까지 작성한 코드는 작동하지만, 더 개선할 수 있는 몇 가지 조정 사항이 있습니다. 우리가 해야 할 몇 가지 작업은 다음과 같습니다: + +- **비밀 정보와 코드 분리하기**, 예를 들어 API 키와 같은 비밀 정보는 코드에 포함되어서는 안 됩니다. 비밀 정보를 코드와 분리하기 위해 환경 변수와 `python-dotenv`와 같은 라이브러리를 사용하여 파일에서 로드할 수 있습니다. 코드에서 이렇게 구현할 수 있습니다: + + 1. `.env` 파일을 다음 내용으로 생성하세요: + + ```bash + OPENAI_API_KEY=sk-... + ``` + + > 참고로, Azure의 경우 다음 환경 변수를 설정해야 합니다: + + ```bash + OPENAI_API_TYPE=azure + OPENAI_API_VERSION=2023-05-15 + OPENAI_API_BASE= + ``` + + 코드에서는 다음과 같이 환경 변수를 로드합니다: + + ```python + from dotenv import load_dotenv + + load_dotenv() + + openai.api_key = os.environ["OPENAI_API_KEY"] + ``` + +- **토큰 길이에 대한 고려사항**. 우리는 원하는 텍스트를 생성하기 위해 얼마나 많은 토큰이 필요한지 고려해야 합니다. 토큰은 비용이 들기 때문에 가능한 경우, 토큰의 수를 절약할 수 있는 방법을 고려해야 합니다. 예를 들어, 프롬프트를 어떻게 구성하면 더 적은 토큰을 사용할 수 있을까요? + + 사용할 토큰을 변경하려면 `max_tokens` 매개변수를 사용할 수 있습니다. 예를 들어, 100개의 토큰을 사용하려면 다음과 같이 할 수 있습니다: + + ```python + completion = openai.Completion.create(model="davinci-002", prompt=prompt, max_tokens=100) + ``` + +- **temperature 조절 실험**. temperature는 우리가 지금까지 언급하지 않았지만, 프로그램의 동작에 중요한 맥락입니다. temperature 값이 높을수록 출력이 더 무작위적이 됩니다. 반대로, temperature 값이 낮을수록 출력이 더 예측 가능해집니다. 출력에 변화를 원하는지 여부를 고려해보세요. + + temperature를 변경하려면 `temperature` 매개변수를 사용할 수 있습니다. 예를 들어, temperature를 0.5로 설정하려면 다음과 같이 할 수 있습니다: + + ```python + completion = openai.Completion.create(model="davinci-002", prompt=prompt, temperature=0.5) + ``` + +> 참고로, 값이 1.0에 가까울수록 출력이 더 다양해집니다. + +## 과제 + +이 과제에서는 무엇을 구축할지 선택할 수 있습니다. + +다음은 몇 가지 제안 사항입니다: + +- 레시피 생성기 앱을 더 개선해 보세요. temperature 값과 프롬프트를 조정하여 어떤 결과를 얻을 수 있는지 확인해보세요. +- "스터디 버디"를 만들어 보세요. 이 앱은 Python과 같은 주제에 대한 질문에 답변할 수 있어야 합니다. "Python에서 특정 주제는 무엇인가요?"와 같은 프롬프트를 사용하거나, 특정 주제에 대한 코드를 보여달라는 프롬프트를 사용할 수도 있습니다. +- 역사 봇을 만들어 역사를 생생하게 만들어 보세요. 봇에게 특정 역사적 인물로 역할을 맡게 하고, 그 인물에 대한 생애와 시대에 대해 질문해 보세요. + +## 정답 예시 + +### 스터디 버디 + +아래는 시작 프롬프트입니다. 이를 활용하고 원하는 대로 조정해보세요. + +```text +- "You're an expert on the Python language + + Suggest a beginner lesson for Python in the following format: + + Format: + - concepts: + - brief explanation of the lesson: + - exercise in code with solutions" +``` + +### 역사 봇 + +다음은 사용할 수 있는 몇 가지 프롬프트입니다: + +```text +- "You are Abe Lincoln, tell me about yourself in 3 sentences, and respond using grammar and words like Abe would have used" +- "You are Abe Lincoln, respond using grammar and words like Abe would have used: + + Tell me about your greatest accomplishments, in 300 words" +``` + +## 지식 확인 + +temperature 개념은 무엇을 하는 역할인가요? + +1. 출력의 무작위성을 조절합니다. +2. 응답의 크기를 조절합니다. +3. 사용되는 토큰의 수를 조절합니다. + + +## 🚀 도전과제 + +과제를 수행할 때, temperature 값을 다양하게 변경해보세요. 0, 0.5, 1로 설정해보세요. 기억해주세요, 0은 가장 일정하고 1은 가장 다양한 값을 의미합니다. 어떤 값이 앱에 가장 적합한지 확인해보세요. + +## 수고하셨습니다! 학습을 계속하세요 + +이 수업을 완료한 후에는 [Generative AI 학습 컬렉션](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)을 확인하여 Generative AI 지식을 더욱 향상시킬 수 있습니다! + +7번 수업으로 이동하여 [채팅 애플리케이션을 구축하는 방법](../../../07-building-chat-applications/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)을 살펴보세요! diff --git a/07-building-chat-applications/translations/ko/README.md b/07-building-chat-applications/translations/ko/README.md new file mode 100644 index 000000000..53607e8ef --- /dev/null +++ b/07-building-chat-applications/translations/ko/README.md @@ -0,0 +1,184 @@ +# 생성형 AI를 활용한 채팅 애플리케이션 구축 + +[![Generative AI를 활용한 채팅 애플리케이션 구축](../../images/07-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://youtu.be/Kw4i-tlKMrQ?WT.mc_id=academic-105485-koreyst) + +> *(위의 이미지를 클릭하여 이 레슨의 비디오를 시청하세요)* + +텍스트 생성 앱을 구축하는 방법을 살펴보았으니 이제 채팅 애플리케이션에 대해 알아보겠습니다. + +채팅 애플리케이션은 우리의 일상에 통합되어 있으며, 단순한 대화 수단 이상을 제공합니다. 고객 서비스, 기술 지원, 심지어 정교한 상담 시스템의 핵심 요소입니다. 얼마 전에도 채팅 애플리케이션으로부터 도움을 받은 적이 있을 것입니다. 우리가 이러한 플랫폼에 생성형 AI와 같은 고급 기술을 통합할수록 복잡성과 도전 과제도 증가합니다. + +다음과 같은 몇 가지 질문에 대답해야 합니다: + +- **앱 구축**. 특정 사용 사례에 대해 이 AI 기반 애플리케이션을 효율적으로 구축하고 원활하게 통합하는 방법은 무엇인가요? +- **모니터링**. 배포된 후에는 기능과 [책임 있는 AI의 여섯 가지 원칙](https://www.microsoft.com/ai/responsible-ai?WT.mc_id=academic-105485-koreyst)을 준수하는 채로 애플리케이션이 최고 수준의 품질로 작동하는지 어떻게 모니터링할 수 있을까요? + +자동화와 원활한 인간-기계 상호작용으로 정의되는 시대로 나아감에 따라, 생성형 AI가 채팅 애플리케이션의 범위, 깊이 및 적응성을 어떻게 변화시키는지 이해하는 것이 필수적입니다. 이 레슨에서는 이러한 복잡한 시스템을 지원하는 아키텍처의 측면을 조사하고, 도메인 특정 작업에 대해 세밀하게 조정하는 방법을 탐구하며, 책임 있는 AI 배포를 보장하기 위한 지표와 고려 사항을 평가할 것입니다. + +## 소개 + +이 레슨에서는 다음을 다룹니다: + +- 효율적으로 채팅 애플리케이션을 구축하고 통합하는 기술. +- 응용 프로그램에 맞게 사용자 정의 및 세부 조정하는 방법. +- 채팅 애플리케이션을 효과적으로 모니터링하고 유지하는 전략 및 고려 사항. + +## 학습 목표 + +이 레슨을 마치면 다음을 할 수 있습니다: + +- 기존 시스템에 채팅 애플리케이션을 구축하고 통합하기 위한 고려 사항을 설명할 수 있습니다. +- 특정 사용 사례에 대해 채팅 애플리케이션을 사용자 정의할 수 있습니다. +- AI 기반 채팅 애플리케이션의 품질을 효과적으로 모니터링하고 유지하기 위한 주요 지표 및 고려 사항을 식별할 수 있습니다. +- 채팅 애플리케이션이 AI를 책임있게 활용하도록 보장할 수 있습니다. + +## 생성형 AI를 채팅 애플리케이션에 통합하기 + +생성형 AI를 통해 채팅 애플리케이션을 개선하는 것은 단순히 더 똑똑하게 만드는 것에만 관련되지 않습니다. 품질 좋은 사용자 경험을 제공하기 위해 아키텍처, 성능 및 사용자 인터페이스를 최적화하는 것입니다. 이에는 아키텍처 기반, API 통합 및 사용자 인터페이스 고려 사항을 조사하는 것이 포함됩니다. 이 섹션은 기존 시스템에 플러그인으로 제공하거나 독립적인 플랫폼으로 구축하는 경우에도 이러한 복잡한 영역을 탐색하기 위한 포괄적인 로드맵을 제공합니다. + +이 섹션을 마치면 채팅 애플리케이션을 효율적으로 구축하고 통합하기 위해 필요한 전문 지식을 갖추게 될 것입니다. + +### 챗봇 또는 채팅 애플리케이션? + +채팅 애플리케이션을 구축하기 전에 '챗봇'과 'AI 기반 채팅 애플리케이션'을 비교해보겠습니다. 이들은 서로 다른 역할과 기능을 제공합니다. 챗봇의 주된 목적은 자주 묻는 질문에 대답하거나 소포를 추적하는 등 특정 대화 작업을 자동화하는 것입니다. 일반적으로 규칙 기반 논리나 복잡한 AI 알고리즘에 의해 제어됩니다. 반면, AI 기반 채팅 애플리케이션은 인간 사용자 간의 텍스트, 음성 및 비디오 채팅과 같은 다양한 형태의 디지털 커뮤니케이션을 원활하게 하는 더 넓은 환경을 제공합니다. 그 중요한 특징은 다양한 입력과 문맥적 단서를 기반으로 응답을 생성하는 생성형 AI 모델을 통합한다는 것입니다. 생성형 AI 기반 채팅 애플리케이션은 오픈 도메인 토론에 참여하고, 변화하는 대화적 문맥에 적응하며, 창의적이거나 복잡한 대화도 생성할 수 있습니다. + +아래 표는 디지털 커뮤니케이션에서 각각의 역할을 이해하기 위해 주요 차이점과 유사점을 개요로 제시합니다. + +| 챗봇 | 생성형 AI 기반 채팅 애플리케이션 | +| ------------------------------------- | -------------------------------------- | +| 작업 중심 및 규칙 기반 | 문맥 인식 | +| 주로 대규모 시스템에 통합됨 | 하나 또는 여러 챗봇을 호스팅할 수 있음 | +| 사전에 프로그래밍된 기능으로 제한됨 | 생성형 AI 모델 통합 | +| 전문화되고 구조화된 상호작용 | 열린 도메인으로 토론 가능 | + +### SDK 및 API를 활용한 사전 구축된 기능 활용 + +채팅 애플리케이션을 구축할 때, 이미 존재하는 것을 평가하는 것은 매우 유리한 전략입니다. 잘 문서화된 SDK 및 API를 통합함으로써, 애플리케이션을 장기적으로 성공시키고, 확장성 및 유지보수 문제를 해결할 수 있습니다. + +- **개발 프로세스를 가속화하고 오버헤드를 줄임**: 비용이 많이 드는 기능을 직접 구축하는 대신, 사전 구축된 기능을 활용함으로써 비즈니스 로직과 같이 더 중요한 애플리케이션의 다른 측면에 집중할 수 있습니다. +- **더 나은 성능**: 처음부터 기능을 구축할 때, "확장성은 어떻게 되는가? 이 애플리케이션은 갑작스런 사용자 증가에 대응할 수 있는가?"라는 질문을 하게 될 것입니다. 잘 관리되는 SDK 및 API는 이러한 문제에 대한 솔루션을 내장하고 있습니다. +- **보다 쉬운 유지보수**: 대부분의 API 및 SDK는 라이브러리의 업데이트만으로 업데이트 및 개선을 쉽게 관리할 수 있습니다. +- **최첨단 기술에 대한 접근**: 사전에 세밀하게 조정되고 광범위한 데이터셋으로 훈련된 모델을 활용함으로써 애플리케이션에 자연어 기능을 제공할 수 있습니다. + +SDK 또는 API의 기능에 액세스하려면 일반적으로 제공된 서비스를 사용할 수 있는 권한을 얻어야 합니다. 이는 일반적으로 고유한 키 또는 인증 토큰을 사용하여 이루어집니다. 우리는 OpenAI Python 라이브러리를 사용하여 이를 탐색해볼 것입니다. 또한 이 레슨을 위한 [OpenAI 노트북](../../notebook-openai.ipynb?WT.mc_id=academic-105485-koreyst) 또는 [Azure OpenAI 서비스 노트북](../../notebook-azure-openai.ipynb?WT.mc_id=academic-105485-koreys)에서 직접 시도해볼 수도 있습니다. + +```python +import os +import openai + +openai.api_key = os.getenv("OPENAI_API_KEY") + +chat_completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Suggest two titles for an instructional lesson on chat applications for generative AI."}]) +``` + +위의 예제는 GPT-3.5 Turbo 모델을 사용하여 프롬프트를 완성하는 것을 보여줍니다. 그러나 주의할 점은 API 키를 설정하지 않으면 다음과 같은 오류가 발생합니다. + +```output +AuthenticationError: No API key provided. You can set your API key in code using 'openai.api_key = ', or you can set the environment variable OPENAI_API_KEY=). If your API key is stored in a file, you can point the openai module at it with 'openai.api_key_path = '. You can generate API keys in the OpenAI web interface. See https://platform.openai.com/account/api-keys for details. +``` + +## 사용자 경험 (UX) + +일반적인 UX 원칙은 채팅 애플리케이션에도 적용되지만, 기계 학습 구성 요소의 참여로 인해 특히 중요한 몇 가지 고려 사항이 있습니다. + +- **모호함에 대한 대응 메커니즘**: 생성형 AI 모델은 때로 모호한 답변을 생성할 수 있습니다. 사용자가 이러한 문제를 마주치면 해결을 요청할 수 있는 기능은 도움이 될 수 있습니다. +- **컨텍스트 보존**: 고급 생성형 AI 모델은 대화 내에서 컨텍스트를 기억할 수 있는 능력을 갖추고 있으며, 이는 사용자 경험에 필수적인 자산일 수 있습니다. 사용자가 컨텍스트를 제어하고 관리할 수 있는 기능은 사용자 경험을 향상시키지만, 민감한 사용자 정보를 보존하는 위험을 동반합니다. 이러한 정보를 얼마나 오래 저장할지에 대한 고려 사항, 예를 들어 보존 정책을 도입함으로써 컨텍스트의 필요성과 개인 정보 보호 사이의 균형을 맞출 수 있습니다. +- **개인화**: 학습하고 적응할 수 있는 AI 모델을 통해 사용자에게 맞춤화된 경험을 제공할 수 있습니다. 사용자 프로필과 같은 기능을 통해 사용자 경험을 맞춤화함으로써 사용자가 이해받는 느낌을 주고, 특정 답변을 찾는 데 도움을 줌으로써 더 효율적이고 만족스러운 상호작용을 가능하게 합니다. + +예를 들어, OpenAI의 ChatGPT에서 "사용자 정의 지침 (Custom instructions)" 설정은 개인화의 한 예입니다. 이 설정을 사용하면 프롬프트에 중요한 컨텍스트가 될 수 있는 자기 소개 정보를 제공할 수 있습니다. 다음은 사용자 정의 지침의 예입니다. + +![ChatGPT의 사용자 정의 지침 설정](../../images/custom-instructions.png?WT.mc_id=academic-105485-koreyst) + +이 "프로필"은 ChatGPT에게 연결 리스트에 대한 수업 계획을 생성하도록 요청합니다. ChatGPT는 사용자가 자신의 경험에 기반한 더 깊은 수업 계획을 원할 수 있다는 점을 고려합니다. + +![연결 리스트에 대한 수업 계획에 대한 ChatGPT의 프롬프트](../../images/lesson-plan-prompt.png?WT.mc_id=academic-105485-koreyst) + +### 대형 언어 모델을 위한 Microsoft의 시스템 메시지 프레임워크 + +[Microsoft는 LLM(대형 언어 모델)에서 응답을 생성할 때 효과적인 시스템 메시지 작성에 대한 지침](https://learn.microsoft.com/azure/ai-services/openai/concepts/system-message#define-the-models-output-format?WT.mc_id=academic-105485-koreyst)을 제공하고 있으며, 다음 4가지 영역으로 구분됩니다: + +1. 모델을 사용하는 대상, 기능 및 제한 사항 정의 +2. 모델의 출력 형식 정의 +3. 모델의 의도된 동작을 보여주는 구체적인 예시 제공 +4. 추가적인 동작 가이드라인 제공 + +### 접근성 + +시각, 청각, 운동, 인지 장애를 가진 사용자에게 잘 설계된 채팅 애플리케이션은 모두 사용할 수 있어야 합니다. 다음 목록은 다양한 사용자 장애에 대한 접근성을 향상시키기 위한 특정 기능을 설명합니다. + +- **시각 장애용 기능**: 고대비 테마와 크기 조절 가능한 텍스트, 스크린 리더 호환성. +- **청각 장애용 기능**: 텍스트 읽기 및 음성을 텍스트로 변환하는 기능, 오디오 알림을 위한 시각적 힌트. +- **운동 장애용 기능**: 키보드 탐색 지원, 음성 명령. +- **인지 장애용 기능**: 단순화된 언어 옵션. + +## 도메인별 언어 모델을 위한 맞춤화 및 세부 조정 + +회사의 전문 용어를 이해하고 사용자들이 일반적으로 가지는 특정 질문을 예상하는 채팅 애플리케이션을 상상해보세요. 여기에 언급할 가치가 있는 두 가지 접근 방식이 있습니다. + +- **DSL 모델 활용**: DSL은 도메인별 특정 언어를 의미합니다. 특정 도메인에 대한 DSL 모델을 활용하여 해당 도메인의 개념과 시나리오를 이해할 수 있습니다. +- **파인 튜닝 적용**: 파인 튜닝은 특정 데이터로 모델을 추가로 학습하는 과정입니다. + +## 맞춤화: DSL 사용 + +도메인별 언어 모델(DSL 모델)을 활용하면 전문적이고 문맥에 맞는 상호작용을 통해 사용자 참여를 높일 수 있습니다. 이는 특정 분야, 산업 또는 주제와 관련된 텍스트를 이해하고 생성하는 데 훈련되거나 세부 조정된 모델입니다. DSL 모델을 사용하는 옵션은 처음부터 훈련하는 것부터 SDK 및 API를 통해 기존 모델을 사용하는 것까지 다양합니다. 또 다른 옵션은 세부 조정으로, 기존 사전 훈련된 모델을 가져와 특정 도메인에 맞게 적응시키는 것입니다. + +## 맞춤화: 세부 조정 적용 + +세부 조정은 사전 훈련된 모델이 특정 도메인이나 특정 작업에서 부족한 경우에 고려됩니다. + +예를 들어, 의료 질문은 복잡하며 많은 문맥을 필요로 합니다. 의료 전문가가 환자를 진단할 때는 생활 방식이나 기존 질환과 같은 다양한 요소를 고려하며, 최신 의학 저널을 통해 진단을 검증하기도 합니다. 이러한 미묘한 시나리오에서는 일반적인 목적의 AI 채팅 애플리케이션이 신뢰할 수 있는 출처가 될 수 없습니다. + +### 시나리오: 의료 애플리케이션 + +의료 전문가를 지원하기 위해 설계된 채팅 애플리케이션을 고려해보세요. 이 애플리케이션은 치료 지침, 약물 상호작용 또는 최근 연구 결과에 대한 빠른 참고를 제공합니다. + +일반적인 목적의 모델은 기본적인 의료 질문에 대답하거나 일반적인 조언을 제공하는 데에는 적합할 수 있지만, 다음과 같은 상황에서는 어려움을 겪을 수 있습니다: + +- **매우 구체적이거나 복잡한 경우**: 예를 들어, 신경과 의사는 "소아 환자에서 약물 내성 간질에 대한 최신 관리 방법은 무엇인가요?"라고 애플리케이션에 물을 수 있습니다. +- **최신 개발에 대한 부족**: 일반적인 목적의 모델은 신경학과 약리학의 최신 개발을 반영한 현재 답변을 제공하는 데 어려움을 겪을 수 있습니다. + +이러한 경우, 전문 의료 데이터셋을 사용하여 모델을 세부 조정하면 복잡한 의료 문의에 대한 정확성과 신뢰성을 크게 향상시킬 수 있습니다. 이는 해당 도메인의 도전과 질문을 대표하는 대규모이고 관련성 있는 데이터셋에 액세스하는 것을 필요로 합니다. + +## 고품질 AI 기반 채팅 경험을 위한 고려 사항 + +이 섹션에서는 "고품질" 채팅 애플리케이션의 기준을 설명하며, 실행 가능한 지표를 수집하고 AI 기술을 책임있게 활용하는 프레임워크를 준수하는 것을 포함합니다. + +### 주요 지표 + +애플리케이션의 고품질 성능을 유지하기 위해 주요 지표와 고려 사항을 추적하는 것이 중요합니다. 이러한 측정은 애플리케이션의 기능뿐만 아니라 AI 모델의 품질과 사용자 경험을 평가하는 데 도움이 됩니다. 아래는 고려해야 할 기본, AI 및 사용자 경험 지표를 다루는 목록입니다. + +| 지표 | 정의 | 채팅 개발자를 위한 고려 사항 | +| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| **가동 시간 (Uptime)** | 애플리케이션이 사용자에게 작동 가능하고 접근 가능한 시간을 측정합니다. | 다운타임을 최소화하기 위해 어떻게 할 것인가요? | +| **응답 시간 (Response Time)** | 애플리케이션이 사용자의 쿼리에 응답하는 데 걸리는 시간을 측정합니다. | 응답 시간을 개선하기 위해 쿼리 처리를 어떻게 최적화할 수 있을까요? | +| **정확도 (Precision)** | 전체 양성 예측 중 실제 양성 예측의 비율 | 모델의 정확도를 어떻게 검증할 것인가요? | +| **재현율 (Recall), 민감도 (Sensitivity)** | 실제 양성 중 양성 예측의 비율 | 재현율 (recall)을 어떻게 측정하고 개선할 것인가요? | +| **F1 점수** | 정밀도 (precision)와 재현율 (recall)의 조화 평균으로, 두 가지 사이의 균형을 맞춥니다. | 목표 F1 점수는 무엇이며, 정밀도와 재현율을 어떻게 균형있게 유지할 것인가요? | +| **Perplexity** | 모델이 예측한 확률 분포가 실제 데이터의 분포와 얼마나 일치하는지 측정합니다. | Perplexity를 최소화하기 위해 어떻게 할 것인가요? | +| **사용자 만족도 지표** | 사용자가 애플리케이션에 대한 인식을 측정합니다. 주로 설문 조사를 통해 수집됩니다. | 얼마나 자주 사용자 피드백을 수집할 것인가요? 이를 기반으로 어떻게 적응할 것인가요? | +| **오류율 (Error Rate)** | 모델이 이해하거나 출력하는 데 발생하는 오류의 비율 | 오류율을 줄이기 위한 전략은 무엇인가요? | +| **재학습 주기** | 새로운 데이터와 통찰력을 반영하기 위해 모델을 업데이트하는 빈도 | 모델을 얼마나 자주 재학습할 것인가요? 재학습 주기를 트리거하는 요소는 무엇인가요? | +| **이상 탐지** | 예상되는 동작과 일치하지 않는 비정상적인 패턴을 식별하기 위한 도구와 기법 | 이상 탐지에 어떻게 대응할 것인가요? | + +### 채팅 애플리케이션에서 책임 있는 AI 실천 방법 구현 + +Microsoft의 책임 있는 AI 접근 방식은 AI 개발과 사용을 안내하는 여섯 가지 원칙을 도출했습니다. 아래는 원칙, 정의 및 채팅 개발자가 고려해야 할 사항과 그 중요성입니다. + +| 원칙 | Microsoft의 정의 | 채팅 개발자를 위한 고려 사항 | 중요성 | +| ---------------------- | ----------------------------------------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------- | +| 공정성 | AI 시스템은 모든 사람을 공정하게 대우해야 합니다. | 채팅 애플리케이션이 사용자 데이터를 기반으로 차별하지 않도록 보장합니다. | 사용자들 사이에서 신뢰와 포용성을 구축하며, 법적인 문제를 피할 수 있습니다. | +| 신뢰성과 안전성 | AI 시스템은 신뢰성 있고 안전하게 작동해야 합니다. | 테스트와 오류 방지를 구현하여 오류와 위험을 최소화합니다. | 사용자 만족도를 보장하고 잠재적인 피해를 방지합니다. | +| 개인 정보 보호와 보안 | AI 시스템은 안전하고 개인 정보를 존중해야 합니다. | 강력한 암호화와 데이터 보호 조치를 구현합니다. | 민감한 사용자 데이터를 보호하고 개인 정보 보호 법을 준수합니다. | +| 포용성 | AI 시스템은 모든 사람을 적극적으로 참여시켜야 합니다. | 다양한 대중을 위해 접근 가능하고 사용하기 쉬운 UI/UX를 디자인합니다. | 더 넓은 범위의 사람들이 효과적으로 애플리케이션을 사용할 수 있도록 보장합니다. | +| 투명성 | AI 시스템은 이해하기 쉬워야 합니다. | AI 응답에 대한 명확한 문서와 이유를 제공합니다. | 사용자는 결정 방식을 이해할 수 있을 때 시스템을 더 신뢰할 가능성이 높습니다. | +| 책임성 | 사람들은 AI 시스템에 대해 책임져야 합니다. | 감사 및 개선을 위한 명확한 프로세스를 수립합니다. | 실수가 발생한 경우 지속적인 개선과 수정 조치를 가능하게 합니다. | + +## 과제 + +[과제](../../notebook-azure-openai.ipynb?WT.mc_id=academic-105485-koreyst)를 확인하세요. 이 과제에서는 첫 번째 채팅 프롬프트 실행부터 텍스트 분류 및 요약 등 다양한 연습을 진행합니다. + +## 수고하셨습니다! 계속해서 학습을 진행하세요 + +이 레슨을 완료한 후 [Generative AI Learning collection](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)을 확인하여 Generative AI 지식을 계속해서 향상시킬 수 있습니다! + +[검색 애플리케이션 구축](../../../08-building-search-applications/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)을 시작하는 방법을 알아보려면 레슨 8로 이동하세요! diff --git a/08-building-search-applications/translations/ko/README.md b/08-building-search-applications/translations/ko/README.md new file mode 100644 index 000000000..d69c621f2 --- /dev/null +++ b/08-building-search-applications/translations/ko/README.md @@ -0,0 +1,162 @@ +# 검색 애플리케이션 만들기 + +[![Introduction to Generative AI and Large Language Models](../../images/08-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](TBD) + +> **비디오 제공 예정** + +LLM(대형 언어 모델)은 챗봇과 텍스트 생성 이상의 기능을 가지고 있습니다. Embedding을 사용하여 검색 애플리케이션을 만들 수도 있습니다. Embedding은 데이터의 수치적 표현인 벡터로, 데이터의 의미 기반 검색에 사용할 수 있습니다. + +이 레슨에서는 교육 스타트업을 위한 검색 애플리케이션을 만들 것입니다. 우리 스타트업은 개발도상국의 학생들에게 무료 교육을 제공하는 비영리 기관입니다. 우리 스타트업은 학생들이 AI에 대해 배울 수 있는 많은 수의 YouTube 비디오를 보유하고 있습니다. 우리 스타트업은 학생들이 질문을 입력하여 YouTube 비디오를 검색할 수 있는 검색 애플리케이션을 만들고자 합니다. + +예를 들어, 학생이 'Jupyter Notebook이란 무엇인가?' 또는 'Azure ML이란 무엇인가?'라고 입력할 수 있고, 검색 애플리케이션은 해당 질문과 관련된 YouTube 비디오 목록을 반환하며, 더 나아가 검색 애플리케이션은 질문의 답변이 있는 비디오의 위치로 이동할 수 있는 링크를 반환할 것입니다. + +## 소개 + +이 레슨에서는 다음 내용을 다룰 것입니다: + +- 의미 기반 검색과 키워드 검색의 차이점. +- 텍스트 Embedding이란 무엇인가. +- 텍스트 Embedding 인덱스 생성. +- 텍스트 Embedding 인덱스 검색. + +## 학습 목표 + +이 레슨을 마친 후에는 다음을 할 수 있습니다: + +- 의미 기반 검색과 키워드 검색의 차이를 설명할 수 있습니다. +- 텍스트 Embedding이란 무엇인지 설명할 수 있습니다. +- Embedding을 사용하여 데이터를 검색하는 애플리케이션을 만들 수 있습니다. + +## 검색 애플리케이션을 만드는 이유 + +검색 애플리케이션을 만드는 것은 Embedding을 사용하여 데이터를 검색하는 방법을 이해하는 데 도움이 됩니다. 또한 학생들이 정보를 빠르게 찾을 수 있는 검색 애플리케이션을 만드는 방법을 배우게 될 것입니다. + +이 레슨에는 Microsoft [AI Show](https://www.youtube.com/playlist?list=PLlrxD0HtieHi0mwteKBOfEeOYf0LJU4O1?WT.mc_id=academic-105485-koreyst) YouTube 채널의 YouTube 비디오 트랜스크립트의 Embedding 인덱스가 포함되어 있습니다. AI Show는 AI와 머신러닝에 대해 가르치는 YouTube 채널입니다. Embedding 인덱스에는 2023년 10월까지의 각 YouTube 트랜스크립트에 대한 Embedding이 포함되어 있습니다. 우리 스타트업을 위해 Embedding 인덱스를 사용하여 검색 애플리케이션을 만들 것입니다. 검색 애플리케이션은 질문의 답변이 있는 비디오의 위치로 이동할 수 있는 링크를 반환합니다. 이는 학생들이 필요한 정보를 빠르게 찾는 좋은 방법입니다. + +다음은 질문 'Azure ML에서 rstudio를 사용할 수 있나요?'에 대한 의미 기반 쿼리의 예입니다. YouTube URL을 확인해보면, 질문의 답변이 있는 비디오의 위치로 이동하는 타임스탬프가 URL에 포함되어 있습니다. + +![Semantic query for the question "can you use rstudio with Azure ML"](../../images/query-results.png?WT.mc_id=academic-105485-koreyst) + +## 의미 기반 검색이란 무엇인가요? + +이제 아마도 궁금해하실 것 같습니다. 의미 기반 검색이란 무엇일까요? 의미 기반 검색은 쿼리의 단어들의 의미, 즉 의미론을 활용하여 관련된 결과를 반환하는 검색 기술입니다. + +다음은 의미 기반 검색의 예시입니다. 예를 들어, 차를 구매하려고 한다고 가정해봅시다. '내 꿈의 차'라고 검색할 수 있습니다. 의미 기반 검색은 여러분이 차에 대해 '꿈을 꾸는' 것이 아니라 '이상적인' 차를 구매하려고 한다는 것을 이해합니다. 의미 기반 검색은 여러분의 의도를 이해하고 관련된 결과를 반환합니다. 반면에 '키워드 검색'은 차에 대한 꿈을 진정으로 검색하고 종종 관련 없는 결과를 반환합니다. + +## 텍스트 임베딩이란 무엇인가요? + +[텍스트 임베딩](https://en.wikipedia.org/wiki/Word_embedding?WT.mc_id=academic-105485-koreyst)은 [자연어 처리](https://en.wikipedia.org/wiki/Natural_language_processing?WT.mc_id=academic-105485-koreyst)에서 사용되는 텍스트 표현 기술입니다. 텍스트 임베딩은 텍스트의 의미론적인 수치적 표현입니다. 임베딩은 기계가 이해하기 쉬운 방식으로 데이터를 표현하는 데 사용됩니다. 텍스트 임베딩을 구축하기 위한 다양한 모델이 있지만, 이 레슨에서는 OpenAI 임베딩 모델을 사용하여 임베딩을 생성하는 방법에 초점을 맞출 것입니다. + +다음은 AI Show YouTube 채널의 에피소드 중 하나의 트랜스크립트에서 가져온 텍스트의 예시입니다: + +```text +오늘은 Azure Machine Learning에 대해 배우게 될 것입니다. +``` + +텍스트를 OpenAI Embedding API에 전달하면, 1536개의 숫자로 구성된 임베딩이 반환됩니다. 각 숫자는 텍스트의 다른 측면을 나타냅니다. 간결함을 위해, 임베딩의 첫 10개 숫자만 표시하면 아래와 같습니다. + +```python +[-0.006655829958617687, 0.0026128944009542465, 0.008792596869170666, -0.02446001023054123, -0.008540431968867779, 0.022071078419685364, -0.010703742504119873, 0.003311325330287218, -0.011632772162556648, -0.02187200076878071, ...] +``` + +## 임베딩 인덱스는 어떻게 생성되나요? + +이 레슨의 임베딩 인덱스는 일련의 Python 스크립트를 사용하여 생성되었습니다. 이 스크립트는 이 레슨의 `scripts` 폴더에 있는 [README](../../scripts/README.md?WT.mc_id=academic-105485-koreyst)와 함께 제공됩니다. 이 레슨을 완료하기 위해 이 스크립트를 실행할 필요는 없습니다. 왜냐하면 임베딩 인덱스가 이미 제공되기 때문입니다. + +이 스크립트는 다음과 같은 작업을 수행합니다: + +1. [AI Show](https://www.youtube.com/playlist?list=PLlrxD0HtieHi0mwteKBOfEeOYf0LJU4O1?WT.mc_id=academic-105485-koreyst) 재생목록의 각 YouTube 비디오의 트랜스크립트를 다운로드합니다. +2. [OpenAI Functions](https://learn.microsoft.com/azure/ai-services/openai/how-to/function-calling?WT.mc_id=academic-105485-koreyst)를 사용하여 YouTube 트랜스크립트의 처음 3분에서 스피커 이름을 추출하려고 시도합니다. 각 비디오의 스피커 이름은 `embedding_index_3m.json`이라는 임베딩 인덱스에 저장됩니다. +3. 그런 다음 트랜스크립트 텍스트를 **3분 텍스트 세그먼트**로 분할합니다. 세그먼트에는 임베딩이 잘리지 않도록 하고 더 나은 검색 문맥을 제공하기 위해 다음 세그먼트에서 약 20개의 단어가 겹치도록 설계되었습니다. +4. 각 텍스트 세그먼트는 OpenAI Chat API에 전달되어 텍스트를 60단어로 요약합니다. 이 요약은 임베딩 인덱스 `embedding_index_3m.json`에도 저장됩니다. +5. 마지막으로, 세그먼트 텍스트는 OpenAI Embedding API에 전달됩니다. Embedding API는 세그먼트의 의미론적인 의미를 나타내는 1536개의 숫자 벡터를 반환합니다. 세그먼트와 OpenAI Embedding 벡터는 임베딩 인덱스 `embedding_index_3m.json`에 저장됩니다. + +### 벡터 데이터베이스 + +레슨의 간소화를 위해 임베딩 인덱스는 `embedding_index_3m.json`이라는 JSON 파일에 저장되고 Pandas 데이터프레임으로 로드됩니다. 그러나 실제 운영 환경에서는 임베딩 인덱스를 [Azure Cognitive Search](https://learn.microsoft.com/training/modules/improve-search-results-vector-search?WT.mc_id=academic-105485-koreyst), [Redis](https://cookbook.openai.com/examples/vector_databases/redis/readme?WT.mc_id=academic-105485-koreyst), [Pinecone](https://cookbook.openai.com/examples/vector_databases/pinecone/readme?WT.mc_id=academic-105485-koreyst), [Weaviate](https://cookbook.openai.com/examples/vector_databases/weaviate/readme?WT.mc_id=academic-105485-koreyst)와 같은 벡터 데이터베이스에 저장됩니다. + +## 코사인 유사도 이해하기 + +텍스트 임베딩에 대해 배웠으니, 다음 단계는 코사인 유사도를 사용하여 데이터를 검색하고 특정 쿼리에 가장 유사한 임베딩을 찾는 방법을 배우는 것입니다. + +### 코사인 유사도란 무엇인가요? + +코사인 유사도는 두 벡터 사이의 유사성을 측정하는 방법으로, 이를 `최근접 이웃 검색 (nearest neighbor search)`이라고도 합니다. 코사인 유사도 검색을 수행하려면 OpenAI Embedding API를 사용하여 _쿼리_ 텍스트를 _벡터화_ 해야 합니다. 그런 다음 쿼리 벡터와 임베딩 인덱스의 각 벡터 간의 _코사인 유사도_ 를 계산합니다. 기억하세요, 임베딩 인덱스에는 각 YouTube 트랜스크립트 텍스트 세그먼트에 대한 벡터가 있습니다. 마지막으로, 코사인 유사도에 따라 결과를 정렬하고, 코사인 유사도가 가장 높은 텍스트 세그먼트가 쿼리와 가장 유사합니다. + +수학적인 관점에서 코사인 유사도는 다차원 공간에 투영된 두 벡터 사이의 각도의 코사인을 측정합니다. 이 측정은 유용합니다. 왜냐하면 두 문서가 크기 때문에 유클리드 거리로 인해 멀리 떨어져 있을지라도, 그들 사이의 각도가 더 작고 따라서 코사인 유사도가 더 높을 수 있기 때문입니다. 코사인 유사도 방정식에 대한 자세한 정보는 [코사인 유사도](https://en.wikipedia.org/wiki/Cosine_similarity?WT.mc_id=academic-105485-koreyst)를 참조하세요. + +## 첫 번째 검색 애플리케이션 만들기 + +이제 임베딩을 사용하여 검색 애플리케이션을 만드는 방법을 배우겠습니다. 검색 애플리케이션은 학생들이 질문을 입력하여 비디오를 검색할 수 있게 해줍니다. 검색 애플리케이션은 질문과 관련된 비디오 목록을 반환합니다. 또한 검색 애플리케이션은 질문의 답변이 있는 비디오의 위치로 이동할 수 있는 링크를 반환합니다. + +이 솔루션은 Windows 11, macOS 및 Ubuntu 22.04에서 Python 3.10 이상을 사용하여 빌드 및 테스트되었습니다. Python은 [python.org](https://www.python.org/downloads/?WT.mc_id=academic-105485-koreyst)에서 다운로드할 수 있습니다. + +## 과제 - 학생들이 사용할 수 있도록 검색 애플리케이션 만들기 + +이 레슨의 시작에서 우리 스타트업을 소개했습니다. 이제 학생들이 자신의 평가를 위해 검색 애플리케이션을 만들 수 있도록 해야 합니다. + +이 과제에서는 검색 애플리케이션을 구축하는 데 사용될 Azure OpenAI 서비스를 생성합니다. 다음 Azure OpenAI 서비스를 생성해야 합니다. 이 과제를 완료하려면 Azure 구독이 필요합니다. + +### Azure Cloud Shell 시작하기 + +1. [Azure portal](https://portal.azure.com/?WT.mc_id=academic-105485-koreyst)에 로그인합니다. +2. Azure 포털의 오른쪽 상단에 있는 Cloud Shell 아이콘을 선택합니다. +3. 환경 유형으로 **Bash**를 선택합니다. + +#### 리소스 그룹 생성 + +> 이 안내에서는 동부 미국에 있는 "semantic-video-search"라는 리소스 그룹을 사용합니다. +> 리소스 그룹의 이름을 변경할 수 있지만, 리소스의 위치를 변경할 때는 [모델 가용성 테이블](https://aka.ms/oai/models?WT.mc_id=academic-105485-koreyst)을 확인하세요. + +```shell +az group create --name semantic-video-search --location eastus +``` + +#### Azure OpenAI 서비스 리소스 생성 + +Azure Cloud Shell에서 다음 명령을 실행하여 Azure OpenAI 서비스 리소스를 생성합니다. + +```shell +az cognitiveservices account create --name semantic-video-openai --resource-group semantic-video-search \ + --location eastus --kind OpenAI --sku s0 +``` + +#### 애플리케이션에서 사용할 엔드포인트와 키 가져오기 + +Azure Cloud Shell에서 다음 명령을 실행하여 Azure OpenAI 서비스 리소스의 엔드포인트와 키를 가져옵니다. + +```shell +az cognitiveservices account show --name semantic-video-openai \ + --resource-group semantic-video-search | jq -r .properties.endpoint +az cognitiveservices account keys list --name semantic-video-openai \ + --resource-group semantic-video-search | jq -r .key1 +``` + +#### OpenAI 임베딩 모델 배포 + +Azure Cloud Shell에서 다음 명령을 실행하여 OpenAI 임베딩 모델을 배포합니다. + +```shell +az cognitiveservices account deployment create \ + --name semantic-video-openai \ + --resource-group semantic-video-search \ + --deployment-name text-embedding-ada-002 \ + --model-name text-embedding-ada-002 \ + --model-version "2" \ + --model-format OpenAI \ + --scale-settings-scale-type "Standard" +``` + +## 해답 + +GitHub Codespaces에서 [해답 노트북](../../solution.ipynb?WT.mc_id=academic-105485-koreyst)을 열고 Jupyter Notebook의 지침을 따르세요. + +노트북을 실행할 때, 쿼리를 입력하라는 메시지가 표시됩니다. 입력 상자는 다음과 같이 보일 것입니다: + +![사용자가 쿼리를 입력하는 입력 상자](../../images/notebook-search.png?WT.mc_id=academic-105485-koreyst) + +## 수고하셨습니다. 학습을 계속하세요! + +이 레슨을 완료한 후, [Generative AI 학습 컬렉션](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)을 확인하여 Generative AI 지식을 더욱 향상시킬 수 있습니다! + +Lesson 9로 이동하여 [이미지 생성 애플리케이션 구축하기](../../../09-building-image-applications/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)을 살펴보세요! diff --git a/09-building-image-applications/translations/ko/README.md b/09-building-image-applications/translations/ko/README.md new file mode 100644 index 000000000..3a9e681db --- /dev/null +++ b/09-building-image-applications/translations/ko/README.md @@ -0,0 +1,460 @@ +# 이미지 생성 애플리케이션 구축하기 + +[![Building Image Generation Applications](../../images/09-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](TBD) + +> **비디오 제공 예정** + +LLM은 텍스트 생성 이상의 기능을 갖고 있습니다. 텍스트 설명으로부터 이미지를 생성하는 것도 가능합니다. 이미지를 모달리티로 사용하는 것은 MedTech, 건축, 관광, 게임 개발 등 여러 분야에서 매우 유용할 수 있습니다. 이 장에서는 가장 인기 있는 이미지 생성 모델인 DALL-E와 Midjourney에 대해 알아보겠습니다. + +## 소개 + +이 레슨에서는 다음을 다룰 예정입니다: + +- 이미지 생성과 그 유용성 +- DALL-E와 Midjourney, 그들이 무엇이며 어떻게 작동하는지 +- 이미지 생성 애플리케이션을 구축하는 방법 + +## 학습 목표 + +이 레슨을 마치면 다음을 할 수 있게 될 것입니다: + +- 이미지 생성 애플리케이션을 구축할 수 있습니다. +- 메타 프롬프트를 사용하여 애플리케이션의 범위를 정의할 수 있습니다. +- DALL-E와 Midjourney와 함께 작업할 수 있습니다. + +## 이미지 생성 애플리케이션을 구축하는 이유 + +이미지 생성 애플리케이션은 생성적 AI의 능력을 탐색하는 좋은 방법입니다. 이미지 편집 및 합성과 같은 다양한 용도로 이미지를 생성할 수 있습니다. + +- **이미지 편집 및 합성**. 이미지 편집 및 이미지 합성과 같은 다양한 용도로 이미지를 생성할 수 있습니다. + +- **다양한 산업에 적용**. MedTech, 관광, 게임 개발 등 다양한 산업에 이미지를 생성하는 데 사용할 수 있습니다. + +## 시나리오: Edu4All + +이 레슨의 일환으로 Edu4All이라는 스타트업과 계속해서 작업할 예정입니다. 학생들은 자신들의 평가를 위해 이미지를 생성할 것입니다. 어떤 이미지를 생성할지는 학생들에게 달려 있지만, 그들은 자신들의 동화를 위한 일러스트를 만들거나 이야기를 위한 새로운 캐릭터를 만들거나 아이디어와 개념을 시각화하는 데 도움이 되는 이미지를 생성할 수 있습니다. + +예를 들어, Edu4All의 학생들이 수업에서 명소에 대해 작업한다면: + +![Edu4All 스타트업, 명소 수업, 에펠탑](../../images/startup.png?WT.mc_id=academic-105485-koreyst) + +다음과 같은 프롬프트를 사용하여 이미지를 생성할 수 있습니다. + +> "아침 햇살에 에펠탑 옆에 있는 개" + +## DALL-E와 Midjourney란 무엇인가요? + +[DALL-E](https://openai.com/dall-e-2?WT.mc_id=academic-105485-koreyst)와 [Midjourney](https://www.midjourney.com/?WT.mc_id=academic-105485-koreyst)는 가장 인기 있는 이미지 생성 모델 중 두 가지로, 텍스트를 사용하여 이미지를 생성할 수 있게 해줍니다. + +### DALL-E + +먼저 DALL-E부터 시작해보겠습니다. DALL-E는 텍스트 설명으로부터 이미지를 생성하는 생성형 AI 모델입니다. + +> [DALL-E는 CLIP과 diffused attention 두 모델의 조합입니다](https://towardsdatascience.com/openais-dall-e-and-clip-101-a-brief-introduction-3a4367280d4e?WT.mc_id=academic-105485-koreyst). + +- **CLIP**은 이미지와 텍스트로부터 데이터의 수치적 표현인 임베딩을 생성하는 모델입니다. + +- **Diffused attention**은 임베딩으로부터 이미지를 생성하는 모델입니다. DALL-E는 이미지와 텍스트 데이터셋으로 학습되며, 텍스트 설명으로부터 이미지를 생성할 수 있습니다. 예를 들어, DALL-E는 모자를 쓴 고양이 이미지나 모히칸을 한 개의 개 이미지를 생성할 수 있습니다. + +### Midjourney + +Midjourney는 DALL-E와 비슷한 방식으로 작동하며, 텍스트 프롬프트를 사용하여 이미지를 생성합니다. Midjourney는 "모자를 쓴 고양이"나 "모히칸을 한 개"와 같은 프롬프트를 사용하여 이미지를 생성할 수도 있습니다. + +![Image generated by Midjourney, mechanical pigeon](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/Rupert_Breheny_mechanical_dove_eca144e7-476d-4976-821d-a49c408e4f36.png/440px-Rupert_Breheny_mechanical_dove_eca144e7-476d-4976-821d-a49c408e4f36.png?WT.mc_id=academic-105485-koreyst) + +*이미지 출처: 위키백과, Midjourney가 생성한 이미지* + +## DALL-E와 Midjourney는 어떻게 작동하나요? + +먼저, [DALL-E](https://arxiv.org/pdf/2102.12092.pdf?WT.mc_id=academic-105485-koreyst)입니다. DALL-E는 *자기회귀 트랜스포머 (autoregressive transformer)* 를 기반으로 한 생성형 AI 모델입니다. + +*자기회귀 트랜스포머 (autoregressive transformer)* 는 모델이 텍스트 설명으로부터 이미지를 생성하는 방식을 정의합니다. 모델은 한 번에 한 픽셀을 생성하고, 생성된 픽셀을 사용하여 다음 픽셀을 생성합니다. 신경망의 여러 계층을 통과하여 이미지가 완성됩니다. + +이 과정을 통해 DALL-E는 생성된 이미지에서 속성, 객체, 특징 등을 제어할 수 있습니다. 더불어 DALL-E 2와 3은 생성된 이미지에 대해 더 많은 제어를 할 수 있습니다. + +## 첫 번째 이미지 생성 애플리케이션 구축하기 + +이미지 생성 애플리케이션을 구축하려면 어떤 라이브러리가 필요할까요? 다음 라이브러리가 필요합니다: + +- **python-dotenv**: 이 라이브러리를 사용하여 secrets를 코드에서 분리하여 *.env* 파일에 저장하는 것을 권장합니다. +- **openai**: OpenAI API와 상호 작용하기 위해 사용하는 라이브러리입니다. +- **pillow**: Python에서 이미지 작업을 위해 사용하는 라이브러리입니다. +- **requests**: HTTP 요청을 도와주는 라이브러리입니다. + +1. 다음 내용으로 *.env* 파일을 생성하세요: + + ```text + AZURE_OPENAI_ENDPOINT= + AZURE_OPENAI_KEY= + ``` + + 이 정보는 Azure Portal에서 리소스의 "Keys and Endpoint" 섹션에서 찾을 수 있습니다. + +1. 다음과 같이 *requirements.txt* 파일에 위의 라이브러리들을 모아두세요: + + ```text + python-dotenv + openai + pillow + requests + ``` + +1. 이제 가상 환경을 생성하고 라이브러리를 설치하세요: + + ```bash + python3 -m venv venv + source venv/bin/activate + pip install -r requirements.txt + ``` + + Windows의 경우 다음 명령을 사용하여 가상 환경을 생성하고 활성화하세요: + + ```bash + python3 -m venv venv + venv\Scripts\activate.bat + ```` + +1. *app.py*라는 파일에 다음 코드를 추가하세요: + + ```python + import openai + import os + import requests + from PIL import Image + import dotenv + + # dotenv 라이브러리를 불러옵니다. + dotenv.load_dotenv() + + # 환경 변수에서 엔드포인트와 키를 가져옵니다. + openai.api_base = os.environ['AZURE_OPENAI_ENDPOINT'] + openai.api_key = os.environ['AZURE_OPENAI_KEY'] + + # API 버전을 할당합니다 (DALL-E는 현재 2023-06-01-preview API 버전만 지원됩니다). + openai.api_version = '2023-06-01-preview' + openai.api_type = 'azure' + + + try: + # 이미지 생성 API를 사용하여 이미지를 생성합니다. + generation_response = openai.Image.create( + prompt='수선화가 자라는 안개가 자욱한 초원에 막대사탕을 들고 있는 말 위의 토끼', # 여기에 원하는 프롬프트 텍스트를 입력하세요 + size='1024x1024', + n=2, + temperature=0, + ) + # 저장된 이미지를 위한 디렉토리를 설정합니다. + image_dir = os.path.join(os.curdir, 'images') + + # 디렉토리가 존재하지 않으면 생성합니다. + if not os.path.isdir(image_dir): + os.mkdir(image_dir) + + # 이미지 경로를 초기화합니다 (파일 유형은 png여야 합니다). + image_path = os.path.join(image_dir, 'generated-image.png') + + # 생성된 이미지를 가져옵니다. + image_url = generation_response["data"][0]["url"] # 응답에서 이미지 URL을 추출합니다. + generated_image = requests.get(image_url).content # 이미지를 다운로드합니다. + with open(image_path, "wb") as image_file: + image_file.write(generated_image) + + # 기본 이미지 뷰어에서 이미지를 표시합니다. + image = Image.open(image_path) + image.show() + + # 예외 처리 + except openai.error.InvalidRequestError as err: + print(err) + + ``` + +이 코드를 설명해보겠습니다: + +- 먼저, 필요한 라이브러리를 가져옵니다. 이는 OpenAI 라이브러리, dotenv 라이브러리, requests 라이브러리, 그리고 Pillow 라이브러리를 포함합니다. + + ```python + import openai + import os + import requests + from PIL import Image + import dotenv + ``` + +- 다음으로, *.env* 파일에서 환경 변수를 로드합니다. + + ```python + # dotenv 라이브러리를 불러옵니다. + dotenv.load_dotenv() + ``` + +- 그 다음, OpenAI API의 엔드포인트와 키, 버전 및 타입을 설정합니다. + + ```python + # 환경 변수에서 엔드포인트와 키를 가져옵니다. + openai.api_base = os.environ['AZURE_OPENAI_ENDPOINT'] + openai.api_key = os.environ['AZURE_OPENAI_KEY'] + + # 버전과 타입을 추가합니다. Azure에 특화된 설정입니다. + openai.api_version = '2023-06-01-preview' + openai.api_type = 'azure' + ``` + +- 그 다음, 이미지를 생성합니다: + + ```python + # 이미지 생성 API를 사용하여 이미지를 생성합니다. + generation_response = openai.Image.create( + prompt='수선화가 자라는 안개가 자욱한 초원에 막대사탕을 들고 있는 말 위의 토끼', # 여기에 원하는 프롬프트 텍스트를 입력하세요 + size='1024x1024', + n=2, + temperature=0, + ) + ``` + + 위의 코드는 생성된 이미지의 URL을 포함하는 JSON 객체를 반환합니다. 이 URL을 사용하여 이미지를 다운로드하고 파일로 저장할 수 있습니다. + +- 마지막으로, 이미지를 열고 기본 이미지 뷰어를 사용하여 표시합니다: + + ```python + image = Image.open(image_path) + image.show() + ``` + +### 이미지 생성에 대한 자세한 내용 + +이미지를 생성하는 코드를 자세히 살펴보겠습니다: + +```python +generation_response = openai.Image.create( + prompt='수선화가 자라는 안개가 자욱한 초원에 막대사탕을 들고 있는 말 위의 토끼', # 여기에 원하는 프롬프트 텍스트를 입력하세요 + size='1024x1024', + n=2, + temperature=0, + ) +``` + +- **prompt**는 이미지를 생성하는 데 사용되는 텍스트 프롬프트입니다. 이 경우 "수선화가 자라는 안개가 자욱한 초원에 막대사탕을 들고 있는 말 위의 토끼"라는 프롬프트를 사용합니다. +- **size**는 생성되는 이미지의 크기입니다. 이 경우 1024x1024 픽셀의 이미지를 생성합니다. +- **n**은 생성되는 이미지의 개수입니다. 이 경우 두 개의 이미지를 생성합니다. +- **temperature**은 생성적 AI 모델의 출력의 무작위성을 제어하는 매개변수입니다. temperature는 0과 1 사이의 값으로, 0은 출력이 결정론적이고 1은 출력이 무작위적임을 의미합니다. 기본값은 0.7입니다. + +다음 섹션에서 이미지로 할 수 있는 더 많은 작업을 다룰 예정입니다. + +## 이미지 생성의 추가 기능 + +지금까지 몇 줄의 Python 코드로 이미지를 생성하는 방법을 살펴보았습니다. 그러나 이미지로 할 수 있는 더 많은 작업이 있습니다. + +다음과 같은 작업을 수행할 수도 있습니다: + +- **편집하기**. 기존 이미지, 마스크 및 프롬프트를 제공하여 이미지를 수정할 수 있습니다. 예를 들어, 이미지의 일부에 무언가를 추가할 수 있습니다. 토끼 이미지에 모자를 추가한다고 상상해보세요. 이미지, 마스크(변경할 영역을 식별하는) 및 수행할 작업을 설명하는 텍스트 프롬프트를 제공하는 방식으로 수행할 수 있습니다. + + ```python + response = openai.Image.create_edit( + image=open("base_image.png", "rb"), + mask=open("mask.png", "rb"), + prompt="모자를 쓴 토끼의 이미지입니다.", + n=1, + size="1024x1024" + ) + image_url = response['data'][0]['url'] + ``` + + 기본 이미지에는 토끼만 포함되지만 최종 이미지에는 토끼에 모자가 있게 됩니다. + +- **변형 생성하기**. 기존 이미지를 가져와서 변형을 생성할 수 있습니다. 변형을 생성하려면 이미지와 텍스트 프롬프트를 제공하고 다음과 같은 코드를 사용합니다: + + ```python + response = openai.Image.create_variation( + image=open("bunny-lollipop.png", "rb"), + n=1, + size="1024x1024" + ) + image_url = response['data'][0]['url'] + ``` + + > 참고: 이 기능은 OpenAI에서만 지원됩니다. + +## Temperature + +temperature는 생성적 AI 모델의 출력의 무작위성을 제어하는 매개변수입니다. temperature는는 0과 1 사이의 값으로, 0은 출력이 결정론적이고 1은 출력이 무작위적임을 의미합니다. 기본값은 0.7입니다. + +temperature가 어떻게 작용하는지 예제를 통해 살펴보겠습니다. 다음 프롬프트를 두 번 실행하여 확인해보겠습니다: + +> 프롬프트: "수선화가 자라는 안개가 자욱한 초원에 막대사탕을 들고 있는 말 위의 토끼" + +![토끼가 말 위에 막대사탕을 들고 있는 이미지, 버전 1](../../images/v1-generated-image.png?WT.mc_id=academic-105485-koreyst) + +이제 동일한 프롬프트를 다시 실행하여 동일한 이미지를 얻지 못하는지 확인해보겠습니다: + +![토끼가 말 위에 달고 있는 이미지](../../images/v2-generated-image.png?WT.mc_id=academic-105485-koreyst) + +이미지는 비슷하지만 완전히 동일하지는 않습니다. 이제 temperature 값을 0.1로 변경해보고 어떤 일이 일어나는지 확인해보겠습니다: + +### temperature 조절하기 + +그러면 응답을 더 결정론적으로 만들어 보겠습니다. 우리가 생성한 두 이미지를 관찰해보면 첫 번째 이미지에는 토끼가 있고 두 번째 이미지에는 말이 있음을 알 수 있습니다. 따라서 이미지가 크게 다릅니다. + +따라서 코드를 변경하여 온도를 0으로 설정해 보겠습니다: + +```python +generation_response = openai.Image.create( + prompt='수선화가 자라는 안개가 자욱한 초원에 막대사탕을 들고 있는 말 위의 토끼', # 여기에 원하는 프롬프트 텍스트를 입력하세요 + size='1024x1024', + n=2, + temperature=0 + ) +``` + +코드를 실행하면 다음 두 이미지를 얻게 됩니다: + +- ![Temperature 0, v1](../../images/v1-temp-generated-image.png?WT.mc_id=academic-105485-koreyst) +- ![Temperature 0 , v2](../../images/v2-temp-generated-image.png?WT.mc_id=academic-105485-koreyst) + +여기에서 이미지들이 서로 더 닮아있는 것을 명확히 볼 수 있습니다. + +## 메타프롬프트를 사용하여 애플리케이션의 경계 정의하기 + +우리의 데모를 통해 이미지를 생성할 수 있습니다. 그러나 애플리케이션에 일부 경계를 설정해야 합니다. + +예를 들어, 성인용이나 어린이에게 적합하지 않은 이미지를 생성하고 싶지 않습니다. + +이를 위해 *메타프롬프트* 를 사용할 수 있습니다. 메타프롬프트는 생성형 AI 모델의 출력을 제어하는 데 사용되는 텍스트 프롬프트입니다. 예를 들어, 메타프롬프트를 사용하여 출력을 제어하고, 생성된 이미지가 안전하고 어린이에게 적합하도록 할 수 있습니다. + +### 어떻게 작동하나요? + +그렇다면 메타프롬프트는 어떻게 작동할까요? + +메타프롬프트는 생성형 AI 모델의 출력을 제어하는 데 사용되는 텍스트 프롬프트입니다. 이는 텍스트 프롬프트 앞에 위치하며, 모델의 출력을 제어하고 애플리케이션에서 모델의 출력을 제어하는 데 사용됩니다. 프롬프트 입력과 메타프롬프트 입력을 하나의 텍스트 프롬프트에 포함시킵니다. + +메타프롬프트의 한 예는 다음과 같습니다: + +```text +어린이를 위한 이미지를 만드는 어시스턴트 디자이너입니다. + +이미지는 작업하는데 안전하고 어린이에게 적합해야 합니다. + +이미지는 컬러여야 합니다. + +이미지는 가로 방향이어야 합니다. + +이미지는 16:9의 가로 세로 비율을 가져야 합니다. + +다음과 같이 작업하는데 안전하지 않거나 어린이에게 적합하지 않은 입력은 고려하지 마세요. + +(입력) + +```text + +이제 데모에서 메타프롬프트를 사용하는 방법을 살펴보겠습니다. + +```python +disallow_list = "칼, 폭력, 피, 유혈, 과도한 노출, 성적인 콘텐츠, 성인용 콘텐츠, 성인 테마, 성인 언어, 성인 유머, 성인 농담, 성인 상황, 성인" + +meta_prompt =f"""어린이를 위한 이미지를 만드는 어시스턴트 디자이너입니다. + +이미지는 작업하는데 안전하고 어린이에게 적합해야 합니다. + +이미지는 컬러여야 합니다. + +이미지는 가로 방향이어야 합니다. + +이미지는 16:9의 가로 세로 비율을 가져야 합니다. + +다음과 같이 작업하는데 안전하지 않거나 어린이에게 적합하지 않은 입력은 고려하지 마세요. +{disallow_list} +""" + +prompt = f"{meta_prompt} +토끼가 말 위에 올라타고 롤리팝을 들고 있는 이미지를 생성해주세요" + +``` + +위의 프롬프트에서 모든 생성된 이미지가 메타프롬프트를 고려한다는 것을 볼 수 있습니다. + +## 과제 - 학생들에게 제공하기 + +우리는 이 수업의 시작에서 Edu4All을 소개했습니다. 이제 학생들이 자신의 평가를 위해 이미지를 생성할 수 있도록 제공할 차례입니다. + +학생들은 자신이 선택한 기념물을 포함한 평가용 이미지를 생성할 것입니다. 어떤 기념물을 사용할지는 학생들에게 달려 있습니다. 이 작업에서 학생들은 이러한 기념물을 다른 맥락에 배치하는 창의력을 발휘해야 합니다. + +## 해결책 + +다음은 하나의 가능한 해결책입니다: + +```python +import openai +import os +import requests +from PIL import Image +import dotenv + +# dotenv를 가져옵니다. +dotenv.load_dotenv() + +# 환경 변수에서 엔드포인트와 키를 가져옵니다. +openai.api_base = "" +openai.api_key = "" + +# API 버전을 할당합니다 (DALL-E는 현재 2023-06-01-preview API 버전만 지원됩니다) +openai.api_version = '2023-06-01-preview' +openai.api_type = 'azure' + +disallow_list = "칼, 폭력, 피, 유혈, 과도한 노출, 성적인 콘텐츠, 성인용 콘텐츠, 성인 테마, 성인 언어, 성인 유머, 성인 농담, 성인 상황, 성인" + +meta_prompt = f"""어린이를 위한 이미지를 만드는 어시스턴트 디자이너입니다. + +이미지는 작업하는데 안전하고 어린이에게 적합해야 합니다. + +이미지는 컬러여야 합니다. + +이미지는 가로 방향이어야 합니다. + +이미지는 16:9의 가로 세로 비율을 가져야 합니다. + +다음과 같이 작업하는데 안전하지 않거나 어린이에게 적합하지 않은 입력은 고려하지 마세요. +{disallow_list}""" + +prompt = f"""{meta_prompt} +파리, 프랑스의 아크 드 트리옴프 기념비를 저녁 빛 아래에서 작은 아이가 테디를 들고 바라보는 이미지를 생성해주세요. +""" + +try: + # 이미지 생성 API를 사용하여 이미지 생성 + generation_response = openai.Image.create( + prompt=prompt, # 여기에 프롬프트 텍스트를 입력하세요 + size='1024x1024', + n=2, + temperature=0, + ) + # 저장된 이미지의 디렉토리 설정 + image_dir = os.path.join(os.curdir, 'images') + + # 디렉토리가 존재하지 않으면 생성 + if not os.path.isdir(image_dir): + os.mkdir(image_dir) + + # 이미지 경로 초기화 (파일 유형은 png여야 함) + image_path = os.path.join(image_dir, 'generated-image.png') + + # 생성된 이미지 가져오기 + image_url = generation_response["data"][0]["url"] # 응답에서 이미지 URL 추출 + generated_image = requests.get(image_url).content # 이미지 다운로드 + with open(image_path, "wb") as image_file: + image_file.write(generated_image) + + # 기본 이미지 뷰어에서 이미지 표시 + image = Image.open(image_path) + image.show() + +# 예외 처리 +except openai.error.InvalidRequestError as err: + print(err) +``` + + +## 잘하셨습니다. 학습을 계속하세요! + +이 레슨을 완료한 후에는 [Generative AI 학습 컬렉션](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)을 확인하여 Generative AI 지식을 더욱 향상시킬 수 있습니다! + +Lesson 10으로 이동하여 [low-code로 AI 애플리케이션을 구축하는 방법](../../../10-building-low-code-ai-applications/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)을 살펴보세요. diff --git a/10-building-low-code-ai-applications/translations/ko/README.md b/10-building-low-code-ai-applications/translations/ko/README.md new file mode 100644 index 000000000..cfd811930 --- /dev/null +++ b/10-building-low-code-ai-applications/translations/ko/README.md @@ -0,0 +1,244 @@ +# Low Code AI 애플리케이션 개발 + +[![Building Low Code AI Applications](../../images/10-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://youtu.be/XX8491SAF44?WT.mc_id=academic-105485-koreyst) + +> *(위 이미지를 클릭하여 이 레슨의 비디오를 시청하세요)* + +## 소개 + +이미지 생성 애플리케이션을 만드는 방법을 배웠으니 이제는 Low Code에 대해 이야기해보겠습니다. 생성형 AI는 low code를 포함한 다양한 영역에 사용될 수 있지만, low code란 무엇이며 어떻게 AI를 추가할 수 있을까요? + +Low Code 개발 플랫폼을 사용하면 전통적인 개발자와 비개발자 모두가 쉽게 앱과 솔루션을 구축할 수 있습니다. Low Code 개발 플랫폼은 시각적 개발 환경을 제공하여 컴포넌트를 드래그 앤 드롭하여 앱과 솔루션을 구축할 수 있도록 합니다. 이를 통해 앱과 솔루션을 더 빠르고 적은 리소스로 구축할 수 있습니다. 이 레슨에서는 Low Code의 사용 방법과 Power Platform을 사용하여 low code 개발을 AI로 향상시키는 방법에 대해 자세히 알아보겠습니다. + +Power Platform은 조직에게 직관적인 low-code 또는 no-code 환경을 통해 팀이 자체 솔루션을 구축할 수 있는 기회를 제공합니다. 이 환경은 솔루션 구축 프로세스를 간소화하는 데 도움이 됩니다. Power Platform을 사용하면 솔루션을 개월이나 연도가 아닌 몇 일 또는 몇 주 안에 구축할 수 있습니다. Power Platform은 Power Apps, Power Automate, Power BI, Power Pages 및 Power Virtual Agents라는 다섯 가지 주요 제품으로 구성됩니다. + +이 레슨에서는 다음 내용을 다룹니다: + +- Power Platform에서 생성형 AI 소개 +- Copilot 소개 및 사용 방법 +- Power Platform에서 생성형 AI를 사용하여 앱과 플로우 구축 +- AI Builder를 사용하여 Power Platform의 AI 모델 이해 + +## 학습 목표 + +이 레슨을 마치면 다음을 할 수 있습니다: + +- Power Platform에서 Copilot의 작동 방식 이해하기. + +- 교육 스타트업을 위한 학생 과제 추적 앱 구축하기. + +- AI를 사용하여 송장 정보를 추출하는 송장 처리 플로우 구축하기. + +- Create Text with GPT AI 모델을 사용할 때 최상의 방법 적용하기. + +이 레슨에서 사용할 도구와 기술은 다음과 같습니다: + +- **Power Apps**: 데이터를 추적, 관리 및 상호 작용하는 앱을 구축하기 위한 low-code 개발 환경을 제공합니다. + +- **Dataverse**: 학생 과제 추적 앱의 데이터를 저장하기 위한 Dataverse는 앱의 데이터를 저장하기 위한 low-code 데이터 플랫폼을 제공합니다. + +- **Power Automate**: 송장 처리 플로우를 위한 low-code 개발 환경을 제공합니다. 이를 통해 송장 처리 프로세스를 자동화할 수 있습니다. + +- **AI Builder**: 스타트업의 송장을 처리하기 위해 사전 구축된 AI 모델을 사용할 수 있습니다. + +## Power Platform의 생성형 AI + +생성형 AI를 사용하여 low-code 개발과 애플리케이션을 향상시키는 것은 Power Platform의 주요 관심사입니다. 목표는 데이터 과학 전문 지식이 필요하지 않고 AI를 사용하여 앱, 사이트, 대시보드를 구축하고 프로세스를 자동화할 수 있는 모든 사람을 가능하게 하는 것입니다. 이 목표는 Copilot과 AI Builder의 형태로 생성형 AI를 Power Platform의 low-code 개발 환경에 통합함으로써 달성됩니다. + +### 이 작업은 어떻게 이루어질까요? + +Copilot은 자연어를 사용하여 대화식 단계로 요구 사항을 설명함으로써 Power Platform 솔루션을 구축할 수 있는 AI 어시스턴트입니다. 예를 들어, 앱에서 사용할 필드를 지정하는 방법을 AI 어시스턴트에게 지시할 수 있으며, 그는 앱과 기본 데이터 모델을 모두 생성할 것입니다. 또는 Power Automate에서 플로우를 설정하는 방법을 지정할 수도 있습니다. + +Copilot을 사용하여 사용자가 대화식 상호 작용을 통해 통찰력을 발견할 수 있도록 앱 화면의 기능으로 Copilot 기반 기능을 사용할 수 있습니다. + +AI Builder는 Power Platform에서 사용할 수 있는 low-code AI 기능으로, AI 모델을 사용하여 프로세스를 자동화하고 결과를 예측할 수 있습니다. AI Builder를 사용하면 Dataverse나 SharePoint, OneDrive, Azure와 같은 다양한 클라우드 데이터 소스 또는 Dataverse와 같은 데이터에 연결하는 앱과 플로우에 AI를 가져올 수 있습니다. + +Copilot은 Power Apps, Power Automate, Power BI, Power Pages 및 Power Virtual Agents의 모든 Power Platform 제품에서 사용할 수 있습니다. AI Builder는 Power Apps와 Power Automate에서 사용할 수 있습니다. 이 레슨에서는 교육 스타트업을 위한 솔루션을 구축하기 위해 Power Apps와 Power Automate에서 Copilot과 AI Builder를 사용하는 방법에 중점을 둘 것입니다. + +### Power Apps에서의 Copilot + +Power Apps는 Power Platform의 일부로, 데이터를 추적, 관리 및 상호 작용하기 위한 앱을 구축하기 위한 low-code 개발 환경을 제공합니다. 확장 가능한 데이터 플랫폼과 클라우드 서비스 및 온프레미스 데이터에 연결할 수 있는 기능을 갖춘 앱 개발 서비스 모음입니다. Power Apps를 사용하면 브라우저, 태블릿 및 휴대폰에서 실행되는 앱을 구축하고 동료들과 공유할 수 있습니다. Power Apps는 간단한 인터페이스로 사용자를 앱 개발로 안내하여 모든 비즈니스 사용자나 전문 개발자가 사용자 정의 앱을 구축할 수 있습니다. 앱 개발 경험은 또한 생성형 AI를 통해 Copilot과 함께 향상됩니다. + +Power Apps의 Copilot AI 어시스턴트 기능을 사용하면 필요한 앱 종류와 앱이 추적, 수집 또는 표시해야 하는 정보를 설명할 수 있습니다. Copilot은 이 설명을 기반으로 반응형 캔버스 앱을 생성합니다. 그런 다음 앱을 사용자의 요구에 맞게 사용자 정의할 수 있습니다. AI Copilot은 또한 데이터를 추적하려는 필드와 일부 샘플 데이터가 포함된 Dataverse 테이블을 생성하고 제안합니다. 이후 대화식 단계를 통해 AI Copilot 어시스턴트 기능을 사용하여 테이블을 사용자의 요구에 맞게 사용자 정의할 수 있습니다. 이 기능은 Power Apps 홈 화면에서 즉시 사용할 수 있습니다. + +### Power Automate에서의 Copilot + +Power Automate는 Power Platform의 일부로, 응용 프로그램 및 서비스 간에 자동화된 워크플로우를 생성할 수 있도록 도와줍니다. 의사 결정 승인, 커뮤니케이션, 데이터 수집과 같은 반복적인 비즈니스 프로세스를 자동화하는 데 도움이 됩니다. 간단한 인터페이스를 통해 모든 기술 역량을 갖춘 사용자(초보자부터 숙련된 개발자까지)가 작업 작업을 자동화할 수 있습니다. 워크플로우 개발 경험은 또한 생성형 AI를 통해 Copilot과 함께 향상됩니다. + +Power Automate의 Copilot AI 어시스턴트 기능을 사용하면 필요한 플로우 종류와 플로우가 수행해야 하는 작업을 설명할 수 있습니다. Copilot은 이 설명을 기반으로 플로우를 생성합니다. 그런 다음 플로우를 사용자의 요구에 맞게 사용자 정의할 수 있습니다. AI Copilot은 또한 자동화하려는 작업을 수행하기 위해 필요한 작업을 생성하고 제안합니다. 이후 대화식 단계를 통해 AI Copilot 어시스턴트 기능을 사용하여 작업을 사용자의 요구에 맞게 사용자 정의할 수 있습니다. 이 기능은 Power Automate 홈 화면에서 즉시 사용할 수 있습니다. + +## 과제: Copilot을 사용하여 학생 과제 및 송장을 관리하는 솔루션 구축 + +우리 스타트업은 학생들에게 온라인 강좌를 제공합니다. 스타트업은 빠르게 성장하여 강좌 수요를 따라가기 어려워졌습니다. 스타트업은 학생 과제와 송장 처리 프로세스를 관리하기 위해 low code 솔루션을 구축하는 데 도움을 받기 위해 Power Platform 개발자로서 여러분을 고용했습니다. 솔루션은 앱을 통해 학생 과제를 추적하고 관리하며, 워크플로우를 통해 송장 처리 프로세스를 자동화해야 합니다. 여러분은 생성형 AI를 사용하여 솔루션을 개발하도록 요청받았습니다. + +Copilot 사용을 시작할 때는 [Power Platform Copilot Prompt Library](https://pnp.github.io/powerplatform-prompts/?WT.mc_id=academic-109639-somelezediko)를 사용하여 프롬프트로 시작할 수 있습니다. 이 라이브러리에는 Copilot을 사용하여 앱과 플로우를 구축하는 데 사용할 수 있는 프롬프트 목록이 포함되어 있습니다. 또한 라이브러리의 프롬프트를 사용하여 Copilot에게 요구 사항을 설명하는 방법에 대한 아이디어를 얻을 수 있습니다. + +### 학생 과제 추적 앱 구축하기 + +우리 스타트업의 교육자들은 학생 과제를 추적하는 데 어려움을 겪고 있습니다. 학생 수가 증가함에 따라 스프레드시트를 사용하여 과제를 추적하고 있지만 관리하기 어려워졌습니다. 교육자들은 학생 과제를 추적하고 관리할 수 있는 앱을 구축해 달라고 요청했습니다. 이 앱은 새로운 과제를 추가하고, 과제를 보고, 과제를 업데이트하고, 과제를 삭제할 수 있어야 합니다. 또한 교육자와 학생 모두가 채점된 과제와 채점되지 않은 과제를 볼 수 있어야 합니다. + +다음 단계를 따라 Power Apps에서 Copilot을 사용하여 앱을 구축하겠습니다: + +1. [Power Apps](https://make.powerapps.com?WT.mc_id=academic-105485-koreyst) 홈 화면으로 이동합니다. + +2. 왼쪽 탐색 창에서 **Tables**을 선택한 다음 **Describe the new Table**을 클릭합니다. + +3. 홈 화면의 텍스트 영역을 사용하여 구축하려는 앱을 설명합니다. 예를 들어, ***학생 과제를 추적하고 관리하기 위한 앱을 구축하고 싶습니다***. **Send** 버튼을 클릭하여 AI Copilot에게 프롬프트를 전송합니다. + + ![Describe the app you want to build](../../images/copilot-chat-prompt-powerapps.png?WT.mc_id=academic-105485-koreyst) + +4. AI Copilot은 데이터베이스 테이블을 제안하며, 추적하려는 데이터를 저장하기 위해 필요한 필드와 일부 샘플 데이터를 제공합니다. 그런 다음 대화식 단계를 통해 테이블을 사용자 정의하여 요구 사항에 맞게 만들 수 있습니다. + + > **중요**: Dataverse는 Power Platform의 기반이 되는 데이터 플랫폼입니다. 앱의 데이터를 저장하기 위한 low-code 데이터 플랫폼으로, Microsoft Cloud에 안전하게 데이터를 저장하며 Power Platform 환경 내에서 프로비저닝됩니다. 데이터 분류, 데이터 계보, 세밀한 액세스 제어 등과 같은 내장 데이터 거버넌스 기능을 갖추고 있습니다. Dataverse에 대해 자세히 알아보려면 [여기](https://docs.microsoft.com/powerapps/maker/data-platform/data-platform-intro?WT.mc_id=academic-109639-somelezediko)를 참조하세요. + + ![새로운 테이블에 제안된 필드](../../images/copilot-dataverse-table-powerapps.png?WT.mc_id=academic-105485-koreyst) + +5. 교육자들은 과제를 제출한 학생들에게 진행 상황을 알리기 위해 이메일을 보내고 싶어합니다. Copilot을 사용하여 테이블에 학생 이메일을 저장할 새로운 필드를 추가할 수 있습니다. 예를 들어, 다음과 같은 프롬프트를 사용하여 테이블에 새로운 필드를 추가할 수 있습니다: ***학생 이메일을 저장할 열을 추가하고 싶습니다***. **Send** 버튼을 클릭하여 AI Copilot에게 프롬프트를 전송합니다. + +![Adding a new field](../../images/copilot-new-column.png?WT.mc_id=academic-105485-koreyst) + +6. AI Copilot은 새로운 필드를 생성하고, 사용자 정의하여 요구 사항에 맞게 만들 수 있습니다. + +7. 테이블 작업이 완료되면 **Create app** 버튼을 클릭하여 앱을 생성합니다. + +8. AI Copilot은 설명에 기반한 반응형 캔버스 앱을 생성하며, 사용자 정의하여 요구 사항에 맞게 만들 수 있습니다. + +9. 교육자가 학생들에게 이메일을 보낼 수 있도록 앱에 새로운 화면을 추가할 수 있습니다. 예를 들어, 다음과 같은 프롬프트를 사용하여 앱에 새로운 화면을 추가할 수 있습니다: ***학생들에게 이메일을 보내기 위한 화면을 추가하고 싶습니다***. **Send** 버튼을 클릭하여 AI Copilot에게 프롬프트를 전송합니다. + +![Adding a new screen via a prompt instruction](../../images/copilot-new-screen.png?WT.mc_id=academic-105485-koreyst) + +10. AI Copilot은 새로운 화면을 생성하고, 사용자 정의하여 요구 사항에 맞게 만들 수 있습니다. + +11. 앱 작업이 완료되면 **Save** 버튼을 클릭하여 앱을 저장합니다. + +12. 교육자와 앱을 공유하려면 **Share** 버튼을 클릭한 다음 **Share** 버튼을 다시 클릭합니다. 그런 다음 교육자의 이메일 주소를 입력하여 앱을 공유할 수 있습니다. + +> **과제**: 방금 구축한 앱은 좋은 시작이지만 개선할 수 있습니다. 이메일 기능을 사용하면 교육자는 학생들에게 이메일을 수동으로 보내야 합니다. Copilot을 사용하여 학생들이 과제를 제출할 때 자동으로 교육자에게 이메일을 보낼 수 있는 자동화를 구축할 수 있을까요? 힌트는 적절한 프롬프트를 사용하여 Power Automate에서 Copilot을 사용하여 이를 구축할 수 있다는 것입니다. + +### 우리 스타트업을 위한 송장 정보 테이블 구축하기 + +우리 스타트업의 재무팀은 송장을 처리하는 데 어려움을 겪고 있습니다. 송장을 추적하기 위해 스프레드시트를 사용하고 있지만 송장 수가 증가함에 따라 관리하기 어려워졌습니다. 그들은 송장 정보를 추출하고 해당 정보를 Dataverse 테이블에 저장하는 자동화를 구축할 수 있는 테이블을 만들어 달라고 요청했습니다. 또한 송장이 지불된 것과 미지불된 것을 확인할 수 있는 테이블을 제공해야 합니다. + +Power Platform에는 Dataverse라는 데이터 플랫폼이 있어 앱과 솔루션의 데이터를 저장할 수 있습니다. Dataverse는 앱의 데이터를 저장하기 위한 low-code 데이터 플랫폼으로, Microsoft Cloud에 안전하게 데이터를 저장하며 Power Platform 환경 내에서 프로비저닝됩니다. 데이터 분류, 데이터 계보, 세밀한 액세스 제어 등과 같은 내장 데이터 거버넌스 기능을 갖추고 있습니다. Dataverse에 대해 자세히 알아보려면 [여기](https://docs.microsoft.com/powerapps/maker/data-platform/data-platform-intro?WT.mc_id=academic-109639-somelezediko)를 참조하세요. + +우리 스타트업이 Dataverse를 사용해야 하는 이유는 무엇일까요? Dataverse 내의 표준 및 사용자 정의 테이블은 데이터를 위한 안전하고 클라우드 기반의 저장 옵션을 제공합니다. 테이블은 하나의 Excel 워크북에서 여러 개의 워크시트를 사용하는 것과 유사하게 다양한 유형의 데이터를 저장할 수 있습니다. 테이블을 사용하여 조직 또는 비즈니스 요구에 맞는 데이터를 저장할 수 있습니다. 우리 스타트업이 Dataverse를 사용함으로써 얻을 수 있는 이점은 다음과 같습니다. + +- **쉬운 관리**: 메타데이터와 데이터 모두 클라우드에 저장되므로 저장 또는 관리 방법에 대해 걱정할 필요가 없습니다. 앱과 솔루션 구축에 집중할 수 있습니다. + +- **보안**: Dataverse는 데이터를 위한 안전하고 클라우드 기반의 저장 옵션을 제공합니다. 역할 기반 보안을 사용하여 테이블의 데이터에 액세스할 수 있는 사용자와 액세스 방법을 제어할 수 있습니다. + +- **풍부한 메타데이터**: 데이터 유형과 관계를 Power Apps에서 직접 사용할 수 있습니다. + +- **로직 및 유효성 검사**: 비즈니스 규칙, 계산 필드 및 유효성 검사 규칙을 사용하여 비즈니스 로직을 강제하고 데이터의 정확성을 유지할 수 있습니다. + +이제 Dataverse가 무엇인지 알고 왜 사용해야 하는지 알았으니, AI Copilot을 사용하여 재무팀의 요구 사항을 충족하는 Dataverse 테이블을 생성하는 방법을 살펴보겠습니다. + +>**참고**: 이 테이블은 다음 섹션에서 송장 정보를 추출하고 해당 정보를 저장하는 자동화를 구축하는 데 사용됩니다. + +Copilot을 사용하여 Dataverse에서 테이블을 생성하려면 다음 단계를 따르세요: + +1. [Power Apps](https://make.powerapps.com?WT.mc_id=academic-105485-koreyst) 홈 화면으로 이동합니다. + +2. 왼쪽 탐색 창에서 **Tables**을 선택한 다음 **Describe the new Table**을 클릭합니다. + +![Select new table](../../images/describe-new-table.png?WT.mc_id=academic-105485-koreyst) + +3. **Describe the new Table** 화면에서 테이블을 생성할 내용을 텍스트 영역에 설명합니다. 예를 들어, ***송장 정보를 저장하기 위한 테이블을 생성하고 싶습니다***. **Send** 버튼을 클릭하여 AI Copilot에게 프롬프트를 전송합니다. + +![Describe the table](../../images/copilot-chat-prompt-dataverse.png?WT.mc_id=academic-105485-koreyst) + +4. AI Copilot은 필요한 필드와 일부 샘플 데이터를 포함한 Dataverse 테이블을 제안합니다. 그런 다음 AI Copilot 도우미 기능을 통해 대화식 단계를 통해 테이블을 사용자 정의하여 요구 사항에 맞게 만들 수 있습니다. + +![Suggested Dataverse table](../../images/copilot-dataverse-table.png?WT.mc_id=academic-105485-koreyst) + +5. 재무팀은 공급업체에게 송장의 현재 상태를 알리기 위해 이메일을 보내고 싶어합니다. Copilot을 사용하여 테이블에 공급업체 이메일을 저장할 새로운 필드를 추가할 수 있습니다. 예를 들어, 다음과 같은 프롬프트를 사용하여 테이블에 새로운 필드를 추가할 수 있습니다: ***공급업체 이메일을 저장할 열을 추가하고 싶습니다***. **Send** 버튼을 클릭하여 AI Copilot에게 프롬프트를 전송합니다. + +6. AI Copilot은 새로운 필드를 생성하고, 사용자 정의하여 요구 사항에 맞게 만들 수 있습니다. + +7. 테이블 작업이 완료되면 **Create** 버튼을 클릭하여 테이블을 생성합니다. + +## AI Builder를 사용한 Power Platform의 AI 모델 + +AI Builder는 Power Platform에서 사용할 수 있는 low-code AI 기능으로, 프로세스 자동화와 결과 예측을 도와주는 AI 모델을 사용할 수 있습니다. AI Builder를 사용하면 Dataverse나 SharePoint, OneDrive, Azure와 같은 다양한 클라우드 데이터 소스 또는 Dataverse 내의 데이터에 연결된 앱과 플로우에 AI를 적용할 수 있습니다. + +AI Builder는 두 가지 유형의 AI 모델을 제공합니다: Prebuilt AI 모델과 Custom AI 모델입니다. Prebuilt AI 모델은 Microsoft에서 훈련한 사용 준비가 된 AI 모델로, Power Platform에서 사용할 수 있습니다. 이 모델을 사용하면 데이터를 수집하고 모델을 빌드, 훈련 및 게시할 필요 없이 앱과 플로우에 지능을 추가할 수 있습니다. 이러한 모델을 사용하여 프로세스를 자동화하고 결과를 예측할 수 있습니다. + +Power Platform에서 사용할 수 있는 Prebuilt AI 모델 중 일부는 다음과 같습니다: + +- **키 구문 추출**: 이 모델은 텍스트에서 키 구문을 추출합니다. +- **언어 감지**: 이 모델은 텍스트의 언어를 감지합니다. +- **감정 분석**: 이 모델은 텍스트의 긍정적, 부정적, 중립적 또는 혼합된 감정을 감지합니다. +- **명함 판독기**: 이 모델은 명함에서 정보를 추출합니다. +- **텍스트 인식**: 이 모델은 이미지에서 텍스트를 추출합니다. +- **객체 감지**: 이 모델은 이미지에서 객체를 감지하고 추출합니다. +- **양식 처리**: 이 모델은 양식에서 정보를 추출합니다. +- **송장 처리**: 이 모델은 송장에서 정보를 추출합니다. + +Custom AI 모델을 사용하면 AI Builder에 직접 모델을 가져와서 AI Builder 사용자 정의 모델과 같은 방식으로 작동하도록 할 수 있습니다. 이 모델을 사용하여 Power Apps와 Power Automate에서 프로세스를 자동화하고 결과를 예측할 수 있습니다. 사용자 정의 모델을 사용할 때는 일부 제한 사항이 적용됩니다. 이에 대한 자세한 내용은 [여기](https://learn.microsoft.com/ai-builder/byo-model#limitations?WT.mc_id=academic-105485-koreyst)를 참조하세요. + +![AI builder models](../../images/ai-builder-models.png?WT.mc_id=academic-105485-koreyst) + +## 과제 #2 - 우리 스타트업을 위한 송장 처리 플로우 구축하기 + +재무팀은 송장 처리에 어려움을 겪고 있습니다. 송장을 추적하기 위해 스프레드시트를 사용하고 있지만 송장 수가 증가함에 따라 관리하기 어려워졌습니다. 그들은 AI를 활용하여 송장을 처리하는 워크플로우를 구축해주길 요청했습니다. 이 워크플로우는 송장에서 정보를 추출하고 해당 정보를 Dataverse 테이블에 저장할 수 있어야 합니다. 또한 추출된 정보를 재무팀에게 이메일로 보낼 수 있어야 합니다. + +AI Builder가 무엇이며 왜 사용해야 하는지 알았으니, 앞서 다룬 AI Builder의 송장 처리 AI 모델을 활용하여 재무팀이 송장을 처리하는 데 도움이 되는 워크플로우를 구축하는 방법을 알아보겠습니다. + +AI Builder의 송장 처리 AI 모델을 활용하여 재무팀이 송장을 처리하는 워크플로우를 구축하려면 다음 단계를 따르세요: + +1. [Power Automate](https://make.powerautomate.com?WT.mc_id=academic-105485-koreyst) 홈 화면으로 이동합니다. + +2. 홈 화면의 텍스트 영역을 사용하여 구축하려는 워크플로우를 설명합니다. 예를 들어, ***송장이 메일함에 도착했을 때 송장을 처리합니다***. **Send** 버튼을 클릭하여 AI Copilot에게 프롬프트를 전송합니다. + + ![Copilot power automate](../../images/copilot-chat-prompt-powerautomate.png?WT.mc_id=academic-105485-koreyst) + +3. AI Copilot은 자동화하려는 작업을 수행하기 위해 필요한 동작을 제안합니다. 다음 단계를 진행하려면 **Next** 버튼을 클릭할 수 있습니다. + +4. 다음 단계에서 Power Automate는 워크플로우에 필요한 연결 설정을 위해 프롬프트를 표시합니다. 설정을 완료한 후 **Create flow** 버튼을 클릭하여 워크플로우를 생성합니다. + +5. AI Copilot은 워크플로우를 생성하고, 원하는 대로 워크플로우를 사용자 정의할 수 있습니다. + +6. 워크플로우의 트리거를 업데이트하고 **Folder**를 송장이 저장될 폴더로 설정합니다. 예를 들어, **Inbox**로 폴더를 설정할 수 있습니다. **Show advanced options**를 클릭하고 **Only with Attachments**를 **Yes**로 설정합니다. 이렇게 하면 워크플로우가 첨부 파일이 포함된 이메일이 폴더에 도착했을 때만 실행되도록 할 수 있습니다. + +7. 워크플로우에서 다음 동작을 제거합니다: **HTML to text**, **Compose**, **Compose 2**, **Compose 3**, **Compose 4**. 이 동작들은 사용하지 않을 것이기 때문에 제거합니다. + +8. 워크플로우에서 **Condition** 동작을 제거합니다. 사용하지 않을 것이기 때문에 제거합니다. 다음과 같이 보일 것입니다: + + ![power automate, remove actions](../../images/powerautomate-remove-actions.png?WT.mc_id=academic-105485-koreyst) + +9. **Add an action** 버튼을 클릭하고 **Dataverse**를 검색합니다. **Add a new row** 동작을 선택합니다. + +10. **송장에서 정보 추출** 동작에서 **Invoice File**을 이메일의 **Attachment Content**로 설정합니다. 이렇게 하면 워크플로우가 송장 첨부 파일에서 정보를 추출할 수 있습니다. + +11. 이전에 생성한 **Table**을 선택합니다. 예를 들어, **Invoice Information** 테이블을 선택할 수 있습니다. 이전 동작의 동적 콘텐츠를 사용하여 다음 필드를 채웁니다: + + - ID + - Amount + - Date + - Name + - Status - **Status**를 **Pending**으로 설정합니다. + - Supplier Email - **When a new email arrives** 트리거의 **From** 동적 콘텐츠를 사용합니다. + + ![power automate add row](../../images/powerautomate-add-row.png?WT.mc_id=academic-105485-koreyst) + +12. 워크플로우 작업이 완료되면 **Save** 버튼을 클릭하여 워크플로우를 저장합니다. 그런 다음 지정한 폴더로 송장 첨부 파일이 포함된 이메일을 보내어 워크플로우를 테스트할 수 있습니다. + +> **과제**: 방금 구축한 워크플로우는 좋은 시작입니다. 이제 재무팀이 공급업체에게 송장의 현재 상태를 알리기 위해 이메일을 보낼 수 있는 자동화를 구축하는 방법을 고민해보세요. 힌트: 워크플로우는 송장의 상태가 변경될 때 실행되어야 합니다. + +## Power Automate에서 텍스트 생성 AI 모델 사용하기 + +AI Builder의 Create Text with GPT AI 모델은 Microsoft Azure OpenAI 서비스를 기반으로 프롬프트를 기반으로 텍스트를 생성할 수 있는 기능을 제공합니다. 이 기능을 사용하면 GPT (Generative Pre-Trained Transformer) 기술을 앱과 워크플로우에 통합하여 다양한 자동화 흐름과 통찰력 있는 애플리케이션을 구축할 수 있습니다. + +GPT 모델은 방대한 양의 데이터를 기반으로 광범위한 훈련을 거쳐 프롬프트가 제공되면 인간의 언어와 유사한 텍스트를 생성할 수 있습니다. 워크플로우 자동화와 통합되면 GPT와 같은 AI 모델을 활용하여 다양한 작업을 간소화하고 자동화할 수 있습니다. + +예를 들어, 다음과 같은 다양한 용도로 텍스트를 자동으로 생성하는 흐름을 구축할 수 있습니다: 이메일 초안, 제품 설명 등. 또한 이 모델을 사용하여 챗봇과 고객 서비스 앱과 같은 다양한 앱에 텍스트를 생성할 수 있으며, 이를 통해 고객 서비스 담당자가 고객 문의에 효과적으로 대응할 수 있습니다. + +![create a prompt](../../images/create-prompt-gpt.png?WT.mc_id=academic-105485-koreyst) + +Power Automate에서 이 AI 모델을 사용하는 방법에 대해 자세히 알아보려면 [AI Builder와 GPT를 사용하여 지능 추가하기](https://learn.microsoft.com/training/modules/ai-builder-text-generation/?WT.mc_id=academic-109639-somelezediko) 모듈을 참조하세요. + +## 잘하셨습니다. 학습을 계속하세요! + +이 레슨을 완료한 후 [Generative AI 학습 컬렉션](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)을 확인하여 생성형 AI 지식을 계속 향상시킬 수 있습니다! + +다음 레슨인 [Function Calling과 생성형 AI 통합](../../../11-integrating-with-function-calling/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)을 살펴보세요! diff --git a/11-integrating-with-function-calling/translations/ko/README.md b/11-integrating-with-function-calling/translations/ko/README.md new file mode 100644 index 000000000..4cf0be855 --- /dev/null +++ b/11-integrating-with-function-calling/translations/ko/README.md @@ -0,0 +1,450 @@ +# Function Calling과 통합하기 + +![chapter image](../../images/11-lesson-banner.png?WT.mc_id=academic-105485-koreyst) + +> **비디오 공개 예정** + +지금까지 이전 레슨에서 많은 것을 배웠습니다. 그러나 더 나아갈 수 있습니다. 우리가 해결할 수 있는 몇 가지 문제는 응답 형식을 더 일관되게 만들어 응답을 더 쉽게 처리할 수 있도록 하는 것이며, 또한 응용 프로그램을 더 풍부하게 만들기 위해 다른 소스에서 데이터를 추가할 수도 있습니다. + +위에서 언급한 문제들은 이번 챕터에서 다루고자 하는 내용입니다. + + + +## 소개 + +이 레슨에서는 다음을 다룹니다: + +- function calling이란 무엇이며 사용 사례는 무엇인지 설명합니다. +- Azure OpenAI를 사용하여 function calling을 만드는 방법을 알아봅니다. +- function calling을 응용 프로그램에 통합하는 방법을 알아봅니다. + +## 학습 목표 + +이 레슨을 마치면 다음을 할 수 있게 됩니다: + +- function calling을 사용하는 목적을 설명할 수 있습니다. +- Azure Open AI 서비스를 사용하여 function calling을 설정할 수 있습니다. +- 응용 프로그램의 사용 사례에 맞는 효과적인 function calling을 설계할 수 있습니다. + +## 시나리오: 함수를 사용하여 챗봇 개선하기 + +이 레슨에서는 교육 스타트업을 위한 기능을 구축하려고 합니다. 사용자가 챗봇을 사용하여 기술적인 과목을 찾을 수 있는 기능을 추가할 것입니다. 우리는 사용자의 기술 수준, 현재 역할 및 관심 기술에 맞는 과목을 추천할 것입니다. + +이 시나리오를 완료하기 위해 다음을 조합하여 사용할 것입니다: + +- 사용자에게 채팅 경험을 제공하기 위해 `Azure Open AI` 사용. +- 사용자의 요청에 기반하여 과목을 찾는 데 도움을 주는 `Microsoft Learn Catalog API` 사용. +- 사용자의 쿼리를 가져와 API 요청을 수행하는 함수에 전달하기 위해 `function calling` 사용. + +시작하기 전에, 왜 우리가 처음부터 function calling을 사용하고자 하는지 살펴보겠습니다: + +## Function calling의 필요성 + +function calling 이전에 LLM에서의 응답은 구조화되지 않고 일관성이 없었습니다. 개발자는 각 응답의 변형을 처리할 수 있도록 복잡한 유효성 검사 코드를 작성해야 했습니다. 사용자는 "스톡홀름의 현재 날씨는 어떻게 되나요?"와 같은 답변을 받을 수 없었습니다. 이는 모델이 데이터를 훈련한 시점으로 제한되었기 때문입니다. + +function calling은 다음과 같은 제한 사항을 극복하기 위한 Azure Open AI 서비스의 기능입니다: + +- **일관된 응답 형식**. 응답 형식을 더 잘 제어할 수 있다면 응답을 다른 시스템과 더 쉽게 통합할 수 있습니다. +- **외부 데이터**. 채팅 컨텍스트에서 응용 프로그램의 다른 소스 데이터를 사용할 수 있는 능력. + +## 시나리오를 통해 문제 설명하기 + +> 아래 시나리오를 실행하려면 [제공된 노트북](../../Lesson11-FunctionCalling.ipynb?WT.mc_id=academic-105485-koreyst)을 사용하는 것을 권장합니다. 문제를 설명하기 위해 함수가 문제를 해결하는 데 도움이 되는 시나리오를 보여주려고 하므로 읽기만 해도 됩니다. + +응답 형식 문제를 보여주는 예제를 살펴보겠습니다: + +학생 데이터베이스를 생성하여 학생들에게 적합한 과목을 제안할 수 있도록 하려고 합니다. 아래에는 데이터 내용이 매우 유사한 두 학생의 설명이 있습니다. + +1. Azure Open AI 리소스에 연결을 만듭니다: + + ```python + import os + import json + from openai import AzureOpenAI + from dotenv import load_dotenv + load_dotenv() + + client = AzureOpenAI( + api_key=os.environ['AZURE_OPENAI_KEY'], # 이것은 기본값이며, 생략 가능합니다. + api_version = "2023-07-01-preview" + ) + + deployment=os.environ['AZURE_OPENAI_DEPLOYMENT'] + ``` + + 다음은 `api_type`, `api_base`, `api_version` 및 `api_key`를 설정하는 Azure Open AI에 대한 연결을 구성하기 위한 일부 Python 코드입니다. + +2. Creating two student descriptions using variables `student_1_description` and `student_2_description`. + + ```python + student_1_description="Emily Johnson는 Duke 대학교에서 컴퓨터 공학을 전공하는 2학년 학생입니다. 그녀는 3.7의 평점을 가지고 있습니다. Emily는 대학의 체스 동아리와 토론 팀의 활발한 회원입니다. 졸업 후 소프트웨어 엔지니어링 분야에서 경력을 쌓고자 합니다." + + student_2_description = "Michael Lee는 Stanford 대학교에서 컴퓨터 공학을 전공하는 2학년 학생입니다. 그는 3.8의 평점을 가지고 있습니다. Michael은 프로그래밍 기술로 유명하며 대학의 로봇 공학 동아리의 활발한 회원입니다. 그는 학업을 마친 후 인공지능 분야에서 경력을 쌓고자 합니다." + ``` + + 위의 학생 설명을 LLM에게 보내 데이터를 구문 분석하도록 하려고 합니다. 이 데이터는 나중에 우리의 애플리케이션에서 사용되어 API로 전송되거나 데이터베이스에 저장될 수 있습니다. + +3. LLM에게 우리가 관심 있는 정보를 지시하는 두 개의 동일한 프롬프트를 생성해 봅시다: + + ```python + prompt1 = f''' + 다음 텍스트에서 다음 정보를 추출하여 JSON 객체로 반환해주세요: + + 이름 + 전공 + 학교 + 성적 + 동아리 + + 다음 텍스트에서 정보를 추출해주세요: + {student_1_description} + ''' + + prompt2 = f''' + 다음 텍스트에서 다음 정보를 추출하여 JSON 객체로 반환해주세요: + + 이름 + 전공 + 학교 + 성적 + 동아리 + + 다음 텍스트에서 정보를 추출해주세요: + {student_2_description} + ''' + ``` + + 위의 프롬프트는 LLM에게 정보를 추출하고 응답을 JSON 형식으로 반환하도록 지시합니다. + +4. 프롬프트와 Azure Open AI와의 연결을 설정한 후, `openai.ChatCompletion`을 사용하여 프롬프트를 LLM에게 전송합니다. 프롬프트를 `messages` 변수에 저장하고 역할을 `user`로 지정합니다. 이는 챗봇에게 사용자의 메시지를 모방하기 위한 것입니다. + + ```python + # prompt one에 대한 응답 + openai_response1 = client.chat.completions.create( + model=deployment, + messages = [{'role': 'user', 'content': prompt1}] + ) + openai_response1.choices[0].message.content + + # prompt two에 대한 응답 + openai_response2 = client.chat.completions.create( + model=deployment, + messages = [{'role': 'user', 'content': prompt2}] + ) + openai_response2.choices[0].message.content + ``` + +이제 우리는 두 요청을 LLM에게 보내고, `openai_response1['choices'][0]['message']['content']`와 같이 응답을 받을 수 있습니다. + +1. 마지막으로, `json.loads`를 호출하여 응답을 JSON 형식으로 변환할 수 있습니다: + + ```python + # 응답을 JSON 객체로 로드합니다. + json_response1 = json.loads(openai_response1.choices[0].message.content) + json_response1 + ``` + + 응답 1: + + ```json + { "이름": "Emily Johnson", "전공": "컴퓨터 공학", "학교": "Duke 대학교", "성적": "3.7", "동아리": "체스 동아리" } + ``` + + 응답 2: + + ```json + { "이름": "Michael Lee", "전공": "컴퓨터 공학", "학교": "Stanford 대학교", "성적": "3.8 GPA", "동아리": "로봇 공학 동아리" } + ``` + + 프롬프트는 동일하고 설명은 유사하지만, `Grades` 속성의 값은 때로는 `3.7` 또는 `3.7 GPA`와 같이 서로 다른 형식으로 포맷되는 것을 볼 수 있습니다. + + 이 결과는 LLM이 쓰인 프롬프트의 구조화되지 않은 (unstructured) 데이터를 받아들이고 구조화되지 않은 (unstructured) 데이터를 반환하기 때문입니다. 이 데이터를 저장하거나 사용할 때 어떤 형식을 기대해야 하는지 알기 위해 구조화된 (structured) 형식이 필요합니다. + + 그렇다면 포맷팅 문제를 어떻게 해결할까요? functional calling을 사용하여 구조화된 데이터를 받을 수 있도록 할 수 있습니다. function calling을 사용할 때, LLM은 실제로 함수를 호출하거나 실행하지 않습니다. 대신, LLM에게 응답을 따르기 위한 구조를 만듭니다. 그런 다음, 우리는 응답을 사용하여 응용 프로그램에서 어떤 함수를 실행할지 알 수 있습니다. + +![function flow](../../images/Function-Flow.png?WT.mc_id=academic-105485-koreyst) + +함수에서 반환된 값을 가져와서 LLM에게 다시 전송할 수 있습니다. 그럼 LLM은 자연어를 사용하여 사용자의 질문에 답변합니다. + +## function call을 사용하는 사용 사례 + +function call을 사용하여 앱을 개선할 수 있는 다양한 사용 사례가 있습니다. 예를 들어 다음과 같은 경우입니다: + +- **외부 도구 호출**: 챗봇은 사용자의 질문에 대한 답변을 제공하는 데에 탁월합니다. function calling을 사용하면 챗봇은 사용자의 메시지를 사용하여 특정 작업을 완료할 수 있습니다. 예를 들어, 학생이 챗봇에게 "이 주제에 대해 더 많은 도움이 필요하다는 내 강사에게 이메일을 보내주세요"라고 요청할 수 있습니다. 이는 `send_email(to: string, body: string)` function calling을 수행할 수 있습니다. + +- **API 또는 데이터베이스 쿼리 생성**: 사용자는 자연어를 사용하여 형식화된 쿼리나 API 요청을 통해 정보를 찾을 수 있습니다. 예를 들어, 선생님이 "최근 과제를 완료한 학생들은 누구인가요?"라고 요청할 수 있으며, 이는 `get_completed(student_name: string, assignment: int, current_status: string)`라는 함수를 호출할 수 있습니다. + +- **구조화된 데이터 생성**: 사용자는 텍스트 블록이나 CSV에서 중요한 정보를 추출하기 위해 LLM을 사용할 수 있습니다. 예를 들어, 학생이 평화 협정에 대한 위키피디아 문서를 가져와 AI 플래시 카드를 만들 수 있습니다. 이는 `get_important_facts(agreement_name: string, date_signed: string, parties_involved: list)`라는 함수를 사용하여 수행할 수 있습니다. + +## 첫 번째 Function Call 생성 + +Function Call을 생성하는 과정은 다음 3단계로 이루어집니다: + +1. 함수 목록과 사용자 메시지를 사용하여 Chat Completions API를 **호출**합니다. +2. 모델의 응답을 **읽어** 함수를 실행하거나 API 호출을 수행합니다. +3. 함수의 응답을 사용하여 사용자에게 응답을 생성하기 위해 Chat Completions API에 **다시 호출**합니다. + +![LLM Flow](../../images/LLM-Flow.png?WT.mc_id=academic-105485-koreyst) + +### 단계 1 - 메시지 생성 + +첫 번째 단계는 사용자 메시지를 생성하는 것입니다. 이는 동적으로 텍스트 입력의 값을 가져와 할당할 수도 있고, 여기에서 값을 직접 할당할 수도 있습니다. Chat Completions API를 처음 사용하는 경우, `role`과 `content`를 메시지에 정의해야 합니다. + +`role`은 `system` (규칙 생성), `assistant` (모델), `user` (최종 사용자) 중 하나일 수 있습니다. function calling을 위해 `user`로 할당하고 예시 질문을 작성합니다. + +```python +messages= [ {"role": "user", "content": "Azure를 배우기 위한 초보 학생에게 좋은 강좌를 찾아주세요."} ] +``` + +다른 역할을 할당함으로써, 시스템이 무언가를 말하는지 사용자가 말하는지 LLM에게 명확하게 전달되어 LLM이 대화 기록을 구축하는 데 도움이 됩니다. + +### 단계 2 - 함수 생성 + +다음으로, 함수와 해당 함수의 매개변수를 정의합니다. 여기에서는 `search_courses`라는 하나의 함수만 사용하지만 여러 개의 함수를 생성할 수 있습니다. + +> **중요**: 함수는 LLM에게 시스템 메시지에 포함되며 사용 가능한 토큰의 양에 포함됩니다. + +아래에서는 각 항목이 함수인 배열로 함수를 생성합니다. 각 항목은 `name`, `description`, `parameters` 속성을 가지고 있습니다: + +```python +functions = [ + { + "name":"search_courses", + "description":"Retrieves courses from the search index based on the parameters provided", + "parameters":{ + "type":"object", + "properties":{ + "role":{ + "type":"string", + "description":"The role of the learner (i.e. developer, data scientist, student, etc.)" + }, + "product":{ + "type":"string", + "description":"The product that the lesson is covering (i.e. Azure, Power BI, etc.)" + }, + "level":{ + "type":"string", + "description":"The level of experience the learner has prior to taking the course (i.e. beginner, intermediate, advanced)" + } + }, + "required":[ + "role" + ] + } + } +] +``` + +아래에서 각 함수 인스턴스를 자세히 설명하겠습니다: + +- `name` - 호출하려는 함수의 이름입니다. +- `description` - 함수가 작동하는 방식에 대한 설명입니다. 여기서는 구체적이고 명확하게 작성하는 것이 중요합니다. +- `parameters` - 모델이 응답에서 생성할 값과 형식의 목록입니다. 매개변수 배열은 다음 속성을 가진 항목으로 구성됩니다: + 1. `type` - 속성의 데이터 유형이 저장됩니다. + 1. `properties` - 모델이 응답에 사용할 구체적인 값의 목록입니다. + 1. `name` - 모델이 형식화된 응답에서 사용할 속성의 이름입니다. 예를 들어, `product`입니다. + 1. `type` - 이 속성의 데이터 유형입니다. 예를 들어, `string`입니다. + 1. `description` - 특정 속성에 대한 설명입니다. + +function call이 완료되기 위해 선택적으로 `required` 속성도 있습니다. + +### 단계 3 - function call 만들기 + +함수를 정의한 후에는 Chat Completions API 호출에 해당 함수를 포함해야 합니다. 이를 위해 요청에 `functions`를 추가합니다. 이 경우 `functions=functions`로 설정합니다. + +`function_call`을 `auto`로 설정하는 옵션도 있습니다. 이는 우리가 직접 할당하는 대신 LLM이 사용자 메시지를 기반으로 어떤 함수를 호출할지 결정하도록 합니다. + +아래 코드에서는 `ChatCompletion.create`를 호출하는 방법을 보여줍니다. `functions=functions`와 `function_call="auto"`를 설정하여 LLM에게 우리가 제공한 함수를 언제 호출할지 결정하도록 합니다: + +```python +response = client.chat.completions.create(model=deployment, + messages=messages, + functions=functions, + function_call="auto") + +print(response.choices[0].message) +``` + +The response coming back now looks like so: + +```json +{ + "role": "assistant", + "function_call": { + "name": "search_courses", + "arguments": "{\n \"role\": \"student\",\n \"product\": \"Azure\",\n \"level\": \"beginner\"\n}" + } +} +``` + +여기에서는 `search_courses` 함수가 어떻게 호출되고 어떤 인수로 호출되었는지를 볼 수 있습니다. 이는 JSON 응답의 `arguments` 속성에 나열된 것과 동일합니다. + +LLM은 `messages` 매개변수에 제공된 값에서 데이터를 추출하여 함수의 인수와 일치하는 데이터를 찾을 수 있었습니다. 아래는 `messages` 값의 복습입니다: + +```python +messages= [ {"role": "user", "content": "초보 학생이 Azure를 배우기 위한 좋은 강좌를 찾아주세요."} ] +``` + +`messages`에서 `student`, `Azure` 및 `beginner`가 추출되어 함수의 입력으로 설정되었음을 확인할 수 있습니다. 함수를 이렇게 사용하는 것은 프롬프트에서 정보를 추출하는 좋은 방법이며 LLM에 구조를 제공하고 재사용 가능한 기능을 갖도록 하는 데 유용합니다. + +다음으로, 이를 앱에 통합하는 방법을 살펴보겠습니다. + +## Function Call을 애플리케이션에 통합하기 + +LLM에서 서식이 지정된 응답을 테스트한 후, 이제 이를 애플리케이션에 통합할 수 있습니다. + +### 흐름 관리 + +애플리케이션에 이를 통합하기 위해 다음 단계를 수행해 보겠습니다: + +1. 먼저 Open AI 서비스에 호출을 수행하고 메시지를 `response_message`라는 변수에 저장합니다. + + ```python + response_message = response.choices[0].message + ``` + +1. 이제 Microsoft Learn API를 호출하여 강좌 목록을 가져올 함수를 정의합니다: + + ```python + import requests + + def search_courses(role, product, level): + url = "https://learn.microsoft.com/api/catalog/" + params = { + "role": role, + "product": product, + "level": level + } + response = requests.get(url, params=params) + modules = response.json()["modules"] + results = [] + for module in modules[:5]: + title = module["title"] + url = module["url"] + results.append({"title": title, "url": url}) + return str(results) + ``` + + 이제 우리는 `functions` 변수에 도입된 함수 이름과 매핑되는 실제 Python 함수를 생성합니다. 또한 필요한 데이터를 가져오기 위해 실제 외부 API 호출을 수행합니다. 이 경우에는 Microsoft Learn API를 사용하여 교육 모듈을 검색합니다. + + 그래서 `functions` 변수와 해당하는 Python 함수를 생성했는데, 어떻게 LLM에게 이 둘을 매핑하여 Python 함수를 호출하도록 알려줄까요? + + 1. Python 함수를 호출해야 하는지 확인하기 위해 LLM 응답을 살펴보고 `function_call`이 포함되어 있는지 확인한 후 해당 함수를 호출해야 합니다. 아래에 언급된 확인 방법을 사용하여 이를 수행할 수 있습니다: + + ```python + # 모델이 함수를 호출하려는지 확인합니다. + if response_message.function_call.name: + print("추천 function call:") + print(response_message.function_call.name) + print() + + # 함수를 호출합니다. + function_name = response_message.function_call.name + + available_functions = { + "search_courses": search_courses, + } + function_to_call = available_functions[function_name] + + function_args = json.loads(response_message.function_call.arguments) + function_response = function_to_call(**function_args) + + print("function call 결과:") + print(function_response) + print(type(function_response)) + + + # 어시스턴트 응답과 함수 응답을 메시지에 추가합니다. + messages.append( # 어시스턴트 응답을 메시지에 추가 + { + "role": response_message.role, + "function_call": { + "name": function_name, + "arguments": response_message.function_call.arguments, + }, + "content": None + } + ) + messages.append( # 함수 응답을 메시지에 추가 + { + "role": "function", + "name": function_name, + "content":function_response, + } + ) + ``` + + 이 세 줄은 함수 이름, 인수를 추출하고 호출을 수행하는 것을 보장합니다: + + ```python + function_to_call = available_functions[function_name] + + function_args = json.loads(response_message.function_call.arguments) + function_response = function_to_call(**function_args) + ``` + + 아래는 코드를 실행한 결과입니다: + + **결과** + + ```Recommended Function call: + { + "name": "search_courses", + "arguments": "{\n \"role\": \"student\",\n \"product\": \"Azure\",\n \"level\": \"beginner\"\n}" + } + + Output of function call: + [{'title': 'Describe concepts of cryptography', 'url': 'https://learn.microsoft.com/training/modules/describe-concepts-of-cryptography/? + WT.mc_id=api_CatalogApi'}, {'title': 'Introduction to audio classification with TensorFlow', 'url': 'https://learn.microsoft.com/en- + us/training/modules/intro-audio-classification-tensorflow/?WT.mc_id=api_CatalogApi'}, {'title': 'Design a Performant Data Model in Azure SQL + Database with Azure Data Studio', 'url': 'https://learn.microsoft.com/training/modules/design-a-data-model-with-ads/? + WT.mc_id=api_CatalogApi'}, {'title': 'Getting started with the Microsoft Cloud Adoption Framework for Azure', 'url': + 'https://learn.microsoft.com/training/modules/cloud-adoption-framework-getting-started/?WT.mc_id=api_CatalogApi'}, {'title': 'Set up the + Rust development environment', 'url': 'https://learn.microsoft.com/training/modules/rust-set-up-environment/?WT.mc_id=api_CatalogApi'}] + + ``` + +1. 이제 우리는 업데이트된 메시지 `messages`를 LLM에 보내서 API JSON 형식의 응답 대신 자연어 응답을 받을 것입니다. + + ```python + print("Messages in next request:") + print(messages) + print() + + second_response = client.chat.completions.create( + messages=messages, + model=deployment, + function_call="auto", + functions=functions, + temperature=0 + ) # GPT에서 함수 응답을 볼 수 있는 새로운 응답을 받습니다. + + + print(second_response.choices[0].message) + ``` + + **Output** + + ```python + { + "role": "assistant", + "content": "Azure를 배우기 위한 초보 학생들을 위한 좋은 강의를 찾았어요:\n\n1. [암호학 개념 설명](https://learn.microsoft.com/training/modules/describe-concepts-of-cryptography/?WT.mc_id=api_CatalogApi)\n2. [TensorFlow를 사용한 오디오 분류 소개](https://learn.microsoft.com/training/modules/intro-audio-classification-tensorflow/?WT.mc_id=api_CatalogApi)\n3. [Azure SQL Database에서 성능이 우수한 데이터 모델 설계](https://learn.microsoft.com/training/modules/design-a-data-model-with-ads/?WT.mc_id=api_CatalogApi)\n4. [Azure를 위한 Microsoft Cloud Adoption Framework 시작하기](https://learn.microsoft.com/training/modules/cloud-adoption-framework-getting-started/?WT.mc_id=api_CatalogApi)\n5. [Rust 개발 환경 설정하기](https://learn.microsoft.com/training/modules/rust-set-up-environment/?WT.mc_id=api_CatalogApi)\n\n링크를 클릭하여 강의에 접속할 수 있습니다." + } + + ``` + +## 과제 + +Azure Open AI Function Calling 학습을 계속 진행하기 위해 다음을 구현해 볼 수 있습니다: + +- 학습자가 더 많은 강의를 찾을 수 있도록 함수의 추가 매개변수를 만들어보세요. +- 학습자의 모국어와 같은 추가 정보를 받아들이는 다른 function call을 생성하세요. +- function call 및/또는 API 호출이 적합한 강의를 반환하지 않을 경우 오류 처리를 만들어보세요. + +힌트: [Learn API 참조 문서](https://learn.microsoft.com/training/support/catalog-api-developer-reference?WT.mc_id=academic-105485-koreyst) 페이지를 참고하여 이 데이터가 어떻게 사용 가능한지 확인하세요. + +## 훌륭합니다! 계속해서 학습하세요 + +이 레슨을 완료한 후, [Generative AI 학습 컬렉션](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)을 확인하여 Generative AI 지식을 더욱 향상시킬 수 있습니다! + +12번 레슨으로 이동하여 [AI 애플리케이션을 위한 UX 디자인](../../../12-designing-ux-for-ai-applications/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)에 대해 알아보세요! diff --git a/12-designing-ux-for-ai-applications/translations/ko/README.md b/12-designing-ux-for-ai-applications/translations/ko/README.md new file mode 100644 index 000000000..e84e93f5a --- /dev/null +++ b/12-designing-ux-for-ai-applications/translations/ko/README.md @@ -0,0 +1,122 @@ +# AI 애플리케이션을 위한 사용자 경험(ux) 디자인하기 + +[![Designing UX for AI Applications](../../images/12-lesson-banner.png?WT.mc_id=academic-105485-koreyst)](https://youtu.be/bO7h2_hOhR0?WT.mc_id=academic-105485-koreyst) + +> *(이미지를 클릭하면 이 수업의 비디오를 볼 수 있습니다)* + +사용자 경험은 앱을 개발하는 데 있어 매우 중요한 부분입니다. 사용자들은 작업을 효율적으로 수행할 수 있어야 합니다. 그리고 효율적으로 사용하는 것도 중요하지만 누구나 사용할 수 있도록 앱을 디자인하는 것도 중요합니다. 이 장에서는 이러한 영역에 중점을 두어 사람들이 사용할 수 있고, 사용하고 싶어하는 앱을 디자인할 수 있도록 하는 부분들을 다룰 것입니다. + +## 소개 + +사용자 경험은 특정 제품이나 서비스(시스템, 도구, 또는 디자인)와 상호 작용하고 사용하는 방식입니다. AI 애플리케이션을 개발할 때, 개발자들은 사용자 경험이 효과적인 것뿐만 아니라 윤리적인 것도 보장하는 데 중점을 둡니다. 이 수업에서는 사용자의 요구를 충족시키는 AI 애플리케이션을 어떻게 구축하는지에 대해 다룹니다. + +이 수업에서는 다음의 영역들을 다룹니다: + +* 사용자 경험 소개 및 사용자 요구 이해 +* 신뢰와 투명성을 위한 AI 애플리케이션 디자인 +* 협력과 피드백을 위한 AI 애플리케이션 디자인 + +## 학습 목표 + +이 수업을 마친 후에는 다음을 할 수 있을 것입니다: + +* 사용자 요구를 충족시키는 AI 애플리케이션을 구축하는 방법에 대한 이해 +* 신뢰와 협력을 촉진하는 AI 애플리케이션 디자인 + +### 전제 조건 + +다음에 대해 더 읽어보십시오. [user experience and design thinking.](https://learn.microsoft.com/training/modules/ux-design?WT.mc_id=academic-105485-koreyst) + +## 사용자 경험 소개 및 사용자 요구 이해 + +우리 가상의 교육 스타트업에서는 두 주요 사용자, 즉 교사와 학생이 있습니다. 각각의 사용자는 고유한 요구사항을 가지고 있습니다. 사용자 중심 디자인은 제품이 목적 그대로의 사용자에게 관련성 있고 유익하도록 하는 데 중점을 둡니다. + +애플리케이션은 **유용하며, 신뢰성 있고, 접근 가능하며, 즐거워야** 좋은 사용자 경험을 제공할 수 있습니다. + +### 유용성 + +"유용하다"는 애플리케이션이 의도한 목적과 일치하는 기능을 갖고 있다는 것을 의미합니다. 예를 들어, 평가 과정을 자동화하거나 복습용 플래시카드를 생성하는 것과 같은 목적을 가지고 있을 수 있습니다. 평가 과정을 자동화하는 애플리케이션은 미리 정의된 기준을 기반으로 학생들의 과제에 정확하고 효율적으로 점수를 부여할 수 있어야 합니다. 마찬가지로, 복습용 플래시카드를 생성하는 애플리케이션은 데이터를 기반으로 관련성 있고 다양한 질문을 생성할 수 있어야 합니다. + +### 신뢰성 + +신뢰성은 애플리케이션이 일관되고 오류 없이 지속적으로 작업을 수행할 수 있다는 것을 의미합니다. 그러나 인간과 마찬가지로 AI도 완벽하지 않으며 오류에 노출될 수 있습니다. 애플리케이션은 오류나 예상치 못한 상황에 직면할 수 있으며 이는 인간의 개입이나 수정이 필요할 수 있습니다. 이러한 상황을 직면 했을 때 오류를 어떻게 처리하는지는 중요한 문제입니다. 이 수업의 마지막 섹션에서는 AI 시스템과 애플리케이션이 협력과 피드백을 위해 어떻게 디자인되는지에 대해 다룰 것입니다. + +### 접근성 + +접근 가능하다는 것은 사용자 경험을 여러 능력을 가진 사용자, 장애가 있는 사용자를 포함하여 모든 이에게 확장할 수 있다는 것을 의미합니다. 접근성 가이드라인과 원칙을 따르면, AI 솔루션은 모든 사용자에게 포괄적이고, 사용하기 쉬우며, 혜택이 있는 것으로 나타납니다. + +### 즐거움 + +즐거움을 준다는 것은 애플리케이션의 사용이 즐거움을 주는 것을 의미합니다. 매력적인 사용자 경험은 사용자에게 긍정적인 영향을 미칠 수 있어 애플리케이션에 다시 돌아오게 유도하고 비즈니스 수익을 증가시킬 수 있습니다. + +![image illustrating UX considerations in AI](../../images/uxinai.png?WT.mc_id=academic-105485-koreyst) + +모든 문제를 AI로 해결할 수 있는 것은 아닙니다. AI는 사용자 경험을 증진시키기 위해 나타납니다. 이는 수동적인 작업을 자동화하거나 사용자 경험을 개인화하는 것과 같은 방식으로 이루어질 수 있습니다. + +## 신뢰와 투명성을 위한 AI 애플리케이션 디자인 + +신뢰를 구축하는 것은 AI 애플리케이션을 디자인할 때 중요합니다. 신뢰가 있다는 것은 애플리케이션이 작업을 완료하고 결과를 일관되게 제공하며 그 결과가 사용자가 필요로 하는 것임을 확신할 수 있게 도움을 줍니다. 이 영역에서의 위험은 불신이나 과신입니다. 불신은 사용자가 AI 시스템에 신뢰를 갖지 않거나 거의 없을 때 발생하며 이는 사용자가 애플리케이션을 거부하게 만들 수 있습니다. 과신은 사용자가 AI 시스템의 능력을 과대평가할 때 발생하며 이는 사용자가 AI 시스템에 지나치게 신뢰할 수 있게 만듭니다. 예를 들어, 자동 채점 시스템에서 과신이 발생하면 교사가 몇몇 종이를 확인하지 않고도 채점 시스템이 잘 작동하는지 확인하지 않을 수 있습니다. 이로 인해 학생들에 대한 불공정하거나 부정확한 성적 또는 피드백 및 개선의 기회를 놓치는 일이 발생할 수 있습니다. + +신뢰를 디자인의 중심에 두기 위해 두 가지 방법은 설명가능성과 제어입니다. + +### 설명가능성 + + +AI가 미래 세대에 지식을 전달하는 것과 같이 결정에 도움이 되는 경우, 교사와 부모가 AI 결정이 어떻게 이루어지는지 이해하는 것이 중요합니다. AI 애플리케이션이 결정을 내리는 방식을 이해하는 것이 설명가능성입니다. 설명가능성을 위한 디자인에는 AI 애플리케이션이 수행할 수 있는 예제의 세부 정보를 추가하는 것이 포함됩니다. 예를 들어, "AI 교사로 시작하기" 대신에 "AI를 사용하여 노트를 요약하여 쉬운 복습을 도와보세요"와 같이 시스템이 구체적인 예시를 제공할 수 있습니다. + +![an app landing page with clear illustration of explainability in AI applications](../../images/explanability-in-ai.png?WT.mc_id=academic-105485-koreyst) + +또 다른 예로는 AI가 사용자 및 개인 데이터를 사용하는 방법이 있습니다. 예를 들어, 학생이라는 페르소나를 가진 사용자는 해당 페르소나에 기반한 제한이 있을 수 있습니다. AI는 질문에 대한 답을 드러낼 수 없을지라도 사용자가 문제를 어떻게 해결할지에 대한 가이드를 제공할 수 있습니다. + +![AI replying to questions based on persona](../../images/solving-questions.png?WT.mc_id=academic-105485-koreyst) + +설명가능성의 마지막 중요한 부분은 설명을 단순화하는 것입니다. 학생들과 교사들이 AI 전문가가 아닐 수 있기 때문에 애플리케이션이 할 수 있는 일이나 할 수 없는 일에 대한 설명은 단순하고 이해하기 쉽게 제공되어야 합니다. + +![simplified explanations on AI capabilities](../../images/simplified-explanations.png?WT.mc_id=academic-105485-koreyst) + +### 제어 + +생성형 AI는 사용자와 AI 간의 협력을 만들어냅니다. 예를 들어 사용자는 서로 다른 결과를 얻기 위해 프롬프트를 수정할 수 있습니다. 또한, 한 번 출력물이 생성되면 사용자는 자신의 통제대로 결과를 수정하여 얻을 수 있어야 합니다. 예를 들어, Bing을 사용할 때는 형식, 어조, 길이에 기반하여 프롬프트를 맞춤 설정할 수 있습니다. 더불어 결과에 변경을 추가하거나 출력물을 수정할 수 있습니다. 아래에 표시된 것처럼요: + +![Bing search results with options to modify the prompt and output](../../images/bing1.png?WT.mc_id=academic-105485-koreyst "Bing search results with options to modify the prompt and output") + +Bing의 또 다른 기능 중 하나는 사용자가 애플리케이션을 통제할 수 있도록 데이터 사용에 동의하거나 동의를 철회할 수 있는 기능입니다. 예를 들어 학교 애플리케이션의 경우 학생은 자신의 노트와 교사의 자료를 복습 자료로 활용하고 싶을 것입니다. + +![Bing search results with options to modify the prompt and output](../../images/bing2.png?WT.mc_id=academic-105485-koreyst "Bing search results with options to modify the prompt and output") + +> AI 애플리케이션을 디자인할 때 의도성(intentionality)은 사용자가 능력을 과대평가하거나 현실적이지 않은 기대를 설정하지 않도록 하는 데 핵심적인 역할을 합니다. 이를 위한 한 가지 방법은 프롬프트와 결과 사이에 마찰을 만들어내는 것입니다. 사용자에게 이것이 AI이며 인간이 아니라는 점을 상기시켜 사용자에게 경고하는 것입니다. + +## 협력과 피드백을 위한 AI 애플리케이션 디자인 + +앞서 언급한대로 생성형 AI는 사용자와 AI 간의 협력을 만들어냅니다. 대부분의 상호작용은 사용자가 프롬프트를 입력하고 AI가 결과를 생성하는 것입니다. 그렇다면 결과가 부정확한 경우는 어떻게 처리되는 걸까요? 애플리케이션이 오류를 어떻게 처리하나요? AI는 사용자를 나무랄까요 아니면 오류를 설명하는 데 시간을 들일까요? + +AI 애플리케이션은 피드백을 받고 주는 데에 적합하게 구축되어야 합니다. 이는 AI 시스템이 개선되는 데 도움이 되는 것뿐만 아니라 사용자와의 신뢰를 쌓는 데에도 기여합니다. 디자인에 피드백 루프를 포함하는 것이 중요하며, 이를 위한 예시로는 결과물에 대한 간단한 좋아요 또는 싫어요가 있을 수 있습니다. + +이를 처리하는 또 다른 방법은 시스템의 능력과 제한을 명확하게 전달하는 것입니다. 사용자가 AI 능력을 넘어서는 것을 요청할 때, 이에 대한 처리 방법도 명시되어야 합니다. 아래에 표시된 것처럼 사용자가 AI 능력을 벗어난 요청을 할 경우에 대한 처리 방법이 있어야 합니다. + +![Giving feedback and handling errors](../../images/feedback-loops.png?WT.mc_id=academic-105485-koreyst) + +시스템 오류는 사용자가 AI의 범위를 벗어난 정보와 관련한 도움이 필요한 경우나 애플리케이션이 사용자가 생성할 수 있는 질문/주제의 수에 제한을 둔 경우에 흔히 발생합니다. 예를 들어, 역사와 수학과 같은 한정된 주제의 데이터로 훈련된 AI 애플리케이션은 지리와 관련된 질문에 대응할 수 없을 것입니다. 이를 완화하기 위해 AI 시스템은 다음과 같은 응답을 할 수 있습니다: "죄송합니다만, 저희 제품은 다음과 같은 주제의 데이터로 훈련되었기 때문에... 당신이 물은 질문에 답할 수 없습니다." + +AI 애플리케이션은 완벽하지 않기 때문에 오류가 발생할 수 있습니다. 그렇기에 앱을 디자인할 때 사용자로부터 피드백과 오류 처리를 간단하고 설명하기 쉬운 방식으로 수용할 수 있도록 하는 것이 중요합니다. + +## 과제 + + +당신이 만든 AI 앱들 중에 어떠한 것이든 골라 밑의 단계들을 당신의 앱에 구현해보는 것을 고려해보세요: + +* **즐거움:** 앱을 어떻게 더 즐겁게 만들 수 있는지 고려하세요. 설명을 어디에 추가하고 있는지, 사용자의 탐험을 유도하고 있는지 확인하세요. 에러 메시지를 어떻게 구성하고 있는지도 고려해보세요. + +* **사용성:** 웹 앱을 개발 중이라면, 앱이 마우스와 키보드 둘다를 가지고 탐험할 수 있도록 보장하세요. + +* **신뢰와 투명성:** AI의 출력물을 완전히 신뢰하지 말고, 출력물을 검증하기 위해 인간을 프로세스에 추가하는 방법을 고려하세요. 또한, 신뢰성과 투명성을 달성하기 위한 다른 방법을 고려하고 구현하세요. + +* **제어:** 사용자에게 어플리케이션에 제공하는 데이터를 통제할 수 있는 권한을 부여하세요. 사용자가 AI 어플리케이션의 데이터 수집에 동의하거나 동의 철회할 수 있는 방법을 구현하세요. + + + +## 축하합니다, 이번 코스를 완료하였습니다. + +이 수업이 끝났으니 우리의 [Generative AI 학습 컬렉션](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst) 수업을 들어, 생성형 AI에 관한 지식을 계속해서 쌓아보세요! + +축하합니다, 이번 코스를 완료하였습니다! 그러나 여기서 멈추면 안됩니다. 바라건대, 당신이 당신만의 생성형 AI 스타트업을 만드는 것에 영감을 얻었으면 좋겠습니다. 여기 [Microsoft Founders Hub](https://aka.ms/genai-foundershub?WT.mc_id=academic-105485-koreyst)로 이동하여 당신의 여정에 도움을 주기 위한 프로그램에 신청해보세요. diff --git a/13-continued-learning/translations/ko/README.md b/13-continued-learning/translations/ko/README.md new file mode 100644 index 000000000..b385fcbb7 --- /dev/null +++ b/13-continued-learning/translations/ko/README.md @@ -0,0 +1,135 @@ +# 추가 자료 + +다음은 Generative AI 학습 및 구축을 계속하기 위한 다른 훌륭한 자료에 대한 링크입니다. + +빠진 좋은 자료가 있나요? PR을 제출하여 알려주세요! + +## 🧠 학습 컬렉션 + +이 강좌를 완료한 후, [Generative AI 학습 컬렉션](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)을 확인하여 Generative AI 지식을 더욱 향상시킬 수 있습니다! + +## Lesson 1 - 생성형 AI와 LLM 소개 + +🔗 [How GPT models work: accessible to everyone](https://bea.stollnitz.com/blog/how-gpt-works/?WT.mc_id=academic-105485-koreyst) + +🔗 [Fundamentals of Generative AI](https://learn.microsoft.com/training/modules/fundamentals-generative-ai?&WT.mc_id=academic-105485-koreyst) + +🔗 [How GPT models work: accessible to everyone](https://bea.stollnitz.com/blog/how-gpt-works?WT.mc_id=academic-105485-koreyst) + +🔗 [Generative AI: Implication and Applications for Education](https://arxiv.org/abs/2305.07605?wt.mc_id=github_S-1231_webpage_reactor) + +## Lesson 2 - 다양한 LLM 탐색 및 비교 + +🔗 [How to use Open Source foundation models curated by Azure Machine Learning (preview) - Azure Machine Learning | Microsoft Learn](https://learn.microsoft.com/azure/machine-learning/how-to-use-foundation-models?WT.mc_id=academic-105485-koreyst) + +🔗 [The Large Language Model (LLM) Index | Sapling](https://sapling.ai/llm/index?WT.mc_id=academic-105485-koreyst) + +🔗 [[2304.04052] Decoder-Only or Encoder-Decoder? Interpreting Language Model as a Regularized Encoder-Decoder (arxiv.org)](https://arxiv.org/abs/2304.04052?WT.mc_id=academic-105485-koreyst) + +🔗 [Retrieval Augmented Generation using Azure Machine Learning prompt flow](https://learn.microsoft.com/azure/machine-learning/concept-retrieval-augmented-generation?WT.mc_id=academic-105485-koreyst) + +🔗 [Grounding LLMs](https://techcommunity.microsoft.com/t5/fasttrack-for-azure/grounding-llms/ba-p/3843857?wt.mc_id=github_S-1231_webpage_reactor) + +🔗 [The Large Language Model (LLM) Index | Sapling](https://sapling.ai/llm/index?wt.mc_id=github_S-1231_webpage_reactor ) + +🔗 [[2304.04052] Decoder-Only or Encoder-Decoder? Interpreting Language Model as a Regularized Encoder-Decoder (arxiv.org)](https://arxiv.org/abs/2304.04052?wt.mc_id=github_S-1231_webpage_reactor) + +## Lesson 3 - 생성형 AI의 책임 있는 사용 + +🔗 [Fundamentals of Responsible Generative AI](https://learn.microsoft.com/training/modules/responsible-generative-ai/?&WT.mc_id=academic-105485-koreyst) + +🔗 [Grounding LLMs](https://techcommunity.microsoft.com/t5/fasttrack-for-azure/grounding-llms/ba-p/3843857?WT.mc_id=academic-105485-koreyst) + +🔗 [Fundamentals of Responsible Generative AI](https://learn.microsoft.com/training/modules/responsible-generative-ai?WT.mc_id=academic-105485-koreyst) + +🔗 [Being Responsible with Generative AI](https://learn.microsoft.com/shows/ai-show/being-responsible-with-generative-ai?WT.mc_id=academic-105485-koreyst) + +🔗 [GPT-4 System Card](https://cdn.openai.com/papers/gpt-4-system-card.pdf?wt.mc_id=github_S-1231_webpage_reactor) + +## Lesson 4 - 프롬프트 엔지니어링 기본 원리 이해 + +🔗 [Getting Started with Azure OpenAI Services](https://https://learn.microsoft.com/training/modules/get-started-openai/?&WT.mc_id=academic-105485-koreyst) + +[Apply Prompt Engineering with Azure OpenAI services](https://learn.microsoft.com/training/modules/apply-prompt-engineering-azure-openai/?&WT.mc_id=academic-105485-koreyst) + +[Introduction to Prompt Engineering](https://learn.microsoft.com/azure/ai-services/openai/concepts/prompt-engineering?&WT.mc_id=academic-105485-koreyst) + +🔗 [Prompt Engineering Overview](https://learn.microsoft.com/semantic-kernel/prompt-engineering/?WT.mc_id=academic-105485-koreyst) + +🔗 [Azure OpenAI for Education Prompts](https://techcommunity.microsoft.com/t5/education-blog/azure-openai-for-education-prompts-ai-and-a-guide-from-ethan-and/ba-p/3938259?wt.mc_id=github_S-1231_webpage_reactor ) + +🔗 [Introduction to Prompt Engineering](https://learn.microsoft.com/azure/ai-services/openai/concepts/prompt-engineering?WT.mc_id=academic-105485-koreyst) + +🔗 [Prompt Engineering Overview](https://learn.microsoft.com/semantic-kernel/prompt-engineering?WT.mc_id=academic-105485-koreyst) + +🔗 [Azure OpenAI for Education Prompts](https://techcommunity.microsoft.com/t5/e1.ucation-blog/azure-openai-for-education-prompts-ai-and-a-guide-from-ethan-and/ba-p/3938259?WT.mc_id=academic-105485-koreyst) + +## Lesson 5 - 고급 프롬프트 생성 + +🔗 [Prompt Engineering Techniques](https://learn.microsoft.com/azure/ai-services/openai/concepts/advanced-prompt-engineering?WT.mc_id=academic-105485-koreyst) + +## Lesson 6 - 텍스트 생성 애플리케이션 구축 + +🔗 [Prompt Engineering Techniques](https://learn.microsoft.com/azure/ai-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions&WT.mc_id=academic-105485-koreyst) + +## Lesson 7 - 채팅 애플리케이션 구축 + +🔗 [System message framework and template recommendations for Large Language Models (LLMs)](https://learn.microsoft.com/azure/ai-services/openai/concepts/system-message?WT.mc_id=academic-105485-koreyst) + +🔗 [Learn how to work with the GPT-35-Turbo and GPT-4 models](https://learn.microsoft.com/azure/ai-services/openai/how-to/chatgpt?&WT.mc_id=academic-105485-koreyst) + +🔗 [Fine-Tuning language models from human preferences](https://arxiv.org/pdf/1909.08593.pdf?wt.mc_id=github_S-1231_webpage_reactor) + +🔗 [Build natural language solutions with Azure OpenAI Services](https://learn.microsoft.com/training/modules/build-language-solution-azure-openai/?WT.mc_id=academic-105485-koreyst) + + +🔗 [OpenAI Fine-Tuning](https://platform.openai.com/docs/guides/fine-tuning/when-to-use-fine-tuning?wt.mc_id=github_S-1231_webpage_reactor ) + +## Lesson 8 -검색 애플리케이션 구축 + +🔗 [Azure Cognitive Search](https://learn.microsoft.com/training/modules/improve-search-results-vector-search?WT.mc_id=academic-105485-koreyst) + +🔗 [OpenAI Embedding API](https://platform.openai.com/docs/api-reference/embeddings?wt.mc_id=github_S-1231_webpage_reactor) + +🔗 [Cosine Similarity](https://en.wikipedia.org/wiki/Cosine_similarity?wt.mc_id=github_S-1231_webpage_reactor) + +## Lesson 9 - 이미지 생성 애플리케이션 구축 + +🔗 [Generate Images with Azure OpenAI Service](https://learn.microsoft.com/training/modules/generate-images-azure-openai?WT.mc_id=academic-105485-koreyst) + +🔗 [OpenAI's DALL-E and CLIP 101: A Brief Introduction](https://towardsdatascience.com/openais-dall-e-and-clip-101-a-brief-introduction-3a4367280d4e?wt.mc_id=github_S-1231_webpage_reactor) + +🔗 [OpenAI's CLIP paper](https://arxiv.org/pdf/2103.00020.pdf?wt.mc_id=github_S-1231_webpage_reactor) + +🔗 [OpenAI's DALL-E and CLIP 101: A Brief Introduction](https://towardsdatascience.com/openais-dall-e-and-clip-101-a-brief-introduction-3a4367280d4e?WT.mc_id=academic-105485-koreyst) + +🔗 [OpenAI's CLIP paper](https://arxiv.org/pdf/2103.00020.pdf?WT.mc_id=academic-105485-koreyst) + +## Lesson 10 - 로우 코드 AI 애플리케이션 구축 +🔗 [Create bots with Microsoft Copilot Studio](https://learn.microsoft.com/training/paths/work-power-virtual-agents/?&WT.mc_id=academic-105485-koreyst) + +🔗 [Add intelligence with AI Builder and GPT](https://learn.microsoft.com/training/modules/ai-builder-text-generation?&WT.mc_id=academic-105485-koreyst) + +🔗 [Get Started with AI Builder](https://learn.microsoft.com/training/modules/get-started-with-ai-builder?WT.mc_id=academic-105485-koreyst) + +🔗 [Detect Objects with AI Builder](https://learn.microsoft.com/training/modules/get-started-with-ai-builder-object-detection?WT.mc_id=academic-105485-koreyst) + +🔗 [Build a canvas app solution with Copilot in Power Apps](https://learn.microsoft.com/training/modules/build-canvas-app-real-estate-power-apps-copilot/?WT.mc_id=academic-105485-koreyst) + +🔗 [Power Platform Copilot Prompt Library](https://pnp.github.io/powerplatform-prompts/?wt.mc_id=github_S-1231_webpage_reactor&WT.mc_id=academic-109639-somelezediko) + +## Lesson 11- 외부 애플리케이션과의 function calling 통합 + +🔗 [OpenAI Functions Documentation](https://learn.microsoft.com/azure/ai-services/openai/how-to/function-calling?WT.mc_id=academic-105485-koreyst) + +## Lesson 12 - AI 애플리케이션을 위한 UX 디자인 + +🔗 [Best practices for building collaborative UX with Human-AI partnership](https://learn.microsoft.com/community/content/best-practices-ai-ux?WT.mc_id=academic-105485-koreyst) + +🔗 [Designing Human-Centric AI Experiences: Applied UX Design for Artificial Intelligence by Akshay Kpre](https://www.linkedin.com/learning/ux-for-ai-design-practices-for-ai-developers?wt.mc_id=github_S-1231_webpage_reactor) + +🔗 [UX for AI: Design Practices for AI Developers](https://www.youtube.com/watch?wt.mc_id=github_S-1231_webpage_reactor&v=Lkbkd_hkDLY) + +🔗 [New skills in the age of AI by John Maeda](https://www.amazon.com/Designing-Human-Centric-Experiences-Artificial-Intelligence/dp/1484280873?wt.mc_id=github_S-1231_webpage_reactor) + +🔗 [Designing Human-Centric AI Experiences: Applied UX Design for Artificial Intelligence by Akshay Kpre](https://www.amazon.com/Designing-Human-Centric-Experiences-Artificial-Intelligence/dp/1484280873?WT.mc_id=academic-105485-koreyst) diff --git a/translations/ko/README.md b/translations/ko/README.md new file mode 100644 index 000000000..49dcb6123 --- /dev/null +++ b/translations/ko/README.md @@ -0,0 +1,95 @@ + +![Generative AI For Beginners](../../images/repository-thumbnail.png?WT.mc_id=academic-105485-koreyst) + +### 생성형 AI 애플리케이션을 구축하기 위해 알아야 할 모든 것을 가르치는 12개의 레슨 + +[![GitHub license](https://img.shields.io/github/license/microsoft/Generative-AI-For-Beginners.svg)](https://github.com/microsoft/Generative-AI-For-Beginners/blob/master/LICENSE?WT.mc_id=academic-105485-koreyst) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/Generative-AI-For-Beginners.svg)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/graphs/contributors/?WT.mc_id=academic-105485-koreyst) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/Generative-AI-For-Beginners.svg)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/issues/?WT.mc_id=academic-105485-koreyst) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/Generative-AI-For-Beginners.svg)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/pulls/?WT.mc_id=academic-105485-koreyst) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com?WT.mc_id=academic-105485-koreyst) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/Generative-AI-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/watchers/?WT.mc_id=academic-105485-koreyst) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/Generative-AI-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/network/?WT.mc_id=academic-105485-koreyst) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/Generative-AI-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/Generative-AI-For-Beginners/stargazers/?WT.mc_id=academic-105485-koreyst) + +[![Open in GitHub Codespaces](https://img.shields.io/static/v1?style=for-the-badge&label=GitHub+Codespaces&message=Open&color=lightgrey&logo=github)](https://codespaces.new/microsoft/generative-ai-for-beginners?WT.mc_id=academic-105485-koreyst) +[![](https://dcbadge.vercel.app/api/server/ByRwuEEgH4)](https://aka.ms/genai-discord?WT.mc_id=academic-105485-koreyst) + + +# 입문자를 위한 생성형 AI 코스 + +마이크로소프트 클라우드 애드보킷들이 제공하는 12개 강의로 구성된 종합적인 생성형 AI 애플리케이션 구축의 기본을 배워보세요. 각각의 강의는 생성형 AI 원리와 애플리케이션 개발의 핵심 측면을 다룹니다. 이 강의를 통해 여러분은 자신만의 생성형 AI 스타트업을 만들면서 아이디어를 실현하는 데 필요한 것들을 이해할 수 있습니다. + +### 🌟 도움을 주신 분들 +마이크로소프트 스튜던트 앰배서더와 커뮤니티 작성자, 리뷰어, 콘텐츠 기여자들에게 특별한 감사의 말씀을 전합니다. + +[**John Aziz**](https://www.linkedin.com/in/john0isaac/) - 모든 GitHub Actions 및 워크플로우를 만들어주신 분 + +## 🌱 시작하기 + +시작하려면 [이 저장소 전체를 포크](https://github.com/microsoft/generative-ai-for-beginners/fork?WT.mc_id=academic-105485-koreyst)하여 코드를 변경하고 과제를 완료할 수 있도록 자신의 GitHub 계정에 저장하세요. 나중에 찾기 쉽게 하려면 [이 저장소에 스타 (🌟)](https://docs.github.com/en/get-started/exploring-projects-on-github/saving-repositories-with-stars?WT.mc_id=academic-105485-koreyst)하세요. + +각각의 강의 링크는 아래에 제공되어 있습니다. 가장 관심 있는 강의부터 찾아보고 시작하세요! + +[강의 환경 구축 페이지](../../00-course-setup/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)로 이동하여 적합한 환경 구축 가이드를 찾으세요. + +## 🗣️ 다른 학습자들을 만나고 지원받기 + +가장 좋은 학습 방법 중 하나는 다른 사람들과 함께 배우는 것입니다! [공식 AI Discord 서버](https://aka.ms/genai-discord?WT.mc_id=academic-105485-koreyst)에 가입하여 이 강의를 수강하는 다른 학습자들과 소통하고 네트워킹을 할 수 있으며 지원을 받을 수 있습니다. 거기서 다음 공동 창업자를 만날 수도 있습니다! + +## 🧠 더 배우고 싶으신가요? + +이 강의를 완료한 후 [생성형 AI 학습 컬렉션](https://aka.ms/genai-collection?WT.mc_id=academic-105485-koreyst)을 확인하여 생성형 AI 지식을 더욱 향상시킬 수 있습니다! + +## 🚀 스타트업이거나 실현하고자 하는 아이디어가 있나요? + +[Microsoft for Startups Founders Hub](https://aka.ms/genai-foundershub?WT.mc_id=academic-105485-koreyst)에 가입하여 **무료 OpenAI 크레딧**과 **Azure OpenAI 서비스를 통해 OpenAI 모델에 액세스하기 위해 최대 $150,000의 Azure 크레딧**을 받아보세요. + +## 🙏 도움을 주고 싶으신가요? + +이 강의에 기여할 수 있는 방법들입니다: +- 맞춤법 오류나 코드 오류를 찾으셨다면, [이슈를 제기](https://github.com/microsoft/generative-ai-for-beginners/issues?WT.mc_id=academic-105485-koreyst)하거나 [풀 리퀘스트를 생성](https://github.com/microsoft/generative-ai-for-beginners/pulls?WT.mc_id=academic-105485-koreyst)해주세요. +- 여러분의 아이디어를 보내주세요. 새로운 강의나 연습 문제에 대한 아이디어를 제안하고 어떻게 개선할 수 있는지 알려주세요. + +## 📂 각각의 강의에는 다음이 포함되어 있습니다: + +- 해당 주제에 대한 짧은 동영상 소개 +- README에 위치한 문서화된 강의 +- 프로젝트 기반 강의의 경우 Jupyter Notebook에 포함된 코드 예제 +- 학습을 적용할 수 있는 도전 과제 또는 과제 +- 추가 학습을 위한 추가 자료 링크 + +## 🗃️ 강의 목록 +| | 강의 링크 | 다루는 개념 | 학습 목표 | +| :---: | :------------------------------------: | :---------------------------------------------------------: | ----------------------------------------------------------- | +| 00 | [강의 소개 - 이 강의를 수강하는 방법](../../00-course-setup/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) | 기술 설정 및 강의 구조 | 이 강의에서 성공적인 학습을 위한 준비하기| +| 01 | [생성형 AI와 LLM 소개](../..//01-introduction-to-genai/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) | **개념**: 생성형 AI와 현재 기술 동향| 생성형 AI의 개념과 대형 언어 모델 (LLM)의 작동 방식 이해하기 | +| 02 | [다양한 LLM 탐색 및 비교](../../02-exploring-and-comparing-different-llms/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) | **개념**: 다양한 대형 언어 모델 테스트, 반복 및 비교 | 사용 사례에 적합한 모델 선택하기 | +| 03 | [생성형 AI의 책임 있는 사용](../../03-using-generative-ai-responsibly/translations/ko/README.md?WT.mc_id=academic-105485-koreyst)| **개념:** 기반 모델의 한계와 AI의 위험 이해 | 책임 있는 생성형 AI 애플리케이션 개발하기 +| 04 | [프롬프트 엔지니어링 기본 원리 이해](../../04-prompt-engineering-fundamentals/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) | **코드/개념:** 프롬프트 엔지니어링 최적 사례의 실제 적용 | 프롬프트 구조와 사용법 이해하기| +| 05 | [고급 프롬프트 생성](../../05-advanced-prompts/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) | **코드/개념:** 다양한 기법을 적용하여 프롬프트 엔지니어링 지식 확장하기 | 프롬프트 엔지니어링 기법을 적용하여 프롬프트 결과 향상하기.| +| 06 | [텍스트 생성 애플리케이션 구축](../../06-text-generation-apps/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) | **코드:** Azure OpenAI를 사용하여 텍스트 생성 앱 구축하기 | 토큰과 temperature를 효율적으로 사용하여 모델의 출력 다양성 이해하기 | | +| 07 | [채팅 애플리케이션 구축](../../07-building-chat-applications/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) | **코드**: 효율적으로 채팅 애플리케이션 구축 기법 | AI 기반 채팅 애플리케이션의 품질을 효과적으로 모니터링하고 유지하기 위한 주요 지표와 고려 사항 식별하기| +| 08 | [검색 애플리케이션 구축](../../08-building-search-applications/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) | **코드**: 의미 기반 검색과 키워드 검색 비교. 텍스트 임베딩 및 검색에 대한 이해 | 임베딩을 사용하여 데이터 검색하는 애플리케이션 생성하기 | +| 09 | [이미지 생성 애플리케이션 구축](../../09-building-image-applications/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) | **코드:** 이미지 생성 및 애플리케이션 구축의 유용성 이해하기| 이미지 생성 애플리케이션 구축하기 | +| 10 | [로우 코드 AI 애플리케이션 구축](../../10-building-low-code-ai-applications/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) | **로우 코드:** Power Platform에서 생성형 AI 소개 | 로우 코드를 사용하여 교육 스타트업을 위한 학생 과제 추적 앱 구축하기 | | +| 11 | [외부 애플리케이션과의 function calling 통합](../../11-integrating-with-function-calling/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) | **코드:** function calling과 애플리케이션의 사용 사례 | 외부 API에서 데이터를 검색하기 위한 function calling 설정하기 | | +| 12 | [AI 애플리케이션을 위한 UX 디자인](../../12-designing-ux-for-ai-applications/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) | **개념:** 신뢰성과 투명성을 위한 AI 애플리케이션 디자인 | 생성형 AI 애플리케이션 개발 시 UX 디자인 원칙 적용하기 | | +| xx | [학습 계속하기](../../13-continued-learning/translations/ko/README.md?WT.mc_id=academic-105485-koreyst) | 각각의 강의에서 학습을 계속할 수 있는 링크! | 생성형 AI 기술 습득하기 | | + + + + + +## 🎒 다른 강의 + +저희 팀은 다른 강의도 제작합니다! 확인해보세요: + +- [ML 입문자를 위한 강의](https://aka.ms/ml-beginners?WT.mc_id=academic-105485-koreyst) +- [데이터 과학 입문자를 위한 강의](https://aka.ms/datascience-beginners?WT.mc_id=academic-105485-koreyst) +- [AI 입문자를 위한 강의](https://aka.ms/ai-beginners?WT.mc_id=academic-105485-koreyst) +- [웹 개발 입문자를 위한 강의](https://aka.ms/webdev-beginners?WT.mc_id=academic-105485-koreyst) +- [IoT 입문자를 위한 강의](https://aka.ms/iot-beginners?WT.mc_id=academic-105485-koreyst) +- [XR 개발 입문자를 위한 강의](https://github.com/microsoft/xr-development-for-beginners?WT.mc_id=academic-105485-koreyst) +- [AI 페어 프로그래밍을 위한 GitHub Copilot 마스터하기](https://aka.ms/GitHubCopilotAI?WT.mc_id=academic-105485-koreyst)