Tool 설계와 LLM CoT 실행 구조
Tool 쪼개는 기준
"이 작업을 다른 Skill에서 다시 쓸 수 있는가?" Yes → Tool / No → Skill 내부 로직
예시: 사이트 로그인 + 자료조사 분해
login(url, credentials) → session
navigate(session, url) → page_content
search(session, query) → results
extract(page_content, schema) → structured_data
download_file(session, url) → local_path
convert_to_md(path, output) → md_path
logout(session) → void
각 Tool: 단일 입출력, 독립적으로 재사용 가능.
Skill 정의 방식
방식 A — 코드 (개발자용)
def research_skill(query: str, save_path: str):
session = login(SITE_URL, credentials)
results = search(session, query)
for r in results:
path = download_file(session, r.url)
convert_to_md(path, save_path)
logout(session)
방식 B — 선언적 YAML (LLM이 읽는 형태)
skill: research_and_save
description: "특정 사이트에서 자료 조사 후 MD로 저장"
steps:
- tool: login
params: {url: "{site_url}"}
- tool: search
params: {query: "{user_query}"}
- tool: download_file
for_each: results
- tool: convert_to_md
params: {output_path: "{save_path}"}
방식 B: LLM이 읽기 좋고, 사용자가 파라미터만 채우는 구조.
LLM의 CoT 실행 흐름
System prompt에 들어가는 것:
- 사용 가능한 Tool 목록 + 입출력 명세
- 사용자의 Skill 정의
- 현재 맥락 (캘린더 이벤트, 사용자 설정)
LLM 내부 추론:
"'내일 회의 전 관련 논문 3개 조사' 요청.
→ research_and_save Skill 선택
→ 파라미터 결정:
query: 회의 제목에서 키워드 추출
save_path: 사용자 Obsidian 경로
→ 1단계: login 실행 → session 획득
→ 2단계: search(query) → results 3개
→ 3단계: download_file × 3
→ 4단계: convert_to_md × 3
→ 완료. 요약 보고."
LLM은 "뇌" (CoT + Tool 호출 결정) Tool 실행 레이어는 "손" (실제 코드 실행) Skill은 LLM이 읽는 "작업 지침서"
전체 아키텍처
사용자 요청 / 캘린더 트리거
↓
LLM (CoT)
→ 어떤 Skill?
→ 파라미터 채우기
→ Tool 실행 순서 결정
↓
Tool 실행 레이어 (코드)
→ login(), search(), download_file(), convert_to_md()
↓
결과 → 사용자
관련 개념
- tool-vs-skill-design — Tool/Skill 설계 원칙
- overview — 전체 지도
- research/harness-engineering/context-engineering — LLM에게 Skill을 어떻게 전달할 것인가
여러 작업이 있을 때 — Task Router 구조
핵심 판단 기준
작업들이 서로 의존하는가?
의존성 있음: "다운 → 변환 → 인덱싱"
→ 단일 CoT (순서와 결과를 연결)
의존성 없음: "리서치 + 회의록 요약 + 이메일 확인"
→ Task Router + 병렬/순차 CoT
Task Router 구조
캘린더 트리거
↓
Router LLM (가벼운 CoT — 어떤 Skill? 어떤 순서?)
↓
병렬 실행: Agent A, Agent B (독립 context)
순차 실행: Agent C (A, B 결과 참고)
↓
최종 보고
Router는 "무엇을 어떤 순서로"만 결정. 실제 CoT는 각 Agent가 담당.
Router Output 예시
{
"parallel": ["research_papers", "check_attendee_emails"],
"sequential": ["summarize_last_meeting"],
"order": ["summarize_last_meeting", "report_to_user"]
}
16GB 환경 현실적 구현
병렬 실행은 단일 GPU에서 불가. 빠른 순차 실행으로 근사.
Router LLM: 7B (판단만, 가볍게)
Task Agent: 14B (실제 작업, 순차 실행)