GitLab Duo Chat

GitLab Duo Chat은 사용자들이 아이디어를 구상하고 생성 작업을 수행하는 데 AI를 지원하고, 전체 소프트웨어 개발 생명 주기(SDLC) 전반에 걸쳐 학습 작업을 더 빠르고 효율적으로 할 수 있도록 돕습니다.

ChatGitLab Duo 제공의 일부입니다.

Chat은 다양한 질문에 답하고 특정 작업을 수행할 수 있습니다. 이는 promptstools의 도움으로 이루어집니다.

사용자가 Chat 인터페이스에서 질문을 할 때, GitLab은 GraphQL request를 Rails 백엔드로 보냅니다. 그러면 Rails 백엔드는 AI Gateway를 통해 대형 언어 모델(LLM)에게 지시를 보냅니다.

어떤 사용 사례가 Chat에 기여하기에 가장 적합합니까?

우리는 대형 언어 모델(LLM)을 기반으로 한 사용자AI 간의 대화형 상호 작용에서 이점을 얻을 수 있는 모든 사용 사례와 워크플로우를 위해 Chat을 활용하고자 합니다. 일반적으로 이러한 경우는 다음과 같습니다:

  • 생성과 아이디어 작업과 학습 작업은 단발성 상호 작용보다 반복을 통해 더 효과적이고 효율적으로 해결됩니다.

  • 일반적으로 단발성 상호 작용으로 해결 가능한 작업이지만, 다듬을 필요가 있거나 대화로 발전할 수 있는 작업입니다.

  • 후자의 경우에는 AI가 처음에는 잘못 이해할 수 있지만, 사용자가 AI에게 더 정확히 필요한 것을 말함으로써 쉽게 수정할 수 있는 작업이 포함됩니다. 예를 들어, “이 코드를 설명해줘”라는 질문은 대개 만족스러운 답변을 제공하지만, 때로는 사용자가 추가 질문을 할 수 있습니다.

  • 대화의 기록을 활용하면 사용자와 AI 모두 반복하지 않아도 되는 작업입니다.

Chat은 맥락을 인식하고 궁극적으로 사용자가 접근할 수 있는 GitLab의 모든 자원에 접근할 수 있도록 목표를 두고 있습니다. 초기에는 개별 문제 및 에픽의 콘텐츠와 GitLab 문서로 제한된 맥락이 있었지만, 이후 코드 선택 및 코드 파일과 같은 추가 맥락이 추가되었습니다. 현재는 취약성 맥락 및 파이프라인 작업 맥락을 기여하는 작업이 진행 중이며, 사용자가 이러한 맥락에 대해 질문할 수 있습니다.

DevSecOps 영역 전반에 걸쳐 맥락 인식을 확장하고 생성, 아이디어 및 학습 사용 사례를 확장하기 위해 Duo Chat 팀은 다른 GitLab 팀과 넓은 커뮤니티로부터 Chat 플랫폼에 대한 기여를 환영합니다. 그들은 사용 사례 및 워크플로우의 전문가들입니다.

어떤 사용 사례가 독립형 AI 기능으로 구현하는 것이 더 나은가요?

어떤 사용 사례가 독립형 AI 기능으로 구현하는 것이 더 나은가요, 혹은 최소한 독립형 AI 기능으로도 구현할 수 있나요?

  • 기존의 워크플로우에 AI를 깊이 통합함으로써 가속화할 수 있는 협소하게 정의된 작업입니다.

  • AI와의 대화로부터 이점을 얻을 수 없었던 작업입니다.

이를 더 구체적으로 설명하면 다음과 같은 예가 있습니다.

변경 사항을 기반으로 커밋 메시지를 생성하는 것은 커밋 메시지 작성 워크플로우에 가장 잘 구현됩니다.

  • AI 없이 커밋 메시지 작성을 하려면 10초가 걸릴 수 있습니다.

  • IDE의 Commit message 필드에 AI가 생성한 커밋 메시지를 자동으로 채우면, 이 작업은 1초로 단축됩니다.

커밋 메시지 작성을 위해 Chat을 사용하는 것은 아마도 스스로 메시지를 작성하는 것보다 더 오랜 시간이 걸릴 것입니다. 사용자는 Chat 창으로 전환하여 요청을 타이핑해야 하고, 그런 다음 결과를 커밋 메시지 필드에 복사해야 합니다.

그렇다고 해서 Chat이 커밋 메시지를 작성할 수 없다는 뜻은 아닙니다. Chat이 커밋 맥락(이는 커밋 메시지 작성을 위한 이유 외에도 추가될 수 있음)을 가지고 있다면, 사용자는 이 커밋 내용으로 무엇이든 요청할 수 있습니다, 커밋 메시지 작성을 포함해. 하지만 사용자는 시간을 잃을 수 있기 때문에 Chat을 통해 그렇게 할 가능성이 낮습니다. 참고: 결과적인 커밋 메시지는 사용자가 작성한 프롬프트와 목적에 맞게 생성된 정적 프롬프트로부터 Chat에서 생성된 경우 다를 수 있습니다.

GitLab Duo Chat 설정

로컬에서 Duo Chat을 설정하려면 AI 기능에 대한 일반 설정 지침을 확인하세요.

GitLab Duo Chat 사용하기

프롬프트는 GitLab Duo Chat 시스템에서 가장 중요한 부분입니다. 프롬프트는 특정 작업을 수행하기 위해 LLM에 전송되는 지침입니다.

프롬프트의 상태는 몇 주의 반복 결과입니다. 현재 도구에서 프롬프트를 변경하려면 기능 플래그 뒤에 두어야 합니다.

새롭거나 업데이트된 프롬프트가 있는 경우, Duo Chat 팀의 구성원에게 검토를 요청하세요, 그들은 이와 관련된 경험이 많습니다.

문제 해결

로컬에서 Chat 작업을 수행할 때 오류가 발생할 수 있습니다. 가장 일반적인 문제는 이 섹션에 문서화되어 있습니다. 문서화되지 않은 문제를 발견하면 해결 방법을 찾은 후 이 섹션에 문서화해야 합니다.

문제 해결책
GitLab UI에 채팅 버튼이 없습니다. 사용자가 프리미엄 또는 얼티밋 라이센스가 있는 그룹에 속하고 Chat이 활성화되어 있는지 확인하세요.
Chat이 “Forbidden by auth provider” 오류로 응답합니다. 백엔드가 LLM에 접근할 수 없습니다. AI Gateway가 올바르게 설정되어 있는지 확인하세요.
요청이 UI에 표시되는 데 너무 오래 걸립니다. gdk restart rails-background-jobs를 실행하여 Sidekiq를 재시작하세요. 그것이 효과가 없으면 gdk killgdk start를 시도하세요. 또는, Sidekiq를 완전히 우회할 수 있습니다. 이를 위해 Llm::CompletionWorker.perform_async 문을 Llm::CompletionWorker.perform_inline로 일시적으로 변경하세요.
GDK가 비SaaS 모드에서 실행 중일 때 GitLab UI에 채팅 버튼이 없습니다. 클라우드 커넥터 액세스 토큰 기록 또는 지정된 좌석이 없습니다. 클라우드 커넥터 액세스 기록을 생성하려면, Rails 콘솔에서 다음 코드를 입력하세요: CloudConnector::Access.new(data: { available_services: [{ name: "duo_chat", serviceStartTime: ":date_in_the_future" }] }).save.

문제 해결을 지원하기 위해 Chat이 전송하는 코드에 대해 읽을 수 있는 오류 코드 섹션도 확인하세요.

GitLab Duo Chat에 기여하기

코드 관점에서 Chat은 다른 AI 기능과 유사한 방식으로 구현됩니다. GitLab의 AI Abstraction layer에 대해 자세히 읽어보세요.

Chat 기능은 시스템 프롬프트를 포함하는 zero-shot agent를 사용하여, 거기에는 대형 언어 모델이 질문을 어떻게 해석하고 답변을 제공해야 하는지에 대한 설명이 포함되어 있습니다. 시스템 프롬프트는 사용자가 질문에 대한 답변을 수집하는 데 사용할 수 있는 도구를 정의합니다.

zero-shot agent는 사용자의 질문을 받고, 이를 답변하기 위해 어떤 도구를 사용할지를 결정합니다. 그런 다음 대형 언어 모델에 요청을 하여, 직접 답변할 수 있는지, 아니면 정의된 도구 중 하나를 사용해야 하는지를 결정합니다.

각 도구에는 정보를 수집하기 위해 그 도구를 사용하는 방법에 대한 지침을 제공하는 자체 프롬프트가 있습니다. 도구는 자급자족할 수 있도록 설계되어 있으며, 대형 언어 모델과의 여러 요청을 피합니다.

도구가 필요한 정보를 수집한 후, 그것은 zero-shot agent에 반환되며, 사용자의 질문에 대한 최종 답변을 제공하기에 충분한 정보가 수집되었는지 대형 언어 모델에 질문합니다.

GitLab Duo Chat와의 상호작용 사용자화

사용자는 여러 가지 방법으로 GitLab Duo Chat와의 상호작용을 사용자화할 수 있습니다.

프로그래밍적으로 GitLab Duo Chat 열기

사용자에게 GitLab Duo Chat에 접근하는 보다 동적인 방법을 제공하기 위해, 응용 프로그램에 기능을 직접 통합하여 GitLab Duo Chat 인터페이스를 열 수 있습니다. 아래 예시는 이벤트 리스너와 GitLab Duo Chat의 글로벌 상태를 사용하여 GitLab Duo Chat 드로어를 여는 방법을 보여줍니다:

import { duoChatGlobalState } from '~/super_sidebar/constants';
myFancyToggleToOpenChat.addEventListener('click', () => {
  duoChatGlobalState.isShown = true;
});

미리 정의된 프롬프트로 GitLab Duo Chat 시작하기

일부 상황에서는 사용자에게 GitLab Duo Chat을 열 때 특정 주제나 쿼리에 더욱 집중하도록 유도할 수 있습니다. DuoChat 드로어를 열고 DuoChat이 실행할 명령을 큐에 전송하는 유틸리티 함수가 있습니다. 이는 로딩 상태를 트리거하고 주어진 프롬프트로 스트리밍합니다.

import { sendDuoChatCommand } from 'ee/ai/utils';
[...]

methods: {
  openChatWithPrompt() {
    sendDuoChatCommand(
      {
        question: '/feedback' // 이것이 당신의 프롬프트입니다.
        resourceId: 'gid:://gitlab/WorkItem/1', // 스트리밍을 위한 작업을 식별하는 고유 ID
        variables: {} // 쿼리를 실행할 때 ee/app/assets/javascripts/ai/graphql/chat.mutation.graphql에 전달할 추가 graphql 변수
      }
    )
  }
}

sendDuoChatCommand는 체인할 수 없음을 유의하십시오. 즉, 하나의 명령을 DuoChat에 전송하고 해당 작업이 완료될 때까지 기다려야 합니다. 그 후에 다른 명령을 전송해야 하고, 그렇지 않으면 이전 명령이 예상대로 작동하지 않을 수 있습니다.

이 개선은 GitLab Duo Chat 내 대화를 미리 정의된 관심 영역이나 문제로 유도함으로써 보다 맞춤화된 사용자 경험을 가능하게 합니다.

새로운 도구 추가하기

새로운 도구를 추가하려면 AI Gateway와 Rails Monolith에 모두 변경 사항을 추가해야 합니다. 주요 채팅 프롬프트는 AI Gateway에 저장되고 구성됩니다. Rails 측은 프롬프트의 필요한 매개변수를 구성하고 이를 AI Gateway에 전송하는 역할을 맡고 있습니다. AI Gateway는 채팅 프롬프트를 구성하고 사용자 기반의 구독 및 애드온에 따라 사용 가능한 채팅 도구를 선택하는 책임이 있습니다.

LLM이 사용할 도구를 선택할 때, 해당 도구는 Rails 측에서 실행됩니다. 도구는 AI Gateway에 요청을 보내기 위해 다른 엔드포인트를 사용합니다. 새로운 도구를 추가할 때는 AI Gateway가 서로 다른 버전을 가진 다양한 클라이언트와 GitLab 응용 프로그램과 작동한다는 점을 유의해 주십시오. 즉, GitLab의 이전 버전은 새로운 도구에 대한 정보를 알 수 없으며, 새로운 도구를 추가하려면 Duo Chat 팀에 문의하십시오. 이 문제에 대한 장기 솔루션을 작업 중입니다. 문제.

AI Gateway 변경 사항

  1. ai_gateway/chat/tools/gitlab.py에 도구에 대한 새로운 클래스를 생성하십시오. 이 클래스는 다음 속성을 포함해야 합니다:

    • 도구의 name
    • 도구가 작동하는 GitLab resource
    • 도구가 하는 일의 description
    • 질문 및 원하는 대답의 example
  2. ai_gateway/chat/tools/gitlab.py의 도구 목록인 __all__ 리스트에 도구를 추가합니다.

  3. ai_gateway/chat/toolset.pyDuoChatToolsRegistry에 도구 클래스를 적절한 Unit Primitive와 함께 추가합니다.

  4. 변경 사항에 대한 테스트를 추가합니다.

Rails 모놀리스의 변경 사항

  1. ee/lib/gitlab/llm/chain/tools/ 폴더에 도구에 대한 파일을 생성하세요. issue_reader 또는 epic_reader와 같은 기존 도구를 템플릿으로 사용하세요.

  2. 도구에 대한 클래스를 작성하여 도구를 사용하여 정보를 수집하는 방법에 대한 큰 언어 모델에 대한 지침 - 이 도구가 사용하는 주요 프롬프트를 포함하세요.

  3. 큰 언어 모델의 응답을 파싱하고 이를 채팅 에이전트로 반환하는 코드를 도구에 구현하세요.

  4. 에이전트가 새 도구에 대해 알고 있도록 ee/lib/gitlab/llm/completions/chat.rb에서 tools 배열에 새 도구 이름을 추가하세요.

전체 테스트

실제 요청을 큰 언어 모델에 하는 RSpec 테스트를 사용하여 프롬프트를 테스트하고 반복하세요.

  • 프롬프트는 시행 착오가 필요하며, LLM을 활용할 때 비결정론적 특성은 놀라운 결과를 낳을 수 있습니다.

  • Anthropic은 프롬프트 작업에 대한 좋은 가이드를 제공합니다.

  • GitLab 가이드는 프롬프트 작업에 관한 것입니다.

예상되는 사항은 프롬프트 및 도구 설명을 통해 큰 언어 모델을 적절히 지시하고, 도구가 자급자족할 수 있도록 하며, 제로샷 에이전트에 응답을 반환하는 것입니다. 프롬프트에서 일정한 시행 착오를 거치면서 새로운 도구를 추가하면 채팅 기능의 성능이 확장될 수 있습니다.

이 주제를 다룬 짧은 영상을 확인할 수 있습니다.

디버깅

전체 요청에 대한 추가 통찰력을 모으기 위해 Gitlab::Llm::Logger 파일을 사용하여 로그를 디버깅하세요.

생산 환경의 기본 로깅 수준은 INFO이며, 개인 식별 정보를 포함할 수 있는 데이터를 로그에 기록하는 것은 금지되어 있습니다.

추상화 계층의 AI 요청에 대한 디버깅 메시지를 따르기 위해 다음을 사용할 수 있습니다:

export LLM_DEBUG=1
gdk start
tail -f log/llm.log

생산 환경에서의 디버깅

생산 환경에서의 디버깅 및 문제 해결과 관련된 모든 정보는 Duo Chat On-Call Runbook에 수집됩니다.

LangSmith를 통한 추적

추적은 LLM 애플리케이션의 동작을 이해하는 데 강력한 도구입니다.

LangSmith는 최고의 추적 기능을 제공하며, GitLab Duo Chat과 통합되어 있습니다. 추적은 다음과 같은 문제를 추적하는 데 도움을 줄 수 있습니다:

  • GitLab Duo Chat에 처음 와서 내부에서 어떤 일이 일어나는지 이해하고 싶습니다.
  • 예기치 않은 답변을 받았을 때 프로세스가 실패한 정확한 위치.
  • 지연의 병목 현상이 발생한 프로세스는 무엇인지.
  • 모호한 질문에 사용된 도구는 무엇인지.

LangSmith UI

추적은 대량의 데이터 세트에 대해 GitLab Duo Chat을 실행하는 평가에 특히 유용합니다.

LangSmith 통합은 프롬프트 라이브러리RSpec 테스트를 포함하여 모든 도구와 작동합니다.

LangSmith와의 추적 사용하기

note
추적은 개발 및 테스트 환경에서만 사용할 수 있습니다.
프로덕션 환경에서는 사용할 수 없습니다.
  1. LangSmith 사이트에 접속하여 계정을 생성합니다 (GitLab 조직에 추가될 수도 있습니다).

  2. API 키를 생성합니다 (API 키를 생성할 위치에 주의하세요 - 개인 네임스페이스 또는 GL 네임스페이스에서 생성할 수 있습니다).

  3. GDK에서 다음 환경 변수를 설정합니다. env.runit에 정의하거나 터미널에서 직접 export할 수 있습니다.

    export LANGCHAIN_TRACING_V2=true
    export LANGCHAIN_API_KEY='<your-api-key>'
    export LANGCHAIN_PROJECT='<your-project-name>'
    export LANGCHAIN_ENDPOINT='https://api.smith.langchain.com'
    export GITLAB_RAILS_RACK_TIMEOUT=180 # LangSmith를 사용하여 Prompt Library를 평가 도구로 사용하는 경우 Puma의 타임아웃을 연장합니다.
    

    프로젝트 이름은 LangSmith의 기존 프로젝트이거나 새로운 프로젝트입니다. 환경 변수에 새로운 이름을 입력하는 것으로 충분합니다 - 요청 중에 프로젝트가 생성됩니다.

  4. GDK를 재시작합니다.

  5. Chat에 질문을 합니다.

  6. LangSmith 페이지 > 프로젝트 > [프로젝트 이름]에서 프로젝트를 관찰합니다. ‘실행’ 탭에는 마지막 요청이 포함되어야 합니다.

GitLab Duo Chat 테스트

GitLab Duo Chat에서 사용자의 질문에 대한 답변의 성공은
각 도구의 툴체인과 프롬프트에 크게 의존하므로,
프롬프트나 도구의 사소한 변경이 일부 질문의 처리에 영향을 미치는 것은 흔한 일입니다.

툴체인에서의 변경이 기존 기능을 손상시키지 않도록
실제 LLM을 사용할 때 몇 가지 미리 정의된 질문에 대한 답변을 검증하기 위해 다음 RSpec 테스트를 사용할 수 있습니다:

  1. ee/spec/lib/gitlab/llm/completions/chat_real_requests_spec.rb
    이 테스트는 제로샷 에이전트가 Chat 질문 세트에 대해 올바른 도구를 선택하고 있는지 검증합니다. 도구 선택을 확인하지만 Chat 응답의 품질은 평가하지 않습니다.

  2. ee/spec/lib/gitlab/llm/chain/agents/zero_shot/qa_evaluation_spec.rb
    이 테스트는 질문과 Chat이 제공한 답변 및 컨텍스트를 최소 두 개의 다른 LLM에 전달하여 Chat 응답의 품질을 평가합니다. 이 평가는 문제 및 Epic에 대한 질문으로 제한됩니다. GitLab Duo Chat QA 평가 테스트에 대해 자세히 알아보세요.

GitLab Duo Chat 로직에 대해 변경 작업을 수행하고 있다면,
변경사항이 포함된 병합 요청에 대해 GitLab Duo Chat CI 작업을 반드시 실행하세요. 일부 CI 작업은 수동으로 트리거해야 합니다.

로컬에서 테스트하기

QA 평가 테스트를 로컬에서 실행하려면 다음 환경 변수를 내보내야 합니다:

ANTHROPIC_API_KEY='your-key' VERTEX_AI_PROJECT='your-project-id' REAL_AI_REQUEST=1 bundle exec rspec ee/spec/lib/gitlab/llm/completions/chat_real_requests_spec.rb

CI로 테스트하기

GitLab 프로젝트에 대한 다음 CI 작업은 real_ai_request로 태그가 지정된 테스트를 실행합니다:

  • rspec-ee unit gitlab-duo-chat-zeroshot:
    이 작업은 ee/spec/lib/gitlab/llm/completions/chat_real_requests_spec.rb를 실행합니다.
    이 작업은 수동으로 트리거되어야 하며 실패할 수 있습니다.

  • rspec-ee unit gitlab-duo-chat-qa:
    이 작업은 ee/spec/lib/gitlab/llm/chain/agents/zero_shot/qa_evaluation_spec.rb에서 QA 평가 테스트를 실행합니다.
    이 작업은 수동으로 트리거되어야 하며 실패할 수 있습니다.
    GitLab Duo Chat QA 평가 테스트에 대해 읽어보세요.

  • rspec-ee unit gitlab-duo-chat-qa-fast:
    이 작업은 ee/spec/lib/gitlab/llm/chain/agents/zero_shot/qa_evaluation_spec.rb에서 단일 QA 평가 테스트를 실행합니다.
    이 작업은 항상 실행되며 실패할 수 없습니다. QA 테스트가 실패할 가능성이 있지만, 빠르고 저렴하게 실행되어 QA 테스트 도우미의 회귀를 방지하는 데 기여합니다.

  • rspec-ee unit gitlab-duo pg14:
    이 작업은 시스템 오류 없이 GitLab Duo 기능이 작동하는지 확인하는 테스트를 실행합니다.
    이 작업은 항상 실행되며 실패할 수 없습니다.
    이 작업은 평가를 수행하지 않습니다. 기능의 품질은 QA 작업과 같은 다른 작업에서 테스트됩니다.

CI 작업을 위한 자격 증명 및 API 키 관리

rspecs를 실행하는 데 필요한 모든 API 키는 마스킹되어야 합니다.

예외는 GCP 자격 증명으로, 마스킹을 방지하는 문자가 포함되어 있습니다.

CI 작업은 MR 브랜치에서 실행되어야 하므로 GCP 자격 증명을 보호된 변수로 추가할 수 없으며 일반 CI 변수로 추가해야 합니다.

보안을 위해 GitLab 프로젝트의 CI에 추가된 GCP 자격 증명 및 관련 프로젝트는 프로덕션 인프라에 액세스할 수 없으며 샌드박스 되어야 합니다.

GitLab Duo Chat QA 평가 테스트

자연어 생성(NLG) 시스템인 GitLab Duo Chat의 평가는

많은 답변이 없는 질문과 모호함이 있는 빠르게 발전하는 분야입니다.

실용적인 작업 가정은 LLM이 명확한 질문과 맥락이 주어졌을 때 합리적인 답변을 생성할 수 있다는 것입니다.

이 가정을 바탕으로 LLM을 평가자로 사용하여 질문 샘플의 정확성을 판단하고

GitLab Duo Chat의 응답 전체 정확도를 추적하며 기능의 회귀를 감지하는 방법을 탐색하고 있습니다.

이 주제와 관련된 논의는

병합 요청

문제를 참조하세요.

현재 QA 평가 테스트는 다음 구성 요소로 이루어져 있습니다.

에픽 및 이슈 고정물

고정물은 GitLab이 소유한 프로젝트와 그룹의 공개 이슈 및 에픽의 복제본입니다.

샘플링 시 내부 메모는 제외되었습니다. 고정물은 정식 gitlab 저장소에 커밋되었습니다.

고정물을 생성하는 데 사용된 스니펫을 참조하세요.

RSpec 및 헬퍼

  1. RSpect 파일과 포함된 헬퍼는 질문과 함께 내부 인터페이스인 Chat 서비스를 호출합니다.

  2. Chat 서비스의 답변을 수집한 후,

    답변은 질문 및 맥락에 따라 답변의 정확성을 평가하는 LLM을 지시하는 “평가 프롬프트”에 주입됩니다.

    맥락은 단순히 각 질문에서 질문한 이슈 또는 에픽에 대한 JSON 직렬화입니다.

  3. 평가 프롬프트는 두 개의 LLM, Claude와 Vertex에 전송됩니다.

  4. LLM의 평가 응답은 JSON 파일로 저장됩니다.

  5. 각 질문에 대해 RSpec는 CORRECT 또는 INCORRECT를 정규 표현식으로 매칭합니다.

CI/CD 자동화를 통한 QA 평가 수집 및 추적

gitlab 프로젝트의 CI 구성은 RSpec를 실행하도록 설정되어 있으며,

평가 응답을 아티팩트로 수집하고 평가 수집 및 추적을 자동화하는 리포터 스크립트를 실행합니다.

rspec-ee unit gitlab-duo-chat-qa 작업이 병합 요청을 위한 파이프라인에서 실행될 때,

리포터 스크립트는 CI 아티팩트로 저장된 평가를 사용하여 Markdown 보고서를 생성하고 병합 요청의 노트로 게시합니다.

QA 테스트 결과를 시간에 따라 추적하고 비교하기 위해서는

master 브랜치에서 rspec-ee unit gitlab-duo-chat-qa를 수동으로 실행해야 합니다:

  1. 새 파이프라인 페이지를 방문하세요.

  2. master 브랜치에 대해 파이프라인을 실행하려면 “Run pipeline”을 선택하세요.

  3. 파이프라인이 처음 시작되면, “Test” 단계에서 rspec-ee unit gitlab-duo-chat-qa 작업은 사용할 수 없습니다. 몇 분간 다른 CI 작업이 실행되도록 기다린 후 이 작업을 수동으로 시작하려면 “Play” 아이콘을 선택하세요.

master에서 테스트가 실행될 때 리포터 스크립트는 생성된 보고서를 이슈로 게시하고

평가 아티팩트를 스니펫으로 저장하며

GitLab-org/ai-powered/ai-framework/qa-evaluation#1 내의 추적 문제를 업데이트합니다.

GitLab-org/ai-powered/ai-framework/qa-evaluation 프로젝트에서.

GitLab Duo Chat Self-managed End-to-End Tests

MRs에서는 엔드 투 엔드 테스트가 GitLab Linux 패키지의 인스턴스를 사용하여 셀프 관리 인스턴스의 Duo Chat 기능을 실행합니다.

이 인스턴스는 AI Gateway의 latest 버전과 통합되어 있습니다.

AI Gateway의 인스턴스는 모의 응답을 반환하도록 구성되어 있습니다.

이 테스트의 결과를 보려면 e2e:test-on-omnibus-ee 자식 파이프라인을 열고 ai-gateway 작업을 확인합니다.

ai-gateway 작업은 클라우드 라이센스를 활성화한 후 테스트 사용자에게 Duo Pro 좌석을 할당하고, 그 후에 테스트가 실행됩니다.

추가 정보는 GitLab QA 문서를 참조하십시오.

GraphQL Subscription

Chat을 위한 GraphQL Subscription은 사용자 중심으로 약간 다르게 작동합니다. 사용자는 여러 브라우저 탭에서 Chat을 열거나 IDE에서도 열 수 있습니다.

따라서 여러 클라이언트에게 메시지를 브로드캐스트하여 동기화 상태를 유지해야 합니다. aiAction 뮤테이션의 chat 액션은 다음과 같이 작동합니다.

  1. 모든 완전한 Chat 메시지(사용자 메시지 포함)는 식별자로서 userId, aiAction: "chat"와 함께 브로드캐스트됩니다.

  2. 스트리밍된 Chat 메시지의 청크는 식별자로서 뮤테이션의 clientSubscriptionId와 함께 브로드캐스트됩니다.

Vue 구성 요소의 GraphQL Subscription 예시:

  1. 완전한 Chat 메시지

    import aiResponseSubscription from 'ee/graphql_shared/subscriptions/ai_completion_response.subscription.graphql';
    [...]
    
    apollo: {
     $subscribe: {
       aiCompletionResponse: {
         query: aiResponseSubscription,
         variables() {
           return {
             userId, // 예를 들면 "gid://gitlab/User/1"
             aiAction: 'CHAT',
           };
         },
         result({ data }) {
           // handle data.aiCompletionResponse
         },
         error(err) {
           // handle error
         },
       },
     },
    
  2. 스트리밍된 Chat 메시지

    import aiResponseSubscription from 'ee/graphql_shared/subscriptions/ai_completion_response.subscription.graphql';
    [...]
    
    apollo: {
     $subscribe: {
       aiCompletionResponseStream: {
         query: aiResponseSubscription,
         variables() {
           return {
             aiAction: 'CHAT',
             userId, // 예를 들면 "gid://gitlab/User/1"
             clientSubscriptionId, // 각 메시지에 대해 무작위로 생성된 식별자
             htmlResponse: false, // 각 청크에서 HTML 처리를 우회하기 위해 중요
           };
         },
         result({ data }) {
           // handle data.aiCompletionResponse
         },
         error(err) {
           // handle error
         },
       },
     },
    

클라이언트 구독 ID는 각 요청마다 고유해야 한다는 점을 유념하세요.

클라이언트 구독 ID를 재사용하면 구독 응답에 여러 원치 않는 부작용을 일으킬 수 있습니다.

Duo Chat GraphQL queries

  1. GitLab Duo Chat 설정
  2. GraphQL 탐색기 방문.
  3. aiAction 뮤테이션을 실행합니다. 예시는 다음과 같습니다:

    mutation {
      aiAction(
        input: {
          chat: {
            resourceId: "gid://gitlab/User/1",
            content: "Hello"
          }
        }
      ){
        requestId
        errors
      }
    }
    
  4. 응답을 가져오기 위한 다음 쿼리를 실행합니다:

    query {
      aiMessages {
        nodes {
          requestId
          content
          role
          timestamp
          chunkId
          errors
        }
      }
    }
    

응답을 가져올 수 없는 경우, graphql_json.log, sidekiq_json.log, llm.log 또는 modelgateway_debug.log에 오류 정보가 포함되어 있는지 확인하세요.

GitLab Duo Chat을 생산 유사 환경에서 테스트하기

GitLab Duo Chat은 StagingStaging Ref GitLab 환경에서 활성화되어 있습니다.

현재 GitLab Duo Chat은 Premium 및 Ultimate 계층의 그룹 구성원만 사용할 수 있으므로, GitLab 팀 구성원으로서 변경 사항을 테스트하기에 Staging Ref가 더 쉬운 장소가 될 수 있습니다.

Staging Ref에서 인스턴스 관리자로 만들 수 있습니다

관리자로서 테스트를 위해 라이선스가 부여된 그룹을 쉽게 생성할 수 있습니다.

GitLab Duo Chat의 엔드 투 엔드 테스트 라이브 환경

Duo Chat의 엔드 투 엔드 테스트는 StagingProduction GitLab 환경에서 지속적으로 실행됩니다.

이 테스트는 예약된 파이프라인에서 실행되며 엔드 투 엔드 사용자 경험이 올바르게 작동하는지 확인합니다. 결과는 #e2e-run-staging#e2e-run-production Slack 채널에서 볼 수 있습니다. 파이프라인은 아래에서 찾을 수 있으며, #test-platform에서 접근을 요청할 수 있습니다:

제품 분석

기능 사용 방식을 더 잘 이해하기 위해 각 생산 사용자 입력 메시지는 LLM 및 Ruby를 사용하여 분석되며, 분석은 Snowplow 이벤트로 추적됩니다.

분석에는 최신 iglu 스키마에서 정의된 속성이 포함될 수 있습니다.

  • 가능한 모든 “category” 및 “detailed_category”는 여기에서 확인할 수 있습니다.
  • 다음은 아직 구현되지 않았습니다:
    • “is_proper_sentence”
  • 다음은 사용되지 않습니다:
    • “number_of_questions_in_history”
    • “length_of_questions_in_history”
    • “time_since_first_question”

대시보드는 수집된 데이터를 시각화하기 위해 생성될 수 있습니다.

access_duo_chat 정책 작동 방식

이 표는 access_duo_chat 정책이 다양한 맥락에서 true를 반환하기 위한 요구 사항을 설명합니다.

  GitLab.com 전용 또는 셀프 관리 모든 인스턴스
프로젝트나 그룹 외부의 사용자에 대해 (user.can?(:access_duo_chat)) 사용자는 duo_features_enabled 그룹 설정이 켜져 있는 최소한 하나의 Premium 또는 Ultimate 계층 그룹에 속해야 합니다 - 인스턴스는 Premium 또는 Ultimate 계층이어야 합니다
- 인스턴스는 duo_features_enabled 설정이 켜져 있어야 합니다
 
그룹 맥락의 사용자에 대해 (user.can?(:access_duo_chat, group)) - 사용자는 experiment_and_beta_features 그룹 설정이 켜져 있는 최소한 하나의 Premium 또는 Ultimate 계층 그룹에 속해야 합니다
- 그룹의 루트 조상 그룹은 Premium 또는 Ultimate 계층에 있어야 하며, 그룹은 duo_features_enabled 설정이 켜져 있어야 합니다
- 인스턴스는 Premium 또는 Ultimate 계층이어야 합니다
- 인스턴스는 duo_features_enabled 설정이 켜져 있어야 합니다
사용자는 그룹에 대해 최소한 읽기 권한이 있어야 합니다
프로젝트 맥락의 사용자에 대해 (user.can?(:access_duo_chat, project)) - 사용자는 Premium 또는 Ultimate 계층의 최소한 하나의 그룹에 속해야 하며, experiment_and_beta_features 그룹 설정이 켜져 있어야 합니다
- 프로젝트의 루트 조상 그룹은 Premium 또는 Ultimate 계층이어야 하며, 프로젝트는 duo_features_enabled 설정이 켜져 있어야 합니다
- 인스턴스는 Ultimate 계층이어야 합니다
- 인스턴스는 duo_features_enabled 설정이 켜져 있어야 합니다
사용자는 프로젝트에 대해 최소한 읽기 권한이 있어야 합니다

GitLab Duo Chat 프롬프트 실험 실행

병합되기 전에, GitLab Duo Chat을 위한 모든 프롬프트 또는 모델 변경 사항은 다음을 충족해야 합니다:

  1. 기능 플래그 뒤에 있어야 하며 또한
  2. 로컬에서 평가되어야 합니다.

필요한 로컬 평가의 유형은 변경 사항의 종류에 따라 달라집니다. GitLab Duo Chat에서 Prompt Library를 사용한 로컬 평가는 이슈 및 에픽에 대한 질문의 평균 올바름을 측정하는 효과적인 방법입니다.

다음의 Prompt Library 가이드를 따라 GitLab Duo Chat의 변경 사항을 로컬에서 평가하세요. 프롬프트 라이브러리 문서는 유일한 진실의 출처이며 최신 상태여야 합니다.

전체 설정을 다룬 비디오를 참조하세요 (internal link).

이슈 및 에픽 실험

평가 프레임워크를 사용하고 싶으시다면 (여기에 설명됨)를 보실 수 있습니다 here,

이 Rake 작업을 사용하여 필요한 그룹 및 프로젝트를 가져올 수 있습니다:

GITLAB_SIMULATE_SAAS=1 bundle exec 'rake gitlab:duo:setup_evaluation[<test-group-name>]'

우리는 하위 그룹을 가져오기 위해 그룹을 생성하는 데 필요한 “saas” 모드를 요구하는 Setup 클래스를 사용하기 때문에,

GITLAB_SIMULATE_SAAS=1을 설정해야 합니다. 이것은 가져오기를 성공적으로 완료하기 위한 것이며, 원하시면 GITLAB_SIMULATE_SAAS=0으로 다시 전환할 수 있습니다.

Chat 프롬프트 구성 방법

모든 Chat 요청은 GitLab GraphQL API로 해결됩니다. 그리고 현재 3rd 파티 LLM을 위한 프롬프트는 GitLab 코드베이스에 하드코딩되어 있습니다.

그러나 Chat 프롬프트를 변경하려면, 단일 파일에서 문자열을 찾는 것처럼 명확하지 않습니다. Chat 프롬프트 구성은 여러 단계에 걸쳐 이루어지기 때문에 따라가기가 어렵습니다. Chat 프롬프트를 구성하는 흐름은 다음과 같습니다:

  1. API 요청이 GraphQL AI Mutation에 이루어집니다; 요청에는 사용자 Chat 입력이 포함됩니다. (code)

  2. GraphQL 변형은 Llm::ExecuteMethodService#execute를 호출합니다. (code)

  3. Llm::ExecuteMethodService#executechat 메서드가 GraphQL API로 전송되었음을 확인하고 Llm::ChatService#execute를 호출합니다. (code)

  4. Llm::ChatService#executeschedule_completion_worker를 호출합니다. 이는 ChatService의 기초 클래스인 Llm::BaseService에 정의되어 있습니다. (code)

  5. schedule_completion_worker는 비동기적으로 작업을 대기열에 추가하는 Llm::CompletionWorker.perform_for를 호출합니다. (code)

  6. Llm::CompletionWorker#perform는 작업이 실행될 때 호출됩니다. 이는 사용자 입력과 기타 메시지 컨텍스트를 역직렬화하고 이를 Llm::Internal::CompletionService#execute에 전달합니다. (code)

  7. Llm::Internal::CompletionService#executeGitlab::Llm::CompletionsFactory#completion!를 호출하여 원래 GraphQL 요청에서 ai_action을 끌어오고 Gitlab::Llm::Completions::Chat의 새 인스턴스를 초기화한 후, 그 위에서 execute를 호출합니다. (code)

  8. Gitlab::Llm::Completions::Chat#executeGitlab::Llm::Chain::Agents::SingleActionExecutor를 호출합니다. (code)

  9. Gitlab::Llm::Chain::Agents::SingleActionExecutor#executeexecute_streamed_request를 호출하며, 이는 AiDependent concern에 정의된 request 메서드를 호출합니다. (code)

  10. SingleActionExecutor#prompt_options 메서드는 AI Gateway 요청을 위한 모든 프롬프트 매개변수를 조합합니다. (code)

  11. ai_requestLlm::Completions::Chat에 정의되어 있으며, AiGateway로 평가됩니다. (code)

  12. ai_request.requestLlm::Chain::Requests::AiGateway#request로 경로가 지정되며, 이는 ai_client.stream을 호출합니다. (code)

  13. ai_client.streamGitlab::Llm::AiGateway::Client#stream으로 경로가 지정되며, AI Gateway /v2/chat/agent 엔드포인트에 API 요청을 수행합니다. (code)

  14. AI Gateway는 요청을 수신합니다. (code)

  15. AI Gateway는 사용자에게 사용 가능한 도구 목록을 가져옵니다. (code)

  16. AI GW는 각 도구에 대한 정의를 가져옵니다. (code)

  17. 그리고 그것들은 Rails에서 오는 다른 프롬프트 매개변수와 함께 프롬프트 템플릿에 삽입됩니다. (code)

  18. AI Gateway는 LLM에 요청을 하고 Rails에 응답을 반환합니다. (code)

  19. 이제 우리는 AI Gateway에 첫 번째 요청을 수행했습니다. LLM이 첫 번째 요청에 대한 답변이 최종 답변이라고 말하면, 우리는 답변을 파싱합니다 그리고 그것을 스트리밍합니다 (code) 그리고 그것을 반환합니다 (code).

  20. 첫 번째 답변이 최종이 아니라면 첫 번째 LLM 요청의 “생각”과 “선택된 도구”가 파싱되고 관련 도구 클래스가 호출됩니다. (code)

  21. 도구 실행기 클래스는 또한 Concerns::AiDependent를 포함하며, chat 실행기가 사용하는 것과 유사한 포함된 request 메서드를 사용합니다. (example). request 메서드는 Llm::Completions::Chatcontext에 주입된 동일한 ai_request 인스턴스를 사용합니다. Chat의 경우, 이는 Gitlab::Llm::Chain::Requests::AiGateway입니다. 그래서 본질적으로 AI Gateway에 대한 동일한 요청이 조합되지만 첫 번째 요청과는 다른 prompt / PROMPT_TEMPLATE이 사용됩니다. (Example tool prompt template)

  22. 도구 응답이 최종이 아니라면 응답은 agent_scratchpad에 추가되고, SingleActionExecutor의 루프가 다시 시작되며 추가 컨텍스트를 요청에 추가합니다. 이는 최종 답변까지 최대 10회까지 반복됩니다.

GitLab Duo Chat 오류 코드 해석

GitLab Duo Chat에는 디버깅에 도움이 되는 지정된 의미를 가진 오류 코드가 있습니다.

모든 GitLab Duo Chat 오류 코드의 목록은 GitLab Duo Chat 문제 해결 문서를 참조하세요.

GitLab Duo Chat용 개발 시, 오류를 반환할 때 이러한 오류 코드를 포함하고 문서화하세요, 특히 사용자에게 표시되는 오류에 대해 그렇습니다.

오류 코드 형식

오류 코드는 다음 형식을 따릅니다: <Layer Identifier><Four-digit Series Number>.

예를 들어:

  • M1001: 모놀리트 계층에서의 네트워크 통신 오류.
  • G2005: AI 게이트웨이 계층에서의 데이터 포맷/처리 오류.
  • A3010: 서드파티 API에서의 인증 또는 데이터 접근 권한 오류.

오류 코드 레이어 식별자

코드 레이어
M 모놀리트
G AI 게이트웨이
A 서드파티 API

오류 시리즈

시리즈 유형
1000 네트워크 통신 오류
2000 데이터 포맷/처리 오류
3000 인증 및/또는 데이터 접근 권한 오류
4000 코드 실행 예외
5000 잘못된 구성 또는 잘못된 매개변수 오류
6000 의미론적 또는 추론 오류(모델이 이해하지 못하거나 환각 발생)