Solon AI에서의 도구(Tool) vs 재능(Talent): 함수만으로는 부족할 때
요약
Solon AI가 제안하는 에이전트 설계 패턴인 '도구(Tool)'와 '재능(Talent)'의 차이를 설명합니다. 단순 함수 호출을 넘어 SOP와 활성화 규칙을 결합한 '재능' 개념을 통해 컨텍스트 폭발과 부적절한 도구 호출 문제를 해결하는 방법을 다룹니다.
핵심 포인트
- 도구(Tool)는 단일 함수 단위이며, 재능(Talent)은 지침과 도구 세트를 포함하는 상위 단위임
- 재능 개념을 통해 모델이 필요한 시점에만 도구를 활성화하여 토큰을 절약함
- SOP와 활성화 규칙을 결합하여 에이전트의 비즈니스 도메인 준수 능력을 향상함
- Gate, Attach, Inject 단계를 거치는 체계적인 라이프사이클로 도구 관리 최적화
대부분의 에이전트 튜토리얼은 도구(tools) 단계에서 멈춥니다. 모델에게 함수 스키마(function schema)를 제공하고, 모델이 올바른 함수를 호출하기를 바라는 식이죠. 이는 get_time이나 hash_string 같은 경우에는 작동합니다. 하지만 모델이 지식 검색을 건너뛰고 바로 티켓을 생성하거나, 80개의 API가 하나의 컨텍스트 윈도우(context window)에 모두 쏟아질 때는 무너지고 맙니다.
Solon AI는 도구를 실행 단위(execution unit)로 유지하면서, 여기에 **재능 (Talent)**을 제품 단위(product unit)로 추가합니다. 즉, 도구(tools)에 표준 운영 절차(SOP)와 활성화 규칙(activation rules)을 더한 것입니다. 다음과 같이 생각하면 쉽습니다:
- 도구 (Tool) ≈ 함수 (function)
- 재능 (Talent) ≈ 해당 함수들, 그 함수들의 플레이북(playbook), 그리고 그 함수들이 나타나는 시점을 소유하는 클래스 (class)
이 포스트는 언제 도구에 머물러야 하는지, 언제 도구를 재능으로 감싸야 하는지, 그리고 Solon v4.0.3에서 등록(registration)이 실제로 어떻게 작동하는지에 대한 실질적인 지도입니다.
“도구만 더 추가하면 돼”라는 생각 뒤에 숨겨진 제품의 실패
순수 도구는 모델에게 오직 두 가지 질문에만 답합니다:
- 내가 무엇을 호출할 수 있는가?
- 어떤 인자(args)가 필요한가?
이들은 다음 질문에는 답하지 못합니다:
- 이 기능이 지금 당장 보여야 하는가?
- 위험한 호출을 하기 전에 어떤 순서를 따라야 하는가?
- 어떤 도구들이 동일한 비즈니스 도메인(business domain)에 속하는가?
이러한 격차는 다음과 같은 문제로 나타납:
- 성급한 부작용 (진단 전에 티켓이 생성됨)
- 컨텍스트 폭발 (매 턴마다 전체 도구 테이블이 포함됨)
- 취약한 SOP 준수 (모델이 도메인을 넘나들며 즉흥적으로 행동함)
재능(Talent)은 Solon의 해답입니다. 이는 **인지(awareness) + 지침(instruction) + 도구(tools)**의 재사용 가능한 패키지이며, 도구들이 자신의 도메인 정체성을 유지할 수 있도록 자동 컬러링(coloring) 기능을 갖추고 있습니다.
도구(Tool) vs 재능(Talent) 비교표
공식 비교 자료에 따르면:
| 차원 (Dimension) | 도구 (Tool, FunctionTool) | 재능 (Talent, Talent) |
|---|---|---|
| 단위 (Unit) | 단일 함수 / 메서드 | 지침 + 도구 세트 + 상태 |
| ... |
이들은 경쟁 관계가 아닙니다. 재능은 도구를 **포함(contains)**합니다. 재능을 등록하면 그 도구들도 함께 등록됩니다. 동일한 도구 세트에 대해 두 번째 defaultToolAdd를 호출할 필요가 없습니다.
라이프사이클: 요청 시점에 실제로 실행되는 것
요청이 시작되면, Solon은 등록된 재능들을 탐색합니다:
- Gate (게이트) —
isSupported(prompt)가 비활성 재능을 필터링합니다. - Attach (어태치) — 워밍업(warm-up) / 감사(audit) / 컨텍스트 준비를 위한
onAttach(prompt)가 실행됩니다. - Inject + color (주입 + 컬러링) —
getInstruction이 시스템 메시지(system message)에 병합되며, 도구(tools)에는 재능 메타데이터(coloring)가 부여됩니다. - Reason + act (추론 + 실행) — 모델은 도메인 태그와 표준 운영 절차(SOP) 텍스트가 포함된 활성 도구들만 보게 됩니다.
이것이 바로 재능(talents)이 토큰을 절약할 수 있는 이유입니다. 비활성 도메인은 도구 테이블(tool table)에 아예 들어가지 않기 때문입니다.
패턴 A: 도구(Tool)로 유지하기
다음과 같은 역량이 필요할 때는 일반적인 도구를 사용하세요:
- 결정론적(deterministic)인 경우
- 리스크가 낮은 경우
- 스키마(schema)만으로 자기 설명이 가능한 경우
- 다단계 비즈니스 정책(business policy)과 결합되지 않은 경우
public class ClockTools extends AbsToolProvider {
@ToolMapping(description = "ISO-8601 형식으로 현재 서버 시간을 반환합니다")
public String now() {
...
분기(branching)가 매우 적은 요청 범위(request-scoped) 옵션의 경우에도 괜찮습니다:
chatModel.prompt("Hangzhou의 날씨는?")
.options(o -> {
o.systemPrompt("당신은 날씨 도우미입니다.");
...
일시적인 급증(spikes) 상황에는 좋지만, 동일한 역할 규칙이 여러 컨트롤러(controllers)에서 반복될 때는 고통스러울 수 있습니다.
패턴 B: 재능(Talent)으로 업그레이드하기
다음 중 하나라도 필요한 경우 도구를 재능으로 감싸세요:
- 부수 효과(side effect)가 발생하기 전의 다단계 SOP(표준 운영 절차)
- 의도 기반 활성화(intent-based activation)
- 역할(role) / 테넌트(tenant)를 인식하는 도구 인터페이스
- ChatModel / ReActAgent / TeamAgent 전반에 걸쳐 재사용 가능한 도메인 모듈
선언적 빌드: TalentDesc
TalentDesc orderTalent = new TalentDesc("order_expert")
.description("주문 도우미")
.isSupported(prompt -> prompt.getUserContent().contains("order"))
...
로컬 환경에서 람다(lambda) 친화적인 정의를 빠르게 작성할 수 있습니다.
엔지니어링 빌드: AbsTalent + @ToolMapping
public class TechSupportTalent extends AbsTalent {
@Override
public String name() {
...
AbsTalent는 MethodToolProvider를 통해 @ToolMapping 메서드를 스캔하며, 이는 이미 에이전트(agents)를 위해 사용 중인 도구 등록 방식과 동일한 계열입니다.
하나의 재능 내부에서 역할 인식 도구 인터페이스 제공
public class AuthControlTalent extends AbsTalent {
private final UserTool userTool = new UserTool();
private final AdminTool adminTool = new AdminTool();
...
Call site stays thin:
ChatModel chatModel = ChatModel.of(apiUrl)
.apiKey(apiKey)
.defaultModel(model)
...
Or per request:
chatModel.prompt(Prompt.of("...").attrPut("role", role))
.options(o -> o.talentAdd(new AuthControlTalent()))
.call();
등록 및 우선순위 (Registration and priority)
| 범위 (Scope) | API |
|---|---|
| 모델의 모든 요청에서 (Every request on a model) | ChatModel.of(...).defaultTalentAdd(talent) |
| ... | |
| 여러 재능(talents)은 등록 순서에 따라 지침을 주입합니다. 이들의 도구는 메타데이터를 사용하여 색상으로 표시되어 모델이 SOP 텍스트를 올바른 도구 그룹과 정렬할 수 있게 합니다. |
ChatModel, SimpleAgent, ReActAgent, 그리고 TeamAgent 모두에서 동일한 패턴이 작동합니다.
결정 체크리스트 (Decision checklist)
| 신호 (Signal) | 선호하는 방식 (Prefer) |
|---|---|
| 단일 순수 함수, 정책 없음 (Single pure function, no policy) | 도구 (Tool) |
| ... | |
| 한 줄의 공식 지침: 도구로 시작하고; 모델이 플레이북이나 게이트가 필요할 때 재능(talent)으로 래핑합니다. |
이것이 아닌 것 (What this is not)
- 재능(Talent)은 Claude Code Skill의 클론이 아닙니다. Solon talents는 개발자 시간(developer-time) 역량입니다 (빌드/요청 시 연결됨). Claude Skills는 **런타임 학습(runtime-learned)**에 가깝습니다. Solon은 이 구분을 명시적으로 문서화합니다.
- 재능(Talent)은 모델 네이티브 표준이 아닙니다. 이는 프롬프트 + 도구 호출 위에 구축된 프레임워크 패턴입니다.
다음으로 나아갈 곳 (Where to go next)
- 도구 대 재능 선택: solon.noear.org/article/1335
- 재능 개념 및 인터페이스: article/1331
- 두 가지 빌드 스타일: article/1332
- 등록 및 우선순위: article/1334
- 옵션 도구 대 재능 캡슐화: article/1385
- 대규모 표면을 위한 게이트웨이 재능: article/1353
만약 당신의 에이전트(Agent)가 계속해서 "도구(Tools)를 알고" 있음에도 불구하고 여전히 비즈니스 경로(Business path)를 완수하는 데 실패한다면, 대개 당신에게 필요한 것은 더 많은 도구가 아닙니다. 당신에게 필요한 것은 그 경로를 소유하는 재능(Talent)입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기