GitLab Duo Chat

채팅GitLab Duo의 일부입니다.

채팅이 자신을 설명하는 방식: “나는 GitLab Duo Chat이며, 개발자들이 DevSecOps, 소프트웨어 개발, 소스 코드, 프로젝트 관리, CI/CD 및 GitLab을 돕기 위해 초점을 맞춘 AI 어시스턴트입니다. 이러한 영역에서 자유롭게 나에게 질문을 해 주십시오.”

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

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

GitLab Duo Chat 설정

Saas 및 Self-Managed 인스턴스를 위한 설정에 차이가 있습니다. 우선, SaaS 전용 AI 기능에 대한 설명부터 시작하는 것이 좋습니다.

  1. SaaS 전용 AI 기능 설정.
  2. Self-Managed AI 기능 설정.

GitLab Duo Chat 사용하기

Prompts는 GitLab Duo Chat 시스템에서 가장 중요한 부분입니다. Prompts는 LLM에게 특정 작업을 수행하기 위한 지시입니다.

Prompts의 상태는 몇 주 동안의 반복 과정을 통해 결정됩니다. 현재 도구의 어떤 prompt를 변경하고 싶다면 반드시 피처 플래그 뒤에 놓아야 합니다.

새로운 prompt가 있거나 업데이트된 prompt가 있다면 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로 변경할 수 있습니다.
GDK가 비-SaaS 모드에서 실행되는 경우 UI에 채팅 버튼이 나타나지 않음 클라우드 커넥터 액세스 토큰 레코드 또는 할당된 seat가 없습니다. 클라우드 커넥터 액세스 레코드를 생성하려면 Rails 콘솔에 다음 코드를 입력합니다: CloudConnector::Access.new(data: { available_services: [{ name: "duo_chat", serviceStartTime: ":date_in_the_future" }] }).save.

GitLab Duo Chat 기여

코드적 측면에서, Chat은 다른 AI 기능과 유사한 방식으로 구현되었습니다. GitLab AI Abstraction layer에 대해 자세히 알아보세요.

Chat 기능은 zero-shot agent를 사용하며, 이는 큰 언어 모델이 질문을 해석하고 답변을 제공하는 방식을 설명하는 시스템 prompt를 포함합니다. 시스템 prompt는 사용 가능한 도구를 정의합니다.

zero-shot agent는 사용자의 질문을 받아 해당 질문에 대답하기 위해 어떤 도구를 사용해야 하는지 결정합니다. 그런 다음 큰 언어 모델에 요청을 보내어 직접 답변할 수 있는지 또는 정의된 도구를 사용해야 하는지 결정합니다.

각 도구에는 해당 도구를 사용하여 정보를 수집하기 위한 지침을 제공하는 독립적인 prompt가 있습니다. 도구는 자체적으로 동작하도록 설계되어 있으며 큰 언어 모델과의 왕복 요청을 피합니다.

도구가 필요한 정보를 수집한 후에는 zero-shot agent에 반환되어 사용자의 질문에 대한 최종 답변을 제공할 충분한 정보를 수집했는지 LLM에게 요청합니다.

새로운 도구 추가

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

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

  2. 해당 도구에 대한 클래스를 작성합니다.
    • 도구의 이름 및 설명
    • 이 도구를 사용하는 예상 질문
    • 큰 언어 모델에게 도구를 사용하여 정보를 수집하는 방법에 대한 지침 - 즉, 이 도구가 사용하는 주요 prompts.
  3. 실제 큰 언어 모델에 요청을 보내는 RSpec 테스트를 사용하여 prompt를 테스트하고 반복합니다.
    • Prompt는 시행착오를 거쳐야 하며, LLM과의 비결정적인 작업의 성격은 놀라울 수 있습니다.
    • Anthropic은 prompt 작업에 대해 좋은 가이드를 제공합니다.
    • GitLab은 prompt 작업에 대한 가이드를 제공합니다.
  4. 도구 코드를 구현하여 큰 언어 모델의 응답을 구문 분석하고 zero-shot agent에 반환합니다.

  5. ee/lib/gitlab/llm/completions/chat.rbtools 배열에 새로운 도구 이름을 추가하여 zero-shot agent가 도구에 대해 알 수 있도록 합니다.

  6. 테스트를 추가하여 새로운 도구에 응답할 질문을 테스트 스위트에 추가합니다. 필요에 따라 prompt를 반복합니다.

주의할 점은 prompt 및 도구 설명을 통해 큰 언어 모델에 명확한 지시를 제공하고, 도구를 자체적으로 운영하며, zero-shot agent에 응답을 반환하는 것입니다. prompt를 몇 번 시행착오한 후, 새로운 도구를 추가함으로써 Chat 기능의 능력을 확장할 수 있습니다.

이 주제를 다루는 짧은 비디오도 있습니다.

디버깅

더 많은 통찰을 얻기 위해 전체 요청에 대한 디버그 로그를 수집하기 위해 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 테스트를 포함한 모든 도구와 함께 작동합니다.

LangSmith을 사용하여 추적하기

note
추적은 개발 및 테스트 환경에서만 사용할 수 있습니다. 프로덕션 환경에서는 사용할 수 없습니다.
  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 # LangSmith 및 평가 도구로 Prompt Library를 사용하여 사용하는 puma 타임아웃을 연장합니다.
    
  4. GDK를 다시 시작합니다.

GitLab Duo 채팅 테스트

GitLab Duo 채팅에서 사용자 질문에 대한 답변의 성공은 도구 체인 및 각 도구의 프롬프트에 크게 의존하기 때문에 프롬프트 또는 도구의 작은 변경이 일부 질문의 처리에 영향을 미치는 것이 일반적입니다.

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

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

GitLab Duo 채팅 로직에 대한 어떤 변경을 진행 중이라면 변경 사항이 포함된 Merge Request에서 GitLab Duo 채팅 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 채팅 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 키의 관리

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

예외로 GCP 자격 증명은 마스킹이 불가능한 문자를 포함하고 있기 때문에 마스킹될 수 없습니다. Because the CI jobs need to run on MR branches, GCP credentials cannot be added as a protected variable 대표적인 변수로서 추가되어야 하며, 보안상 GCP 자격 증명 및 관련 프로젝트는 어떤 프로덕션 인프라에도 액세스할 수 없어야 합니다.

GitLab Duo 채팅 QA 평가 테스트

GitLab Duo 채팅과 같은 자연어 생성 (NLG) 시스템의 평가는 많은 미해결된 문제와 모호성이 있는 빠르게 발전하는 영역입니다.

실무 가정은 명확한 질문과 컨텍스트가 주어지면 LLM이 합리적인 답변을 생성할 수 있다는 것입니다. 이러한 가정을 바탕으로 우리는 LLM을 평가자로 사용하여 일부 질문의 정확성을 결정하고 GitLab Duo 채팅 응답의 전반적인 정확성을 추적하고 기능에 대한 회귀를 감지할 수 있습니다.

이러한 주제와 관련된 논의들은 Merge Request이슈에서 확인할 수 있습니다.

현재 QA 평가 테스트에는 다음 컴포넌트가 포함되어 있습니다.

에픽 및 이슈 fixture

이 fixture들은 GitLab이 소유한 프로젝트 및 그룹에서 가져온 공개 이슈 및 에픽의 복제본입니다. 내부 노트는 샘플링할 때 제외되었습니다. fixture들은 공식적인 gitlab 리포지터리에 커밋되었습니다. fixture를 생성하는 데 사용된 스니펫을 확인하세요.

RSpec 및 도우미들

  1. RSpec 파일 및 포함된 도우미들은 Chat 서비스, 즉 질문과의 내부 인터페이스를 호출합니다.

  2. Chat 서비스의 응답을 수집한 후, 응답은 “평가 프롬프트”라고도하는 평가 프롬프트에 주입됩니다. 이 평가 프롬프트는 답변의 정확성을 질문과 컨텍스트에 따라 LLM이 등급을 매길 수 있도록 하는 것입니다. 컨텍스트는 각 질문에서 질의된 이슈 또는 에픽의 JSON 직렬화일 뿐입니다.

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

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

  5. 각 질문에 대해, RSpec는 CORRECT 또는 INCORRECT에 대한 정규 표현식 매치를 수행합니다.

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

gitlab 프로젝트의 CI 구성은 RSpec를 실행하고 평가 응답을 아티팩트로 수집한 후 평가를 수집하고 추적하는 리포트 스크립트를 실행합니다.

Merge Request을 위한 파이프라인에서 rspec-ee unit gitlab-duo-chat-qa 작업이 실행될 때, 리포트 스크립트는 CI 아티팩트로 저장된 평가를 사용하여 Markdown 리포트를 생성하고 이를 Merge Request의 노트로 게시합니다.

시간이 흐름에 따라 QA 테스트 결과를 추적하고 비교하기 위해 rspec-ee unit gitlab-duo-chat-qamaster 브랜치에서 매뉴얼으로 실행해야 합니다:

  1. 새 파이프라인 페이지를 방문하십시오.
  2. master 브랜치로 파이프라인을 실행하려면 “파이프라인 실행”을 선택합니다.
  3. 파이프라인이 처음 시작하면 “테스트” 단계 아래의 rspec-ee unit gitlab-duo-chat-qa 작업이 사용할 수 없습니다. 기타 CI 작업을 실행한 후 몇 분을 기다린 다음 “재생” 아이콘을 선택하여 이 작업을 매뉴얼으로 시작하세요.

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

GraphQL 구독

채팅을 위한 GraphQL 구독은 사용자 중심으로 작동하기 때문에 약간 다릅니다. 사용자는 여러 브라우저 탭이나 IDE에서 대화를 열 수 있습니다. 따라서 우리는 그들을 동기화하기 위해 여러 클라이언트에 메시지를 브로드캐스트해야 합니다. aiAction 변이에서 chat 동작을 사용하는 경우 다음과 같이 작동합니다.

  1. 완전한 채팅 메시지(사용자의 메시지 포함)는 userId, aiAction: "chat"를 식별자로 사용하여 브로드캐스트됩니다.
  2. 스트리밍된 채팅 메시지의 청크 및 현재 사용 중인 도구는 변이에서 userId, resourceIdclientSubscriptionId를 식별자로 브로드캐스트됩니다.

참고: 여전히 userIdresourceId를 식별자로 사용하여 채팅 메시지 및 현재 사용 중인 도구를 브로드캐스트하지만, 이것은 사용되어서는 안 되며 폐기될 예정입니다. 이 이슈의 일부로 구독에서 resourceId를 제거하려고 합니다.

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

GitLab Duo Chat은 스테이징스테이징 Ref GitLab 환경에서 활성화되어 있습니다.

현재 GitLab Duo Chat은 Premium 및 Ultimate 티어의 그룹 구성원에게만 사용 가능하기 때문에, 변경 사항을 테스트하기에 스테이징 Ref가 더 쉬운 환경일 수 있습니다. 여기에서 스테이징 Ref에서 Self-Managed형자로 설정하여 테스트용 라이선스 그룹을 쉽게 만들 수 있습니다.

제품 분석

기능 사용 방식을 더 잘 이해하기 위해, 각 프로덕션 사용자 입력 메시지는 LLM(Labore et Luminum Model) 및 루비를 사용하여 분석되며, 해당 분석은 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 전용 또는 Self-Managed 모든 인스턴스
프로젝트 또는 그룹 외부의 사용자용 (user.can?(:access_duo_chat)) 사용자는 experiment_and_beta_features 그룹 설정이 활성화된 Premium 또는 Ultimate 티어의 하나 이상의 그룹 구성원이어야 합니다. - 인스턴스는 Premium 또는 Ultimate 티어에 있어야 합니다
- 인스턴스는 instance_level_ai_beta_features_enabled 설정을 활성화해야 합니다
 
그룹 컨텍스트의 사용자용 (user.can?(:access_duo_chat, group)) - 사용자는 experiment_and_beta_features 그룹 설정이 활성화된 Premium 또는 Ultimate 티어의 하나 이상의 그룹 구성원이어야 합니다
- 그룹의 뿌리 조상 그룹은 Premium 또는 Ultimate 티어이어야 하며 experiment_and_beta_features 설정이 활성화되어야 합니다
- 인스턴스는 Premium 또는 Ultimate 티어에 있어야 합니다
- 인스턴스는 instance_level_ai_beta_features_enabled 설정을 활성화해야 합니다
사용자는 그룹에서 최소한 읽기 권한을 가지고 있어야 합니다
프로젝트 컨텍스트의 사용자용 (user.can?(:access_duo_chat, project)) - 사용자는 Premium 또는 Ultimate 티어에서 experiment_and_beta_features 그룹 설정이 활성화된 하나 이상의 그룹 구성원이어야 합니다
- 프로젝트 뿌리 조상 그룹이 Premium 또는 Ultimate 티어이어야 하며 experiment_and_beta_features 그룹 설정이 활성화되어야 합니다
- 인스턴스는 Ultimate 티어에 있어야 합니다
- 인스턴스는 instance_level_ai_beta_features_enabled 설정을 활성화해야 합니다
사용자는 프로젝트에서 최소한 읽기 권한을 가지고 있어야 합니다

GitLab Duo Chat 프롬프트 실험 실행

Merge되기 전에 GitLab Duo Chat의 프롬프트나 모델 변경은 다음 둘 다를 준수해야 합니다:

  1. 피처 플래그를 통해 숨겨져야 하며 그리고
  2. 로컬로 평가되어야 합니다

로컬 평가의 종류는 변경의 유형에 따라 다릅니다. GitLab Duo Chat 로컬 평가를 Prompt Library를 사용하여 수행하는 것은 이슈 및 에픽에 대한 질문에 대한 평균 정확성을 메트릭하는 효과적인 방법입니다.

GitLab Duo Chat 변경 사항을 로컬에서 평가하려면 Prompt Library 가이드를 따르세요. 프롬프트 라이브러리 설명서가 최신이며 최신 정보여야 합니다.

전체 설정을 다루는 동영상을 참조하세요.

채팅 프롬프트의 작동 방식

모든 채팅 요청은 GitLab GraphQL API를 통해 처리됩니다. 현재는 3rd party LLMs의 프롬프트가 GitLab 코드베이스에 하드코딩되어 있습니다.

하지만 채팅 프롬프트를 변경하고 싶다면, 단일 파일에서 문자열을 찾는 것만큼 명백하지 않습니다. 채팅 프롬프트 구성은 여러 단계에 걸쳐 조립되기 때문에 추적하기가 어렵습니다. 여기 채팅 프롬프트의 조립 방식이 있습니다:

  1. GraphQL AI 변이에 API 요청이 전송됩니다. 요청에는 사용자 채팅 입력이 포함됩니다. (코드)
  2. GraphQL 변이는 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를 호출하며, 이는 작업을 비동기적으로 enqueue합니다. (코드)
  6. 작업 실행 시 Llm::CompletionWorker#perform이 호출됩니다. 이는 사용자 입력 및 다른 메시지 컨텍스트를 역직렬화하고 Llm::Internal::CompletionService#execute로 전달합니다. (코드)

… (이어집니다)