본문 바로가기
Daily

1년간 AI로만 개발한 사람의 팁과 노하우

by AI미남홀란드 2024. 8. 12.
728x90

 

 

X의 Alexander Isora 👽님(@alexanderisorax)

I stopped writing code entirely in 2024. I only copy-paste code generated by AI ✌️🤓 How do I do that? 10 hints: Hint 1: if you have a creative task such as code architecture, you want to use so called chain of thoughts. You add "Think step-by-step"

x.com

평소와 같이 커뮤니티들을 둘러보다가 재밌는 글이 있어서 제가 ChatGPT, Claude를 구독 사용하면서 썼던 방법들과 코드 생성 방법 다양한 팁을 정리해 볼까 합니다. 글쓴이는 24년에 AI를 활용해서만 개발을 진행했었고, 그 팁들에 대해 얘기를 해줍니다.

 

우선 GPT에게 내용으르 긁어다가.. 내용이 뭔지를 정리해서 설명해 달라고 부탁하였습니다.

 

 

Alexander lsora의 개발 방법:

 

  • 체계적 사고 요청하기: 창의적인 작업이 필요한 경우, 프롬프트에 "단계별로 생각해봐"를 추가하여 문제에 대한 상세한 분석을 얻을 수 있습니다.
  • 프로젝트 관리: AI 모델에 프로젝트를 생성하고 코드 베이스에 대한 기본 설명(의존성, 배포, 파일 구조)을 추가하세요. 같은 내용을 반복해서 설명할 필요가 없어지고, AI의 응답이 더 정확해집니다.
  • 최신 문서 활용: AI가 사용하는 프레임워크나 플러그인의 최신 버전을 모른다면, 전체 문서 파일을 AI에 복사해 붙여 넣고 최신 사양에 맞춰 코드를 생성하도록 요청하세요.
  • 한 작업당 하나의 세션: 한 세션에 여러 작업을 넣지 마세요. 문제를 해결한 후에는 새 세션을 시작하세요. 이렇게 하면 코드의 질이 향상되고, "전체 코드를 제공해 줘"와 같은 요청을 남발하지 않게 됩니다.
  • 명확하고 구체적인 프롬프트 사용: 요청이 구체적일수록 AI가 필요한 코드를 더 잘 이해하고 생성할 수 있습니다. 기능, 입력/출력 타입, 에러 처리, UI 동작 등에 대해 상세히 설명하세요.
  • 복잡한 작업을 작은 부분으로 나누기: 복잡한 시스템을 한 번에 요청하는 대신, 더 작은 부분으로 나눠서 요청하세요. 이렇게 하면 코드가 더 잘 조직되고 관리됩니다.
  • 코드에 주석 달기 요청: AI에게 생성된 코드에 대한 상세한 주석을 포함하도록 요청하세요. 이렇게 하면 코드 이해도와 이후 수정이 더 쉬워집니다.
  • 코드 리뷰 요청: 코드 생성 후 AI에게 개선 가능한 부분이 있는지 리뷰를 요청하세요. "이거 확실해?" 같은 간단한 질문으로 AI가 자신의 작업을 다시 확인하도록 유도할 수 있습니다.
  • 문서화 요청: 코드 내 주석 외에도 README 파일, API 문서, 사용자 가이드 등의 문서를 생성하도록 요청하세요. 이후 스타트업을 판매하거나 개발자를 고용할 때 큰 도움이 됩니다.
  • 데이터베이스 관련 작업에 AI 활용: 데이터베이스 쿼리와 스키마 생성은 실수하기 쉬운 부분이므로, AI에게 맡기세요. AI는 DB 스키마, SQL 쿼리, 정규식 등을 매우 잘 작성해줍니다.
  • 붙여 넣은 코드를 이해하기: 최종적으로는 당신이 앱을 책임지고 있으므로, AI가 제공한 코드를 반드시 이해해야 합니다. 이해되지 않는 부분이 있다면 문서를 읽거나 AI와 대화하여 어떻게 작동하는지 알아보세요.

1. 체계적 사고요청하기, 프로젝트 관리, 한 작업당 하나의 세션

 

우선 최근 Teddynote님의 유튜브 강수진 박사님의 라이브 영상을 되게 유익하게 봤었는데, 거기서 나온 주제라 할 수 있습니다. 프롬프트 괴담에 대하여 예전엔 저도 X 같은 곳에서 "네가 잘하면 20불의 팁을 줄 예정이야."  요런 프롬프트들을 실제로 사용했었는데요. 결국 괴담이었다고 할 수 있습니다. 정확한 검증도 없고, 제한적인 환경에서 실험을 하고 정확하게 어떤 방법으로 그저 결과만 보여주고 있기 때문입니다.  저 또한 이게 정말 효과가 있는 건지 잘 모르겠지만. 예전부터 Chain Of Thought, Tree of Thought 등 다양한 사고 기법의 프롬프팅 방법 프롬프트였던 Think step by step prompt를 무심결에 넣고 썼던 거 같습니다. 이 프롬프트에 대해서는 저도 동의하는 게 확실히 Custom instruction에 넣고 쓸 때 효과를 발휘합니다.

 

저 같은 경우는 요즘 Claude를 구독해서 사용하고 있는데 프로젝트별로 prompt를 활용 중입니다.

Claude 활용 사례

 

 

위처럼 프로젝트 task 별로 구분해서 요청을 하는 편입니다. 일반적인, 업무용, 사이드프로젝트(개발용)를 나누어 만들었고, 여기서 중요한 점은 그 프로젝트에 맞는 프롬프트만 수행요청해서 더욱 정확한 답변을 받을 수 있게끔 하려고 합니다. 실제로 이전엔 GPT를 쓸 때는 그냥 시간별로 sorting 이 되어서 그냥 계속 한 스레드에서 질문을 했었는데 계속 새 로키고, 하는 작업을 어느샌가 하고 있었습니다. 저렇게 도커처럼 task 별로 구분하면 보는 사람도 편하고, LLM 도 다양한 로그에 대해서 분석하지 않아도 되기 때문에 성능이 좋아지는 것 같습니다. 한 작업당 하나의 세션의 내용과 겹치는 편입니다. 

 

GPT는 아직도 사실 그냥 새로운 세션을 계속 켜서 쓰는 편입니다.

 

 

다시 돌아와서 Chain of Thought Prompting의 예시인데요. 저렇게 복잡하게 작성해 줘도 되지만 Thinks step by step을 넣고 쓰시면 됩니다.

 

현재 GPT-4o는 사실 너무 성능이 좋기 때문에 웬만하면 잘 답변을 해줍니다. 그러나 사업적인 측면에서의 문화적 고려, 프리미엄 브랜드 포지셔닝보단, 마케팅, 재무, 리스크, 사업확장 등 의 Think step by step 프롬프트를 적용한 쿼리가 저의 입맛엔 더 맞았던 거 같습니다. 같은 prompt의 쿼리를 던지더라도 조금씩 달라지는 모습을 볼 수 있습니다. (아마 단계별로 생각해야 하는 중요한 Task에 분명 효과적일 것)

 

 프로젝트 관리에 대한 명확한 정보

DockerFile 만들기 tip

App.py에 대해 dockerfile 배포를 하고싶다면?

파이썬버전, 실행파일, pip list, 파일 위치등을 자세하게 설명

 

이제 도커는 생활화가 되었지만, 예전에 DockerFile을 만들 때 어지러웠던 기억이 납니다. 그냥 코드를 긁어다가 넣어주고, 명확한 정보를 주면 원하는 대로 만들어주고 잘 실행이 됩니다. 이렇게 저는 활용하고 있습니다. 아마 저자의 의도는 프로젝트를 관리하는 관점에서 명확하게 Custom prompt를 입력해 둔다면, 기존의 레거시에 맞게 개발 관리를 쉽게 할 수 있다는 의도 같긴 합니다.

 


2. 최신 문서 활용

 

과연 이제 개발자들이 새로운 프레임워크가 나와서 그를 적용하는 시간까지 얼마나 걸릴까요? 저 또한 새 프레임워크를 사용할 때 이걸 독스부터 모두 공부하기에는 시간이 오래 걸리기 때문에 Docs의 examples core 내용을 복사해서 예제를 던져주고 one-shot prompting을 통해서 제 코드를 수정 개발합니다. 물론 작년에는 불가능했습니다. Context의 한계 때문이었습니다. 지금은 128k를 지원하고 gpt는 Gemini는 200만 콘텍스트까지 지원합니다.

 

https://platform.openai.com/docs/guides/structured-outputs/introduction

 

 

최근에 나온 gpt output json을 고정시켜 주는 방법에 대해서 모든 내용과 예제를 다 긁습니다. "나는 여기서 json 축구 선수들의 데이터를 통해서 임의로 json 값을 고정으로 받기 위한 코드를 생성해 줘"

 

 

{
    "name": "All Stars",
    "country": "International",
    "players": [
        {
            "name": "Lionel Messi",
            "position": "Forward",
            "age": 36,
            "team": "Inter Miami",
            "goals": 700
        },
        {
            "name": "Cristiano Ronaldo",
            "position": "Forward",
            "age": 39,
            "team": "Al-Nassr",
            "goals": 800
        },
        {
            "name": "Kevin De Bruyne",
            "position": "Midfielder",
            "age": 32,
            "team": "Manchester City",
            "goals": 100
        }
    ]
}

 

아래처럼 처음 써보는 업그레이드의 내용이라도 내용을 긁고 내가 수행하고 싶은 내용을 입력해 준다면 잘 코드를 생성해 주는 모습입니다.

 


3. 명확하고 구체적인 프롬프트 사용, 복잡한 작업을 작은 부분으로 나누기

 

모든 프롬프트에서 명확하고 구체적인 프롬프트를 사용해야 하지만 워낙 언어모델은 성능이 좋아서 개떡같이 던져도 찰떡같이 알아듣는 경우가 많습니다. 그러나 알고리즘류나 복잡한 파이프라인을 구성할 때는 분명하게 정리를 해서 프롬프트를 던져주는 것이 좋습니다.

 

xml , markdown의 형식으로 기본구조를 활용해서 프롬프트를 만드는 것을 추천하고, 복잡한 알고리즘 같은 경우는 depth를 더 내려서 아이에게 설명하듯이 설명한다면 좋은 답변을 받았던 기억이 많았습니다. 최근 등급을 산정하는 알고리즘을 짤 때 등급별 알고리즘에 대해 예외처리 해야 할 것 조건분기 처리 해야 할 점을 정확하게 구분해서 프롬프트를 작성해 주니 단 한 번에 실행이 되었던 경험이 있습니다.

 

예시 프롬프트

나는 두바이 초콜렛을 판매하고, 다양한 해외 초콜렛을 파는 판매 키오스크 알고리즘을 만들려고 합니다. (큰 범위) 사용자의 취향에 따라 초콜릿을 고르는 알고리즘을 만들려고 합니다. 마치 퀴즈를 내면서 질문을 하고 그에 따라등급을 산정해서 초콜렛을 추천해주는 방식을 따를 예정입니다.(작은 부분)

 

# 초콜릿 추천 알고리즘

def recommend_chocolate(preferences):
    # 사용자의 취향에 따라 초콜릿을 추천합니다.
    if preferences['flavor'] == 'sweet' and preferences['texture'] == 'smooth':
        return "밀크 초콜릿"
    elif preferences['flavor'] == 'bitter' and preferences['texture'] == 'crunchy':
        return "다크 초콜릿 with nuts"
    elif preferences['flavor'] == 'sweet' and preferences['texture'] == 'crunchy':
        return "화이트 초콜릿 with crisps"
    elif preferences['flavor'] == 'bitter' and preferences['texture'] == 'smooth':
        return "다크 초콜릿"
    else:
        return "다양한 맛을 가진 초콜릿 트러플 세트"

def ask_questions():
    # 사용자의 초콜릿 취향을 묻는 질문
    print("초콜릿 취향에 대해 몇 가지 질문을 드리겠습니다.")
    
    flavor = input("어떤 맛을 선호하시나요? (sweet/bitter): ").strip().lower()
    texture = input("어떤 질감을 선호하시나요? (smooth/crunchy): ").strip().lower()
    
    # 사용자의 답변을 기반으로 추천할 초콜릿을 선택
    preferences = {
        'flavor': flavor,
        'texture': texture
    }
    
    return preferences

def main():
    # 메인 함수로, 사용자의 취향을 물어보고 초콜릿을 추천합니다.
    user_preferences = ask_questions()
    recommendation = recommend_chocolate(user_preferences)
    
    print(f"추천드리는 초콜릿은: {recommendation}입니다.")

if __name__ == "__main__":
    main()

4. 코드 주석달기 요청, 코드 리뷰 요청, 코드 리팩토링

 

주석을 달아 요청하면 우선 코드의 가독성 및 이해가 쉬워지는 것 같습니다. GenCode 이기에 코드를 이해하는 능력이 중요함으로 AI 가 만든 의도를 쉽게 파악할 수 있어서 가끔 사용합니다.

 

 

근데 대체적으로 쉽거나, 단순반복, 아예 이해가 가지 않는 task에서 코드생성을 요청하기에 생각보다 주석달기 요청을 쓰진 않으나, 아마 협업이 잦아질 땐 디폴트로 써두면 좋지 않을까 생각됩니다. 저도 이번에 해커톤을 진행하면서 여러 개발자 및 기획자분들과 소통하면서 개발을 했지만 제가 진짜 code를 더럽게 짜는구나 생각도 들었고 이게 딜레이가 많이 지체될 수 있구나 몸소 느끼게 되었습니다. 평소에 주석이나 아니면 리팩토링을 활용했다면 어땠을까란 생각이 들었습니다. 

 

저도 ipynb로 데이터분석 ML 모델링을 배우면서 코딩을 시작했기에 단숨에 코드를 py 파일로 짜는 게 익숙지 않아서, 한 줄 단위로 실행해 보면서 개발을 하는 습관이 있는데 이때, 모듈화 클래스화 가 어렵다는 점을 GPT에게 모두 긁어서 내가 원하는 기능을 모듈화 해서 py file로 만들고 main.py 에서 실행되게끔 리팩토링을 자주 요청하는 편입니다. 이러면 나중에 개발레거시 때도 편해지고, 각 기능별 정리가 되어 가독성이 높아집니다. 이런 Detail 이 개발 생산성을 늘려주는 것 아닌가 생각합니다.

 

코드리뷰요청은 잘 안 해봤지만 저자의 본문에서는 u sure? 과 같이 코드 리뷰요청을 하면, 코드를 더 잘 생성해 준다고 합니다. 즉 코드를 만들고, 이게 최선이야? 코드리뷰 후에 재 생성해줘 하면 품질 좋은 코드를 다시 생성할 수 있는 거 같습니다. 써보진 않았지만 종종 적용해 봐야겠습니다.(reranker 같은 건가 🤣)

 


5. 문서화 요청

 

 

GitHub - jh941213/Logistics-Project

Contribute to jh941213/Logistics-Project development by creating an account on GitHub.

github.com

 

저도 예전에 매우 readme를 막일로 며칠간 장황하게 작성해 본 경험이 있습니다. 다른 github reference를 찾아서 내 걸로 변환해서 만든 기억이 있는데요. 아마 지금은 longContext 덕에 이게 더 쉬워지지 않았나 싶습니다. 방대한 리드미 markdown을 긁어서 내 코드에 맞게 만들어달라고 해도 되고, 미리 readme 스타일을 파악하고 그에 맞는 포맷에 맞게 정보를 준다면 이모지, 표, 들여 쓰기, 문단 정리 등 진짜 잘해줍니다. 저는 웬만하면 1차로 리드미를 깃허브에 올릴 포맷을 만들어줘 하고 제가 거기서 그 후 수정하는 편이고, 막일해야 하는 표 같은 것도 긁어서 markdown으로 바꿔줘 하면서 리드미를 작성합니다. 그래서 리드미도 보통 1시간 내외로 만드는 것 같습니다.

 

뿐만 아니라 사실 마크다운 형태 XML형태는 LLM 이 학습이 많이 되어서 구조적인 건 진짜 잘 만들어 주는 것 같습니다. 지금 하다 못해 이 블로그 글도 아마 markdown 형식이 지원되긴 하니, 내용만 잘 만들어서 마크다운으로 넣어주면 자동블로그 기계 생성이 되지 않을까도 막연한 생각을 해봅니다. (블로그는 사람의 영역 지키자..)

 


6. 데이터베이스 관련 작업에 AI 활용

사실 이건 지금 다른 LLM , RAG 뭐 다양하게 응용해서 Agent를 붙여서 많이 개발되고 있고, 저자는 SQL 쿼리와 같은 쉬운 작업은 GPT가 빠르게 잘해준다라고하는데 맞는 말인것 같습니다. 예전에 코딩테스트에서 sql 을 하나도모를때, 일단 복붙해서 주석, 설명 같이 출력시켜서 그렇게 공부했었는데 왠만하면 한큐에 다맞았던거 같습니다. 그래서 쉬운작업은 LLM을 활용해서 개발 생산성을 올려라 라는 뜻 같습니다.

 


7. 멀티모달 활용

- 여기서부터는 제 tip입니다.

 

현재 ChatGPT, gemini, Claude는 멀티모달의 기능을 지원하고 있습니다. 이미지 인식을 할 수 있기 때문에 그 기능을 코드 생성에도 활용하면 좋습니다. 내가 풀고자 하는 Task의 사진이나, 프로젝트에서 너무 방황하다 일단, 정보를 사진으로 주고 텍스트를 생성한 후에 질문을 해도 되고 아니면 그대로 해도 좋습니다. 물론! 글씨가 어느 정도 인식될 수 있는 환경의 사진이어야 합니다. 당장의 예제가 생각이 나지 않지만, UI를 만들 때도 충분히 활용할 수 있습니다. 그렇기 때문에 멀티모달 활용을 적극적으로 활용하면 개발향상에 도움이 됩니다.

 

 

특히 Claude의 임의의 예시지만 artifacts를 활용하는 게 진짜 요즘 코드 짜는데 수월하게 느껴질 정도로 좋습니다.

 

 


8. 다양한 언어모델, 코드생성모델 비교해 보면서 쓰자

AI 황금기에 개발자들의 칼은 너무 많습니다. 특히 코드생성에 특화된, GithubCopilot, Devian 등 다양한 무기도 있고 다양한 언어모델이 있습니다. 이 모델들은 주기적으로 CodeGenerator 성능이 올라가고 있을 뿐만 아니라 , 미묘하게 코드를 짜는 스타일이 다른 것 같습니다. 물론 프롬프트를 잘 주어야 하겠지만 비교해 보면서 쓰면 좋습니다. 이전에는 클로드가 Langchain docs가 유일하게 학습되어서 langchain 코드를 활용할 땐 클로드로 작업을 했었습니다. 이렇게 업데이트 및 데이터 학습에 따라 쓸 수 있는 범위가 다릅니다. 그리고 코드생성모델 같은 경우는 Vscode와 같은 IDE 형태로 지원해서, 특정 부분을 코드생성을 한다던지 주석생성에 매우 용이한 편입니다. 저도 원래는 Githubcopilot을 구독해서 사용했었으나, 조금 아쉬운 건 context 때문에 언제부턴가 gpt로 복붙 해서 코드를 생성하고 있었습니다. 이 점은 차츰 개선될 거라고 생각합니다. 그러나 최고의 장점은 미리 tab 망쳐도 다음에 나올 코드를 예측 생성해 줘서 이 부분이 진짜 개발 생산성이 올랐었고, 예로 들어 강의나 기본예제와 같은 간단한 코드를 작성할 땐 탭탭탭만 해도 충분히 작성이 가능합니다.

 

그리고 또 하나의 팁은 저 같은 경우는 코드 주석을 달아서 입력을 하는 편입니다.

```python

내용

```

 

인라인 코드를 통해 코드를 구분해서 모델이 보다 이해하기 쉽도록 전달해 주는 편인데, 언젠가부터 습관이 돼서 계속 쓰고 있습니다. 


9. 붙여 넣은 코드를 이해하기

 

"최종적으로는 당신이 앱을 책임지고 있으므로, AI가 제공한 코드를 반드시 이해해야 합니다. 이해되지 않는 부분이 있다면 문서를 읽거나 AI와 대화하여 어떻게 작동하는지 알아보세요."처럼 귀찮아도 코드 생성하고 쭉 흐름을 파악하는 것이 코드생성기를 통해 개발하는 개발자에게 필수 덕목 같습니다. 결국 그 코드를 설명할 줄 알아야 내 것이 되니깐 꼭 해야 하는 업무입니다.

 

 

이렇게 어떻게 보면 9개로 추려지긴 했는데, 저자가 말한 것과 제가 코드생성하는 방식이 매우 유사했고, 저만의 팁도 생각나서 같이 적어봤습니다. GPT로 코드를 짜볼까? 하는 분들에게 도움이 되었으면 좋겠습니다.

 

 

728x90

'Daily' 카테고리의 다른 글

하이퍼클로바 X 프로젝트 회고  (0) 2024.08.16
Hyper CLOVA 스터디를 참여하게 되었다🙇  (20) 2024.05.30
데이터 사이언티스트 특강  (0) 2022.11.17
머신러닝 실무자 특강  (0) 2022.11.03