LangChain Blog수정일

Deep Agents에서 Skills 개편

핵심 요약 이제 도구를 스킬에 바인딩할 수 있습니다. 도구 스키마는 에이전트가 해당 스킬을 읽기 전까지는 컨텍스트에 포함되지 않으며, 대화 중간에 새 도구를 추가할 수 있는 모델에서는 도구를 추가해도 프롬프트 캐시가 그대로 유지됩니다. 앱은 런타임에 스킬을 고정(pinning)할 수 있습니다, 따라서 첫 모델 호출 전에 지침이 컨텍스트에 들어가며 추가 re

Only a skill's name and description are always in context. The agent reads the instructions on demand, and loads scripts, references, and assets only when needed.
이미지 출처 · LangChain Blog

핵심 요약

  • 이제 도구를 스킬에 바인딩할 수 있습니다. 도구 스키마는 에이전트가 해당 스킬을 읽기 전까지는 컨텍스트에 포함되지 않으며, 대화 중간에 새 도구를 추가할 수 있는 모델에서는 도구를 추가해도 프롬프트 캐시가 그대로 유지됩니다.
  • 앱은 런타임에 스킬을 고정(pinning)할 수 있습니다, 따라서 첫 모델 호출 전에 지침이 컨텍스트에 들어가며 추가 read_file 왕복이 필요 없습니다.
  • 스레드 중간에 스킬을 다시 로드할 수 있습니다, 따라서 장기 실행 에이전트가 새 스레드를 시작하지 않고도 추가, 수정 또는 삭제된 스킬을 반영합니다.

스킬은 에이전트에 도메인 지식을 부여하는 가장 좋은 방법 중 하나입니다. 스킬 은 지침, 스크립트, 참조 파일로 구성된 폴더로, 고객 미팅 준비나 영업팀 방식대로 통화 기록을 검토하는 것 같은 작업 수행 방법을 에이전트에게 가르쳐 줍니다. Agent Skills는 어떤 모델과도 호환되는 오픈 표준 이며 수십 개의 에이전트 제품에서 지원됩니다. 스킬을 작성하는 데 기술 지식이 필요하지도 않습니다. 스킬의 핵심은 마크다운 파일입니다.

스킬이 작동하는 이유는 점진적 공개(progressive disclosure)덕분입니다. 에이전트는 처음에 각 스킬의 이름과 설명만 보고, 작업에 필요할 때 전체 지침을 읽습니다. 이를 통해 컨텍스트가 작게 유지되며, 컨텍스트 엔지니어링 은 효과적인 에이전트를 구축하는 핵심입니다.

사용량이 늘어남에 따라 팀이 스킬에 요구하는 사항도 변하고 있습니다. 기업 스킬 레지스트리가 수천 개의 스킬로 늘어나 팀과 에이전트 간에 공유되는 모습을 보고 있습니다. 우리는 몇 가지 일반적인 요청을 해결하기 위해 Deep Agents의 스킬 지원 을 개편했습니다:

  • 도구를 스킬에 바인딩: 스킬에 바인딩된 도구는 에이전트가 해당 스킬을 읽을 때만 로드됩니다.
  • 고정된 스킬: 사용자가 명시적으로 스킬을 요청하면(예: /meeting-prep), 다음 모델 호출 전에 앱이 이를 로드할 수 있습니다.
  • 스킬 다시 로드: 장기 실행 스레드가 처음부터 다시 시작하지 않고도 새 스킬이나 변경된 스킬을 반영할 수 있습니다.

스킬 작동 방식

스킬은 다음을 포함하는 디렉터리입니다: SKILL.md file: YAML 프런트매터와 name 그리고 description, 그 뒤에 에이전트가 따르는 지침이 이어집니다. 스킬은 또한 지원 파일을 다음 아래에 묶을 수 있습니다 scripts/, references/, 그리고 assets/ (사양).

Only a skill's name and description are always in context. The agent reads the instructions on demand, and loads scripts, references, and assets only when needed.
스킬의 이름과 설명만 항상 컨텍스트에 포함됩니다. 에이전트는 필요할 때 지침을 읽고, 스크립트, 참조 자료, 에셋은 필요할 때만 로드합니다.

이 글 전체에서 우리는 다음을 사용합니다. 우리의 GTM 에이전트 진행 예제로 사용됩니다. 이것은 다음 위에 구축되었습니다. 딥 에이전트(Deep Agents), 그리고 50개 이상의 스킬 라이브러리는 영업 담당자의 반복 업무를 다루는데, 예를 들어 meeting-prep, call-transcripts, 그리고 competitive-intel-card.

스킬은 세 가지 수준으로 로드됩니다:

  1. 발견. 시작 시, 에이전트는 각 스킬의 name 그리고 description 시스템 프롬프트에.
  2. 활성화. 작업이 스킬과 일치하면 에이전트는 전체 SKILL.md 와 함께 read_file.
  3. 실행. 에이전트는 지시를 따르며, 스크립트나 참조 파일을 필요로 할 때에만 읽습니다.
The agent's context grows only by what the task needs: every skill's name and description at startup, then one skill's instructions, then one reference file.
에이전트의 컨텍스트는 작업에 필요한 것만큼만 증가합니다: 시작 시 모든 스킬의 이름과 설명, 그 다음에는 한 스킬의 지침, 그리고 하나의 참조 파일이 추가됩니다.

스킬은 사용되기 전까지는 시스템 프롬프트에서 한 줄만 차지하므로, 라이브러리가 컨텍스트를 어수선하게 만들지 않고도 방대한 수의 스킬에 대한 참조를 보유할 수 있습니다. 이제 Deep Agents에서 우리가 만든 개선 사항으로 넘어가 보겠습니다.

도구를 스킬에 바인딩하기

스킬은 종종 에이전트에게 특정 도구를 사용하는 방법을 알려주며, 일부 도구는 에이전트가 해당 설명서를 읽은 후에야 제대로 작동합니다. 지금까지는 스킬과 도구가 별도로 공개되었습니다. 다음을 사용하여 도구 스키마를 컨텍스트에 포함되지 않게 유지할 수 있었습니다. 도구 검색하지만 도구와 그것을 설명하는 스킬을 연결하는 장치는 없었습니다. 에이전트는 스킬을 읽지 않고도 도구를 찾아 호출할 수 있었고, 스킬을 읽더라도 여전히 해당 도구를 검색해야 했습니다.

이제 가능합니다 스킬에 도구를 바인딩합니다, 따라서 스킬과 그 도구들이 함께 공개됩니다. 바인딩된 도구는 에이전트가 해당 스킬을 읽기 전까지는 컨텍스트에 추가되지 않으며, 그 전에 호출하면 알 수 없는 도구로 실패합니다. 이를 통해 컨텍스트를 가볍게 유지할 수 있고, 에이전트가 도구를 호출하기 전에 반드시 사용법을 읽게 됩니다. 저희의 GTM agent, call-transcripts 는 통화를 검색하고 전사본을 읽는 방법을 설명하므로, 해당 도구들을 바인딩하기에 자연스러운 위치입니다.

스킬의 frontmatter에 도구를 나열하려면 다음 위치 아래에 metadata.include_tools:

call-transcripts SKILL.md frontmatter listing include_tools: search_calls get_transcript

해당 도구들을 전달하세요 SkillsMiddleware 에이전트 대신:

Python: create_deep_agent with SkillsMiddleware(tools=[search_calls, get_transcript])
Reading call-transcripts unlocks search_calls and get_transcript. They arrive in a new system message, so the cached prefix above it stays unchanged.
call-transcripts를 읽으면 search_calls와 get_transcript가 잠금 해제됩니다. 이들은 새로운 시스템 메시지로 도착하므로, 그 위의 캐시된 접두사는 변경되지 않고 유지됩니다.

대화 도중에 도구를 추가하려면 요청의 도구 목록을 편집해야 했고, 이는 프롬프트 캐시를 무효화시켰습니다. Anthropic 그리고 OpenAI 이제 최신 모델들은 대화 도중에 도구를 받아들일 수 있어서, 해당 모델들에서는 Deep Agents가 스킬을 읽은 직후 그 스킬에 바인딩된 도구를 추가하고 캐시된 접두사는 그대로 유지됩니다(Anthropic 그리고 OpenAI 통합 문서). 다른 모델에서는 도구가 이전과 같이 요청에 추가됩니다.

목록 하나로 대부분의 스킬을 다룰 수 있습니다. 더 세밀한 제어를 위해, 스킬은 도구 이름 대신 레이블을 나열할 수 있고, 여러분이 전달하는 함수는 SkillsMiddleware 라벨을 각각 도구로 변환합니다. 이를 통해 다음을 할 수 있습니다:

  • 전체 도구 그룹 공개, MCP 서버의 다른 모든 도구와 마찬가지로, 스킬에 각 도구를 나열하지 않고 하나의 이름 아래에서 말입니다.
  • 런타임 권한에 대한 게이트 도구. 이 함수는 그래프의 런타임을 전달받으므로, 사용자가 누구인지 확인하고 해당 사용자가 사용할 수 있는 도구만 반환할 수 있습니다.

여기서, call-transcripts calls MCP 서버의 모든 도구를 가져오며, pipeline-forecast CRM 도구에 접근할 수 있지만 예측을 업데이트할 수 있는 것은 관리자뿐입니다:

SKILL.md frontmatter for call-transcripts (include_tools: call_tools) and pipeline-forecast (include_tools: crm_tools)
Python: resolve_skill_tools returns every calls MCP tool for call_tools, and update_forecast only for managers

보기 도구를 스킬에 추가 자세한 내용은 위 링크를 참조하십시오.

고정된 스킬

때로는 사용자가 이미 원하는 스킬이 무엇인지 알고 있습니다. 저희 GTM 에이전트에서는 세일즈 담당자가 다음과 같이 입력할 수 있습니다 /meeting-prep for my Acme call tomorrow. 고정(pinning)하지 않으면 모델은 스킬의 설명만 보고 이를 읽어야 합니다. 그러면 작업이 시작되기 전에 추가 왕복이 발생하고, 모델이 올바른 스킬을 로드한다는 보장도 없습니다. 고정된 스킬을 사용하면 앱이 메시지에서 스킬 이름을 찾거나(또는 UI에서 파싱하여) 이를 전달하고 pinned_skills미들웨어가 다음 모델 호출 전에 각 스킬의 지침을 대화에 추가합니다. Deep Agents는 메시지를 직접 파싱하지 않으므로 구문은 사용자가 선택합니다:

Typing /meeting-prep names the skill, so the app can pin it for the agent's next model call.
/meeting-prep을 입력하면 스킬 이름이 지정되므로, 앱이 에이전트의 다음 모델 호출을 위해 해당 스킬을 고정할 수 있습니다.
Python: parse /meeting-prep from the message and pass it as pinned_skills to agent.invoke
A pinned skill's instructions are already in the conversation, so the agent starts the work on model call 1 instead of model call 2.
고정된 스킬의 지침은 이미 대화에 포함되어 있으므로, 에이전트는 모델 호출 2가 아니라 모델 호출 1에서 작업을 시작합니다.

이는 지연 시간을 줄이고 동작을 더 예측 가능하게 만듭니다: 지침이 컨텍스트에 확실히 포함되도록 보장되며, 고정된 스킬에 바인딩된 도구들도 함께 제공됩니다. 각 고정된 스킬은 태그가 지정된 메시지로 한 번만 추가되므로 이전 메시지는 절대 변경되지 않고, 프롬프트 캐시가 유효하게 유지되며, 채팅 UI에서는 스킬의 전체 텍스트 대신 레이블로 표시할 수 있습니다.

스레드 도중 스킬 재장전

기술은 모든 스레드가 시작될 때 로드되어 에이전트 상태에 유지되므로, 이후 모든 턴에서 동일한 기술 세트를 재사용합니다. 이제 이를 통해 이 목록을 무효화하다 설정을 통해 skills_metadata 까지 None 에이전트를 호출할 때. 팀원이 다음을 추가하는 경우 competitive-intel-card 라이브러리에 스킬을 추가하면 애플리케이션이 스킬 목록을 무효화하도록 선택할 수 있으며, 다음 실행 시 모든 소스를 다시 스캔합니다:

Python: agent.invoke with skills_metadata set to None
Setting skills_metadata to None makes the next run rescan the skill library and pick up a skill added since the last run.
skills_metadata를 None으로 설정하면 다음 실행 시 스킬 라이브러리를 다시 스캔하여 마지막 실행 이후에 추가된 스킬을 가져옵니다.

새로운 스킬을 발견하는 리로드는 시스템 프롬프트를 변경하며, 이는 프롬프트 캐시를 무효화합니다. 오랫동안 유휴 상태였던 스레드의 경우 이 비용은 대개 이미 지불된 상태입니다. 공급자 캐시는 일반적으로 몇 분에서 1시간의 비활성 후에 만료되기 때문입니다(Anthropic, OpenAI'), 그래서 담당자가 돌아올 때쯤에는 캐시가 콜드 상태가 됩니다.

리셋은 단순히 실행되는 입력이므로 사용자에게 제어권을 넘길 수도 있습니다. 예를 들어, /reload 클라이언트 측에서 명령어 실행:

다음에서도 초기화할 수 있습니다 update_state 또는 미들웨어에서 호출할 수 있으므로, 앱이 스킬 재로드 시점을 제어합니다. 참고: 스킬 다시 불러오기.

시작하기

스킬(Skills)은 에이전트에 체계화된 도메인 지식을 제공하는 업계 표준 메커니즘입니다. 이번 업데이트를 통해 대규모 실행이 한층 쉬워졌습니다. 도구는 스킬에 필요할 때만 로드되고, 워크플로에 필요한 스킬은 사전에 로드되며, 장기 실행 스레드는 라이브러리가 변경되어도 최신 상태를 유지합니다. 또한 스킬은 개방형 표준이므로 팀이 작성한 스킬은 모델과 에이전트 전반에서 작동합니다.

이들 모두 최신 버전에서 이용할 수 있습니다 deepagents. 다음을 읽어보세요 스킬 문서 시작해 보시고, 의견은 다음을 통해 알려주세요 GitHub 이슈, 이 포럼, 또는 위에서 X.

감사의 말

덕분에 리치 스카롯(Rich Scarrott) 이러한 새로운 기능들의 개발을 주도한 것과 헌터 로벨 기능 및 블로그 검토를 위해!

원문 출처

LangChain Blog

내용 안내

원문 발행 및 권리는 출처에 있습니다.

기계 번역 · 원문을 참고하세요