GitLab Duo 채팅

ChatGitLab Duo 오퍼링의 일부입니다.

채팅이 자신을 설명하는 방식: “나는 GitLab Duo Chat이며, 개발자들이 DevSecOps, 소프트웨어 개발, 소스 코드, 프로젝트 관리, CI/CD, 그리고 GitLab에서 도움을 받는 데 중점을 둔 AI 어시스턴트입니다. 이러한 영역에서 언제든지 나에게 참여해 주십시오.”

채팅은 다른 질문에 대답하고 일부 작업을 수행할 수 있습니다. 이를 위해 프롬프트도구를 사용합니다.

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

GitLab Duo 채팅 설정

SaaS 및 자체 관리 인스턴스에 대해 설정에 차이가 있습니다. 먼저 SaaS 전용 AI 기능에 대한 설명부터 시작하는 것을 권장합니다.

  1. SaaS 전용 AI 기능 설정을 참조하십시오.
  2. 자체 관리 AI 기능 설정을 참조하십시오.

GitLab Duo 채팅 사용 방법

프롬프트는 GitLab Duo 채팅 시스템에서 가장 중요한 부분입니다. 프롬프트는 지정된 작업을 수행하기 위해 LLM에 보내진 지침입니다.

프롬프트의 상태는 몇 주 동안의 반복 작업 결과입니다. 현재 도구에서 어떤 프롬프트를 변경하고 싶다면, 반드시 기능 플래그 뒤에 두어야 합니다.

새로운 또는 업데이트된 프롬프트가 있는 경우, 이에 대한 검토를 AI Framework 팀 멤버에게 요청하십시오. 그들은 이에 대해 상당한 경험을 가지고 있기 때문입니다.

문제 해결

로컬에서 채팅을 사용하는 경우 오류가 발생할 수 있습니다. 가장 일반적인 문제는 이 섹션에 문서화되어 있습니다. 문서화되지 않은 문제를 발견하면, 해결 방법을 찾은 후에 이 섹션에 문서화해야 합니다.

문제 해결 방법
GitLab UI에 채팅 버튼이 표시되지 않음. 사용자가 실험적 및 베타 기능이 활성화된 그룹의 일원임을 확인하십시오.
채팅이 “권한 부여 공급자에 의해 금지됨” 오류로 응답함. 백엔드가 LLM에 액세스할 수 없습니다. AI Gateway가 올바르게 설정되었는지 확인하십시오.
요청이 UI에 나타나기까지 시간이 오래 걸림 gdk restart rails-background-jobs를 실행하여 Sidekiq를 재시동해보세요. 이것이 작동하지 않으면 gdk kill을 시도한 후 gdk start를 시도하십시오. 또는 Sidekiq를 완전히 우회할 수도 있습니다. 일시적으로 Llm::CompletionWorker.perform_async 문장을 Llm::CompletionWorker.perform_inline으로 변경하여 알아보십시오.

GitLab Duo 채팅 기여

코드적으로, 채팅은 다른 AI 기능과 유사한 방식으로 구현되었습니다. GitLab AI 추상화 레이어에 대해 자세히 알아보세요.

채팅 기능은 질문의 해석 및 응답 방법을 설명하는 시스템 프롬프트를 포함하는 제로샷 에이전트를 사용합니다. 시스템 프롬프트는 정보를 수집하여 사용자의 질문에 답변할 수 있도록 하기 위해 사용할 수 있는 도구를 정의합니다.

제로샷 에이전트는 사용자의 질문을 수신하고 어떤 도구를 사용하여 정보를 수집할지 결정합니다. 그런 다음 대형 언어 모델에 요청을 보내어 질문에 대답할 정보를 충분히 수집했는지 여부를 판단합니다.

도구는 각각 독자적인 프롬프트를 갖고 있으며, 대형 언어 모델로의 여러 번의 요청과 응답을 회피하고자 구성됐습니다.

도구들이 필요한 정보를 수집한 후, 그 정보는 제로샷 에이전트로 반환되며, 제로샷 에이전트는 사용자의 질문에 최종 응답을 제공할 충분한 정보를 수집했는지 여부를 대형 언어 모델에 요청합니다.

새로운 도구 추가

새로운 도구를 추가하려면:

  1. ee/lib/gitlab/llm/chain/tools/ 폴더에 도구를 위한 파일을 생성하십시오. issue_identifierresource_reader와 같은 기존 도구를 템플릿으로 사용합니다.

  2. 도구를 위한 클래스를 작성하십시오. 이 클래스에는 다음이 포함되어야 합니다:

    • 도구가 하는 일의 이름과 설명
    • 이 도구를 사용하는 예제 질문
    • 대형 언어 모델에게 정보 수집을 위해 이 도구를 사용하는 방법에 대한 지침 - 즉, 이 도구가 사용하는 주요 프롬프트.
  3. 대형 언어 모델에게 실제 요청을 보내는 RSpec 테스트를 사용하여 프롬프트를 테스트하고 반복해보세요.
    • 프롬프트는 시행착오를 거쳐야 하며, LLM과의 비결정적인 작업의 성격은 놀랄 수 있습니다.
    • Anthropic은 프롬프트 작업에 대한 가이드를 제공합니다.
    • GitLab은 프롬프트 작업에 대한 가이드를 제공합니다.
  4. 도구에서 대형 언어 모델의 응답을 구문 분석하고 제로샷 에이전트로 반환하는 코드를 구현하십시오.

  5. ee/lib/gitlab/llm/completions/chat.rbtools 배열에 새로운 도구 이름을 추가하여 제로샷 에이전트가 이를 알 수 있도록 하십시오.

  6. 새로운 도구가 응답해야 하는 테스트 스위트에 질문을 추가하여 테스트를 추가하고 필요에 따라 프롬프트를 반복해보세요.

주의할 사항은 프롬프트 및 도구 설명을 통해 대형 언어 모델에 올바르게 지시하는 것, 도구를 독립적으로 유지하고 응답을 제로샷 에이전트로 반환하는 것입니다. 프롬프트에 대한 시행착오를 거쳐 새로운 도구를 추가하면 채팅 기능의 기능을 확장할 수 있습니다.

이 주제에 대해 설명하는 단축 비디오도 있습니다.

디버깅

더 많은 통찰을 얻기 위해 Gitlab::Llm::Logger 파일을 사용하여 디버그 로그를 기록하세요. 운영 환경에서의 기본 로깅 레벨은 INFO이며, 개인 식별 정보를 포함할 수 있는 데이터를 기록하는 데 사용해서는 안 됩니다.

추상화 계층의 AI 요청과 관련된 디버깅 메시지를 확인하려면 다음을 사용할 수 있습니다:

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

LangSmith로 추적

추적은 LLM 애플리케이션의 동작을 이해하는 데 효과적인 도구입니다. LangSmith는 최고 수준의 추적 기능을 가지고 있으며 GitLab Duo Chat과 통합되어 있습니다. 추적을 사용하면 다음과 같은 문제를 추적할 수 있습니다:

  • GitLab Duo Chat을 처음 사용하는데 내부 동작을 이해하고 싶습니다.
  • 예기치 않은 답변을 받았을 때 과정이 정확히 어디에서 실패했는지 알고 싶습니다.
  • 지연의 병목 현상이 된 프로세스는 무엇인지 알고 싶습니다.
  • 애매한 질문에 대해 어떤 도구가 사용되었는지 알고 싶습니다.

LangSmith UI

추적은 특히 대규모 데이터 세트에 대한 GitLab Duo Chat 실행을 위한 평가에 유용합니다. LangSmith 통합은 Prompt LibraryRSpec tests를 포함한 모든 도구와 함께 작동합니다.

LangSmith로 추적 사용

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

  1. LangSmith 사이트에 액세스하여 계정을 생성합니다.
  2. API 키를 생성합니다.
  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='api.smith.langchain.com'
     export GITLAB_RAILS_RACK_TIMEOUT=180 # Prompt Library를 평가 도구로 사용하기 위해 LangSmith와 함께 puma 시간 제한을 확장합니다.
    
  4. GDK를 재시작합니다.

GitLab Duo Chat 테스트

GitLab Duo Chat의 사용자 질문에 대한 답변의 성공은 도구 체인과 각 도구의 프롬프트에 매우 의존적이므로, 프롬프트나 도구의 작은 변경도 일부 질문의 처리에 영향을 미칠 수 있습니다.

도구 체인의 변경이 기존 기능을 망가뜨리지 않는지 확인하기 위해 실제 LLMs를 사용하여 일부 이미 정의된 질문에 대한 답변을 검증할 수 있습니다:

  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 이 테스트는 질문과 함께 제공된 채팅 응답과 컨텍스트를 사용하여 채팅 응답의 품질을 평가합니다. 이 평가는 문제 및 이야기에 대한 질문으로 제한됩니다. GitLab Duo Chat QA Evaluation 테스트에 대해 자세히 알아보세요.

GitLab Duo Chat 로직에 대한 변경을 진행 중이라면 변경 사항이 포함된 병합 요청에서 GitLab Duo Chat CI 작업을 실행해야 합니다. CI 작업 중 일부는 수동으로 트리거해야 합니다.

로컬에서 테스트

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

export VERTEX_AI_EMBEDDINGS='true' # Vertex 임베딩을 사용하는 경우
export ANTHROPIC_API_KEY='<key>' # Gitlab::CurrentSettings의 개발 값을 사용할 수 있습니다.
export VERTEX_AI_CREDENTIALS='<vertex-ai-credentials>' # Gitlab::CurrentSettings.vertex_ai_credentials의 개발 값을 설정할 수 있습니다.
export VERTEX_AI_PROJECT='<vertex-project-name>' # Gitlab::CurrentSettings.vertex_ai_project의 개발 값을 사용할 수 있습니다.

REAL_AI_REQUEST=1 bundle exec rspec ee/spec/lib/gitlab/llm/completions/chat_real_requests_spec.rb

문서 임베딩을 필요로 하는 테스트 질문을 업데이트할 때는 변경 사항과 함께 새로운 Fixture를 생성하고 커밋해야 합니다.

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 테스트에 대해 자세히 읽어보세요.

  • 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 키는 mask a cicd variable해야 합니다.

예외로 GCP 자격증명은 마스크를 할 수 없는 문자를 포함하고 있기 때문에 마스크할 수 없습니다. CI 작업이 MR 브랜치에서 실행되어야 하므로 GCP 자격증명을 보호받는 변수로 추가할 수 없으며 일반 CI 변수로 추가해야 합니다. 보안상의 이유로 GitLab 프로젝트의 CI에 추가된 GCP 자격증명과 해당 프로젝트는 생산 인프라 및 격리된 환경에 액세스할 수 없어야 합니다.

GitLab Duo Chat QA 평가 테스트

GitLab Duo Chat과 같은 자연어 생성(NLG) 시스템을 평가하는 것은 많은 미해결된 문제와 모호성을 가진 계속 진화하는 분야입니다.

실용적인 작업 가정은 LLMs가 명확한 질문과 컨텍스트를 제공하면 합리적인 답변을 생성할 수 있는 것입니다. 이 가정을 바탕으로, 우리는 LLMs를 평가자로 사용하여 샘플 질문의 정확성을 결정하고 GitLab Duo Chat의 응답의 전반적인 정확성을 추적하고 기능의 회귀를 감지합니다.

이 주제와 관련된 토론은 병합 요청이슈을 참조하세요.

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

에픽 및 이슈 fixtures

이 fixtures는 GitLab이 소유한 프로젝트 및 그룹의 public 이슈와 에픽의 레플리카입니다. 샘플링할 때 내부 노트는 제외되었습니다. 이 fixtures는 공식적인 gitlab 저장소에 커밋되었습니다. fixtures 생성에 사용된 snippett를 참조하세요.

RSpec 및 도우미

  1. RSpec 파일 및 포함된 도우미는 Chat 서비스를 호출하고, 질문과 컨텍스트에 따라 답변의 정확성을 평가합니다.

  2. Chat 서비스의 답변을 수집한 후, 답변은 “평가 프롬프트” 또는 “평가 프롬프트”로 주입됩니다. 평가 프롬프트는 단순하게 각 질문에 대한 답변에 대해 질문하거나 에픽의 JSON 직렬화인 컨텍스트를 기반으로 답변의 정확성을 평가합니다.

  3. 평가 프롬프트는 Claude와 Vertex 두 개의 LLM로 보내집니다.

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

  5. 각 질문에 대해 RSpec은 CORRECT 또는 INCORRECT를 정규 표현식으로 일치시킵니다.

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

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

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

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

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

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

GraphQL Subscription

채팅에 대한 GraphQL Subscription은 사용자 중심으로 동작하기 때문에 약간 다릅니다. 사용자는 여러 브라우저 탭 또는 IDE에서 Chat을 열 수 있습니다. 따라서 여러 클라이언트에 메시지를 브로드캐스트하여 그들을 동기화 상태로 유지해야 합니다. aiAction 동작이 있는 chat 동작과 함께하는 mutation은 다음과 같이 동작합니다:

  1. userId, aiAction: "chat"을 식별자로 사용하여 모든 완전한 Chat 메시지 (사용자의 메시지 포함)가 브로드캐스트됩니다.
  2. 스트림되는 Chat 메시지의 청크와 현재 사용 중인 도구는 mutation에서 userId, resourceId, 그리고 clientSubscriptionId를 식별자로 사용하여 브로드캐스트됩니다.

참고로 여전히 사용 중인 도구와 채팅 메시지를 userIdresourceId를 식별자로 사용하여 브로드캐스트하지만, 이것은 더 이상 사용되어서는 안 되는 것입니다. 우리는 구독에서 resourceId를 제거하려고 하며, 이는 이 이슈의 일부입니다.

프로덕션과 유사한 환경에서의 GitLab Duo Chat 테스트

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

GitLab Duo Chat은 현재 프리미엄 및 얼티밋 티어의 그룹 구성원에만 사용할 수 있기 때문에, Staging Ref는 GitLab 팀 구성원으로서 변경 사항을 테스트하기에 더 쉬울 수 있습니다. Staging Ref에서 인스턴스 관리자로 자신을 지정할 수 있기 때문에, 관리자로서 테스트용 라이선스 그룹을 쉽게 생성할 수 있습니다.

제품 분석

기능이 어떻게 사용되는지 더 잘 이해하기 위해 각 프로덕션 사용자 입력 메시지는 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를 반환하려면 충족해야 하는 요구 사항을 설명합니다.

  SaaS에서 Self-managed에서
사용자 (user.can?(:access_duo_chat)) 사용자는 최소한 하나의 얼티밋 티어 그룹에 속하고 experiment_and_beta_features 그룹 설정이 켜져 있어야 합니다 인스턴스는 얼티밋 티어에 있어야 하고 instance_level_ai_beta_features_enabled 설정이 켜져 있어야 합니다
그룹 컨텍스트에서 사용자 (user.can?(:access_duo_chat, group)) 사용자는 해당 그룹의 구성원이어야 하며, 이 그룹의 최상위 조상 그룹은 얼티밋 티어에 있고 experiment_and_beta_features 그룹 설정이 켜져 있어야 합니다 인스턴스는 얼티밋 티어에 있어야 하고 instance_level_ai_beta_features_enabled 설정이 켜져 있어야 하며, 사용자는 해당 그룹에 최소한 읽기 권한이 있어야 합니다
프로젝트 컨텍스트에서 사용자 (user.can?(:access_duo_chat, project)) 사용자는 해당 프로젝트의 구성원이어야 하며, 프로젝트는 얼티밋 티어의 최상위 조상 그룹에 있고 experiment_and_beta_features 그룹 설정이 켜져 있어야 합니다 인스턴스는 얼티밋 티어에 있어야 하고 instance_level_ai_beta_features_enabled 설정이 켜져 있어야 하며, 사용자는 해당 프로젝트에 최소한 읽기 권한이 있어야 합니다