AI 뉴스

DeepSeek Harness - 모든 구성 요소를 플러그인으로 만든 오픈소스 코딩 에이전트 — 아키텍처와 실전 활용 가이드

노동1호 2026. 8. 14. 03:01
DeepSeek Harness - 모든 구성 요소를 플러그인으로 만든 오픈소스 코딩 에이전트 — 아키텍처와 실전 활용 가이드

DeepSeek Harness - 모든 구성 요소를 플러그인으로 만든 오픈소스 코딩 에이전트 — 아키텍처와 실전 활용 가이드

DeepSeek Harness 아키텍처
DeepSeek Harness - 플러그인 기반 코딩 에이전트 아키텍처 (Image: Picsum)

핵심은 “Everything is a Plugin” 구조로, Model Adapter와 Tool뿐 아니라 Session Log, Agent Loop 자체까지 플러그인으로 구성 고정된 Core를 직접 수정하는 대신 필요한 플러그인을 추가하거나 기존 구현을 교체해 에이전트의 동작과 실행…

왜 DeepSeek Harness인가

기존의 코딩 에이전트는 LLM 호출, 도구 실행, 컨텍스트 관리, 정책 enforcement이 한 덩어리의 코드에 결합되어 있습니다. 이 때문에 모델을 바꾸거나, 도구를 추가하거나, 정책 룰을 교체하려면 프레임워크 본체를 수정해야 했습니다. DeepSeek Harness는 모든 구성 요소를 플러그인 인터페이스로 추상화해, 한 줄의 설정 변경만으로 LLM·도구·정책을 교체할 수 있게 만들었습니다.

핵심 설계 원칙은 세 가지입니다: (1) 단일 책임 인터페이스 — 각 플러그인은 한 가지 역할만 갖습니다 (2) 런타임 결합 — 플러그인은 사전 등록이 아니라 기동 시점에 로드됩니다 (3) 관측 가능성 우선 — 모든 단계가 trace 이벤트를 발행해 post-mortem 분석이 가능합니다.

플러그인 결합
플러그인 결합 패턴 — LLM·도구·정책을 모듈식으로 교체 (Image: Picsum)

핵심 아키텍처

Harness는 다음 다섯 계층으로 구성됩니다:

  • Agent Loop: 사용자 입력 → 컨텍스트 빌드 → LLM 호출 → 도구 실행 → 응답 생성의 사이클을 담당합니다.
  • Plugin Registry: LLM, Tool, Policy, Storage, Hook 네 종류의 플러그인을 등록·조회합니다.
  • Context Builder: 시스템 프롬프트, 도구 스키마, 메모리, 정책 가드를 종합해 LLM 입력 컨텍스트를 만듭니다.
  • Tool Sandbox: 도구 실행을 격리된 환경에서 수행하고 stdout/stderr/artifact를 수집합니다.
  • Policy Engine: 호출 직전·직후에 정책 룰을 검증합니다 (예: 코드 실행 전 정적 분석, 외부 API 호출 전 사용자 승인).

플러그인 인터페이스 contract

모든 플러그인은 Python 프로토콜로 다음 메서드를 구현합니다:

from harness.plugins import ToolPlugin, ToolContext

class ReadFilePlugin(ToolPlugin):
    name = "read_file"
    description = "지정 경로의 파일을 읽어 반환합니다."

    def run(self, ctx, path):
        if not ctx.policy.allows("read", path):
            raise PermissionError("read blocked: " + path)

        try:
            content = ctx.sandbox.read(path)
            ctx.hook.emit("file.read", {"path": path, "bytes": len(content)})
            return content
        except FileNotFoundError:
            ctx.hook.emit("file.read.miss", {"path": path})
            raise

이 한 클래스만 등록하면 read_file 도구가 LLM에 즉시 노출됩니다. LLM은 함수 호출 형식으로 read_file(path="/repo/src/main.py")를 요청하고, Harness는 tool schema를 자동 생성해 컨텍스트에 포함합니다.

런타임 설정 — 무엇이 플러그인이고 무엇이 코어인가

사용자는 harness.yaml 파일로 어떤 플러그인을 어떤 순서로 결합할지 선언합니다. 다음은 Claude Code 스타일 에이전트를 DeepSeek 모델로 교체하는 예시입니다:

agent:
  name: coding-agent
  plugins:
    llm:
      - deepseek-coder-v3
      - openai-gpt-4o-fallback
    tools:
      - read_file
      - write_file
      - shell_exec
      - grep_search
    policy:
      - no-destructive-shell
      - require-approval-http
    storage:
      - sqlite-memory
    hook:
      - trace-jsonl

이 선언만으로 DeepSeek Coder가 메인 LLM, GPT-4o가 폴백, shell_exec가 destructive 명령 차단 룰과 함께 기동됩니다. 본체 코드는 단 한 줄도 수정하지 않습니다.

기존 프레임워크 대비 마이그레이션 이점

대표적인 코딩 에이전트들과 비교했을 때 DeepSeek Harness의 차별점은 명확합니다:

  • 모듈 교체 비용: 다른 프레임워크는 LLM·도구 변경 시 본체 fork가 필요한 경우가 많지만, Harness는 플러그인 교체 한 줄로 끝납니다.
  • 디버깅 가능성: Hook 플러그인이 모든 trace를 발행하므로 trace-jsonl 플러그인만 켜도 전체 호출 흐름을 재생할 수 있습니다.
  • 정책 일관성: Policy Engine이 도구 호출 직전에 검증하므로, 새 도구를 추가해도 정책 룰을 재작성할 필요가 없습니다.
  • 자가 진단: harness doctor 명령으로 등록된 모든 플러그인의 health를 점검하고, 잘못된 설정은 기동 단계에서 차단됩니다.

실전 활용 팁 — 첫 플러그인 만들기까지

  1. 도메인 한정: 처음부터 모든 기능을 플러그인화하려 하지 말고, 가장 자주 교체하고 싶은 한 가지(예: 모델)부터 시작합니다.
  2. 정책 먼저: 도구 플러그인을 만들기 전에 Policy 플러그인 스키마를 확정하면, 이후 모든 도구가 자동으로 검증됩니다.
  3. Hook로 가시화: 개발 초기에는 trace-jsonl Hook을 반드시 켜고, 호출 그래프를 눈으로 확인하며 진행합니다.
  4. 샌드박스 우선: Tool Sandbox에 시간·메모리·네트워크 제한을 명시해 LLM이 무한 루프에 빠지거나 외부로 데이터를 유출하지 않게 막습니다.
  5. 버전 동결: 플러그인 시그니처는 시맨틱 버저닝하고, 메이저 변경 시 migrate.py로 사용자 설정을 자동 변환합니다.

전망 — 에이전트 생태계의 인프라로

플러그인 인터페이스가 표준화되면, 커뮤니티는 모델별 어댑터, 도구별 구현, 정책 룰 세트를 npm/pip처럼 손쉽게 배포할 수 있게 됩니다. 이미 DeepSeek 측은 핵심 인터페이스를 안정화한 상태이며, 오픈소스 기여를 통해 생태계가 빠르게 확장될 가능성이 높습니다. 기업 입장에서는 vendor lock-in 없이 자체 모델·도구·정책을 조합할 수 있다는 점에서 비용·거버넌스 양면의 이점을 얻습니다.

핵심 정리

  • DeepSeek Harness는 LLM·도구·정책·스토리지·Hook을 플러그인으로 추상화한 코딩 에이전트 프레임워크다.
  • harness.yaml만 수정하면 모델·도구·정책을 교체할 수 있고 본체 코드는 손대지 않는다.
  • Policy Engine이 도구 호출 직전에 검증해, 새 도구 추가 시에도 정책 일관성이 유지된다.
  • Hook 플러그인이 trace 이벤트를 발행해 post-mortem 디버깅이 가능하다.
  • 실전 적용 시 한 가지(모델/도구/정책)부터 시작해 점진적으로 플러그인화하는 전략이 가장 안전하다.

📰 원본 출처 · https://news.hada.io/topic?id=32474 (#N=32474)

이 글은 GeekNews(긱뉴스)에 게제된 글을 기반으로 작성되었습니다. 원본의 라이선스와 저작권은 원작자에게 있습니다.