에이전트 버전 관리

브랜치, 버전 및 트래픽 배포를 사용해 에이전트 구성을 안전하게 실험하세요

에이전트 버전 관리를 사용하면 프로덕션 설정을 위험에 노출하지 않고 에이전트의 다양한 구성을 실험할 수 있습니다. 격리된 브랜치를 만들고 변경 사항을 테스트하며, 트래픽 비율 배포를 통해 업데이트를 점진적으로 출시하세요.

A/B 테스트를 실행하고 싶으신가요? 실제 트래픽을 대상으로 에이전트 변경 사항을 테스트하는 권장 워크플로는 실험을 참고하세요.

개요

버전 관리 시스템은 다음을 제공합니다.

  • 언제든지 에이전트 구성의 변경 불가능한 스냅샷
  • 실제 운영 전 변경 사항을 테스트하기 위한 격리된 브랜치
  • 일정 비율의 사용자에게 변경 사항을 점진적으로 출시하기 위한 트래픽 분할
  • 모든 브랜치의 변경 사항을 다른 브랜치로 가져오는 병합
  • 최신 Main 브랜치 변경 사항을 브랜치로 가져오는 리베이스

에이전트에서 버전 관리를 활성화하면 비활성화할 수 없습니다. 기존 에이전트에서 버전 관리를 활성화하기 전에 이를 고려하세요.

핵심 개념

버전

버전은 특정 시점의 에이전트 구성에 대한 변경 불가능한 스냅샷입니다. 각 버전에는 고유 ID(형식: agtvrsn_xxxx)가 있으며 다음을 포함합니다.

  • conversation_config - 시스템 프롬프트, LLM 설정, 음성 구성, 도구, 지식 베이스
  • platform_settings - 평가, 위젯, 데이터 수집 및 안전 설정을 포함하는 버전 관리 대상 하위 집합
  • workflow - 노드와 엣지를 포함한 전체 워크플로 정의

버전 관리가 활성화된 에이전트에서 변경 사항을 저장하면 버전이 자동으로 생성됩니다. 생성된 버전은 수정할 수 없습니다.

브랜치

브랜치는 git 브랜치와 유사한 이름이 지정된 개발 라인입니다. Main 브랜치에 다시 병합하기 전에 변경 사항을 격리된 환경에서 작업할 수 있습니다.

  • 모든 버전 관리 에이전트에는 삭제하거나 아카이브할 수 없는 Main 브랜치가 있습니다
  • Main뿐 아니라 기존 브랜치의 모든 버전에서 추가 브랜치를 만들 수 있습니다
  • 브랜치는 다른 모든 브랜치에 병합할 수 있으며, Main이 아닌 브랜치는 Main에 리베이스하여 최신 변경 사항을 가져올 수 있습니다
  • 각 브랜치에는 id(agtbrch_xxxx), 이름, 설명 및 버전 목록이 있습니다
  • 브랜치 이름에는 문자, 숫자 및 () [] {} - / .를 사용할 수 있습니다(최대 140자)

트래픽 배포

트래픽을 비율별로 여러 브랜치에 분할하여 점진적 출시와 A/B 테스트를 지원합니다.

  • 비율의 합계는 항상 정확히 100% 여야 합니다
  • 트래픽 라우팅은 대화 ID를 기준으로 결정론적으로 수행됩니다(동일한 사용자는 항상 동일한 브랜치로 라우팅됨)
  • 트래픽이 0%인 아카이브되지 않은 브랜치만 아카이브할 수 있습니다

초안

저장되지 않은 변경 사항은 초안으로 저장되므로 즉시 새 버전을 만들지 않고도 변경 사항을 작업할 수 있습니다.

  • 초안은 사용자별, 브랜치별로 관리됩니다(각 팀원은 자신만의 초안을 가짐)
  • 새 버전이 커밋되면 초안은 자동으로 삭제됩니다
  • 브랜치에 병합할 때도 초안이 삭제됩니다

버전 관리 활성화

버전 관리는 옵트인 방식이며 명시적으로 활성화해야 합니다. 새 에이전트를 만들 때 또는 기존 에이전트에서 활성화할 수 있습니다.

버전 관리를 활성화하면 비활성화할 수 없습니다. 이는 에이전트에 적용되는 영구적인 변경 사항입니다.

에이전트 생성 시 활성화

대시보드에서 에이전트를 열고 설정으로 이동한 다음 버전 관리를 활성화합니다. 활성화하면 브랜치, 초안, 버전 및 트래픽 배포를 관리할 수 있는 버전 관리 탭을 사용할 수 있습니다.

기존 에이전트에서 활성화

대시보드에서 에이전트를 열고 설정으로 이동한 다음 버전 관리를 켭니다.

버전 관리를 활성화하면 현재 에이전트 구성을 포함하는 첫 번째 버전과 함께 초기 “Main” 브랜치가 생성됩니다.

브랜치 작업

브랜치 만들기

브랜치는 Main뿐 아니라 모든 브랜치의 모든 버전에서 만들 수 있습니다. 새 브랜치의 초기 버전에 적용할 구성 변경 사항을 선택적으로 포함할 수 있습니다.

branch = client.conversational_ai.agents.branches.create(
agent_id="agent_7101k5zvyjhmfg983brhmhkd98n6",
parent_version_id="agtvrsn_xxxx",
name="experiment-v2",
description="Testing new prompt and voice settings"
)
print(f"Created branch: {branch.created_branch_id}")
print(f"Initial version: {branch.created_version_id}")

브랜치 목록 보기

branches = client.conversational_ai.agents.branches.list(
agent_id="agent_7101k5zvyjhmfg983brhmhkd98n6"
)
for branch in branches.branches:
print(f"{branch.name}: {branch.id}")

브랜치 세부 정보 가져오기

branch = client.conversational_ai.agents.branches.get(
agent_id="agent_7101k5zvyjhmfg983brhmhkd98n6",
branch_id="agtbrch_xxxx"
)
print(f"Branch: {branch.name}")
print(f"Versions: {len(branch.versions)}")

변경 사항 커밋

버전 관리가 활성화된 에이전트를 업데이트할 때 branch_id를 지정하여 해당 브랜치에 새 버전을 만듭니다.

에이전트의 버전 관리 탭을 열고 대상 브랜치로 전환한 다음, 구성을 편집하고 저장하여 새 버전을 만듭니다.

지정된 브랜치에 새 버전이 자동으로 생성되며, 해당 브랜치에서 해당 사용자가 보유한 기존 초안은 삭제됩니다.

트래픽 배포

배포 엔드포인트를 사용하여 브랜치 간에 트래픽을 분산합니다. 이를 통해 점진적 출시와 A/B 테스트를 수행할 수 있습니다.

deployment = client.conversational_ai.agents.deployments.create(
agent_id="agent_7101k5zvyjhmfg983brhmhkd98n6",
deployments=[
{"branch_id": "agtbrch_main", "percentage": 90},
{"branch_id": "agtbrch_xxxx", "percentage": 10}
]
)
모든 비율의 합계는 정확히 100%여야 합니다. 그렇지 않으면 배포가 실패합니다.

트래픽 라우팅은 대화 ID를 기준으로 결정론적으로 수행되므로, 동일한 사용자는 세션 전반에서 일관되게 동일한 브랜치에 연결됩니다.

브랜치 병합

브랜치의 변경 사항에 만족하면 다른 브랜치에 병합하세요. 아카이브되지 않은 브랜치는 main뿐 아니라 다른 모든 아카이브되지 않은 브랜치에 병합할 수 있습니다.

병합 전에 브랜치의 변경 사항을 검토하거나 쓰기 권한이 없는 브랜치에 접근해야 하는 경우, 직접 병합하는 대신 병합 제안을 여세요.

merge = client.conversational_ai.agents.branches.merge(
agent_id="agent_7101k5zvyjhmfg983brhmhkd98n6",
source_branch_id="agtbrch_xxxx",
target_branch_id="agtbrch_main",
archive_source_branch=True, # Default: true
force=False # Default: false
)

병합 시:

  • 소스 브랜치의 구성을 적용한 새 버전이 대상 브랜치에 생성됩니다.
  • 선택적으로 소스 브랜치를 아카이브합니다(기본 동작).
  • 트래픽이 소스 브랜치에서 대상 브랜치로 자동 전송됩니다.

소스 브랜치가 대상 브랜치에서 생성되었고(대상 브랜치 이후의 새 커밋이 없는 경우)에는 no_new_changes_to_merge로 병합에 실패하며, 이미 해당 대상으로 병합된 경우에는 branch_already_merged로 실패합니다.

병합 충돌 해결

분기된 이후 소스 브랜치와 대상 브랜치 모두에서 설정이 변경된 경우, 기본적으로 더 최근에 업데이트된 브랜치의 값이 유지됩니다. 타임스탬프와 관계없이 항상 소스 브랜치의 값을 사용하려면 force=True를 설정하세요.

병합을 확정하기 전에 재정의될 필드를 포함한 병합 결과를 미리 확인하세요.

preview = client.conversational_ai.agents.branches.preview_merge(
agent_id="agent_7101k5zvyjhmfg983brhmhkd98n6",
source_branch_id="agtbrch_xxxx",
target_branch_id="agtbrch_main",
force=False
)
print(preview.overridden_fields)
print(preview.conflicts)

브랜치를 main에 리베이스하기

리베이스는 git rebase와 유사하게 main 브랜치의 최신 변경 사항을 다른 브랜치로 가져옵니다. 이를 통해 브랜치 자체의 변경 사항을 아직 다시 병합하지 않고도 장기간 유지되는 브랜치를 main과 최신 상태로 유지할 수 있습니다.

client.conversational_ai.agents.branches.rebase(
agent_id="agent_7101k5zvyjhmfg983brhmhkd98n6",
branch_id="agtbrch_xxxx"
)

리베이스 시:

  • main의 최신 변경 사항을 반영한 새 버전이 브랜치에 생성됩니다.
  • 브랜치 자체의 변경 사항이 유지됩니다. 브랜치와 main 모두에서 설정이 수정된 경우 항상 브랜치의 값이 유지됩니다.
  • 브랜치에 main의 모든 변경 사항이 이미 포함되어 있으면 branch_already_up_to_date로 실패합니다.

main이 아닌 브랜치만 main에 리베이스할 수 있습니다. main 브랜치 자체를 리베이스하면 cannot_rebase_main 오류가 반환됩니다.

리베이스를 확정하기 전에 결과를 미리 확인하세요.

preview = client.conversational_ai.agents.branches.preview_rebase(
agent_id="agent_7101k5zvyjhmfg983brhmhkd98n6",
branch_id="agtbrch_xxxx"
)
print(preview.overridden_fields)

브랜치 아카이브

더 이상 필요하지 않은 브랜치를 아카이브하세요. 브랜치 목록을 정리하는 데 도움이 됩니다.

client.conversational_ai.agents.branches.update(
agent_id="agent_7101k5zvyjhmfg983brhmhkd98n6",
branch_id="agtbrch_xxxx",
archived=True
)

트래픽이 할당된 브랜치는 아카이브할 수 없습니다. 아카이브하기 전에 모든 트래픽을 제거하세요.

archived=False를 설정하면 아카이브된 브랜치를 복원할 수 있습니다.

특정 버전 가져오기

특정 버전 또는 브랜치 팁의 에이전트를 가져올 수 있습니다.

특정 버전의 에이전트 가져오기

agent = client.conversational_ai.agents.get(
agent_id="agent_7101k5zvyjhmfg983brhmhkd98n6",
version_id="agtvrsn_xxxx"
)

브랜치 팁의 에이전트 가져오기

agent = client.conversational_ai.agents.get(
agent_id="agent_7101k5zvyjhmfg983brhmhkd98n6",
branch_id="agtbrch_xxxx"
)

초안 변경 사항 포함

agent = client.conversational_ai.agents.get(
agent_id="agent_7101k5zvyjhmfg983brhmhkd98n6",
branch_id="agtbrch_xxxx",
include_draft=True
)

설정 레퍼런스

버전별 설정

다음 설정은 버전과 브랜치마다 다를 수 있습니다.

카테고리설정
대화 구성시스템 프롬프트, 에이전트 개성, LLM 선택 및 파라미터, 음성 설정(TTS 모델, 음성 ID), 도구 구성, 지식 베이스, 첫 메시지, 언어 설정, 턴 감지, 인터럽트 설정
버전별 플랫폼 설정evaluation - 평가 기준, widget - 위젯 모양 및 동작, data_collection - 구조화된 데이터 추출, overrides - 대화 시작 재정의, workspace_overrides - 웹훅 구성, testing - 테스트 구성, safety - 가드레일(IVC/non-IVC 설정)
워크플로전체 워크플로 정의(노드 및 엣지)

에이전트별 설정

다음 설정은 모든 버전에서 공유됩니다.

설정설명
name, tags에이전트 이름 및 태그(main 브랜치에 커밋할 때만 업데이트됨)
auth인증 설정 및 허용 목록
call_limits동시성 및 일일 한도
privacy보존 설정 및 무보존 모드
ban차단 상태(관리자 전용)

main이 아닌 브랜치에서 변경한 이름과 태그는 main에 병합되기 전까지 에이전트에 유지되지 않습니다.

모범 사례

1

브랜치를 만들기 전에 테스트 생성

새 브랜치를 만들기 전에 예상 동작을 포착하는 자동화된 테스트를 설정하세요. 이렇게 하면 기준선을 마련하고 실험을 반복하는 동안 회귀를 조기에 발견하는 데 도움이 됩니다.

2

설명적인 브랜치 이름 사용

실험의 목적을 명확하게 전달하는 브랜치 이름을 선택하세요. 쉽게 참조할 수 있도록 기능 이름, 가설 또는 티켓 번호를 포함하세요(예: feature/new-greeting-flow 또는 experiment/shorter-responses).

3

브랜치 목적 문서화

브랜치 설명 필드를 사용해 테스트 중인 가설, 성공을 정의하는 지표, 종속성 또는 고려 사항을 설명하세요. 이를 통해 팀원이 진행 중인 실험을 이해할 수 있습니다.

4

진행 중인 작업에는 초안 사용

변경 사항을 반복하는 동안 자주 초안을 저장하세요. 불필요한 버전을 만들지 않고 작업 내용을 보존할 수 있습니다. 테스트하거나 배포할 준비가 되었을 때만 커밋하세요.

5

작은 트래픽 비율로 시작

새 브랜치를 배포할 때는 트래픽의 5~10%로 시작하세요. 문제가 발생할 경우 노출을 제한하면서도 의미 있는 데이터를 확보할 수 있습니다.

6

트래픽을 늘리기 전에 핵심 지표 모니터링

분석 대시보드를 사용해 브랜치 성능을 비교하세요. 통화 완료율, 평균 대화 시간, 성공 평가 점수, 도구 실행률을 확인하세요. 지표가 main 브랜치의 기준선에 도달하거나 이를 초과할 때만 트래픽을 늘리세요.

7

점진적으로 트래픽 증가

신뢰도가 높아짐에 따라 단계적으로 트래픽을 확장하세요(10% → 25% → 50% → 100%). 이 방식은 각 단계에서 성능을 검증하면서 위험을 최소화합니다.

8

브랜치를 오래 유지하지 않기

구성 드리프트를 방지하려면 성공한 실험을 즉시 병합하세요. 더 오래 열어 두어야 하는 브랜치는 main에 주기적으로 리베이스하여 너무 멀리 벗어나 병합이 어려워지지 않도록 하세요.

다음 단계