GitLab Duo 채팅

채팅GitLab Duo 오퍼링의 일부입니다.

채팅이 자신을 어떻게 설명합니까: “나는 GitLab Duo 채팅입니다. DevSecOps, 소프트웨어 개발, 소스 코드, 프로젝트 관리, CI/CD 및 GitLab을 돕기 위해 만들어진 AI 어시스턴트입니다. 이와 관련된 질문이나 이슈가 있으면 언제든지 나에게 물어보세요.”

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

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

GitLab Duo 채팅 설정

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

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

GitLab Duo 채팅 사용하기

프롬프트는 GitLab Duo 채팅 시스템의 가장 중요한 부분입니다. 프롬프트는 대형 언어 모델에게 특정 작업을 수행하도록 지시하는 것입니다.

프롬프트의 상태는 몇 주 동안의 반복 작업의 결과입니다. 현재 도구의 프롬프트를 변경하려면 해당 프롬프트를 피처 플래그 뒤에 두어야 합니다.

새롭거나 업데이트된 프롬프트가 있다면 AI 프레임워크 팀 멤버들에게 리뷰를 요청하세요. 프레임워크 팀은 이에 대한 상당한 경험을 가지고 있습니다.

문제 해결

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

문제 해결 방법
GitLab UI에 채팅 버튼이 표시되지 않음. 사용자가 실험 및 베타 기능이 활성화된 그룹의 구성원인지 확인하세요.
채팅이 “auth 제공자에 의해 금지됨” 오류로 응답함. 백엔드가 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_identifier 또는 resource_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 테스트를 비롯한 모든 도구와 작동합니다.

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 # 평가 도구로 Prompt Library를 사용하는 LangSmith의 puma 타임아웃을 연장합니다.
    
  4. GDK를 다시 시작합니다.

GitLab Duo Chat 테스트

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

도구 체인의 변경이 기존 기능을 손상시키지 않는지 확인하려면 실제 LLM을 사용하여 몇 가지 미리 정의된 질문에 대한 답변을 확인할 수 있습니다.

실제 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 Chat QA 평가 테스트에 대해 자세히 알아보세요.

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

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

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 변수로 추가해야 합니다. 보안상의 이유로 GCP 자격 증명 및 관련 프로젝트는 어떠한 프로덕션 인프라에도 액세스하지 못하도록 설정되어야 합니다.

GitLab Duo Chat QA 평가 테스트

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

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

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

현재 QA 평가 테스트는 다음 컴포넌트로 구성됩니다.

Epic and issue fixtures

이 픽스처들은 GitLab이 소유한 프로젝트와 그룹에서 가져온 public 이슈 및 epic의 레플리카입니다. 내부 노트는 샘플링될 때 제외되었습니다. 이 픽스처들은 gitlab 리포지터리에 커밋되었습니다. 픽스처를 생성하는 데 사용된 스니펫을 참조하세요.

RSpec 및 도우미

  1. RSpec 파일 및 포함된 도우미는 Chat 서비스를 호출하며, 이는 질문에 대한 내부 인터페이스입니다.

  2. Chat 서비스의 답변을 수집한 후, 답변은 프롬프트에 주입되며 이는 “평가 프롬프트”로도 알려져 있으며, 질문 및 컨텍스트를 기반으로 답변의 정확성을 평가하는 LLM에게 지시합니다. 컨텍스트는 각 질문에서 물어보는 이슈 또는 epic의 JSON 직렬화를 간단히 나타냅니다.

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

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

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

QA 평가 수집 및 추적을 위한 CI/CD 자동화

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

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

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

  1. 새 파이프라인 페이지를 방문합니다.
  2. “파이프라인 실행”을 선택하여 master 브랜치에 대한 파이프라인을 실행합니다.
  3. 파이프라인이 시작되면 “Test” 단계에 있는 rspec-ee unit gitlab-duo-chat-qa 작업이 사용할 수 없습니다. 기다린 후, 매뉴얼으로 “실행” 아이콘을 선택하여 이 작업을 시작하십시오.

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

GraphQL 구독

Chat을위한 GraphQL 구독은 사용자 중심으로 작동하기 때문에 약간 다릅니다. 사용자는 Chat을 여러 브라우저 탭에서 열거나 IDE에서도 열 수 있습니다. 따라서 우리는 그들을 동기화 유지하기 위해 메시지를 여러 클라이언트로 전파해야합니다. aiAction 동작을 사용하여 chat 동작을 함으로써 다음과 같이 작동합니다.

  1. 모든 완전한 Chat 메시지 (사용자의 메시지 포함)는 userId, aiAction: "chat"로 식별자를 사용하여 전파됩니다.
  2. 스트리밍된 Chat 메시지의 청크 및 현재 사용 중인 도구는 userId, resourceId, 및 clientSubscriptionId(동작에서)를 식별자로 사용하여 전파됩니다.

여전히 userIdresourceId를 사용하여 채팅 메시지 및 현재 사용 중인 도구를 전파합니다. 그러나, 이것은 사용되지 않아야하며 더 이상 사용되어서는 안 됩니다. 우리는 이 문제의 일환으로 구독에서 resourceId를 제거하려고합니다.

프로덕트 분석

기능이 사용되는 방식을 더 잘 이해하기 위해 각 프로덕션 사용자 입력 메시지를 LLM과 Ruby를 사용하여 분석하고, 분석 결과를 Snowplow 이벤트로 추적합니다.

분석에는 최신 iglu 스키마에서 정의된 어트리뷰트 중 하나가 포함될 수 있습니다.

  • 모든 가능한 “카테고리” 및 “상세 카테고리”는 여기에 나열되어 있습니다.
  • 다음이 아직 구현되지 않았습니다:
    • “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)) 사용자는 최소 하나의 Ultimate 티어 그룹에 속하고 experiment_and_beta_features 그룹 설정이 켜져 있어야합니다. 인스턴스는 Ultimate 티어에 있어야하며 instance_level_ai_beta_features_enabled 설정이 켜져 있어야합니다.
그룹 컨텍스트에서 사용자(user.can?(:access_duo_chat, group)) 사용자는 해당 그룹의 구성원이어야하며, 이 그룹의 root 조상 그룹이 Ultimate 티어에 있으며 experiment_and_beta_features 그룹 설정이 켜져 있어야합니다 인스턴스는 Ultimate 티어에 있어야하며 instance_level_ai_beta_features_enabled 설정이 켜져 있어야하며 사용자는 그룹에 대한 적어도 읽기 권한을 가지고 있어야 합니다.
프로젝트 컨텍스트에서 사용자(user.can?(:access_duo_chat, project)) 사용자는 해당 프로젝트의 구성원이어야하며, 프로젝트는 최상위 조상 그룹이 Ultimate 티어에 있으며 experiment_and_beta_features 그룹 설정이 켜져 있어야합니다 인스턴스는 Ultimate 티어에 있어야하며 instance_level_ai_beta_features_enabled 설정이 켜져 있어야하며 사용자는 프로젝트에 대한 적어도 읽기 권한을 가지고 있어야합니다.