<h1 align="center">copilot-ops</h1>
<p align="center">
<img alt="copilot-ops-logo" src="https://raw.githubusercontent.com/redhat-et/copilot-ops/HEAD/public/copilot-ops-logo.png" width="300" height="300" />
</p>
<p align="center">
<a href="https://goreportcard.com/report/github.com/redhat-et/copilot-ops">
<img src="https://goreportcard.com/badge/github.com/redhat-et/copilot-ops" alt="copilot-ops Go report badge">
</a>
<a href="https://codecov.io/gh/redhat-et/copilot-ops" >
<img src="https://codecov.io/gh/redhat-et/copilot-ops/branch/main/graph/badge.svg?token=3SNBJAXSVS"/>
</a>
</p>
개요 (About)
copilot-ops는 모든 "devops repo"를 Artificially Intelligent Ops Repo의 닌자 수준으로 끌어올리는 CLI 도구입니다.
요구 사항 (Requirements)
copilot-ops를 사용하려면 GPT-3 Codex 모델에 접근할 수 있는 OpenAI 계정과 OPENAI_API_KEY 환경 변수로 저장된 API 토큰이 필요합니다.
설치 (Installation)
릴리스 페이지에서 copilot-ops 바이너리를 다운로드할 수 있습니다:
binary releases
가장 최근 커밋의 빌드는 CI 워크플로우에서 사용할 수 있습니다: ci-builds
소스 코드에서 빌드하는 것을 선호한다면, 이 저장소를 클론하고 make build를 실행하기만 하면 됩니다:
# 저장소 클론
git clone https://github.com/redhat-et/copilot-ops.git
...
명령줄 도구를 설치하려면 다음 단계를 완료하십시오:
# bin 디렉토리 생성
mkdir -p ${HOME}/bin
...
사용법 (Usage)
copilot-ops는 현재 generate와 edit의 두 가지 기능을 지원합니다.
기본적으로, copilot-ops는 stdout에만 출력됩니다. 변경 사항을 디스크에 직접 작성하려면 --write 플래그를 제공하십시오.
파일 편집 (Editing Files)
copilot-ops는 자연어로 작성된 명령어를 사용하여 기존 파일을 업데이트할 수 있습니다. 이를 수행하려면, 위에서 설명한 대로 파일을 참조하고 필요한 변경 사항을 지정하기만 하면 됩니다.
예를 들어:
copilot-ops edit --request="The timeout for the @server.yaml should be increased from 60s to 2m" \
--file deployments/server.yaml`
파일 생성 (Generating Files)
generate 명령어는 필요한 파일에 대한 설명을 그리고 그 내용을 기반으로 새 파일을 생성하는 데 사용되는 파일 세트를 받습니다.
다음은 generate 명령어를 사용하는 몇 가지 예시입니다:
copilot-ops generate --request "Jupyter Notebook 이미지를 가져와 1개의 GPU 리소스를 요청하는 Deployment를 생성하세요"
...
생성 시 사용되는 토큰 양을 제어하려면 --ntokens 플래그도 지정할 수 있습니다.
다음은 OpenAI에게 Deployment를 기반으로 서비스를 생성하도록 요청하지만, 100개의 토큰을 초과하지 않도록 하는 예시입니다:
copilot-ops generate --request "mongodb-deployment를 노출하는 'mongodb-service'라는 이름의 Service를 생성하세요" \
--file deployments/mongodb-deployment.yaml \
--ntokens 100
여러 파일을 제공할 필요가 없을 때는 --filesets 플래그를 사용하여 사용할 파일 세트 목록을 지정할 수 있습니다.
예시:
copilot-ops generate --request "이 Deployment 각각에 대한 Service를 생성하세요" --fileset deployments
내부 작동 원리 (Under the hood)
간단히 말해, copilot-ops는 사용자 입력과 제공된 파일(있을 경우)을 OpenAI가 프로그래머가 이슈를 받아 업데이트하는 것으로 이해할 수 있는 방식으로 형식화하여 작동합니다.
파일 생성 (Generating Files)
생성 과정은 다음과 같이 분석됩니다:
- 사용자 요청과 필요한 파일을
generate 템플릿을 사용하여 형식화하며, 이 템플릿은 OpenAI에 의해 "자동 완성"될 것입니다.
- OpenAI가 프롬프트를 완료하고 OpenAI의 응답을 검색하도록 시도합니다.
- OpenAI가 성공하면, 응답을 구문 분석하여 새로 생성된 파일을 추출합니다.
- 생성된 파일은 디스크 또는 STDOUT으로 작성됩니다.
파일 편집 (Editing Files)
파일 편집은 유사하지만, 현재는 한 번에 하나의 파일에서만 작동합니다.
프로세스 분석은 아래와 같이 설명됩니다:
- 레포지토리에서 요청된 변경 사항에 대한 자연어 입력 텍스트 설명을 받습니다. 텍스트 형식에 큰 제한은 없지만, 성공률과 일관성을 높이기 위해 이슈 템플릿 형태로 가이드라인을 제공하고 텍스트 마커를 식별할 것입니다.
- AI 요청에 첨부할 레포지토리 정보를 수집합니다.
- 요청을 AI 서비스로 보내 처리하게 하고 변경된 파일 목록으로 응답받습니다.
- 응답된 변경 사항을 다시 레포지토리에 적용합니다.
> copilot-ops edit "set mysql memory to 42 Gi only for production env" --file deployments/mysql.yaml --write
deployments/mysql.yaml 수집 중 ........ OK
...
Copilot-Ops CLI
Copilot-Ops CLI는 AI 원칙을 적용하여 사용자를 GitOps 닌자로 변신시킵니다.
원하는 변경 사항에 대한 이슈를 제공하고, 선택적으로 해당 이슈에서 참조하길 원하는 파일들을 함께 제공하면, CLI가 그에 맞는 변경 사항을 생성해 줄 것입니다.
copilot-ops 소개
아이디어는 현대 AI 서비스(예: OpenAI Codex)를 사용하여 사용자가 GitHub 이슈에서 요청하는 변경 사항을 설명하고, 이것이 copilot-ops 액션을 트리거하여, 해당 액션이 AI 서비스를 이용해 이슈를 해결할 제안 PR(Pull Request)을 생성하게 하는 것입니다. 사용자들은 이후 이 PR과 상호작용하며 검토하고, 코드를 직접 수정하고, 승인 및 병합할 수 있습니다.
가정하는 바는 이러한 새로운 AI 기능들이 자연어 이해(NLP)와 코드 수정 능력을 갖추게 됨으로써, 많은 변경 사항이 결국 Kubernetes YAML 파일, 설정 파일 또는 배포 스크립트 수정에 불과한 DevOps 레포지토리 작업 과정을 단순화할 수 있다는 것입니다.
자연어 요청과 클론된 저장소에 대한 접근 권한을 가진 경우, copilot-ops 도구는 저장소에서 정보를 수집하고, 코드 변경을 준비하는 데 필요한 모든 정보가 담긴 잘 형식화된 요청을 AI 서비스로 구성하여 작동합니다. 응답을 받으면, 이 답변을 소스 파일 변경에 매핑하여 변경 사항을 저장소에 다시 적용합니다.
런타임 고려사항 - 이 도구를 다양한 gitops 프레임워크에 의존성을 끌고 오거나 컨테이너 이미지 내부에서 실행하도록 강제하지 않고 통합할 수 있도록, 우리는 이 기능을 독립적이고 자체 포함된 golang CLI로 패키징하기로 결정했습니다. 이 결정은 도구의 사용성에 필수적이지 않으며 필요에 따라 향후 수정될 수 있습니다.
현재 Copilot-Ops는 백엔드로 OpenAI codex를 사용하고 있지만, 다른 백엔드인 DeepMind의 AlphaCode나 IBM Watson 등을 사용할 수 있도록 이를 모듈화할 계획입니다.