검색 증강 생성(RAG) 파이프라인에서 PDF 파싱

이 튜토리얼에서는 파싱된 PDF 콘텐츠를 기반으로 검색 증강 생성 (RAG) 파이프라인을 만드는 과정을 안내합니다.

재무 문서와 같은 PDF 파일은 구조가 복잡하고 텍스트, 숫자, 표가 섞여 있어 RAG 파이프라인에서 사용하기 어려울 수 있습니다. 이 튜토리얼에서는 Document AI의 레이아웃 파서와 함께 AI.PARSE_DOCUMENT 함수를 사용하여 PDF 파일에서 추출한 주요 정보를 기반으로 RAG 파이프라인을 빌드하는 방법을 보여줍니다.

목표

이 튜토리얼에서는 다음 태스크를 다룹니다.

  • Cloud Storage 버킷을 만들고 샘플 PDF 파일을 업로드합니다.
  • PDF 파일을 파싱하는 데 사용할 수 있는 Document AI 프로세서를 만듭니다.
  • AI.PARSE_DOCUMENT 함수를 사용하여 PDF 콘텐츠를 청크로 파싱한 다음 해당 콘텐츠를 BigQuery 테이블에 작성합니다.
  • 파싱된 PDF 콘텐츠에서 임베딩을 생성한 후 해당 임베딩을 BigQuery 테이블에 작성하기 임베딩은 PDF 콘텐츠의 수치적 표현으로, PDF 콘텐츠에 대한 시맨틱 검색을 실행할 수 있도록 합니다.
  • 임베딩에 VECTOR_SEARCH 함수를 사용하여 의미적으로 유사한 PDF 콘텐츠를 식별합니다.
  • AI.GENERATE 함수를 사용하여 텍스트를 생성하고, 벡터 검색 결과를 사용하여 프롬프트 입력을 보강하고 결과를 개선하여 검색 증강 생성 (RAG) 수행하기

비용

이 문서에서는 비용이 청구될 수 있는 Cloud de Confiance by S3NS구성요소를 사용합니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

콘솔

  1. In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Cloud de Confiance project.

  3. Enable the BigQuery, BigQuery Connection, Vertex AI, Document AI, and Cloud Storage APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  4. 프로젝트에 다음 역할이 있는지 확인합니다. 스토리지 관리자, Document AI 편집자, BigQuery 관리자, 프로젝트 IAM 관리자

    역할 확인

    1. Cloud de Confiance 콘솔에서 IAM 페이지로 이동합니다.

      IAM으로 이동
    2. 프로젝트를 선택합니다.
    3. 주 구성원 열에서 나 또는 내가 속한 그룹을 식별하는 모든 행을 찾습니다. 내가 속한 그룹을 알아보려면 관리자에게 문의하세요.

    4. 나를 지정하거나 포함하는 모든 행의 역할 열을 확인하여 역할 목록에 필요한 역할이 포함되어 있는지 확인합니다.

    역할 부여

    1. Cloud de Confiance 콘솔에서 IAM 페이지로 이동합니다.

      IAM으로 이동
    2. 프로젝트를 선택합니다.
    3. 액세스 권한 부여를 클릭합니다.
    4. 새 주 구성원 필드에 사용자 식별자를 입력합니다. 일반적으로 직원 ID 풀의 사용자 식별자입니다. 자세한 내용은 IAM 정책에서 직원 풀 사용자 표현을 참조하거나 관리자에게 문의하세요.

    5. 역할 선택을 클릭한 후 역할을 검색합니다.
    6. 역할을 추가로 부여하려면 다른 역할 추가를 클릭하고 각 역할을 추가합니다.
    7. 저장을 클릭합니다.

gcloud

  1. Google Cloud CLI를 설치합니다.

  2. gcloud CLI에서 제휴 ID를 사용하도록 구성합니다.

    자세한 내용은 제휴 ID로 gcloud CLI에 로그인을 참고하세요.

  3. gcloud CLI를 초기화하려면, 다음 명령어를 실행합니다.

    gcloud init
  4. Cloud de Confiance 프로젝트를 만들거나 선택합니다.

    프로젝트를 선택하거나 만드는 데 필요한 역할

    • 프로젝트 선택: 프로젝트를 선택하는 데는 특정 IAM 역할이 필요하지 않습니다. 역할이 부여된 프로젝트를 선택하면 됩니다.
    • 프로젝트 만들기: 프로젝트를 만들려면 resourcemanager.projects.create 권한이 포함된 프로젝트 생성자 역할(roles/resourcemanager.projectCreator)이 필요합니다. 역할 부여 방법 알아보기
    • Cloud de Confiance 프로젝트를 만듭니다.

      gcloud projects create PROJECT_ID

      PROJECT_ID를 만들려는 Cloud de Confiance 프로젝트의 이름으로 바꿉니다.

    • 생성한 Cloud de Confiance 프로젝트를 선택합니다.

      gcloud config set project PROJECT_ID

      PROJECT_ID을 Cloud de Confiance 프로젝트 이름으로 바꿉니다.

  5. Cloud de Confiance 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  6. BigQuery, BigQuery Connection, Vertex AI, Document AI, Cloud Storage API를 사용 설정합니다.

    API 사용 설정에 필요한 역할

    API를 사용 설정하려면 serviceusage.services.enable 권한이 포함된 서비스 사용량 관리자 IAM 역할 (roles/serviceusage.serviceUsageAdmin)이 필요합니다. 역할 부여 방법 알아보기

    gcloud services enable bigquery.googleapis.com bigqueryconnection.googleapis.com aiplatform.googleapis.com documentai.googleapis.com storage.googleapis.com
  7. 사용자 계정에 역할을 부여합니다. 다음 IAM 역할마다 다음 명령어를 1회 실행합니다. roles/storage.admin, roles/documentai.editor, roles/bigquery.admin, roles/resourcemanager.projectIamAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • USER_IDENTIFIER: 사용자 계정입니다. 예를 보려면 IAM 정책에서 직원 풀 사용자 표현을 참고하세요.
    • ROLE: 사용자 계정에 부여하는 IAM 역할입니다.

데이터 세트 만들기

ML 모델을 저장할 BigQuery 데이터 세트를 만듭니다.

콘솔

  1. Cloud de Confiance 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery 페이지로 이동

  2. 탐색기 창에서 프로젝트 이름을 클릭합니다.

  3. 작업 보기 > 데이터 세트 만들기를 클릭합니다.

  4. 데이터 세트 만들기 페이지에서 다음을 수행합니다.

    • 데이터 세트 IDbqml_tutorial를 입력합니다.

    • 위치 유형에 대해 멀티 리전을 선택한 다음 US를 선택합니다.

    • 나머지 기본 설정은 그대로 두고 데이터 세트 만들기를 클릭합니다.

bq

새 데이터 세트를 만들려면 bq mk --dataset 명령어를 사용합니다.

  1. 데이터 위치가 US로 설정된 bqml_tutorial 데이터 세트를 만듭니다.

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. 데이터 세트가 생성되었는지 확인합니다.

    bq ls

API

데이터 세트 리소스가 정의된 datasets.insert 메서드를 호출합니다.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

샘플 PDF를 Cloud Storage에 업로드

샘플 PDF를 Cloud Storage에 업로드하려면 다음 단계를 따르세요.

  1. https://www.federalreserve.gov/publications/files/scf23.pdf로 이동하여 다운로드를 클릭하여 scf23.pdf 샘플 PDF를 다운로드합니다.
  2. Cloud Storage 버킷 생성
  3. scf23.pdf 파일을 버킷에 업로드합니다.

문서 프로세서 만들기

us 멀티 리전의 레이아웃 파서 프로세서를 기반으로 문서 프로세서를 만듭니다. 다음 섹션에서 사용할 예측 엔드포인트를 프로세서 세부정보 페이지에서 복사합니다.

PDF 파일을 청크로 파싱

AI.PARSE_DOCUMENT 함수와 함께 문서 프로세서를 사용하여 PDF 파일을 청크로 파싱한 다음 해당 콘텐츠를 테이블에 작성합니다.

  1. Cloud de Confiance 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 쿼리를 실행합니다.

    CREATE OR REPLACE TABLE bqml_tutorial.parsed_pdf
    AS (
      SELECT *
      FROM
        AI.PARSE_DOCUMENT(
          (
            SELECT
              OBJ.MAKE_REF("gs://BUCKET/scf23.pdf") AS ref
          ),
          endpoint => "PREDICTION_ENDPOINT",
          chunk_size => 250)
    );

임베딩 생성

파싱된 PDF 콘텐츠의 임베딩을 생성한 후 테이블에 작성합니다.

  1. Cloud de Confiance 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 쿼리를 실행합니다.

    CREATE OR REPLACE TABLE `bqml_tutorial.embeddings` AS (
      SELECT *, AI.EMBED(content, endpoint => 'text-embedding-005') AS embedding
      FROM bqml_tutorial.parsed_pdf
    );

파싱된 PDF 콘텐츠에 대해 벡터 검색을 실행합니다.

다음 쿼리는 텍스트 입력을 가져와 AI.EMBED 함수를 사용하여 해당 입력의 임베딩을 만든 다음 VECTOR_SEARCH 함수를 사용하여 입력 임베딩을 가장 유사한 PDF 콘텐츠 임베딩과 일치시킵니다. 결과는 가족 순자산의 변화와 가장 관련성이 높은 상위 10개 PDF 청크입니다.

  1. BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 SQL 문을 실행합니다.

    SELECT distance, base.chunk_id, base.start_page, base.end_page, base.content
    FROM
      VECTOR_SEARCH(
        TABLE `bqml_tutorial.embeddings`,
        'embedding',
        query_value =>
          AI.EMBED(
            'Did the typical family net worth increase? If so, by how much?',
            endpoint => 'text-embedding-005').result,
        top_k => 3,
        OPTIONS => '{"fraction_lists_to_search": 0.01}')
    ORDER BY distance DESC;

    출력은 다음과 비슷합니다.

    +----------+----------+------------+----------+-----------------------------------+
    | distance | chunk_id | start_page | end_page | content                           |
    +----------+----------+------------+----------+-----------------------------------+
    | 0.645685 | 26       | 17         | 18       | 18 Between the first quarter of   |
    |          |          |            |          | 2019 and the first quarter of...  |
    +----------+----------+------------+----------+-----------------------------------+
    | 0.602665 | 30       | 19         | 21       | ## Net Worth by Family            |
    |          |          |            |          | Characteristics...                |
    +----------+----------+------------+----------+-----------------------------------+
    | 0.599438 | 24       | 17         | 21       | # Net Worth                       |
    |          |          |            |          | The net improvements in...        |
    +----------+----------+------------+----------+-----------------------------------+
    

벡터 검색 결과로 보강된 텍스트 생성

임베딩에 벡터 검색을 실행하여 의미적으로 유사한 PDF 콘텐츠를 식별한 다음, 벡터 검색 결과와 함께 AI.GENERATE_TEXT 함수를 사용하여 프롬프트 입력을 보강하고 텍스트 생성 결과를 개선합니다. 이 경우 쿼리는 PDF 청크의 정보를 사용하여 지난 10년간의 가족 순자산 변화에 관한 질문에 답변합니다.

  1. Cloud de Confiance 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 쿼리를 실행합니다.

    SELECT
      AI.GENERATE(
        CONCAT('Did the typical family net worth change? How does this compare the SCF survey a decade earlier? Be concise and use the following context:',
                STRING_AGG(FORMAT("context: %s", base.content), ',\n')
        )
      ).result AS response
    FROM
      VECTOR_SEARCH(
        TABLE `bqml_tutorial.embeddings`,
        'embedding',
        query_value =>
          AI.EMBED(
            'Did the typical family net worth increase? If so, by how much?',
            endpoint => 'text-embedding-005').result,
        top_k => 3,
        OPTIONS => '{"fraction_lists_to_search": 0.01}')

    출력은 다음과 비슷합니다.

    +-------------------------------------------------------------------------+
    | response                                                                |
    +-------------------------------------------------------------------------+
    | Yes, the typical family net worth changed significantly.                |
    |                                                                         |
    | Real median net worth surged 37% between the 2019 and 2022 SCF surveys. |
    | This contrasts sharply with a decade earlier (2010-2013), when real     |
    | median net worth decreased 2%.                                          |
    +-------------------------------------------------------------------------+
    

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

    Cloud de Confiance 프로젝트를 삭제합니다.

    gcloud projects delete PROJECT_ID

다음 단계

- AI.PARSE_DOCUMENT 함수에 대해 자세히 알아보세요. - 시맨틱 검색 및 RAG 실행에 대해 자세히 알아봅니다.