Visual Studio 2022 + GitHub Copilot을 이용해 대략 3시간 만에 만듦
앞 전에 소스 생성기를 이용해 만들고 싶던게 있었어요.
… 검색이 잘 안되네요. 찾으면 수정하는 것으로 하고,
소스 생성기를 통해 구현하고 싶었던 기능이 뭐냐면, EF Core를 이용해서 질의를 했을 때 반환하는 값이 SELECT에 의해 무명 클래스의 목록이 될 수 있어요. 이것을 메소드 외부로 던질 수 없기 때문에 불편했는데요, 이를 소스 생성기를 이용해서 자동 생성해서 쓰고자 했지만 그 당시 어려워서 중도에 포기했던 것으로 기억해요.
그런데 오늘 아침에 (그것도 7시30분에!) 띠용 하고 GitHub Copilot을 이용해 만들어보자고 생각한 후 대략 3시간 만에 위의 라이브러리가 만들어졌습니다. LLM 및 GitHub Copilot Agent의 막강한 성능과 (또 약간의 한계와) 프롬프트를 찰떡같이 알아먹어서 테스트 코드와 예제 코드까지 만들어내면서 결국에 원하는 형태를 만들어내는 것을 보며 약간의 전율과 함께 약간의 슬픔도 T_T
코딩하지 않고 AI로만 만든 두번째 프로그램입니다. 유튜브 url을 넣으면 스크립트를 요약해 출력해줍니다.
유튜브 스크립트를 가져오는 yt-dlp와 스크립트를 요약할 때 쓰는 LLM을 ollama 및 exaone3.5:7.8b모델을 실시간 때 내려받아 실행합니다.
이번에 테스트하고 싶었던 것은 내 의도를 정확히 인지해 런타임에 특정 프로그램을 다운로드 받아 구성해 통합된 프로그램으로 잘 동작하게 만들어주는가입니다. 결과적으로 흡족합니다.
노력 대비 결과는 아주 훌륭합니다. 그리고 인공지능이 생성해주는 코드는 일반적으로 프로그래머가 너무 귀찮아 전개하기 싫은 코드를 곧잘 잘 구현해줍니다.
단점도 있습니다. 구현 스타일이 저랑 안맞습니다. 뭐랄까 너무 장황해요. 저는 깔끔한 코드를 선호하는데 그 근처도 가지 못해 좀 많이 아쉽습니다. 그리고 쓸데없는 주석 및 출력 텍스트와 방어 코드를 많이 만듭니다. 이것은 프롬프트 및 정책을 얼마나 잘 전개하느냐에 따라 달라지면 좋겠군요.
뭐랄까… 프롬프트 엔지니어링이라고 하는데 옛날 옛적 어셈블리 못하면 개발자 아니라던 시대가 영원히 되돌아 오지 않은 것 처럼, 프롬프트 엔지니어링 (요즘에는 컨텍스트 엔지니어링이라고 하더군요)으로 개발하는 시대가 열린것인지도 모르겠습니다.
Agent모드 쓰시는거면, context7이나 MS Docs 와 같은 MCP 연결해서 쓰시면 어떨까요?
제가 체감하기엔 조금 더 깔끔한 결과를 보이는 것 같더라고요.
음… 만약 쓰셨는데도 그렇게 느끼신 거면
아무리 좋은 모델이라도 기본 바탕이 되는 학습 지식 차이가 아닐까 싶긴 하네요…
AI를 이용해 코딩을 시킬 때 또 장점은 단위 테스트를 빠르고 쉽게 만들 수 있다는 점입니다. 물론 다음의 문제점도 발생합니다.
의미 없는 단위 테스트를 만듦
예를 들어 클래스의 인스턴스를 생성한 후 인스턴스로 기능들을 테스트해야 하는데 클래스의 인스턴스가 정상 생성된 것으로 단위테스트가 성공했다고 하는 등의 – 의미 없는 단위 테스트도 꽤 만듭니다. 그래서 생성된 단위테스트 코드를 살핀 뒤 문제점을 다시 알려줘서 좀 더 정확한 단위테스트를 구성할 필요가 있습니다.
테스트 실패된 것을 – 테스트 성공하기 위해 원 소스를 수정해야 하는데 테스트 코드를 수정해버림
아쉽게도 Shadow Drivers는 실패했습니다. 동작은 하지만 오동작을 합니다. 여러가지 원인이 있겠지만… AI가 WinFsp에 대한 학습이 제대로 되지 않은 것이 문제일 것 같아요. 여러분들이 접근할 수 있도록 해당 프로젝트도 GitHub에 올리도록 하겠습니다.
3개의 프로젝트를 전개하면서 다음을 알 수 있었습니다.
GitHub Copilot의 Agent를 이용하면 프로젝트에 구성된 소스코드의 연속성을 유지하면서 기능을 보완하거나 추가하는 것이 가능했음
하지만 소스코드가 어느정도 방대해지면 분석하는 속도가 급격히 떨어지며 속도 대비 성과도 아쉽게 됨
파일이 많아지고 소스코드가 커지면서 전체 구조 및 소스코드의 연속성이 깨지게 됨 (이것은 아마도 LLM이 처리할 수 있는 프롬프트 토큰의 한계와 밀접한 관련이 있을 것 같아요. Agent가 이를 보완해서 연속성을 유지하려 하지만 어쨌든 최종적으로 프롬프트의 토큰에 영향을 받을 수 밖에 없겠지요)
AI로 코딩을 요청하면 할 수록 문제가 좁혀지고 해결되는 것이 아니라 넓어지고 오리무중이 되는 느낌
결론)
AI로 코딩을 짜게 시키는 것은 크게 두가지 방향성으로 활용해겠다는 생각입니다.
문제를 영역별로 나눠서, 각 영역만 해결하라고 요청
예) 테이블 스키마를 참고해서 ORM 엔티티 클래스를 만들어줘
단순작업, 반복작업을 AI를 이용해 처리
예) 단위 테스트를 만들어, 예외 처리를 강화해, Validation 체크 구현을 해, …