GitLab Duo Chat

GitLab Duo Chat는 사용자가 전반적인 소프트웨어 개발 주기(SDLC) 전반에 걸쳐 AI로 아이디어와 창작 작업, 학습 작업을 돕는 것을 목표로 합니다. 이렇게 하면 작업이 빨라지고 효율적으로 진행됩니다.

채팅GitLab Duo의 일부입니다.

채팅은 다양한 질문에 답변하고 특정 작업을 수행할 수 있습니다. 이는 프롬프트도구의 도움을 받아 수행됩니다.

채팅 인터페이스에서 사용자의 질문에 답변하기 위해 GitLab은 GraphQL 요청을 Rails 백엔드에 보냅니다. Rails 백엔드는 AI 게이트웨이를 통해 대규모 언어 모델 (LLM)에 지시를 보냅니다.

어떤 사용 사례가 채팅에 기여하기에 가장 적합한가요?

채팅을 사용자대규모 언어 모델 (LLM)에 의해 주도되는 AI 간의 대화적 상호 작용에서 이젠은 빠르고 더 효과적으로 적용할 수 있는 모든 사용 사례 및 작업에 적용할 계획입니다. 일반적으로 이러한 것들은 다음과 같습니다:

  • 창작 및 아이디어 작업과 학습 작업은 반복을 통해 효과적으로 더 효율적으로 해결되는 것이 일반적입니다.
  • 원 슛 인터랙션보다는 반복을 통해 보다 효과적으로 더 효율적으로 해결되는 작업들.
  • 후자에는 AI가 처음 시도했을 때 항상 올바르지 않을 수 있지만, 사용자가 더 정확하게 필요한 것을 알려 AI를 쉽게 수정할 수 있는 작업이 포함됩니다. 예를 들어, “이 코드를 설명해줘”는 대부분 만족스러운 답변을 얻겠지만, 사용자가 추가 질문을 할 수도 있습니다.
  • 대화의 내용이 이전 대화 내용에서 이득을 볼 수 있는 작업들입니다. 사용자나 AI가 자신들의 의견을 반복해서 얘기할 필요가 없습니다.

채팅은 컨텍스트 감지를 목표로 하며 궁극적으로 사용자가 액세스하는 GitLab의 모든 리소스에 액세스할 수 있습니다. 처음에는 이 컨텍스트가 개별 이슈 및 에픽의 내용, 그리고 GitLab 문서로 제한되었습니다. 그 이후로 코드 선택 및 코드 파일과 같은 추가 컨텍스트가 추가되었습니다. 현재는 취약점 컨텍스트 및 파이프라인 작업 컨텍스트도 추가 중이며, 사용자는 이러한 컨텍스트에 관한 질문을 할 수 있도록 할 계획입니다.

DevSecOps 도메인 전체에 걸쳐 컨텍스트 감지 및 따라서 창작, 아이디어 구상 및 학습 사용 사례를 확장하기 위해, Duo Chat 팀은 다른 GitLab 팀 및 보다 넓은 커뮤니티로부터의 Chat 플랫폼 기여를 환영합니다. 이들은 가속화하기 위한 사용 사례 및 워크플로의 전문가들입니다.

어떤 사용 사례가 독립적인 AI 기능으로 더 잘 구현됩니까?

어떤 사용 사례가 독립적인 AI 기능으로 더 잘 구현될 수 있는지, 또는 적어도 독립적인 AI 기능으로 구현될 수 있는지?

  • 기존 워크플로에 AI를 심층적으로 통합함으로써 가속화할 수 있는 범위가 좁은 작업.
  • AI와의 대화에서 이점을 얻을 수 없는 작업.

구체적으로 설명하기 위해 예를 들어보겠습니다.

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

  • AI가 없으면 커밋 메시지 작성에 10초가 걸립니다.
  • IDE의 커밋 메시지 필드에 AI가 생성한 메시지를 자동으로 채우면, 이 작업은 1초로 줄어듭니다.

커밋 메시지 작성에 채팅을 사용하면 메시지를 직접 작성하는 것보다 시간이 더 걸릴 수 있습니다. 사용자는 채팅 창으로 전환하고 요청을 입력한 다음 결과를 커밋 메시지 필드로 복사해야 합니다.

그렇다고 해서 채팅으로 커밋 메시지를 작성할 수 없거나 그렇게 못하게 하는 것은 아닙니다. 만일 채팅이 커밋 컨텍스트를 보유한다면 (어떤 이유에서든 커밋 메시지 작성 외에만 해당될 수 있음), 사용자는 이 커밋 내용과 관련하여 커밋 메시지를 작성하는 것을 포함하여 어떤 작업이든 요청할 수 있습니다. 하지만 사용자는 시간만 낭비할 뿐입니다. 참고: 사용자가 작성한 프롬프트로부터 정적으로 작성된 프롬프트 뒤에 커밋 메시지를 작성하는 것과 비교하여 채팅에서 생성된 커밋 메시지는 다를 수 있습니다.

GitLab Duo Chat 설정

로컬에서 Duo Chat를 설정하려면 AI 기능에 대한 일반 설정 지침을 따라주십시오.

GitLab Duo Chat 사용하기

프롬프트는 GitLab Duo Chat 시스템의 가장 중요한 부분입니다. 프롬프트는 LLM에게 특정 작업을 수행하도록 지시됩니다.

프롬프트의 상태는 주간 몇 주간의 반복을 통해 만들어졌습니다. 현재 도구 내의 프롬프트 중 하나를 변경하려면 꼭 피쳐 플래그 뒤에 두어야 합니다.

새로운 프롬프트나 업데이트된 프롬프트가 있다면, 이에 대한 중요한 경험이 있는 Duo Chat 팀 구성원에게 리뷰를 요청하십시오.

문제 해결

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

문제 해결 방법
GitLab UI에 채팅 버튼이 없음. 사용자가 프리미엄 또는 얼티메이트 라이선스가 있는 그룹의 일부이고 채팅이 활성화되어 있는지 확인하십시오.
Chat이 “인증 공급자에 의해 거부됨” 오류로 응답함. 백엔드가 LLM에 액세스할 수 없습니다. AI Gateway가 올바르게 설정되었는지 확인하십시오.
요청이 UI에 표시되기까지 시간이 너무 오래 걸림 Sidekiq를 재시작하여 gdk restart rails-background-jobs를 실행해보십시오. 이것이 작동하지 않으면 gdk kill을 시도한 후 gdk start를 해보십시오. 다른 방법으로는 Sidekiq를 완전히 지낼 수 있습니다. 일시적으로 Llm::CompletionWorker.perform_async 구문을 Llm::CompletionWorker.perform_inline로 변경합니다.
GDK가 비-SAAS 모드에서 실행 중일 때 GitLab UI에 채팅 버튼이 없음 클라우드 커넥터 액세스 토큰 레코드나 할당된 시트가 없습니다. 클라우드 커넥터 액세스 레코드를 생성하려면 레일즈 콘솔에서 다음 코드를 넣어주십시오: CloudConnector::Access.new(data: { available_services: [{ name: "duo_chat", serviceStartTime: ":date_in_the_future" }] }).save.

부디 Chat 오류 코드 섹션도 확인하십시오. 거기에서 Chat이 문제 해결을 돕기 위해 보내는 코드에 대해 자세히 읽을 수 있습니다.

GitLab Duo Chat 기여하기

코드 관점에서 채팅은 다른 AI 기능과 유사한 방식으로 구현됩니다. GitLab AI 추상화 레이어에 대해 자세히 읽어보세요.

채팅 기능은 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 시작

특정 주제나 쿼리로 사용자를 유도하고 싶을 때가 있습니다. 이때, sendDuoChatCommand를 사용하여 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의 오래된 버전이 새로운 도구에 대해 알지 못할 수 있으므로 새 도구를 추가하려면 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에 도구 클래스를 추가합니다.

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

Rails Monolith에서의 변경 사항

  1. ee/lib/gitlab/llm/chain/tools/ 폴더에 도구용 파일을 만듭니다. 기존의 도구인 issue_reader 또는 epic_reader와 같은 템플릿으로 사용합니다.

  2. 도구용 클래스를 작성하여 도구의 지시사항을 구현합니다. 이는 도구가 정보를 수집하는 방법을 큰 언어 모델에 지시하는 것입니다.

  3. 도구에서 큰 언어 모델의 응답을 구문 분석하고 chat agent에 반환하는 코드를 구현합니다.

  4. ee/lib/gitlab/llm/completions/chat.rbtools 배열에 새 도구 이름을 추가하여 agent가 해당 도구를 인지하도록 합니다.

모든 것의 테스트

실제로 큰 언어 모델에 요청을 보내는 RSpec 테스트를 사용하여 프롬프트를 테스트하고 반복합니다.

  • 프롬프트는 시행착오를 통해 필요합니다. LLM과 작업하는 비결정론적 성격은 놀라울 수 있습니다.
  • Anthropic은 프롬프트 조작에 대한 좋은 가이드를 제공합니다.
  • 프롬프트 작업에 대한 GitLab의 가이드를 참고하세요.

기억해야 할 중요한 점은 프롬프트를 통해 큰 언어 모델에 정확히 지시를 제공하고 도구 설명을 유지하며 도구들을 자립적으로 유지하고 응답을 zero-shot agent에 반환하는 것입니다. 프롬프트에 대해 시행착오를 통해 새로운 도구를 추가하면 채팅 기능의 기능을 확장할 수 있습니다.

이 주제를 다룬 짧은 동영상도 제공됩니다.

디버깅

더 많은 통찰을 얻기 위해 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 통합은 Prompt LibraryRSpec tests를 포함하여 모든 도구와 작동합니다.

LangSmith를 사용하여 추적하기

참고: 추적은 개발 및 테스트 환경에서만 사용할 수 있습니다. 프로덕션 환경에서는 사용할 수 없습니다.

  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 # 평가 도구로써의 Prompt Library를 사용하기 위해 puma 제한 시간을 연장합니다.
    

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

  4. GDK를 재시작합니다.
  5. 채팅에 질문을 하세요.
  6. LangSmith 페이지 > 프로젝트 > [프로젝트 이름]에서 요청의 ‘Runs’ 탭에 당신의 최신 요청이 들어있어야 합니다.

GitLab Duo Chat 테스트

GitLab Duo Chat에서 사용자 질문에 대한 답변의 성공은 주로 각 도구의 툴체인과 프롬프트에 따라 달라집니다. 그래서 가끔 프롬프트나 도구의 작은 변경도 일부 질문의 처리에 영향을 미칠 수 있습니다.

도구체인의 변경이 기존 기능을 손상시키지 않는지 확인하려면 실제 LLMs를 사용하여 미리 정의된 몇 가지 질문에 대한 답변을 유효성 검사하는 다음 RSpec 테스트를 사용할 수 있습니다:

  1. ee/spec/lib/gitlab/llm/completions/chat_real_requests_spec.rb 이 테스트는 0숏 에이전트가 질문 세트에 대해 올바른 도구를 선택하는지 확인합니다. 이는 도구 선택을 확인하지만 채팅 응답의 품질을 평가하지는 않습니다.
  2. ee/spec/lib/gitlab/llm/chain/agents/zero_shot/qa_evaluation_spec.rb 이 테스트는 질문과 함께 제공된 채팅 응답 및 컨텍스트를 적어도 두 개의 다른 LLM에 제공하여 채팅 응답의 품질을 평가합니다. 이 평가는 문제 및 에픽에 관한 질문에 대해서만 한정됩니다. GitLab Duo Chat QA Evaluation Test에 대해 자세히 알아보세요.

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 Evaluation Test에 대해 읽어보세요.

  • 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 키 관리

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

예외는 GCP 자격 증명이며, 마스킹을 방해하는 문자가 포함되어 있기 때문에 예외입니다. CI 작업이 MR 브랜치에서 실행되어야 하기 때문에 GCP 자격 증명은 보호된 변수로 추가할 수 없으며 일반 CI 변수로 추가해야 합니다. 보안상의 이유로, GitLab 프로젝트의 GCP 자격 증명 및 관련 프로젝트는 생산 인프라와 격리되어 있는 샌드박스에 액세스할 수 없어야 합니다.

GitLab Duo Chat QA 평가 테스트

GitLab Duo Chat와 같은 자연어 생성(NLG) 시스템의 평가는 아직 많은 미해결된 질문과 모호성이 있는 신속하게 발전하는 분야입니다.

실용적인 작업 가정은 LLM(Large Language Models)이 명확한 질문과 맥락이 주어지면 합리적인 답변을 생성할 수 있다는 것입니다. 이 가정에 따라, 우리는 LLM을 평가자로 사용하여 일부 질문의 정확성을 결정하고 GitLab Duo Chat의 응답의 전반적인 정확도를 추적하고 기능의 회귀를 감지합니다.

해당 주제와 관련된 토론은 병합 요청이슈를 참조하십시오.

현재 QA 평가 테스트는 다음 구성 요소로 구성됩니다.

Epic 및 이슈 픽스처

픽스처는 GitLab이 소유한 프로젝트 및 그룹의 공개 이슈 및 에픽의 레플리카입니다. 표본추출 당시 내부 노트는 제외되었습니다. 이러한 픽스처는 공식적인 gitlab 리포지토리에 커밋되었습니다. 픽스처 생성에 사용된 스니펫을 참조하십시오.

RSpec 및 헬퍼

  1. RSpec 파일 및 포함된 헬퍼는 채팅 서비스를 호출하며, 이는 질문과 함께 내부 인터페이스인 Chat 서비스를 활성화합니다.

  2. 채팅 서비스의 답변을 수집한 후, 답변은 평가 프롬프트, 일명 “평가 프롬프트”에 주입되어 답변의 정확성을 평가하는 데 사용됩니다. 맥락은 단순히 각 질문에 대해 물어본 이슈나 에픽의 JSON 직렬화입니다.

  3. 평가 프롬프트는 두 LLM(Claude 및 Vertex)에게 전송됩니다.

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

  5. 각 질문에 대해 RSpec은 CORRECT 또는 INCORRECT를 위해 정규표현식을 사용합니다.

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

gitlab 프로젝트의 CI 구성은 RSpec를 실행하고, 평가 응답을 artifact로 수집하고 평가의 수집 및 추적을 자동화하는 보고 스크립트 를 실행하도록 설정되었습니다.

병합 요청을 위한 파이프라인에서 rspec-ee unit gitlab-duo-chat-qa 작업이 실행될 때, 보고 스크립트는 CI artifact로 저장된 평가를 사용하여 마크다운 보고서를 생성하고 이를 병합 요청의 노트로 게시합니다.

시간이 경과함에 따라 QA 테스트 결과를 추적하고 비교하기 위해, 반드시 master 브랜치에서 rspec-ee unit gitlab-duo-chat-qa를 수동으로 실행해야 합니다:

  1. 새 파이프라인 페이지를 방문합니다.
  2. “파이프라인 실행”을 선택하여 master 브랜치에 대한 파이프라인을 실행합니다.
  3. 파이프라인이 처음 시작될 때 “Test” 단계 하위에 있는 rspec-ee unit gitlab-duo-chat-qa 작업은 사용할 수 없습니다. 다른 CI 작업이 실행되도록 잠시 기다린 후 “Play” 아이콘을 선택하여 이 작업을 수동으로 시작합니다.

master에서 테스트를 실행하면, 보고 스크립트는 생성된 보고서를 이슈로 게시하고, 평가 artifact를 스니펫으로 저장하며 GitLab-org/ai-powered/ai-framework/qa-evaluation#1 프로젝트의 추적 이슈를 업데이트합니다.

GitLab Duo Chat Self-managed End-to-End 테스트

병합 요청에서, self-managed 인스턴스의 Duo Chat 기능을 사용하여 최신 버전의 AI Gateway와 통합된 GitLab Linux 패키지의 인스턴스를 사용하여 종단 간 테스트를 수행합니다. AI Gateway의 인스턴스는 모의 응답을 반환하도록 구성됩니다. 이러한 테스트의 결과를 보려면 e2e:test-on-omnibus-ee 자식 파이프라인을 열고 ai-gateway 작업을 확인하십시오.

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

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

GraphQL Subscription

Chat을 위한 GraphQL Subscription은 사용자 중심적이기 때문에 약간 다른 동작을 합니다. 사용자는 Chat을 여러 브라우저 탭에서 열거나 IDE에서도 열 수 있습니다. 따라서 여러 클라이언트에게 메시지를 브로드캐스트하여 동기화를 유지해야 합니다. aiAction 동작을 하는 chat 신호의 GraphQL Mutation은 다음과 같이 작동합니다:

  1. 모든 완전한 Chat 메시지(사용자의 메시지 포함)는 userId, aiAction: "chat"를 식별자로 사용하여 브로드캐스트됩니다.
  2. 스트림된 Chat 메시지의 청크는 뮤테이션에서 clientSubscriptionId를 식별자로 사용하여 브로드캐스트됩니다.

Vue 구성 요소에서의 GraphQL Subscriptions 예시:

  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 }) {
           // data.aiCompletionResponse 처리
         },
         error(err) {
           // 오류 처리
         },
       },
     },
    
  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 }) {
           // data.aiCompletionResponse 처리
         },
         error(err) {
           // 오류 처리
         },
       },
     },
    

클라이언트서브스크립션ID는 각 요청마다 고유해야 합니다. 동일한 클라이언트서브스크립션ID를 재사용하면 구독 응답에 여러 원치 않는 부작용이 발생합니다.

Duo Chat GraphQL 쿼리

  1. GitLab Duo Chat 설정
  2. GraphQL 탐색기를 방문하세요.
  3. aiAction 뮤테이션을 실행합니다. 다음은 예시입니다:

    mutation {
      aiAction(
        input: {
          chat: {
            resourceId: "gid://gitlab/User/1",
            content: "안녕"
          }
        }
      ){
        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은 현재 프리미엄 및 얼티밋 티어의 그룹 멤버에게만 사용 가능하므로, GitLab 팀 멤버로서 변경 사항을 테스트하는 것이 더 쉬울 수 있습니다. Staging Ref에서 셀프로 관리자 권한을 만드십시오 그리고 관리자로서 테스트용 라이선스 그룹을 쉽게 만들 수 있습니다.

실제 환경에서의 GitLab Duo Chat 종단간 테스트

Duo Chat 종단간 테스트는 StagingProduction GitLab 환경에서 지속적으로 실행됩니다.

이러한 테스트는 예약된 파이프라인에서 실행되며 종단간 사용자 경험이 올바르게 기능하는지 확인합니다. 결과는 #e2e-run-staging#e2e-run-production 슬랙 채널에서 확인할 수 있습니다. 파이프라인은 아래에서 찾을 수 있으며, #test-platform에서 액세스를 요청할 수 있습니다:

제품 분석

기능 사용 방법을 더 잘 이해하기 위해 각 프로덕션 사용자 입력 메시지는 LLM과 루비를 사용하여 분석되며, 이 분석은 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 그룹 설정이 활성화된 그룹에 속해야 함 - 인스턴스는 프리미엄 또는 얼티밋 티어에 있어야 함
- duo_features_enabled 설정이 활성화되어 있어야 함
 
그룹 컨텍스트에서의 사용자 (user.can?(:access_duo_chat, group)) - 사용자는 프리미엄 또는 얼티밋 티어에서 experiment_and_beta_features 그룹 설정이 활성화된 그룹에 속해야 함
- 그룹의 루트 상위 그룹은 프리미엄 또는 얼티밋 티어에 있어야 하며, 그룹은 duo_features_enabled 설정을 가져야 함
- 인스턴스는 프리미엄 또는 얼티밋 티어에 있어야 함
- duo_features_enabled 설정이 활성화되어 있어야 함
사용자는 그룹에 대해 적어도 읽기 권한을 가져야 함
프로젝트 컨텍스트에서의 사용자 (user.can?(:access_duo_chat, project)) - 사용자는 프리미엄 또는 얼티밋 티어에서 experiment_and_beta_features 그룹 설정이 활성화된 그룹에 속해야 함
- 프로젝트 루트 상위 그룹은 프리미엄 또는 얼티밋 티어에 있어야 하며, 프로젝트는 duo_features_enabled 설정을 가져야 함
- 인스턴스는 얼티밋 티어에 있어야 함
- duo_features_enabled 설정이 활성화되어 있어야 함
사용자는 프로젝트에 대해 적어도 읽기 권한을 가져야 함

GitLab Duo Chat 프롬프트 실험 실행

병합되기 전에 GitLab Duo Chat의 프롬프트나 모델 변경은 다음을 모두 해야합니다:

  1. 피처 플래그 뒤에 있어야 합니다 그리고
  2. 로컬에서 평가되어야 합니다

필요한 로컬 평가의 유형은 변경 유형에 따라 다릅니다. GitLab Duo Chat 로컬 평가를 사용하여 프롬프트 라이브러리의 평균 정확성을 측정하는 것은 이슈 및 에픽에 대한 질문에 대한 응답의 평균 정확성을 측정하는 효과적인 방법입니다.

프롬프트 라이브러리 가이드를 따라 GitLab Duo Chat 변경 사항을 로컬에서 평가하세요. 프롬프트 라이브러리 문서가 단일 정보원이 되며 가장 최신 정보를 제공해야 합니다.

전체 설정에 대한 비디오 (내부 링크)를 확인하세요.

이슈 및 epic 실험

평가 프레임워크를 사용하려면 (여기에서 설명된대로), 다음과 같은 Rake 작업을 사용하여 필요한 그룹 및 프로젝트를 가져올 수 있습니다.

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

소모 모드를 클릭하는 데 필요한 “saas” 모드에서 그룹을 생성하기 위해 Setup 클래스( ee/lib/gitlab/duo/developments/setup.rb 아래)를 사용하므로 GITLAB_SIMULATE_SAAS=1로 설정해야 합니다. 이것은 가져오기를 완료하기 위한 것일 뿐이며, 원하면 GITLAB_SIMULATE_SAAS=0으로 다시 전환할 수 있습니다.

채팅 프롬프트 구성 방법

모든 채팅 요청은 GitLab GraphQL API에서 처리됩니다. 그리고 지금은 3rd party LLMs의 프롬프트가 GitLab 코드베이스에 하드코딩되어 있습니다.

그러나 채팅 프롬프트를 변경하려면 단일 파일에서 문자열을 찾는 것만큼 명백하지 않습니다. 채팅 프롬프트 구성은 많은 단계를 거쳐 조합되기 때문에 추적하기 어렵습니다. 다음은 채팅 프롬프트를 구성하는 흐름입니다.

  1. API 요청이 GraphQL AI Mutation에 전송됩니다. 요청에는 사용자 채팅 입력이 포함됩니다. (코드)
  2. GraphQL Mutation은 Llm::ExecuteMethodService#execute를 호출합니다. (코드)
  3. Llm::ExecuteMethodService#execute는 GraphQL API로 chat 메서드가 전송된 것을 감지하고 Llm::ChatService#execute를 호출합니다. (코드)
  4. Llm::ChatService#executeschedule_completion_worker를 호출하며, 이는 Llm::BaseService ( ChatService의 기본 클래스)에 정의됩니다. (코드)
  5. schedule_completion_workerLlm::CompletionWorker.perform_for를 호출하여 작업을 비동기적으로 큐에 넣습니다. (코드)
  6. 작업을 실행하면 Llm::CompletionWorker#perform가 호출됩니다. 이 메서드는 사용자 입력 및 기타 메시지 컨텍스트의 역직렬화를 수행하고이를 Llm::Internal::CompletionService#execute로 전달합니다. (코드)
  7. Llm::Internal::CompletionService#executeGitlab::Llm::CompletionsFactory#completion!를 호출하여 원본 GraphQL 요청에서 ai_action을 가져와 Gitlab::Llm::Completions::Chat의 새 인스턴스를 초기화하고 이를 실행합니다. (코드)
  8. Gitlab::Llm::Completions::Chat#executeGitlab::Llm::Chain::Agents::SingleActionExecutor를 호출합니다. (코드)
  9. Gitlab::Llm::Chain::Agents::SingleActionExecutor#executeexecute_streamed_request를 호출하며, AiDependent concern에서 정의된 request를 호출합니다. (코드)
  10. SingleActionExecutor#prompt_options 메서드는 AI Gateway 요청을 위한 모든 프롬프트 매개변수를 조립합니다. (코드)
  11. ai_requestLlm::Completions::Chat에서 정의되며 AiGateway로 평가됩니다. (코드)
  12. ai_request.requestLlm::Chain::Requests::AiGateway#request로 라우팅되며, ai_client.stream을 호출합니다. (코드)
  13. ai_client.streamGitlab::Llm::AiGateway::Client#stream으로 라우팅되며 AI Gateway /v2/chat/agent 엔드포인트로 API 요청을 작성합니다. (코드)
  14. AI Gateway는 요청을받습니다. (코드)
  15. AI Gateway는 사용자용으로 사용 가능한 도구 목록을 가져옵니다. (코드)
  16. AI GW는 각 도구에 대한 정의를 가져옵니다. (코드)
  17. 그리고 이것들은 Rails에서 온 다른 프롬프트 매개변수와 함께 프롬프트 템플릿에 삽입됩니다. (코드)
  18. AI Gateway는 LLM에 요청을 보내고 응답을 Rails로 반환합니다. (코드)
  19. 이제 AI Gateway에 첫 번째 요청을 보냈습니다. LLM이 첫 번째 요청에 대한 응답이 최종 응답이라고 말하는 경우, 답변을 구문 분석 및 스트리밍을 수행하여 (코드) 반환합니다. (코드)
  20. 첫 번째 답변이 최종이 아닌 경우, 첫 번째 LLM 요청에서 “생각” 및 “선택된 도구”가 구문 분석되고 해당 도구 클래스가 호출됩니다. (코드)
  21. 도구 실행자 클래스는 모두 Concerns::AiDependent를 포함하며 채팅 실행자가하는 것과 유사하게 포함 된 request 메서드를 사용합니다. (예시). request 메서드는 Llm::Completions::Chatcontext에 주입 된 ai_request 인스턴스를 사용합니다. 그래서 기본적으로 AI Gateway에 대한 동일한 요청이 다른 prompt / PROMPT_TEMPLATE으로 구성되지만 첫 번째 요청과는 다릅니다. (예시 도구 프롬프트 템플릿)
  22. 도구 답변이 최종이 아닌 경우, 응답이 agent_scratchpad에 추가되고 SingleActionExecutor의 루프가 다시 시작되며, 추가적인 컨텍스트가 요청에 추가됩니다. 최종 답변이 도달할 때까지 최대 10회까지 반복됩니다.

GitLab Duo Chat 오류 코드 해석

GitLab Duo Chat에는 디버깅을 돕기 위해 특정 의미가 지정된 오류 코드가 있습니다.

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

GitLab Duo Chat를 개발할 때 오류가 발생할 경우, 특히 사용자에게 노출되는 오류의 경우 이러한 오류 코드를 반환하고 문서화에 포함해 주세요.

오류 코드 형식

오류 코드는 다음 형식을 따릅니다: <계층 식별자><네 자리의 일련 번호>.

예를 들어:

  • M1001: 모노리스 계층에서의 네트워크 통신 오류.
  • G2005: AI 게이트웨이 계층의 데이터 형식/처리 오류.
  • A3010: 제3자 API에서의 인증 또는 데이터 접근 권한 오류.

오류 코드 계층 식별자

코드 계층
M 모노리스
G AI 게이트웨이
A 제3자 API

오류 일련 번호

일련 번호 유형
1000 네트워크 통신 오류
2000 데이터 형식/처리 오류
3000 인증 및/또는 데이터 접근 권한 오류
4000 코드 실행 예외
5000 잘못된 구성 또는 잘못된 매개 변수 오류
6000 의미론적 또는 추론 오류 (모델이 이해하지 못하거나 환각을 일으키는 경우)