서드파티 통합 기반 AI 기능
GitLab v19.2GitLab Duo 기능은 AI 모델과 통합을 기반으로 합니다. 개발 환경에서 GitLab Duo 라이선스를 설정하는 자세한 방법은 로컬 개발을 위한 GitLab Duo 라이선스를 참조하세요. 처음부터 GDK 없는 컴퓨터에서 AI 개발이 완전히 준비된 상태까지의 모든 주요 단계 목록입니다.
GitLab Duo 기능은 AI 모델과 통합을 기반으로 합니다. 이 문서는 GitLab에서 AI 기능을 개발하는 방법에 대한 개요를 제공합니다.
개발 환경에서 GitLab Duo 라이선스를 설정하는 자세한 방법은 로컬 개발을 위한 GitLab Duo 라이선스를 참조하세요.
로컬 개발 환경 설정#
처음부터 GDK 없는 컴퓨터에서 AI 개발이 완전히 준비된 상태까지의 모든 주요 단계 목록입니다.
GDK 준비#
GitLab Development Kit 지침에 따라 로컬 개발 목적으로 GitLab Duo를 설정하세요. 이 지침은 로컬 환경에서 전제 조건을 충족하고 핵심 백엔드 구성 요소를 설정하는 방법을 설명합니다.
기존 GDK 업데이트#
이미 GDK가 설치되어 있는 경우에도, 올바른 환경 변수, NGINX, Anthropic 키 등을 갖춘 DAP를 설정하려면 반드시 GitLab Development Kit 지침을 참조해야 합니다.
gitlab:duo:setup 태스크 실행#
gitlab:duo:setup Rake 태스크를 실행하여 GitLab Duo 기능이 활성화된 테스트 그룹과 프로젝트를 시딩합니다.
이 태스크는 멱등성을 가지며 gitlab-duo 그룹이 이미 존재하면 재시딩을 건너뜁니다. 이 태스크에서 강제로 재시딩하려면 GITLAB_DUO_RESEED=1을 설정하세요.
사용되는 시드에 대한 자세한 내용은 개발 시드 파일을 참조하세요.
이를 통해 인스턴스 또는 그룹에 GitLab Duo 기능을 로컬에서 테스트하기 위한 올바른 라이선스, 설정, 기능 플래그가 있는지 확인합니다. 아래에 여러 옵션이 있습니다. 확실하지 않으면 옵션 1을 사용하세요.
이 스크립트를 실행하면 Duo Core 애드온이 항상 생성됩니다.
Rake 태스크는 GDK 루트 디렉터리가 아닌 GitLab Rails 루트 디렉터리(일반적으로 /path/to/gdk/gitlab)에서 실행해야 합니다.
- GitLab.com 모드
GITLAB_SIMULATE_SAAS=1 bundle exec 'rake gitlab:duo:setup'
이 명령은 다음을 수행합니다.
test라는 프로젝트를 포함하는 gitlab-duo라는 테스트 그룹 생성
-
그룹에 Ultimate 라이선스 적용
-
그룹에 GitLab Duo Enterprise 시트 설정
-
그룹에 대한 모든 기능 플래그 활성화
-
모든 사용 가능한 GitLab Duo 기능을 활성화하도록 그룹 설정 업데이트
또는, 그룹에 대해 GitLab Duo Pro 라이선스를 추가하려면(기능의 일부만 활성화됨) 다음을 실행할 수 있습니다.
GITLAB_SIMULATE_SAAS=1 bundle exec 'rake gitlab:duo:setup[duo_pro]'
Duo Core 기능만 테스트하려면 다음을 실행할 수 있습니다.
GITLAB_SIMULATE_SAAS=1 bundle exec 'rake gitlab:duo:setup[duo_core]'
- GitLab Self-Managed / Dedicated 모드
GITLAB_SIMULATE_SAAS=0 bundle exec 'rake gitlab:duo:setup'
이 명령은 다음을 수행합니다.
test라는 프로젝트를 포함하는 gitlab-duo라는 테스트 그룹 생성
-
인스턴스에 Ultimate 라이선스 적용
-
인스턴스에 GitLab Duo Enterprise 시트 설정
-
인스턴스에 대한 모든 기능 플래그 활성화
-
모든 사용 가능한 GitLab Duo 기능을 활성화하도록 인스턴스 설정 업데이트
또는, 인스턴스에 GitLab Duo Pro 애드온을 추가하려면(기능의 일부만 활성화됨) 다음을 실행할 수 있습니다.
GITLAB_SIMULATE_SAAS=0 bundle exec 'rake gitlab:duo:setup[duo_pro]'
Duo Core 기능만 테스트하려면 다음을 실행할 수 있습니다.
GITLAB_SIMULATE_SAAS=0 bundle exec 'rake gitlab:duo:setup[duo_core]'
스크립트가 오류 없이 완료되면 gitlab-duo/test로 이동하여 GitLab Duo Chat이 보이는지 확인하세요. Chat에 질문을 보내고 오류가 없는지 확인하세요.
문제 해결#
대부분의 경우, ai-services 스크립트를 실행하여 GDK 환경 변수를 재설정하는 것으로 발생한 오류를 수정하기에 충분할 수 있습니다.
오류 A9999가 발생하면 이는 포괄적인 오류입니다. 가장 흔한 원인은 AI Gateway 설치 지침에 설명된 대로 AI Gateway URL이 올바르게 설정되지 않은 경우입니다.
그렇지 않다면 make test로 gitlab-ai-gateway 리포지터리의 테스트가 통과하는지 확인하고 gdk tail gitlab-ai-gateway에서 오류가 반환되지 않는지 확인하세요.
A1003은 주로 권한과 관련된 오류로, Anthropic 토큰이 유효하지 않거나 누락되었거나 gcloud 설정이 잘못된 경우입니다.
Agentic Chat에서는 인증 오류가 발생하더라도 A1003 오류가 발생하지 않을 수 있습니다. gdk tail duo-workflow-service를 사용하여 워크플로 서비스가 문제 없이 실행되는지 확인하세요. 인증 오류가 발생하면 새 Anthropic 키를 발급받고 ai-setup 스크립트를 다시 실행해야 합니다.
로컬 개발 팁#
-
사용자 인터페이스에서 응답이 나타나는 데 너무 오래 걸리는 경우,
gdk restart rails-background-jobs를 실행하여 Sidekiq을 재시작하는 것을 고려하세요. 그래도 해결되지 않으면gdk kill후gdk start를 시도해 보세요. -
또는 Sidekiq을 완전히 우회하고 서비스를 동기적으로 실행하세요. 이는 GraphQL 오류가 Sidekiq 로그 대신 네트워크 인스펙터에서 확인 가능하게 되므로 디버깅 오류에 도움이 될 수 있습니다. 이를 위해
Llm::CompletionWorker클래스의perform_for메서드에서perform_async를perform_inline으로 임시 변경하세요. -
모델 선택을 테스트할 때,
env.runit파일에export FETCH_MODEL_SELECTION_DATA_FROM_LOCAL=1을 추가하면 GDK가 클라우드 연결 AIGW 대신 로컬 AI Gateway에서 모델 정보를 가져옵니다.
기능 개발 (추상화 레이어)#
기능 플래그#
모든 AI 기능 작업에 다음 기능 플래그를 적용하세요.
-
다른 모든 AI 기능에 적용되는 일반 플래그(
ai_global_switch). 기본적으로 활성화되어 있습니다. -
해당 기능에 특정한 플래그. 기능 플래그 이름은 라이선스 기능 이름과 달라야 합니다.
모든 기능 플래그 목록과 사용 방법은 기능 플래그 트래커 에픽을 참조하세요.
AI Gateway로 기능 플래그 푸시#
기능 플래그를 AI Gateway로 푸시할 수 있습니다. 이는 기능이 AI Gateway에 있더라도 사용자 대면 변경 사항을 점진적으로 롤아웃하는 데 유용합니다. 다음 예시를 참조하세요.
# Push a feature flag state to AI Gateway.
Gitlab::AiGateway.push_feature_flag(:new_prompt_template, user)
이후 AI Gateway에서 다음과 같은 방법으로 기능 플래그 상태를 사용할 수 있습니다.
from ai_gateway.feature_flags import is_feature_enabled
# Check if the feature flag "new_prompt_template" is enabled.
if is_feature_enabled('new_prompt_template'):
# Build a prompt from the new prompt template
else:
# Build a prompt from the old prompt template
중요: 정리 단계에서 GitLab-Rails 리포지터리의 플래그를 제거하기 전에 AI Gateway 리포지터리에서 기능 플래그를 제거하세요. GitLab-Rails 리포지터리에서 플래그를 먼저 정리하면, AI Gateway의 기능 플래그가 기본 상태인 비활성화 상태가 되어 예상치 못한 동작이 발생할 수 있습니다.
중요: AI Gateway에서 기능 플래그를 정리하면 GitLab.com, GitLab Self-Managed, GitLab Dedicated를 포함한 모든 GitLab 인스턴스에 즉시 변경 사항이 배포됩니다.
기술적 세부 사항:
활성화된 기능 플래그에서 push_feature_flag가 실행되면, 플래그 이름이 현재 컨텍스트에 캐시되고,
이후 GitLab-Sidekiq/Rails가 AI Gateway로 요청을 보낼 때 x-gitlab-enabled-feature-flags HTTP 헤더에 첨부됩니다.
프론트엔드 클라이언트(예: VS Code Extension 또는 LSP)가 직접 AI Gateway 통신을 위한 User JWT(UJWT)를 요청하면 GitLab은 다음을 반환합니다.
공개 헤더(x-gitlab-enabled-feature-flags 포함).
- 생성된 UJWT(1시간 만료).
프론트엔드 클라이언트는 만료 시 UJWT를 재생성해야 합니다. ChatOps를 통한 기능 플래그 업데이트와 같은 백엔드 변경 사항은 헤더 값이 오래된 상태가 됩니다. 이 헤더 값은 다음 UJWT 생성 시 갱신됩니다.
마찬가지로, 기능 플래그를 프론트엔드로 푸시하기 위한 push_frontend_feature_flag도 있습니다.
GraphQL API#
추상화 레이어를 사용하여 AI 공급자 API에 연결하려면, aiAction이라는 확장 가능한
GraphQL API를 사용하세요.
input은 키/값 쌍을 받으며, key는 수행해야 할 작업입니다. 뮤테이션 요청당 하나의 AI 작업만 허용합니다.
뮤테이션 예시:
mutation {
aiAction(input: {summarizeComments: {resourceId: "gid://gitlab/Issue/52"}}) {
clientMutationId
}
}
예를 들어, "코드 설명" 작업을 구축하고 싶다고 가정합니다. 이를 위해 input을 새 키인
explainCode로 확장합니다. 뮤테이션은 다음과 같습니다.
mutation {
aiAction(
input: {
explainCode: { resourceId: "gid://gitlab/MergeRequest/52", code: "foo() { console.log() }" }
}
) {
clientMutationId
}
}
GraphQL API는 Anthropic Client를 사용하여 응답을 전송합니다.
응답을 받는 방법#
AI 공급자에 대한 API 요청은 백그라운드 job에서 처리됩니다. 따라서 요청을 유지하지 않으며, 프론트엔드는 구독에서 응답을 요청과 매칭해야 합니다.
userId와 resourceId만 사용하면 요청에 대한 올바른 응답을 결정하는 데 문제가 생길 수 있습니다. 예를 들어, 두 AI 기능이 동일한 userId와 resourceId를 사용하면 두 구독이 서로의 응답을 받게 됩니다. 이 간섭을 방지하기 위해 clientSubscriptionId를 도입했습니다.
aiCompletionResponse 구독에서 응답을 매칭하려면 aiAction 뮤테이션에 clientSubscriptionId를 제공할 수 있습니다.
-
clientSubscriptionId는 다른 AI 기능과 간섭하지 않도록 기능별로, 그리고 페이지 내에서 고유해야 합니다.UUID사용을 권장합니다. -
clientSubscriptionId가aiAction뮤테이션의 일부로 제공된 경우에만aiCompletionResponse브로드캐스팅에 사용됩니다. -
clientSubscriptionId가 제공되지 않으면userId와resourceId만aiCompletionResponse에 사용됩니다.
코멘트 요약을 위한 뮤테이션 예시로, 뮤테이션의 일부로 randomId를 제공합니다.
mutation {
aiAction(
input: {
summarizeComments: { resourceId: "gid://gitlab/Issue/52" }
clientSubscriptionId: "randomId"
}
) {
clientMutationId
}
}
컴포넌트에서 userId, resourceId, clientSubscriptionId("randomId")를 사용하여 aiCompletionResponse를 구독합니다.
subscription aiCompletionResponse(
$userId: UserID
$resourceId: AiModelID
$clientSubscriptionId: String
) {
aiCompletionResponse(
userId: $userId
resourceId: $resourceId
clientSubscriptionId: $clientSubscriptionId
) {
content
errors
}
}
Chat에 대한 구독은 다르게 동작합니다.
동시 구독이 많이 발생하지 않도록, skip()을 사용하여 뮤테이션이 전송된 후에만 구독하세요.
다양한 ID 파라미터 설명#
aiAction 뮤테이션을 사용할 때 요청과 응답을 올바르게 라우팅하기 위해 여러 ID 파라미터가 사용됩니다. 각 파라미터의 역할은 다음과 같습니다.
- user_id (필수)
목적: 요청하는 사용자를 식별하고 인증
-
사용처: 권한 검사, 요청 귀속, 응답 라우팅
-
예시:
gid://gitlab/User/123 -
참고: 이 ID는 GraphQL API 프레임워크에 의해 자동으로 포함됨
-
client_subscription_id (스트리밍 또는 다중 기능에 권장)
특정 요청/응답 쌍을 추적하기 위한 클라이언트 생성 UUID
-
스트리밍 응답을 사용하거나 동일한 페이지에서 여러 AI 기능이 공유될 때 필요
-
예시:
"9f5dedb3-c58d-46e3-8197-73d653c71e69" -
스트리밍이 없는 단순하고 독립적인 요청에서는 생략 가능
-
resource_id (컨텍스트 의존 - 일부 기능에 필수)
목적: AI 작업의 컨텍스트를 제공하는 특정 GitLab 엔티티(프로젝트, 이슈, MR) 참조
-
사용처: 권한 검증 및 컨텍스트 정보 수집
-
실제 예시:
"gid://gitlab/Issue/164723626" -
참고: 일부 기능은 특정 리소스가 필요하지 않을 수 있음
-
project_id (컨텍스트 의존 - 일부 기능에 필수)
목적: AI 작업의 프로젝트 컨텍스트 식별
-
사용처: 프로젝트별 권한 검사 및 컨텍스트
-
실제 예시:
"gid://gitlab/Project/278964" -
참고: 일부 기능은 특정 프로젝트가 필요하지 않을 수 있음
현재 추상화 레이어 흐름#
다음 그래프는 VertexAI를 예시로 사용합니다. 다른 공급자를 사용할 수도 있습니다.
flowchart TD
A[GitLab frontend] -->B[AiAction GraphQL mutation]
B --> C[Llm::ExecuteMethodService]
C --> D[One of services, for example: Llm::GenerateSummaryService]
D -->|scheduled| E[AI worker:Llm::CompletionWorker]
E -->F[::Gitlab::Llm::Completions::Factory]
F -->G[::Gitlab::Llm::VertexAi::Completions::... class using ::Gitlab::Llm::Templates::... class]
G -->|calling| H[Gitlab::Llm::VertexAi::Client]
H --> |response| I[::Gitlab::Llm::GraphqlSubscriptionResponseService]
I --> J[GraphqlTriggers.ai_completion_response]
J --> K[::GitlabSchema.subscriptions.trigger]
다중 모델을 위한 기존 AI 구성 요소 재사용#
각 LLM에 대해 프롬프트, 입출력 파서, 도구/함수 호출 등의 AI 구성 요소를 최적화하려고 노력하지만, 모델별로 구성 요소를 분기하면 유지 관리 부담이 증가할 수 있습니다. 따라서 기능 품질이 저하되지 않는 한 기존 구성 요소를 여러 모델에서 재사용하는 것이 일반적으로 권장됩니다. 다음은 기본 지침입니다.
-
여러 모델에 대해 기존 프롬프트 템플릿을 반복 개선하세요. 특정 모델에서 품질 저하가 발생하지 않는 한 새로운 템플릿을 도입하지 마세요.
-
여러 모델에 대해 기존 입출력 파서와 도구/함수 호출을 반복 개선하세요. 특정 모델에서 품질 저하가 발생하지 않는 한 새로운 것을 도입하지 마세요.
-
특정 모델에서 품질 저하가 감지되면, 공유 구성 요소를 해당 모델용으로 분기해야 합니다.
이 경우의 예시는 Claude 특정 CoT 최적화가 품질 저하를 일으키지 않는 한 Mixtral과 같은 다른 모델에도 적용할 수 있다는 것입니다.
모니터링#
-
각 AI 작업에 대한 오류 비율 및 응답 지연 시간 apdex는 SLI Detail:
llm_completion아래의 Sidekiq 서비스 대시보드에서 확인할 수 있습니다. -
사용된 토큰, 각 AI 기능의 사용량 및 기타 통계는 Periscope 대시보드에서 확인할 수 있습니다.
보안#
인공지능(AI) 기능에 대한 보안 코딩 지침을 참조하세요.
도움말#
-
GitLab Duo Chat 작업을 위한 지침을 참조하세요.
-
GitLab Duo에 기초 채팅 에이전트를 추가하는 방법을 알아보세요.
-
GitLab Duo Agent Platform에 기초 플로우를 추가하는 방법을 알아보세요.