research

Tool 설계와 LLM CoT 실행 구조

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()
        ↓
결과 → 사용자

관련 개념

여러 작업이 있을 때 — 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 (실제 작업, 순차 실행)