본문 바로가기
SK네트웍스 AI 25기

SK네트웍스 Family AI 캠프 25기 | 13주차 회고

by 욘됴리 2026. 4. 5.

 

요즘 할 일이 산더미처럼 쌓여서 정신이 없다.

일을 쳐내도 쳐내고 또 새로운 일거리가 쌓여있어서 성취감을 느낄 새도 없이 기계적으로 다음 일을 하는 느낌이 든다..

잘 하고있는 거겠지...? ㅠ

 

늦은 회고여도 꾸준히 쓴다는 것에 의의를 두자!

 

 


56일차

날짜 : 2025-03-23

Four F’s of Active Reviewing

Facts : Google ADK로 제미나이 기반 에이전트를 구축했다. Google AI Studio에서 API키를 발급받아 .env에 저장하고 adk_test 폴더 하위에 skn_agent를 구성해봤다. 날씨 조회(get_weather), 종목 코드 추출(get_code), 회사정보 반환(get_compay_info), 인사 응답(greet_user) 4가지 tool을 Agent에 연결해보고 로컬 웹에서 동작을 확인해봤음.

Feelings : adk web 명령어로 로컬 웹 인터페이스를 띄울 수 있다는 게 인상적이었다.

ADK(Agent Development Kit)는 Google이 만든 AI 에이전트 개발 프레임워크라고 생각하면 된다. 하는 일은 LangChain(체인/파이프라인에 좀 더 특화됨!)이랑 비슷한데 ADK는 Gemini 모델에 최적화해서 만든 거 같다. 에이전트를 테스트를 하려면 입력 함수를 받아서 테스트를 해야 할 것 같았는데 web 상에서 UI를 보면서 개발할 수 있다는 게 진짜 신기했다.

Findings : Tool 함수의 docstring이 LLM의 도구 선택 기준이 된다. 에이전트는 사용자의 입력을 보고 docstring을 참고해 어떤 함수를 호출할지 스스로 판단하기 때문에 docstring을 정확하게 작성하는 것이 중요하다.
그리고 나는 get_company_info 함수를 Wikipedia 라이브러리로 구현했는데, 강사님은 외부 API URL에 종목코드를 직접 넣어서 파싱하는 방식으로 구현하셨다.

- 내코드

def get_company_info(company_name: str) -> str:
    """
    사용자가 종목코드나 회사 이름을 전달하면 해당 회사의 정보(설립일자, 어떤 시장에 상장되어 있는지, CEO 이름,
    비즈니스 모델/주요 사업 모델, 제공하고 있는 서비스, 시가총액, 총 발행주식 수 등)를
    줄글로 반환한다.
    """
    wiki_wrapper = WikipediaAPIWrapper(top_k_results=5, doc_content_chars_max=1000, lang='ko')
    wiki_tool = WikipediaQueryRun(api_wrapper=wiki_wrapper)
    return wiki_tool.run(company_name)


- 강사님 코드

def get_company_info(company_code:str) -> dict:
    """
    종목 코드를 사용하여 회사 정보를 반환하는 코드
    회사명에서 종목코드 추출은 get_code가 담당
    company_code예시 : 005930


    """
    url = f"https://wts-info-api.tossinvest.com/api/v2/stock-infos/A{company_code}/overview"
    rt = httpx.get(url).json()
    return rt['result']['company']


이처럼 같은 목적의 tool이라도 구현 방식에 따라 반환되는 정보의 정확도나 신뢰도가 달라질 수 있다.

Future : 외부 API 파싱에 더 익숙해져야할 것 같다.

 

 

 

 


57일차

날짜 : 2025-03-24

Four F’s of Active Reviewing

Facts : ADK의 ParallelAgent와 SequentialAgent를 활용해 멀티에이전트 자기소개서 첨삭 시스템을 구성했다. company_agent, news_agent, resume_agent 세 개를 병렬로 실행한 다음 summarizer가 결과를 종합해서 최종 자소서를 출력하는 구조였다. 이 에이전트를 클로드 MCP에 연결해봤다.

Feelings : MCP 경로 설정, 에러 해결하는 과정이 험난했다 ... 물론 내가 만든 툴을 Claude에 직접 붙이는 건 재밌었다. 어제 ADK로 하던 걸 클로드에 이식한 느낌이었음.

Findings : MCP(Model Context Protocol)은 외부 시스템과 상호작용할 수 있게 해주는 표준 프로토콜이다. MCP가 없다면 Claude는 텍스트만 반환하고 사람이 직접 복붙해야 하지만, MCP가 있다면 Claude가 직접 툴을 호출해서 실행하고 처리한다. ParallelAgent는 비동기 방식으로 여러 에이전트를 동시에 실행하기 때문에 순서와 완료 시점이 보장되지 않고, SequentialAgent는 순서대로 실행되어 이전 에이전트의 output_key 결과를 다음 에이전트가 참조할 수 있다.

Future : 동기와 비동기 정리



 

 

 

 


58일차

날짜 : 2025-03-25

Four F’s of Active Reviewing

Facts : 오늘의 주제는 증권 레포트였다. Selenium으로 네이버 증권 재무재표를 스크래핑하고 LangChain @tool 데코레이터로 finance_report, get_news, get_data, get_code 네 가지 tool을 만들어서 에이전트에 연결했다. 구조는 아래와 같음.

네가지 tool을 병렬 실행해서 최종적으로 매수/매도 의견을 출력하는 워크플로우를 구성해봤다. 어제처럼 이 Tool도 MCP로 클로드에 연동했다.

Feelings : LangGraph로 노드 흐름을 확인했을 때 기획한 구조와 동일하게 나와서 신기했음.

근데 RAG, LangGraph와 LangChain의 연관관계에 대해 헷갈리기 시작했다... 무슨 차이인 것일까.

Findings : START에서 여러 노드로 add_edge를 이용해 연결할 수 있다. 연결된 노드들은 병렬로 실행된다. 이 때 각 노드 함수를 async def로 선언하고 내부에서 await을 사용해야 실제로 비동기 병렬 처리가 이루어진다. 동기 함수로 선언하면 LangGraph 내부에서 순차 실행으로 처리하기 때문에 병렬의 이점이 없다.

Future : RAG vs. LangGraph 정리

RAG (Retrieval-Augmented Generation)

  • 검색 + 생성을 결합한 AI기법
  • LLM이 모르는 최신 정보나 특정 문서를 검색해서 컨텐스트로 넣어주는 방식임
  • 이 RAG를 구현하기 위한 도구나 프레임워크로 LangChain을 사용!

RAG 구현 도구들
├── LangChain (프레임워크)
├── LlamaIndex (프레임워크)
├── 직접 구현 (OpenAI API + FAISS 등)
└── ...

RAG는 기법 중 하나.
LangChain/ LangGraph는 도구임.

LangChain(RAG 구현을 위해 사용함)은 LLM이랑 도구를 연결하는 파이프라인이고
LangGraph는 그 파이프라인을 그래프 흐름으로 만드는 것 (노드, 엣지 사용) 

 

 

 


59일차

날짜 : 2025-03-26

Four F’s of Active Reviewing

Facts : `yt_dlp`로 유튜브 영상을 MP3로 추출했다. Whisper로 SRT 자막 생성 후 GPT api를 이용해서 한국어 번역 및 내용 요약까지 이어지는 파이프라인을 구축했다. 오후에는 RunPod GPU 환경에서 gemma-2-9b-it 모델에 한국어 상담 데이터셋으로 LoRA 기반 SFT(지도미세조정) 학습 준비 진행

Feelings : Whisper로 영어 자막이 나오는 것도 신기했는데 GPT 5.4 모델 번역 스킬이 상당했다. 이젠 자막없는 유튜브 영상도 번역해서 볼 수 있을 것 같다. 번역가라는 직업이 사라질지도 모르겠다는 생각을 했다.

Findings :LoRA는 모델 전체를 재학습하지 않고 일부 가중치에만 저랭크 행렬을 추가해 파인튜닝하는 기법이다. PEET는 이런 기법들을 묶어놓은 라이브러리다. SFT는 정답이 있는 데이터로 모델을 지도학습 시켜서 미세조정하는 것이다. 오늘은 상담 대화 데이터를 전처리한 후에 SFTTrainer에 넘겨서 학습 시키는 구조였다.

Future : LoRA PDF 내용 복습하기

 

 


60일차

날짜 : 2025-03-27

Four F’s of Active Reviewing

Facts : 어제 SFT 학습시킨 모델을 RunPod에 scp로 전송하고 4비트 양자화로 gemma-2-9b-it를 로드했다.
PeftModel.from_pretrained로 LoRA 가중치를 얹어 추론 진행

Feelings : 파인튜닝한 모델이 실제 상담사처럼 답변하는 걸 보면서 SFT 효과가 좋다고 생각했다. 다만 마지막에 악당처럼 말하도록 SFT 학습을 시킨 Qwen모델은 뭔가 잘못되었는지 YouYouYou 가 반복 출력되었다.
학습을 잘 시키는 게 진짜 어려운 거 같다..

Findings : 4비트 양자화는 모델 원본 가중치를 4비트로 압축해 메모리를 줄이는 방식이다. LoRA는 그 위에 저랭크 행렬만 추가로 학습하므로 원본 가중치는 변하지 않는다. YouYouYou 반복 현상은 max_new_tokens 미설정, 잘못된 pad_token_id, 또는 데이터셋 포맷 오류로 인해 모델이 루프에 빠지는 경우에 발생한다.

Future : Qwen 모델을 잘 고쳐보자..

 

 

 

📖 주말 복습

주말에 키보드 박람회가서 다얼유 키보드 업어왔다!
전투력 +100 상승

- ncs 준비
- 정처기 6파트 문풀

 

댓글