검색 조정으로 검색 결과 개선

조정된 검색 모델은 베이스 검색 모델보다 나은 품질 결과를 제공할 수 있습니다.

검색 조정은 일반적인 LLM으로 잘 처리되지 않는 업종별 또는 회사별 쿼리가 있는 경우에 유용합니다. 이를 통해 검색 모델을 추가로 학습시킬 수 있습니다.

제한사항

검색 조정은 비정형 데이터 스토어에만 적용할 수 있습니다.

학습 데이터 정보

검색 모델을 조정하려면 먼저 학습 데이터를 수집해야 합니다.

학습 데이터에는 최종 사용자가 질문할 것으로 예상되는 쿼리와 이러한 쿼리에 답변하는 데 필요한 관련 정보가 포함된 250~500 단어 길이의 텍스트 스니펫이 포함되어야 합니다. 각 스니펫에 쿼리에 답변하는 정보가 포함되어 있는 한 쿼리를 여러 스니펫에 연결할 수 있습니다.

학습 데이터에는 쿼리와 일치하지 않지만 스타일과 길이 측면에서 답변과 유사한 텍스트 스니펫도 포함되어야 합니다. 쿼리와 연결되지 않은 이러한 스니펫은 모델을 조정하는 데 도움이 되는 무작위 네거티브 역할을 수행합니다. 이러한 스니펫은 최소 10,000개 이상 제공하는 것이 좋습니다.

다음은 제공해야 하는 학습 데이터를 기술하는 몇 가지 용어입니다.

  • 학습 쿼리: 최종 사용자가 물을 것으로 예상되는 쿼리입니다. 특정 도메인 또는 회사 용어와 관련된 쿼리에 집중해야 합니다.

    최소 100개 이상 제공하세요.

  • 추출 세그먼트: 일반적으로 여러 단락으로 구성되는 스니펫은 데이터 스토어의 문서에 보이는 대로 정확하게 복사해야 합니다. 데이터 스토어의 모든 문서 집합을 "코퍼스"라고 부릅니다.

    다음 두 가지 유형의 추출 세그먼트를 제공해야 합니다.

    • 학습 쿼리에 답변하는 데 필요한 관련 정보가 포함된 세그먼트. 이러한 세그먼트는 쿼리와 긍정적으로 일치합니다.

    • 학습 쿼리와 연결되지 않은 세그먼트. 이러한 세그먼트는 모델 조정에서 무작위 네거티브로 사용됩니다.

    한두 문장만으로는 적절한 추출 세그먼트가 되기에 충분하지 않으며, 세그먼트에 학습을 위한 충분한 컨텍스트가 포함되어야 합니다. 예를 들어 "누가 Google을 설립했는가"와 같은 쿼리에 대한 응답으로 "래리 페이지"와 같은 짧은 추출은 충분하지 않습니다. 충분히 긴 세그먼트의 예시는 다음 표를 참조하세요.

    쿼리당 추출 세그먼트를 하나 이상 제공하고 추가적인 추출 세그먼트는 최소 10,000개 이상 제공합니다.

  • 관련성 점수: 관련성 점수는 쿼리에 대한 추출 세그먼트의 관련성을 추정하는 음수가 아닌 정수입니다. 각 쿼리 및 추출 세그먼트 쌍에 대해 점수 값을 제공합니다. 점수가 0이면 추출 세그먼트가 쿼리와 전혀 관련성이 없음을 의미합니다. 점수가 0보다 크면 어느 정도 관련성이 있음을 나타냅니다. 간단한 점수 설정을 위해서는 관련성이 완전한 세그먼트에 1점, 관련성이 없는 세그먼트에 0점을 사용하는 것이 좋습니다. 관련성 순위 지정이 필요한 경우에는 0부터 10까지 관련성 점수를 할당할 수 있으며, 10은 세그먼트 관련성이 가장 높고 0은 세그먼트 관련성이 전혀 없음을 나타냅니다.

    관련성 점수를 최소 100개 제공하고 선택적으로 비관련성 점수를 추가로 제공합니다.

쿼리 및 추출 세그먼트 쌍의 예시

다음 표에서는 쿼리 및 추출 세그먼트 쌍의 예시를 보여줍니다. 이러한 일반적인 예시는 Wikipedia에서 가져온 것입니다. 그러나 효과적인 조정을 위해서는 웹에서 쉽게 찾을 수 없는 해당 비즈니스 관련 정보가 포함된 고유 데이터 세트의 문서를 제공해야 합니다.

이 표에서 마지막 쌍은 답변이 쿼리와 관련이 없는 점수가 0인 예시입니다.

학습 쿼리 추출 세그먼트 점수
누가 Google을 창립했나요? Google은 1998년 9월 4일 당시 캘리포니아 스탠퍼드 대학교에서 박사 과정을 밟고 있던 미국 컴퓨터 과학자 래리 페이지와 세르게이 브린이 설립한 회사입니다. 이들은 함께 상장 주식의 약 14%를 소유하고 있으며, 슈퍼 의결권 주식을 통해 의결권의 56%를 장악하고 있습니다. Google은 2004년 기업공개(IPO)를 통해 상장했습니다. 2015년 Google은 모회사인 Alphabet Inc.의 전체 지분을 소유한 자회사가 되었습니다. Google은 Alphabet의 최대 자회사로, Alphabet의 인터넷 관련 자산과 지분을 보유한 지주회사입니다. 순다르 피차이는 2015년 10월 24일 당시 Alphabet의 CEO가 된 래리 페이지의 뒤를 이어 Google의 CEO가 되었습니다. 2019년 12월 3일에는 피차이도 Alphabet의 CEO가 되었습니다. [...] Google은 Forbes가 선정한 가장 가치 있는 브랜드 목록에서 2위, 인터브랜드 목록에서 4위를 차지했습니다. 1
혈액은 우심실을 떠나서 어디로 펌핑되나요? 산소가 공급된 혈액은 폐정맥을 통해 폐를 떠나 심장 왼쪽으로 돌아오면서 폐 순환을 완료합니다. 그런 다음 이 혈액은 좌심방으로 들어가고 승모판을 통해 좌심실로 펌핑됩니다. 혈액은 좌심실에서 대동맥 판막을 통과하여 대동맥으로 들어갑니다. 그런 다음 전신 순환을 통해 신체로 분배되고 이후 다시 폐 순환으로 돌아갑니다. 동맥: 혈액은 우심실에서 반월상 폐판을 통해 각 폐에 하나씩 좌우 주요 폐동맥으로 펌핑됩니다. 이 동맥은 폐 전체에 퍼져 있는 작은 폐동맥으로 분기됩니다. [...] 심장 션트는 심장 부위 사이의 비정상적인 연결로, 폐를 우회하는 방식으로 혈액이 흐르게 합니다. 1
볼링 명예의 전당은 어디에 있나요? 세계 볼링 작가(WBW) 국제 볼링 명예의 전당은 1993년에 설립되었으며 텍사스 알링턴의 국제 볼링 캠퍼스에 있는 국제 볼링 박물관 및 명예의 전당에 위치해 있습니다. 역사: 국제 볼링 박물관 및 명예의 전당은 원래 미국 미주리주 세인트루이스의 11 스타디움 플라자에 있었으며, 2008년 11월 8일까지 세인트루이스 카디널스 명예의 전당 박물관과 같은 건물을 공유하고 있었습니다. 그후 알링턴으로 이전하여 2010년 초에 재개관했습니다. 2012년에 WBW는 국제 볼링 미디어 협회와 합병했습니다. 합병 이후 WBW 명예의 전당 헌액자는 명예의 전당 이사회를 구성하는 세계 볼링 작가들이 감독하는 IBMA 루비 명예의 전당의 일부가 되었습니다.][...] 가장 많은 표를 얻은 남성과 여성이 명예의 전당에 선출됩니다. 1
하늘은 왜 파란색인가요? "Hello, World!" 프로그램은 일반적으로 간단한 컴퓨터 프로그램으로, 사용자 입력 없이 "Hello, World!"와 비슷한 메시지를 화면(주로 콘솔)에 출력(또는 표시)합니다. 대부분의 범용 프로그래밍 언어에서 작은 코드 조각으로 작성되는 이 프로그램은 언어의 기본 구문을 설명하기 위해 사용됩니다. "Hello, World!" 프로그램은 새로운 프로그래밍 언어를 배우는 학생들이 작성하는 첫 번째 프로그램이지만, 소스 코드를 컴파일하거나 실행하는 데 필요한 컴퓨터 소프트웨어가 올바르게 설치되었는지 그리고 운영자가 사용 방법을 알고 있는지 확인하기 위한 목적으로도 사용할 수 있습니다. [...] 이 프로그램의 C 언어 버전은 1972년 커니건의 "언어 B에 대한 튜토리얼 소개"라는 제목의 책 이후에 나왔습니다. 이 책에서는 이 프로그램의 첫 번째로 알려진 버전이 외부 변수의 개념을 설명하기 위한 예시로 등장합니다. 0

테스트 정보

학습 후 조정된 검색을 테스트하여 조정을 통해 결과가 개선되었는지 확인합니다. 테스트할 쿼리를 구체적으로 제공할 수 있습니다. 테스트 쿼리를 제공하지 않으면 Vertex AI Search가 학습 쿼리의 20%를 테스트 쿼리로 사용합니다.

학습 파일

학습 데이터는 3개(필요한 경우 4개)의 특정 파일로 업로드해야 합니다.

3개의 학습 파일(코퍼스 파일, 쿼리 파일, 학습 라벨 파일)과 (선택적인) 테스트 라벨 파일은 Cloud Storage에 저장해야 합니다. 이러한 파일의 경로는 trainCustomMethod 호출의 필드로 정의됩니다.

코퍼스 파일

코퍼스 파일에는 쿼리 파일의 쿼리에 답변하기 위한 정보를 포함하는 추출 세그먼트와 모델을 조정할 때 무작위 네거티브로 사용되는 많은 추가적인 세그먼트가 포함됩니다. 동일한 쿼리에 대해 여러 세그먼트로 답변할 수 있다는 점을 고려할 때 쿼리 답변이 포함된 세그먼트가 100개 이상 있어야 합니다. 또한 무작위 세그먼트는 10,000개 이상 포함해야 합니다.

데이터 스토어의 문서가 500단어보다 짧으면 전체 문서를 세그먼트로 사용할 수 있습니다. 그렇지 않으면 데이터 스토어의 문서에서 250~500 단어 사이의 무작위 세그먼트를 프로그래매틱 방식으로 생성하고 이를 코퍼스 파일에 추가합니다.

코퍼스 파일은 JSONL(JSON 줄) 파일이고 각 줄에는 문자열 값을 포함하는 _idtext 필드가 있습니다. 예를 들면 다음과 같습니다.

  {"_id": "doc1", "text": "Google was founded on September 4, 1998, by American computer scientists Larry Page and Sergey Brin while they were PhD students at Stanford University in California. Together they own about 14% of its publicly listed shares and control 56% of its stockholder voting power through super-voting stock. The company went public via an initial public offering (IPO) in 2004. In 2015, Google was reorganized as a wholly owned subsidiary of Alphabet Inc. Google is Alphabet's largest subsidiary and is a holding company for Alphabet's internet properties and interests. Sundar Pichai was appointed CEO of Google on October 24, 2015, replacing Larry Page, who became the CEO of Alphabet. On December 3, 2019, Pichai also became the CEO of Alphabet. [...] On the list of most valuable brands, Google is 105 ranked second by Forbes and fourth by Interbrand."}
  {"_id": "doc2", "text": "Oxygenated blood leaves the lungs through pulmonary veins, which return it to the left part of the heart, completing the pulmonary cycle. This blood then enters the left atrium, which pumps it through the mitral valve into the left ventricle. From the left ventricle, the blood passes through the aortic valve to the aorta. The blood is then distributed to the body through the systemic circulation before returning again to the pulmonary circulation. Arteries Main article: Pulmonary artery From the right ventricle, blood is pumped through the semilunar pulmonary valve into the left and right main pulmonary artery (one for each lung), which branch into smaller pulmonary arteries that spread throughout the lungs. [...] Cardiac shunt is an unnatural connection between parts of the heart that leads to blood flow that bypasses the lungs."}
  {"_id": "doc3", "text": "The World Bowling Writers ( WBW ) International Bowling Hall of Fame was established in 1993 and is located in the International Bowling Museum and Hall of Fame , on the International Bowling Campus in Arlington , Texas. History The International Bowling Museum and Hall of Fame was located at 11 Stadium Plaza, St. Louis, Missouri, USA, and shared the same building with the St. Louis Cardinals Hall of Fame Museum, until November 8, 2008. It moved to Arlington and reopened in early 2010. In 2012, the WBW was merged with the International Bowling Media Association. After the merger, the WBW Hall of Fame inductees became part of the IBMA Luby Hall of Fame.  officers of the World Bowling Writers, which formed the Hall's Board.][...] The man and woman who receive the most votes are elected."}
  {"_id": "doc4", "text": "A \"Hello, World!\" program is generally a simple computer program which outputs (or displays) to the screen (often the console) a message similar to "Hello, World!" while ignoring any user input. A small piece of code in most general-purpose programming languages, this program is used to illustrate a language's basic syntax. A "Hello, World!" program is often the first written by a student of a new programming language, but such a program can also be used as a check to ensure that the computer software intended to compile or run source code is correctly installed, and that its operator understands how to use it.  [...] The C-language version was preceded by Kernighan's own 1972 A Tutorial Introduction to the Language B, where the first known version of the program is found in an example used to illustrate external variables."}

파일의 최대 크기는 500,000 줄입니다.

쿼리 파일

쿼리 파일에는 모델 조정을 위해 사용되는 쿼리 예시가 포함됩니다. 각 쿼리에는 코퍼스 파일의 해당 추출 세그먼트가 하나 이상 포함되어야 합니다. 양성 일치 쿼리를 100개 이상 제공해야 합니다. 또한 비관련성 쿼리도 제공할 수 있습니다. 이러한 쿼리는 관련성 점수가 0인 추출 세그먼트에 해당합니다.

쿼리 파일은 JSONL 형식이며 코퍼스 파일과 동일한 필드를 갖습니다.

예를 들면 다음과 같습니다.

  {"_id": "query1", "text": "who founded Google?"}
  {"_id": "query2", "text": "where is blood pumped after it leaves the right ventricle?"}
  {"_id": "query3", "text": "where is the bowling hall of fame located?"}
  {"_id": "query4", "text": "why is the sky blue?"}

파일에 허용되는 최대 쿼리 수는 40,000개입니다.

학습 라벨

학습 라벨 파일은 쿼리를 추출 세그먼트와 연결하고 각 쿼리 및 세그먼트 쌍에 점수를 부여합니다.

테스트 라벨 파일이 없으면 학습 라벨 파일에 있는 쿼리의 20%가 학습 후 조정된 모델을 평가하기 위해 보존됩니다.

이 파일에는 쿼리 ID와 일치(또는 비일치) 추출 세그먼트의 ID 그리고 쿼리에 대한 세그먼트의 관련성 점수가 포함됩니다. 쿼리당 줄이 하나 이상 있어야 합니다. 쿼리가 2개의 세그먼트로 답변된 경우 해당 쿼리에 대해 2개 줄이 존재합니다. Score는 음수가 아닌 정수 값입니다. 점수가 0보다 크면 문서가 쿼리와 관련이 있음을 나타냅니다. 숫자가 클수록 관련성이 높은 것입니다. 점수를 생략한 경우 기본값은 1입니다.

학습 라벨 파일은 헤더가 있는 TSV(탭 구분 값) 파일입니다. 이 파일에는 query-id, corpus-id, score 열이 있어야 합니다. query-id는 쿼리 파일의 _id 키와 일치하는 문자열이며, corpus-id는 코퍼스 파일의 _id와 일치하는 문자열입니다.

예를 들면 다음과 같습니다.

query-id    corpus-id   score
query1  doc1    1
query2  doc2    1
query3  doc3    1
query3  doc9    1
query4  doc4    0

학습 라벨 파일에는 고유한 쿼리 ID가 100개 이상 포함되어야 합니다. 테스트 라벨 파일의 쿼리 수와 합한 학습 라벨 파일의 쿼리 ID 수는 500,000개 미만이어야 합니다.

테스트 라벨

학습 라벨 파일과 마찬가지로 이 선택적인 파일에는 쿼리 및 추출 세그먼트의 ID와 관련성 점수가 포함됩니다. 여기에는 학습 라벨 파일보다 개수가 적고 다른 쿼리가 포함됩니다. 이 파일이 제공된 경우 파일에 포함된 쿼리와 추출 세그먼트 쌍은 조정을 평가하기 위해 사용됩니다. 테스트 라벨 파일이 없으면 학습 라벨 파일의 쿼리와 추출 세그먼트 쌍이 평가에 사용됩니다.

이 파일은 학습 라벨 파일과 형식이 동일합니다.

예를 들면 다음과 같습니다.

query-id    corpus-id   score
query200    doc200  1
query201    doc201  1
query202    doc202  1

테스트 라벨 파일은 선택사항이지만, 이 파일을 제공할 경우 고유한 쿼리 ID가 3개 이상 포함되어야 합니다.

시작하기 전에

앱에 대해 엔터프라이즈 버전 기능을 사용 설정합니다.

자체 학습 데이터로 검색 모델을 조정하려면 다음 단계를 수행합니다.

콘솔

Google Cloud 콘솔을 사용하여 모델을 조정하려면 다음 단계를 수행합니다.

  1. 학습 데이터를 준비하고, 선택적으로 데이터 파일을 테스트합니다. 학습 파일에 설명된 형식을 사용합니다.

  2. Cloud Storage에 파일을 업로드합니다.

  3. Google Cloud 콘솔에서 Agent Builder 페이지로 이동합니다.

    Agent Builder

  4. 페이지에서 학습된 모델을 사용하려는 앱 이름을 클릭합니다.

  5. 탐색 메뉴에서 구성을 클릭합니다.

  6. 조정 탭을 클릭합니다.

  7. 베이스 모델 조정을 클릭합니다.

  8. 앞의 1단계와 2단계에서 준비한 코퍼스, 쿼리, 학습 및 선택적인 테스트 파일을 지정합니다.

  9. 조정 시작을 클릭합니다.

  10. 페이지를 새로고침하여 조정 탭의 최근 조정 활동 테이블에서 상태를 확인합니다.

REST

trainCustomModel 메서드를 사용하여 데이터 스토어를 조정하려면 다음 단계를 수행합니다.

  1. 학습 데이터를 준비하고, 선택적으로 데이터 파일을 테스트합니다. 학습 파일에 설명된 형식을 사용합니다.

  2. 파일을 Cloud Storage 버킷에 배치합니다.

  3. 다음 curl 명령어를 실행하여 Cloud Storage 버킷의 파일을 Vertex AI Search에 업로드합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID:trainCustomModel" \
    -d '{
    "gcsTrainingInput": {
     "corpusDataPath": "CORPUS_JSONL_GCS_PATH",
     "queryDataPath": "QUERY_JSONL_GCS_PATH",
     "trainDataPath": "TRAIN_TSV_GCS_PATH",
     "testDataPath": "TEST_TSV_GCS_PATH"
    },
    "modelType": "search-tuning"
    }'
    

    다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.

    • DATA_STORE_ID: 조정하려는 데이터 스토어의 ID입니다.

    • CORPUS_JSONL_GCS_PATH: Cloud Storage의 코퍼스 JSONL 파일 경로입니다. 예를 들면 gs://my-bucket/corpus.jsonl입니다.

    • QUERY_JSONL_GCS_PATH: Cloud Storage의 쿼리 JSONL 파일 경로입니다. 예를 들면 gs://my-bucket/query.jsonl입니다.

    • TRAIN_TSV_GCS_PATH: Cloud Storage의 학습 라벨 TSV 파일 경로입니다. 예를 들면 gs://my-bucket/train.tsv입니다.

    • TEST_TSV_GCS_PATH: 테스트 라벨 TSV 파일의 Cloud Storage 경로를 지정하기 위한 선택적인 필드입니다. 예를 들면 gs://my-bucket/test.tsv입니다. 테스트 라벨 파일이 없으면 testDataPath 필드를 삭제하거나 비워 둡니다.

    이 메서드에 대한 자세한 내용은 trainCustomModel을 참조하세요.

    데이터 파일이 업로드되면 조정이 자동으로 시작됩니다.

    클릭하여 curl 명령어 및 응답 예시를 확인하세요.

    curl -X POST
    -H "Authorization: Bearer $(gcloud auth print-access-token)"
    -H "Content-Type: application/json"
    "https://discoveryengine.googleapis.com/v1/projects/12345/locations/global/collections/default_collection/dataStores/my-data-store_4321:trainCustomModel"
    -d '{
    "dataStore":
    "projects/12345/locations/global/collections/default_collection/dataStores/my-data-store_4321",
    "gcsTrainingInput": {
    "corpusDataPath": "gs://my-bucket/corpus.jsonl",
    "queryDataPath": "gs://my-bucket/query.jsonl",
    "trainDataPath": "gs://my-bucket/train.tsv"
    },
    "modelType": "search-tuning"
    }
    {
      "name": "projects/12345/locations/global/collections/default_collection/dataStores/my-data-store_4321/operations/train-custom-model-6071430366161939774",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.discoveryengine.v1.TrainCustomModelMetadata"
      },
      "response": {
        "@type": "type.googleapis.com/google.cloud.discoveryengine.v1.TrainCustomModelResponse",
        "modelStatus": "in-progress"
      }
    }
  4. trainCustomModel 메서드로 반환된 name 값을 기록하고 장기 실행 작업에 대한 세부정보 가져오기의 안내에 따라 검색 조정 작업이 언제 완료되는지 확인합니다.

Python

자세한 내용은 Vertex AI Agent Builder Python API 참고 문서를 확인하세요.

Vertex AI Agent Builder에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


from google.api_core.client_options import ClientOptions
from google.api_core.operation import Operation
from google.cloud import discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# data_store_id = "YOUR_DATA_STORE_ID"
# corpus_data_path = "gs://my-bucket/corpus.jsonl"
# query_data_path = "gs://my-bucket/query.jsonl"
# train_data_path = "gs://my-bucket/train.tsv"
# test_data_path = "gs://my-bucket/test.tsv"


def train_custom_model_sample(
    project_id: str,
    location: str,
    data_store_id: str,
    corpus_data_path: str,
    query_data_path: str,
    train_data_path: str,
    test_data_path: str,
) -> Operation:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )
    # Create a client
    client = discoveryengine.SearchTuningServiceClient(client_options=client_options)

    # The full resource name of the data store
    data_store = f"projects/{project_id}/locations/{location}/collections/default_collection/dataStores/{data_store_id}"

    # Make the request
    operation = client.train_custom_model(
        request=discoveryengine.TrainCustomModelRequest(
            gcs_training_input=discoveryengine.TrainCustomModelRequest.GcsTrainingInput(
                corpus_data_path=corpus_data_path,
                query_data_path=query_data_path,
                train_data_path=train_data_path,
                test_data_path=test_data_path,
            ),
            data_store=data_store,
            model_type="search-tuning",
        )
    )

    # Optional: Wait for training to complete
    # print(f"Waiting for operation to complete: {operation.operation.name}")
    # response = operation.result()

    # After the operation is complete,
    # get information from operation metadata
    # metadata = discoveryengine.TrainCustomModelMetadata(operation.metadata)

    # Handle the response
    # print(response)
    # print(metadata)
    print(operation)

    return operation

조정된 검색 테스트 및 개별 검색 쿼리에 사용

조정이 완료되면 쿼리 결과를 조정된 모델과 비교하고 동일한 쿼리의 결과를 베이스 모델과 비교하여 테스트할 수 있습니다.

콘솔

Google Cloud 콘솔을 사용하여 조정된 모델의 동작을 미리보려면 다음 단계를 수행합니다.

  1. 조정 탭으로 이동합니다.

    1. Google Cloud 콘솔에서 Agent Builder 페이지로 이동합니다.

      Agent Builder

    2. 미리보려는 앱의 이름을 클릭합니다.

    3. 구성을 클릭합니다.

    4. 조정 탭을 클릭합니다.

  2. 조정된 모델을 클릭하고 오른쪽 미리보기 패널을 사용해서 조정된 모델을 사용하여 쿼리를 만듭니다.

  3. 베이스 모델을 클릭하고 오른쪽 미리보기 패널을 사용하여 원래 모델을 사용하여 쿼리를 만듭니다.

  4. 결과의 품질을 비교합니다.

REST

조정 효과를 평가하기 위해서는 enableSearchAdaptor 필드를 true로 설정하여 쿼리를 만들고 다시 false로 설정하여 쿼리를 만들어서 결과를 비교할 수 있습니다. enableSearchAdaptor 필드를 true로 설정하면 조정된 검색 버전이 해당 쿼리에 사용됩니다.

조정된 모델을 사용하는 검색 쿼리를 만들려면 다음 안내를 따르세요.

  1. 쿼리 메서드 호출에서 customFineTuningSpec 필드의 enableSearchAdaptor 필드를 true로 설정합니다.

    예를 들면 다음과 같습니다.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:search" \
    -d '{
    "query": "QUERY",
    "customFineTuningSpec": { "enableSearchAdaptor": true }
    }'
    

    다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
    • APP_ID: 쿼리할 앱의 ID입니다.

검색 쿼리에 대한 자세한 내용은 검색 결과 가져오기servingConfigs.search 메서드를 참조하세요.

Python

자세한 내용은 Vertex AI Agent Builder Python API 참고 문서를 확인하세요.

Vertex AI Agent Builder에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"          # Values: "global", "us", "eu"
# engine_id = "YOUR_APP_ID"
# search_query = "YOUR_SEARCH_QUERY"


def search_sample(
    project_id: str,
    location: str,
    engine_id: str,
    search_query: str,
) -> discoveryengine.services.search_service.pagers.SearchPager:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.SearchServiceClient(client_options=client_options)

    # The full resource name of the search app serving config
    serving_config = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_config"

    # Optional - only supported for unstructured data: Configuration options for search.
    # Refer to the `ContentSearchSpec` reference for all supported fields:
    # https://cloud.google.com/python/docs/reference/discoveryengine/latest/google.cloud.discoveryengine_v1.types.SearchRequest.ContentSearchSpec
    content_search_spec = discoveryengine.SearchRequest.ContentSearchSpec(
        # For information about snippets, refer to:
        # https://cloud.google.com/generative-ai-app-builder/docs/snippets
        snippet_spec=discoveryengine.SearchRequest.ContentSearchSpec.SnippetSpec(
            return_snippet=True
        ),
        # For information about search summaries, refer to:
        # https://cloud.google.com/generative-ai-app-builder/docs/get-search-summaries
        summary_spec=discoveryengine.SearchRequest.ContentSearchSpec.SummarySpec(
            summary_result_count=5,
            include_citations=True,
            ignore_adversarial_query=True,
            ignore_non_summary_seeking_query=True,
            model_prompt_spec=discoveryengine.SearchRequest.ContentSearchSpec.SummarySpec.ModelPromptSpec(
                preamble="YOUR_CUSTOM_PROMPT"
            ),
            model_spec=discoveryengine.SearchRequest.ContentSearchSpec.SummarySpec.ModelSpec(
                version="stable",
            ),
        ),
    )

    # Refer to the `SearchRequest` reference for all supported fields:
    # https://cloud.google.com/python/docs/reference/discoveryengine/latest/google.cloud.discoveryengine_v1.types.SearchRequest
    request = discoveryengine.SearchRequest(
        serving_config=serving_config,
        query=search_query,
        page_size=10,
        content_search_spec=content_search_spec,
        query_expansion_spec=discoveryengine.SearchRequest.QueryExpansionSpec(
            condition=discoveryengine.SearchRequest.QueryExpansionSpec.Condition.AUTO,
        ),
        spell_correction_spec=discoveryengine.SearchRequest.SpellCorrectionSpec(
            mode=discoveryengine.SearchRequest.SpellCorrectionSpec.Mode.AUTO
        ),
        # Optional: Use fine-tuned model for this request
        # custom_fine_tuning_spec=discoveryengine.CustomFineTuningSpec(
        #     enable_search_adaptor=True
        # ),
    )

    page_result = client.search(request)

    # Handle the response
    for response in page_result:
        print(response)

    return page_result

조정된 검색 사용 설정

조정된 검색을 테스트하고 모든 검색 쿼리에 사용하기로 결정한 다음에는 이를 기본 검색 모델로 지정할 수 있습니다.

콘솔

조정된 모델을 기본 모델로 지정하고 기본 미리보기 페이지, 위젯, API 호출에 적용하려면 다음 단계를 수행합니다.

  1. 조정 탭으로 이동합니다.

    1. Google Cloud 콘솔에서 Agent Builder 페이지로 이동합니다.

      Agent Builder

    2. 앱 이름을 클릭합니다.

    3. 구성을 클릭합니다.

    4. 조정 탭을 클릭합니다.

  2. 조정된 모델을 클릭합니다.

  3. 게시를 클릭합니다.

REST

조정된 모델을 기본 모델로 설정할 때는 앞의 절차에서와 같이 검색 쿼리에 customFineTuningSpec 필드를 지정할 필요가 없습니다.

모든 검색 쿼리에 대해 조정된 검색 버전을 기본적으로 사용하려면 다음 단계를 수행합니다.

  1. 조정된 검색을 기본 모델로 설정하려면 다음 curl 명령어를 실행합니다.

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search?updateMask=customFineTuningSpec.enableSearchAdaptor" \
    -d '{
    "customFineTuningSpec": {
     "enableSearchAdaptor": true
    }
    }'
    

    이 메서드에 대한 자세한 내용은 servingConfigs.patch를 참조하세요.

Python

자세한 내용은 Vertex AI Agent Builder Python API 참고 문서를 확인하세요.

Vertex AI Agent Builder에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1alpha as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# engine_id = "YOUR_DATA_STORE_ID"


def update_serving_config_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.ServingConfig:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )
    # Create a client
    client = discoveryengine.ServingConfigServiceClient(client_options=client_options)

    # The full resource name of the serving config
    serving_config_name = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_search"

    update_mask = "customFineTuningSpec.enableSearchAdaptor"

    serving_config = client.update_serving_config(
        request=discoveryengine.UpdateServingConfigRequest(
            serving_config=discoveryengine.ServingConfig(
                name=serving_config_name,
                custom_fine_tuning_spec=discoveryengine.CustomFineTuningSpec(
                    enable_search_adaptor=True  # Switch to `False` to disable tuned model
                ),
            ),
            update_mask=update_mask,
        )
    )

    # Handle the response
    print(serving_config)

    return serving_config

조정된 검색 사용 중지

조정 전보다 결과가 좋지 않거나 혹은 더 나쁜 것으로 확인된 경우와 같이 조정된 검색 버전을 더 이상 사용하지 않으려는 경우에는 조정된 검색을 사용 중지할 수 있습니다.

콘솔

베이스 모델을 다시 기본 모델로 사용하려면 다음 단계를 수행합니다.

  1. 조정 탭으로 이동합니다.

    1. Google Cloud 콘솔에서 Agent Builder 페이지로 이동합니다.

      Agent Builder

    2. 앱 이름을 클릭합니다.

    3. 구성을 클릭합니다.

    4. 조정 탭을 클릭합니다.

  2. 베이스 모델을 클릭합니다.

  3. 게시를 클릭합니다.

REST

조정된 모델 사용을 중지하려면 이전과 비슷한 curl 호출을 실행하지만 enableSearchAdaptorfalse로 설정합니다.

  1. 다음 curl 명령어를 실행합니다.

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search?updateMask=customFineTuningSpec.enableSearchAdaptor" \
    -d '{
    "customFineTuningSpec": {
     "enableSearchAdaptor": false
    }
    }'
    

    이 메서드에 대한 자세한 내용은 servingConfigs.patch를 참조하세요.

Python

자세한 내용은 Vertex AI Agent Builder Python API 참고 문서를 확인하세요.

Vertex AI Agent Builder에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1alpha as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION" # Values: "global"
# engine_id = "YOUR_DATA_STORE_ID"


def update_serving_config_sample(
    project_id: str,
    location: str,
    engine_id: str,
) -> discoveryengine.ServingConfig:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )
    # Create a client
    client = discoveryengine.ServingConfigServiceClient(client_options=client_options)

    # The full resource name of the serving config
    serving_config_name = f"projects/{project_id}/locations/{location}/collections/default_collection/engines/{engine_id}/servingConfigs/default_search"

    update_mask = "customFineTuningSpec.enableSearchAdaptor"

    serving_config = client.update_serving_config(
        request=discoveryengine.UpdateServingConfigRequest(
            serving_config=discoveryengine.ServingConfig(
                name=serving_config_name,
                custom_fine_tuning_spec=discoveryengine.CustomFineTuningSpec(
                    enable_search_adaptor=True  # Switch to `False` to disable tuned model
                ),
            ),
            update_mask=update_mask,
        )
    )

    # Handle the response
    print(serving_config)

    return serving_config

다음 단계

  • 검색 조정이 검색 품질에 미치는 영향을 이해하려면 검색 품질을 평가하세요. 자세한 내용은 검색 품질 평가를 참조하세요.