기술 스택
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/airflow.png&w=720&q=90)
Airflow
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/angular.png&w=720&q=90)
Angular
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/ansible.png&w=720&q=90)
Ansible
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/argocd.png&w=720&q=90)
Argo CD
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/asana.png&w=720&q=90)
Asana
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/awsathena.png&w=720&q=90)
AWS Athena
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/awsauroradb.png&w=720&q=90)
AWS AuroraDB
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/awscodebuild.png&w=720&q=90)
AWS CodeBuild
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/awscodedeploy.png&w=720&q=90)
AWS CodeDeploy
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/awscodepipeline.png&w=720&q=90)
AWS CodePipeline
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/awsdocumentdb.png&w=720&q=90)
AWS DocumentDB
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/awsdynamodb.png&w=720&q=90)
AWS DynamoDB
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/awskinesis.png&w=720&q=90)
AWS Kinesis
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/awsmariadb.png&w=720&q=90)
AWS MariaDB
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/awsredshift.png&w=720&q=90)
AWS Redshift
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/awsses.png&w=720&q=90)
AWS SES
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/awssqs.png&w=720&q=90)
AWS SQS
![techstack-logo](https://image.wanted.co.kr/optimize?src=https://static.codenary.co.kr/framework_logo/bitbucket.png&w=720&q=90)
Bitbucket
더 보기
Git Commit Squash - 여러 개의 Commit들을 합쳐보자
Commit Squash가 필요한 이유Git에서 commit을 할 때는 언제나 신중해야 한다.논리적인 작업 단위로 깔끔하게 정리된 commit 이력은 코드 히스토리를 파악하기 쉽게 해주고, 코드 변경 사항을 되돌리고 싶은 경우에도 변경할 시점을 찾기 쉽게 해준다.하지만 이미 commit과 push까지 했음에도 불구하고 사소한 오타나 버그가 발견되어 commit을 다시 하게 되는 경우가 있다.지저분하게 남아 버린 commit 내역들이 있으면 히스토리가 난잡해지고, 코드 이력을 확인할 때의 직관성이 떨어지게 된다.이럴 때 유용한 해결책이 commit squash를 이용하는 것이다.Git의 commit squash는 여러 개의 commit들을 하나의 commit으로 합치는 것을 말한다.이 기능은 불필요하게 작은 단위로 나뉘어진 commit들을 의미 있는 변경 사항을 담은 commit으로 압축해준다.Pull request를 날리는 등의 중요한 작업 전에 commit squash로 불필요한 commit들을 정리해주면 깔끔하게 git repository를 관리할 수 있다.그렇다면 이제 예제와 함께 commit squash 사용법에 대해 알아보자.hello, world! 를 출력하는 bash 스크립트를 다섯 차례로 나누어 commit 한 예시이다.먼저, 명령으로 commit 내역을 확인하고 squash할 commit을 선정한다.두 번째 "hello" commit과 세 번째 ", " commit을 합치고네 번째 "world" commit과 다섯 번째 "!" commit을 합쳐보자.명령어로 최근 4개의 commit 을 대상으로 interactive rebase를 시작한다.수정하려는 commit들은 전부 포함되어야 하지만, 그 이상을 대상으로 해도 무방하다.다음과 같이 interactive rebase 세션이 열린다.참고로 최초의 commit까지 포함하고 싶다면 명령어가 아닌, 명령어를 사용해야 한다.편집기에 보이는 commit 목록에서 squash할 commit을 에서 혹은 로 변경한다.이때 혹은 로 설정한 commit들이 그 직전의 commit과 합쳐진다.이 경우에 ", " commit은 "hello" commit에 합쳐지고, "!" commit은 "world" commit에 합쳐진다.만약 ", " commit, "world" commit, "!" commit 을 로 설정하였다면 이들 세 commit이 "hello" commit과 합쳐진다.squash할 commit들을 표시하였다면 를 입력하여 편집기를 닫는다.이제 commit message를 수정할 수 있는 창이 나온다.원하는 내용으로 수정하고 로 저장 후 닫아준다.", " commit은 "hello" commit에 합치고, "!" commit을 "world" commit에 합치는 두 가지 squash를 동시에 실행했기 때문에 다음 squash에 관한 message 수정 창도 나오게 된다.마찬가지로 원하는 내용으로 수정하고 를 입력하여 저장 후 닫아준다.interactive rebase를 종료하면 아
CrewAI로 나만의 AI Agent 만들기
모든 사람이 자신만의 AI Agent를 개발하여 소유하는 시대가 올까요?CrewAI는 여러 AI Agent를 통해 복잡한 작업을 손쉽게 처리할 수 있는 프레임워크입니다.이번 글에서는 CrewAI의 핵심 개념인 Agent, Task, Tool, Process, Crew의 기능과 이들이 어떻게 상호 작용하여 내가 해야 할 일을 대신해 주는지 살펴보겠습니다.• None Agent : 에이전트는 CrewAI에서 작업을 수행하는 주체입니다. 이들은 특정 작업을 수행하도록 프로그래밍된 자율적인 AI입니다. 예를 들어, 데이터 분석 에이전트, 웹 검색 에이전트, 텍스트 요약 에이전트 등이 있습니다. 각 에이전트는 특정한 능력과 역할을 가지고 있으며, 이를 통해 팀의 목표를 달성하는 데 기여합니다. 예시) 데이터 분석 에이전트는 대규모 데이터를 처리하고 통계적 분석을 수행하며, 웹 검색 에이전트는 인터넷에서 필요한 정보를 빠르게 수집합니다.• None Tools: 툴은 에이전트가 태스크를 수행하는 데 사용하는 도구입니다. 이는 소프트웨어, API, 데이터베이스 등 다양한 형태를 가질 수 있습니다. 예를 들어, 웹 검색 에이전트는 검색 엔진을 툴로 사용하고, 데이터 분석 에이전트는 데이터 분석 소프트웨어를 사용할 수 있습니다. 적절한 툴의 선택은 태스크의 효율성과 정확성에 큰 영향을 미칩니다. 예시) 웹 검색 에이전트는 Google API를 사용하며, 데이터 분석 에이전트는 Python의 pandas 라이브러리를 활용합니다.• None Task: 태스크는 에이전트가 수행해야 할 구체적인 과제나 작업입니다. 이는 작업의 세부 사항, 수행 방법, 필요한 도구 등을 포함합니다. 예를 들어, "웹에서 최신 트렌드 정보를 검색하여 요약 보고서 작성하기"라는 태스크는 웹 검색 에이전트와 텍스트 요약 에이전트가 협력하여 수행할 수 있습니다. 예시) 특정 주제에 대한 트렌드 정보를 수집하는 태스크는 웹 검색 에이전트가 다양한 소스에서 데이터를 수집하고, 텍스트 요약 에이전트가 이를 요약하여 보고서를 작성하는 방식으로 진행됩니다.• None Process: 프로세스는 에이전트들이 태스크를 효율적으로 수행할 수 있도록 작업의 흐름을 조정하는 역할을 합니다. 이는 프로젝트 관리와 유사하게 태스크의 우선순위를 정하고, 작업의 순서를 결정하며, 각 단계에서 필요한 조치를 취할 수 있도록 합니다. 예를 들어, 데이터 수집, 분석, 보고서 작성의 순서로 작업을 진행하는 프로세스를 설정할 수 있습니다. 예시) 마케팅 캠페인을 위한 데이터 분석 작업은 먼저 데이터 수집, 그다음 데이터 처리 및 분석, 마지막으로 결과 보고서 작성의 프로세스로 구성됩니다.ChatGPT 통해서 블로그 초안 만들 수 있지만, CrewAI를 활용하면 웹 스크래핑 등 활용하여 조금 더 개선된 결과를 만들 수 있습니다.먼저, CrewAI를 사용하기 위해 초기 설정을 진행해야 합니다.CrewAI 내에서 구현된 추가 도구를 사용하기 위해 crewai[tools]도 설치합니다. LangChain에서 구현된 도구와 함
GPT-4와 함께하는 수능 국어 만점 도전: 프롬프트 학습 비법 공개
프롬프트 엔지니어링을 공부하다가 LLM 모델을 이용한 AI 수능 국어 만점 프로젝트(KICE_slayer_AI_Korean) 프로젝트를 발견하였습니다.이 프로젝트에서 사용한 프롬프트를 알아보겠습니다. 이 프로젝트는 3가지 언어 모델에 9가지 프롬프트를 이용하여 국어 수능 문제를 풀어보는 프로젝트입니다.결론적으로 GPT4는 4등급, GPT3.5-16k는 8등급, Synatra-7B는 9등급을 받았다고 하네요.기본 프롬프트 템플릿을 이용하여 아래와 같이 작성되었습니다.각 프롬프트는 프롬프트 파일에 모두 들어 있습니다.23 수능에서 좋은 성능을 보여주었던 프롬프트로, 수능의 특성에 맞추어 NomaDamas에서 직접 제작한 프롬프트입니다.정답을 위해 대답을 내놓는 과정의 형식을 지정해, 설계된 문제 풀이 방식을 따르는 프롬프트입니다.구체적으로, 지문에서 질문에 답하기 위한 증거를 무조건 찾게 한 이후, 답을 찾아가도록 하였습니다.‘지문에서 답을 찾아야 한다’라는 풀이 방법을 알려주는 것으로, 풀이 방법을 알려주는 manual-CoT의 특성과,Rajagopal et al.의 연구에서 제안된 형식 (template)을 지정하고 해당 형식을 채우는 프롬프트인 POTTER의 특성을 가지고 있습니다.zero-shot-CoT은 가장 기본적인 CoT(Chain of Thought) 형태입니다.가장 사용하기 간단하고 효과가 좋다고 알려져 있어, 프롬프트 엔지니어링에서 가장 많이 언급되는 방법론입니다.zero-shot-CoT 영어는 zero-shot-CoT와 내용은 동일하나, 프롬프트의 언어가 미치는 영향을 분석하기 위하여 instruction 및 프롬프트를 영어로 작성한 프롬프트입니다.Kojima et al.의 연구 결과에 따르면, 을 프롬프트 끝에 추가하여 주는 것만으로도, LLM이 스스로 단계별로 생각을 정리하고 답변을 생성합니다.• None 마지막에 프롬프트를 사용했습니다.Li et al.의 연구에 따르면, GPT-4에 감정적인 자극을 주는 프롬프트를 넣으면 성능이 향상됩니다.수능 국어 프롬프트에도 간절한 학생의 감정적인 자극을 주는 프롬프트를 넣어 성능 증가를 꾀해 보았습니다.• None 사용한 번역본 : 이 문제는 저의 대학 입시에 매우 중요합니다. 저를 위해 꼭 정답을 찾아주세요.하나의 예제를 포함하는 프롬프트를 작성합니다. 해당 프롬프트는 풀이를 하는 과정이 담겨있기 때문에 one-shot-CoT의 일종으로 볼 수 있습니다.• None 2024년 9월 모의고사 35번 문제를 활용한 One-shot 프롬프트프롬프트 엔지니어링이 들어가지 않은 최소한의 프롬프트만을 사용한 프롬프트 입니다.간단한 역할 설정과 지문, 질문, 선지, 보기가 포함됩니다. 그리고 반드시 정답 ‘하나’만 고르라는 프롬프트가 추가되어 있습니다.Qiao et al.에 따르면 GPT-4의 경우, 어려운 reasoning 문제를 ‘인공지능이 못푸는 문제’라고 말할 경우, 인공지능이 자극을 받아 더 좋은 성능을 보여줍니다.이에 따라, 수능 문제 풀이를 위하여 AI가 수능을 못푼다고 하는
Policy Enforcement Platform 비교
이글에서는 정책에 대해 정의하고 이를 지원하는 정책강제플랫폼들을 살펴보고자 한다.정책을 정확하게 그리고 일반적으로 정의하는 것은 매우 어렵다. 당위적인 범위를 규정해보면 거버넌스의 일부분 이면서 인가를 포함하는 영역의 어딘가라고 할수 있다.인가의 영역을 넘어서는 정책을 예를 들면 “네이밍룰에 대한 정책”이나 “접속관리정책”등을 들수 있다.이러한 정책은 인가에서 발생하는 이상의 내용을 처리하거나 상황에 맞는 허용여부 판별하기 위해서 필요하다.컴퓨팅 측면에서 Policy Enforcement는 자원 사용을 위한 요건들을 생성, 관리, 자동화된 실행 및 모니터링하는 기능을 말한다.즉 정책의 시행 뿐 아니라 정의, 적용, 관리를 포함한 개념이다.kubernetes에서의 정책지원기능k8s에서는 인가(authorization) 관련되어 몇가지 기능을 제공하고 있다.첫번쨰는 RBAC으로 각 자원에 대한 접근허용 여부를 역할로 정의하고 역할을 사용자나 그룹등 접근자에게 부여함으로써 자원에 대한 접근을 제어하는 방식이다.두번째로 Pod를 중심으로 좀더 추가적인 정책을 정의할수 있도록 하는 시스템을 제공하고 있으며과거에는 PSP(Pod Security Policy)라 불렸고 다양한 모듈을 제공하여 Pod에 대한 접근제어를 추가하도록 했었으나 1.21버전에서 deprecate 했다.이후1.25버전에서 훨씬 간단한 모습으로 PSA/PSS(Pod Security Admission / Standard) 라는 이름으로 복귀시켰다.세번째는 네트워크 사용관련하여 정책을 정의할수 있도록 해주는 기능을 제공하고 워크로드마다 network policy 부분에 설정할 수 있도록 해준다.네번째로 가장 최근(v1.30, 24년 4월)에 등장한 Validating Admission Policy라는 녀석이 있다.보다 유연한 정책을 정의할 수 있도록 CEL (Common Expression Langage)라는 간결한 정책 정의언어를 제공한다.Kubernetes 외부에서 제공하는 정책관리 도구들v1.21 당시 k8s 진영에서는 정책기능 관련하여 외부에서 그 기능을 제공하도록 가이드하면서 PSP를 종료시켰다.이전부터 해당 영역을 노리고 있던 정책관리 도구들이 있다. OPA와 Gatekeeper, Kyverno 등이 그것이다.OPA는 k8s외부에서 이미 정책관련 정의부터 강제까지의 흐름을 표준화하고자하는 흐름 상에 위치한 오픈소스 소프트웨어이고, kube-mgmt 라는 형태를 통해 k8s의 웹훅시스템으로 들어와 자리 잡고 있다.Gatekeeper는 OPA를 좀더 k8s 스럽게 만들고자 정책을 사용자자원(Custom Resource)으로 만들어 사용할 수 있도록 편의 기능 및 seamless 한 kubeapi 연동 등을 제공하면서 빠르게 입지를 넓혔다.Gatekeeper도 v1에서는 kube-mgmt의 모듈을 사용하여 동작하였으나 v2 부터는 독자적인 연동구조를 만들고 내부 정책평가 엔진만 OPA를 사용하도록 변경했고v3에 이르러서는 OPA에서 제공하지 않는 Mutating 기능까지도 포함
kubernetes