1. 서론
많은 연구 끝에 드디어 생활기록부 프로그램을 작성하기로 했다. 이전 포스팅에서 GUI를 사용하지 않는 프로그램으로 간단히 내가 원하는 프로그램을 디자인 하였다.
https://toyourlight.tistory.com/144
5. DSPy 생기부 AI 에이전트 - 구조화1
4단계의 생기부 작성 AI 에이전트를 모두 완료하였다. 이제 남은 일은 각 역할을 분배하고, 모듈화하여 GUI로 만들기 편하게 해야 한다. 모듈화할 역할은 아래와 같다.1. 공급자 선택하기2. 프롬프
toyourlight.tistory.com
이 과정을 반드시 거쳐야 하는데, 바이브코딩(Vibe Coding)을 이용할 것이라면, AI에게 '나의 작업 의도'를 명확하게 알려주어야 하기 때문이다.
※ 바이브 코딩이란 개발자가 생성형 인공지능의 도움을 받아 코드를 작성하는 것으로 직감과 느낌에 의존한다는 '비하적' 의미를 담고 있다. 참 적절히 잘 지었다고 생각한다.
절대로 '~~~한 프로그램 을 만들어줘' 하면 안된다. 개발자는 분명한 의도를 갖고 프로그램 구조를 인공지능에게 명확히 설명할 수 있어야 한다. 즉, 아무리 생성형이 인공지능이 좋더라도 개발자의 역량에 큰 의존을 한다는 거지...
쨋든, 이전 등가속도 운동 분석기도 바이브코딩을 이용했는데 그 때는 비교적 프로그램이 단순하고 분기를 많이 갖고 있지 않아서 큰 무리없이 작성할 수 있었다.
https://toyourlight.tistory.com/133
등가속도 운동 분석기 개발 과정(with Gemini AI, 노코딩)
1. 개발 동기(블로그를 쭉 보신 분들은 알겠지만) 난 원래 고등학교 물리교사다. 물리 교사라면 실험을 해야 한다.그 당시에 스마트폰을 이용한 활용 교육이 대세였는데 특히 영상 분석이 그러하
toyourlight.tistory.com
그런데 본인이 구조화 해 본 결과 생각보다 많은 분기와, 변수와 상황이 존재했어서 결국 나중에는 '수동 코딩'으로 전환하는 일이 벌어졌다...ㅋㅋㅋㅋ 그래서 깨달았다. 개발자는 줄어들 수 있어도 절대로 없어지진 않겠구나, 그리고 컴퓨터 사고력이 굉장히 중요하겠구나 많은 것을 느꼈다.
이 포스팅도 바이브코딩 과정에 많은 도움이 되었으면 한다.
2. 계획 세우기
사실 이 계획은 4월 말부터 구상하기 시작하였다. 머리속으로 어떻게 구성할지 구조화 작업을 먼저 하였는데 중간고사 시험 들어가려고 대기하던 중에 갑자기 좋은 아이디가 떠올라 급하게 바닥에 굴러다니던 폐기 OMR을 주어서 뒷면에 필기했다. 이 과정이 첫 시작이었다. 시험 종료 후 사진을 찍고 폐기 OMR을 분쇄했다.
그리고 계획을 차근차근 정리했다. (그 때 떠오른 생각을 필기한 것이니 최종 계획과는 일치하지 않는다.)
- 첫 번째 AI는 애들의 자료를 긁어모으고 핵심 부분을 정리하기(성취기준, 활동에 대한 설명, 교사 평가, 학생 보고서)
- 두 번째 AI는 정리한 자료를 바탕으로 요약하기,
- 세 번째는 요약한 내용을 바탕으로 생기부 작성하기,
- 네 번째 AI는 긁어모은 자료와 정리한 자료를 비교, 나의 요구사항이 잘 반영되었는지 판단하기 (예를 들어 주도성, 창의성 부분) → 점수를 매기기
- 네 번재는 세 번째의 context와 첫 번째의 핵심 부분을 바탕으로 두 번째 AI가 다시 작성하고 점수를 매기기 만약 점수가 기준 점수를 넘어가면 출력하기, 평가ai는 펑션콜링을 위해 좋은걸 써야하나?
- 잘 모르는 선생님들을 위해 기본적으로 프롬프트는 그대로 두고(기본값으로는 프롬프트 수정 비활성화) 3000자로 요약 이것만 활성화 → 잘 되는지 연구를 좀 해봐야겠구만 → 이거 tkinter와 api 연동 로그인 또는 ollama 연결해서 하면 안되나?
필요 라이브러리
가상환경명 : sldr( School Life Detail Records)
dspy openai google-generativeai requests Pillow pyinstaller python-dotenv pandas openpyxl tqdm pyyaml
이 아이디어를 토대로 그동안 연구를 진행했던 것이다. 그리고 최종 결론은 loop를 만들지 않기로 하였다. 왜냐하면 피드백이 반드시 좋은 결과를 주지 못하더라고... 그 이유는 AI 메타몽 문제를 검색하면 알 수 있다.
AI가 아무리 발전한들 한들, AI가 AI를 학습하면 (사실 이게 증류 방법 학습 방식 중 하나...) 장기적으로 이를 진행하면 퀄리티가 떨어진다. 직접 해 보니 아니나 다를까 퀄리티 하락이 생각보다 심하여 loop문을 이용한 피드백은 제외하게 되었다.
3. 나의 1차요구(생성자 설정)
아래 사진과 같이
1.API 키 등록하기를 클릭하면 키를 등록하는 팝업창이 뜬다.
2. 각 키 또는 base_url을 입력한다.
3. 저장하기를 누르면 api키 또는 base url이 저장되고 API 등록하기 버튼 아래 여부가 라벨로 뜬다.
4. exe 파일로 배포할 예정이므로 한번 프로그램 저장한 후 다시 프로그램을 켜면 api키나 base url이 저장되어 있어야 하며 언제든지 수정될 수 있어야 한다.
AI와 의논한 결과, config.json 파일로 api 키와 ollama base url을 저장하기로 하였다. 그리고 프로그램을 이용할 선생님분들께는 API 키 관리를 당부하기로 하였다.
4. 나의 2차요구(모델 선택, 연결확인하기)
이제 공급자 선택이라는 작업을 아래와 같이 추가해줘
1. 그림을 참고하여 레이아웃을 만든다. API 등록이 완료되면 완료된 공급자만 “공급자선택” 목록에 뜬다.
2. 공급자 선택이 완료되면 선택할 수 있는 모델의 목록을 “모델 선택” 목록에 띄우고 선택할 수 있게 한다.
3. 모델 선택 후 “선택 완료”라는 버튼을 누르면 연결 테스트가 실행되고 연결테스트는 “하늘은 무슨 색깔일까요” 이다.
4. 연결 완료되면 밑에 연결 결과를 띄운다. (당연히 dspy.Predict로 실행한다.) 연결되지 않으면 “연결에 실패하였습니다” 메세지를 띄운다.
이러저런 상황과 이야기를 하면서 최종에는 "선택 완료"와 "연결 테스트" 두 가지 기능으로 나누어 연결테스트를 하지 않아도 바로 선택 완료를 할 수 있도록 하였다.
5. 나의 3차요구(생기부 워크플로우 디자인)
생기부 처리를 아래와 같이 GUI를 구현하자. 아직 기능은 넣지 말자.
1. 단일모드, 엑셀모드, 저장된 프롬프트 불러오기, 작업시작, 서울대 평가기준, 작업 지시(모든), 교과 활동 내용, 생기부 예시, 입력 데이터는 버튼이다.
2. 그 외에는 라벨이다. 특히 핵심 요약자, 작성자, 평가자는 원 안에 글씨가 있는 것이 좋은 것 같다.
3. ‘사용자’, ‘기본값’ 라벨은 나중에 프롬프트를 넣을 때 기본값을 사용한 것인지, 사용자가 수정하였는지 확인하는 라벨이다.
4. 마찬가지로 입력데이터 옆에 있는 라벨도 단일모드일 땐 텍스트를 입력 받을 것이며 엑셀 모드일 때 입력 데이터를 누르면 엑셀 불러오기가 뜨게 할 것이다.
※ 생기부 요약 정리 내용을 어떻게 추출할까 고민하고 있었는데 '생기부 평가 교내 자율 연수(모임 기회를 제공해 주시고 직접적으로 영감을 주신 최OO 선생님 샤라웃 합니다 ㅎㅎ)'와 '서울대학교 종합전형 대입연수'를 듣고 '어? 이거 서울대 종합전형 평가기준을 넣으면 되겠는데?' 라는 생각이 들어 핵심 요약자에서 '서울대학교 종합전형 평가기준'을 사용하기로 하였다.
어.. 근데 엄청난 큰 문제가 생겼다...ㅋㅋㅋㅋ 전혀 의도대로 생성하지 못한다.
그래서 아래와 같이 tkiter deginer를 이용하였다.
위 내용을 못그려서 Tkinter-Designer를 알아봄
https://github.com/ParthJadhav/Tkinter-Designer/blob/master/docs/instructions.kr-KR.md
Tkinter-Designer/docs/instructions.kr-KR.md at master · ParthJadhav/Tkinter-Designer
An easy and fast way to create a Python GUI 🐍. Contribute to ParthJadhav/Tkinter-Designer development by creating an account on GitHub.
github.com
pip install tkdesigner
빌드에 오류가 발생하여 아래와 같이 수정시도
https://github.com/ParthJadhav/Tkinter-Designer/issues/412
Invalid File URL · Issue #412 · ParthJadhav/Tkinter-Designer
I followed your instruction on how to copy the File URL but for the past few hours I kept receiving the error message, "Please enter a valid file URL." I even tried clicking the frame first before ...
github.com
피그마(figma.com) 가입하고 디자인하기
어이가없네… Canvas.Image()가 아니고 걍 Image잖아
그리고 하나의 창에 띄우는게 아니고 별도의 worflow_window.py라는 창을 띄우기로 결정하였다.
https://www.youtube.com/watch?v=U-jfICHae3w
이렇게 하여 최종 디자인이 완성되었다. (더 추가될 예정이다.)
6. 나의 4차요구(워크플로우 윈도우)
AI와 열심히 의논한 결과, 위 이미지를 기존 창이 아닌 workflow_window.py라는 새로운 창으로 띄우기로 결정하였다. 그럼 워크플로우 파일만 관리하면 되니까! 유지보수가 시워진다. 이제 생기부 처리에서 "생기부 워크플로우 시작하기"를 클릭하면 아래와 같이 워크플로우 창이 뜬다.
7. 나의 5~6차 요구(프롬프트 관리)
기존에는 프롬프트를 py 파일에 관리하였는데, AI와 의논을 나눈 결과 프롬프트를 쉽게 수정하고 저장하고 관리하기 위해 .yaml 파일로 만들기로 하였다. 그리고 기본 프롬프트를 default_yaml.yaml으로 설정하고 "현재 프롬프트 저장하기" 버튼을 추가로 만들기로 하였다.
그리고 프롬프트를 편집할 땐 버튼을 누르면 팝업창이 뜨게 하였다.
7. 나의 7차 요구(단일모드에서 데이터 입력)
- 단일 모드가 눌러져있을 때 입력 데이터 버튼을 누르면 프롬프트 팝업 창과 마찬가지로 ‘텍스트 입력 가능한’ 팝업 창이 뜬다.
- 텍스트 입력 창 하단에 ‘저장’, ‘모두 지우기’, ‘닫기’ 버튼을 구현한다.
- ‘저장은’ 입력데이터를 저장하는 기능(닫히진 않음)
- ‘모두 지우기’는 입력된 텍스트를 모두 지우는 것
- ‘닫기’는 창을 닫는 것인데 저장한 내용에서 변경사항이 있으면 ‘변경된 내용이 있습니다. 저장하시겠습니까?’ 를 띄우고 ‘저장’을 누르면 저장 후 닫기, ‘‘닫기’를 누르면 저장하지 않고 팝업창으로 돌아가기
- 데이터가 입력되면 입력데이터 옆에 ‘초록색’으로 입력됨 으로 바꾸기
8. 나의 8차 요구(엑셀모드에서 데이터 입력)
”사진과 같이 A열에 순서, B열에 학번, C열에 이름, D열에 학생보고서” 양식대로 채워져 있어야 합니다. 확인, 취소 버튼 → 엑셀 불러오기 → 양식 확인한 후 양식이 아니라면 불러오기 취소하자. 양식이 올바르다면 df = pd.read_excel(data_path, engine='openpyxl') 식으로 데이터를 저장하자
- 워크플로우를 눌렀을 때 단일 모드가 선택되어 있잖아? 그럼 바로 경고창으로 “단일 모드가 선택되었습니다. 입력데이터 버튼을 눌러 생기부를 입력하세요.” 를 출력하자. 확인 버튼만 있으면 될 것 같아.
- 자, 단일 모드에서 데이터를 입력하여서 입력데이터가 저장되어 있는데 엑셀 버튼을 누르면 경고창을 띄우고 “단일 모드에서 입력한 데이터가 존재합니다. 모드를 바꾸면 기존 데이터가 사라집니다. 계속하시겠습니까?” 경고창을 띄움. “예”를 누르면 단일 모드에서 작성한 데이터를 초기화시키고 다시 엑셀 모드 입력 안내창 띄우기
- 반대로 엑셀 데이터를 입력한 상태에서 단일 모드를 누르면 경고창을 띄우고 “엑셀 모드에서 입력한 데이터가 존재합니다. 모드를 바꾸면 기존 데이터가 사라집니다. 계속하시겠습니까?” 경고창을 띄움. “예”를 누르면 엑셀 모드에서 작성한 데이터를 초기화시키고 (1)의 내용 경고창을 띄우기
9. 나의 9차 요구(단일 모드에서 생기부 생성)
나하고 의논 좀 하자.
- 작업 결과가 터미널 창에 뜨는게 불편하다. 이런식으로 해볼까? 예를들어 핵심 요약중인 경우 핵심 요약자 겉에 2px 두께의 파란 원을 깜빡이는거야. 그리고 제일 하단에 작업 표시줄에 ‘생활기록부 핵심 요약중’ 이렇게 뜨는거지
- 그리고 이걸 작성자, 평가자일때도 마찬가지로 작업 순서일 때만 파란색 원을 깜빡이고 작업표시줄에 띄우는거.
- 작업이 완료되면 결과 확인 버튼을 자동으로 누른다. 그러면 아래와 같이 출력된다.(1) ——-생활기록부 핵심 요약——-
(2) ——- 생활기록부 작성 결과 ——-
(3) ——- 생활기록부 평가 결과 ——-
~~~~~(내용)
근데 원 깜빡이는건 하지 말고 그냥 파란 원 하자. 부담된다고?
작업이 끝났을 때 핵심요약, 생기부, 평가 글씨를 모두 아우르는 최소한의 넓이로 초록색 네모 테두리를 쳐서 결과가 출력되었다는 것을 보여주자
10. 나의 10차 요구(엑셀 모드에서 생기부 생성)
★여기서 바이브코딩으로는 도저히 해결안되는 사태가 발생
workflow.py로 2000줄이 넘어가고 다른 파일들도 기본적으로 500줄 되었다. 또한 수정에 수정을 거듭할수록 다른 기능이 먹통이되는 등 계속 도돌이가 발생하였다. API 호출 비용만 3만원 넘게 들게 되었다.
엑셀로 처리하기 위해 열고 → 처리 → 닫기 하려고 하니까 LLM한테 안된다고 혼남. 대신 중간저장 기능을 구현해야 함. 그러기 위해선 결과 확인에 마우스를 올리면 메세지를 띄우는 ‘툴팁’ 부터 구현해야 할듯.
- 먼저 툴팁 구현 → 완료 엑셀 모드 작업 진행 중에 결과 확인 버튼을 누르면 지금까지 처리한 내용을 임시 엑셀 파일에 중간 저장할 수 있습니다. 처리되지 않는 데이터는 저장되지 않고 사라집니다.
중간저장 후 작업시작 버튼을 눌러 다시 시작할 수 있습니다.
(단 워크플로우 창을 절대 끄지 마세요) 모든 작업이 종료된 후 결과 확인 버튼을 누르면 최종 결과 파일을 저장할 수 있습니다.
다시 의논 좀 하자 → 여기서부터
- 엑셀모드일 때 이제 작업 시작을 할꺼야. 즉, 엑셀 모드에 입력데이터에 엑셀이 로드되었을 때 작업시작이 활성화되는거지
- 작업시작 버튼을 누르면 입력 데이터의 한 행씩 처리한다. 작업시작 버튼은 비활성화 되고 결과 확인 버튼은 1개의 데이터가 처리될 때 부터 활성화 된다.
- 물론 색깔표시도 나타나는데 아래 작업표시줄에 전체 진행도도 표시되어야 하지
- myApp_triple_forgui.py에서 알 수 있듯이 엑셀에 ‘순서’, ‘학번’, ‘이름’, ‘생기부 결과’, ‘요약 결과’, ‘평가 결과’ 데이터를 정의하고 한 행씩 넣어야지
- 한번에 처리하되 ‘중간 저장’을 위에서 의논한 대로 구현한다. 진행 도중 “결과 확인” 버튼을 누르면 지금까지 처리한 데이터를 저장할 수 있으며 임시 엑셀(캐시 같은 건가?) 등에 저장하자.
- 그리고 작업을 멈춘다. 만약 여기서 워크플로우 창을 꺼버리면 “작업 진행중에 있습니다. 창을 정말 닫으시겠습니까? 경고메세지가 뜸. 확인을 누르면 모두 닫히고 초기화됨. 아니요를 누르면 다시 워크플로우로 돌아옴.
- 중간저장을 하여 작업을 멈추면 “작업 시작” 버튼이 활성화 되며 이를 누르면 다시 작업이 시작된다.
- 어느 정도 작업이 진행된 후, 중간 저장을 누르면 중간 저장한 임시 엑셀 파일 하단에 추가로 데이터가 기록한다.
- 모든 데이터가 처리되고 결과 확인을 누르면 그제서야 엑셀 파일을 저장할 수 있는 창이 뜨고 원하는 경로에 원하는 이름으로 엑셀을 저장할 수 있도록 하자.
- 이 과정을 별도의 thread로 처리하자.
여기서부터 직접 파일을 읽으면서 발생한 문제를 수정하기로 하였다.
깨달은 점이 있는데 바이브코딩으로 작성하면 굉장히 효율적으로 시간을 아낄 수 있지만 이상하게 판단하는 일도 많더라.
예를들어 '단일모드', '엑셀모드'를 판단하는 변수를 이미 지정해 두었는데 입력데이터 버튼을 눌렀을 때 데이터가 1d array인지, 2d array인지 판단하는 모습을 보고 할 말이 없었다(..)
이렇게 불합리한 부분을 직접 실행해가고, 구글링하면서 수정하였다. 정 안되면 AI에게 코드를 물어가보면서 직접 수정했다.
- run_workflow_process_in_thread 함수에서 output_filepath 얘가 정의되기만 하고 엑셀 파일이 생기지 않았네. 그리고 막판에 작업 끝나면 단일창 열리지? 아 그게 왜그러냐면
- processed_results_list 얘가 비어있는걸로 초기화 되어 있는데
- 얘가 위 함수에서 전혀 결과를 받지 못하고 있음.
- 아니 엑셀모드에서 범위도 이상하게 되어 있네… for i in range(start_index, total_rows): 로 수정
- self.current_mode 이걸로 차라리 엑셀모드인지 단일모드인지 판단하는게 낫지 뭔 배열 길이를 재고 있어? 완전 비효율의 끝판왕이구만…
- 아니 진행도에 왜 progress_text_label하고 estimated_time_label 어디갔음?
... 수정사항을 일부 메모를 해 두었는데 참... 아직 갈 길이 멀었나 보다.
11. 나의 11차 작업
수동 수정으로 드디어 완료하고 왠만한 기능이 정상 작동하는 것을 확인하였다. 이제 exe 파일을 만들어 배포하기로 하였다. 여기서 또 문제가 발생했는데 dspy 모듈이 생각보다 exe 파일로 잘 임포드가 안된다는 것이였다(...) 덕분에 구글링하며 고생 좀 했다.
뭐? cl100k_base 인코딩 에러? tiktoken을 포함해야 한다. 그래서 hidden import를 사용해야 한다.
그리고 anthropic_tokenizer.json도 필요하다고?
그리고 메인 py 파일에 포함되는 여러 모듈(py)들도 포함해야 한다는 것을 알게 되었다.
conda activate sldr
conda clean —all
cd X:\School_Life_Detail_Records
#최종 인스톨
pyinstaller --onefile --windowed --icon="academic.png" --add-data "academic.png;." --hidden-import=tiktoken_ext.openai_public --hidden-import=tiktoken_ext --clean --add-data "excel_data_popup.py;." --add-data "excel_info_popup.py;." --add-data "input_data_popup.py;." --add-data "myApp_triple_forgui.py;." --add-data "prompt_edit_popup.py;." --add-data "Prompts.json;." --add-data "workflow_window.py;." --add-data "C:\Users\MyITX\AppData\Roaming\Python\Python310\site-packages\litellm\litellm_core_utils\tokenizers;litellm/litellm_core_utils/tokenizers" --add-data "SR_Agent/assets/frame0;SR_Agent/assets/frame0" --add-data "Prompts.json;." --add-data "SR_Agent/Provider.py;SR_Agent/Provider.py" --add-data "SR_Agent/Triple_Agent.py;SR_Agent/Triple_Agent.py" --add-data "SR_Agent/assets/Prompts/default_yaml.yaml;SR_Agent/assets/Prompts/default_yaml.yaml" gui_app.py
이렇게 고생했는데도... 권한때문에 default_yaml.yaml을 불러올 수 없어 최종 파일에서도 에러창이 뜨게 되었다.
뭐 그냥저냥 사용은 가능하다.
'파이썬 프로그래밍 > 파이썬 개발' 카테고리의 다른 글
7. 생활기록부 작성 AI 에이전트 프로그램 사용설명서 (0) | 2025.06.14 |
---|---|
5. DSPy 생기부 AI 에이전트 - 구조화1 (0) | 2025.05.20 |
4. DSPy 생기부 AI 에이전트-3 (0) | 2025.05.16 |
3. DSPy 생기부 AI 에이전트-2 (0) | 2025.05.14 |
2. DSPy 생기부 AI 에이전트-1 (0) | 2025.05.13 |