RAG로 그라운딩된 답변 생성

Vertex AI Agent Builder에서 검색 증강 생성(RAG) 경험에 따라 다음 그라운딩 소스를 기반으로 프롬프트에 대해 그라운딩된 답변을 생성할 수 있습니다.

  • Google 검색: 모델을 전 세계 지식, 다양한 주제 또는 인터넷의 최신 정보와 연결하려면 Google 검색으로 그라운딩을 사용하세요. Google 검색을 이용한 그라운딩에서는 동적 검색이 지원되어 필요할 때만 Google 검색에 그라운딩된 결과를 생성하는 옵션이 제공됩니다. 따라서 동적 검색 구성에 따라 프롬프트에 최근 이벤트에 대한 지식이 필요한지 평가하고 Google 검색에 그라운딩을 사용 설정합니다. 자세한 내용은 동적 검색을 참조하세요.
  • 인라인 텍스트: 요청에 제공된 사실 텍스트라고 부르는 텍스트 조각에서 응답을 그라운딩하기 위해 인라인 텍스트에 그라운딩을 사용합니다. 사실 텍스트는 지정된 요청에 대해 사실로 간주되는 사용자가 제공한 문구입니다. 이 모델은 사실 텍스트의 진위를 확인하지 않습니다.
  • Vertex AI Search 데이터 스토어: Vertex AI Search 데이터 스토어에서 기업 문서로 모델을 연결하려면 Vertex AI Search와 함께 그라운딩을 사용합니다.

이 페이지에서는 다음 접근 방식을 이용해서 이러한 그라운딩 소스를 기반으로 그라운딩된 답변을 생성하는 방법을 설명합니다.

또한 모델로부터 답변을 스트리밍하도록 선택할 수 있습니다. 스트리밍으로 그라운딩된 답변을 생성하는 방식은 실험적인 기능입니다.

애플리케이션에 따라 다른 방법을 이용해서 그라운딩된 답변을 생성할 수도 있습니다. 자세한 내용은 검색 및 RAG 경험을 빌드하기 위한 Vertex AI API를 참조하세요.

용어

그라운딩된 답변 생성 방법을 사용하기 전에 입력과 출력, 요청의 구성 방법, RAG 관련 용어를 이해하는 것이 도움이 됩니다.

RAG 용어

대규모 언어 모델은 RAG를 통해 사용자가 선택한 데이터 소스에 그라운딩된 응답을 생성할 수 있습니다. RAG에는 두 가지 단계가 있습니다.

  1. 검색: 가장 관련성 있는 사실을 빠르게 가져오는 것이 일반적인 검색 문제일 수 있습니다. RAG를 이용하면 답변을 생성하는 데 중요한 사실을 빠르게 검색할 수 있습니다.
  2. 생성: LLM은 검색된 사실을 이용해서 그라운딩된 응답을 생성합니다.

따라서 그라운딩된 답변 생성 방법은 그라운딩 소스로부터 사실을 검색하고 그라운딩된 답변을 생성합니다.

입력 데이터

그라운딩된 답변 생성 방법을 이용하려면 요청에 다음 입력이 필요합니다.

  • 역할: 제공된 텍스트의 발신자로서, 사용자(user) 또는 모델(model) 중 하나일 수 있습니다.

  • 텍스트: 역할이 user이면 텍스트가 프롬프트이고 역할이 model이면 텍스트가 그라운딩된 답변입니다. 요청에서 역할 및 텍스트를 지정하는 방법은 다음과 같이 결정됩니다.

    • 싱글턴 답변 생성의 경우 사용자가 요청에 프롬프트 텍스트를 전송하고 모델이 응답에 답변 텍스트를 전송합니다.
    • 멀티턴 답변 생성의 경우 요청에는 모든 이전 턴의 프롬프트-답변 쌍과 현재 턴에 대한 사용자의 프롬프트 텍스트가 포함됩니다. 따라서 이러한 요청에서 역할은 프롬프트 텍스트에 대해서는 user이고 답변 텍스트에 대해서는 model입니다.
  • 시스템 안내: 모델의 동작을 제어하고 그에 따라 출력을 수정하는 프롬프트에 대한 프리앰블입니다. 예를 들어 생성된 답변에 페르소나를 추가하거나 모델이 출력 텍스트 형식을 특정 방식으로 지정하도록 설정할 수 있습니다. 멀티턴 답변 생성의 경우 모든 턴에 대해 시스템 안내를 제공해야 합니다. 자세한 내용은 시스템 안내 사용을 참조하세요.

  • 그라운딩 소스: 답변이 그라운딩되는 소스이고, 다음 중 하나 이상일 수 있습니다.

    • Google 검색: Google 검색 결과와 함께 답변을 그라운딩합니다. 그라운딩 소스가 Google 검색이면 동적 검색 기준점이 포함된 동적 검색 구성을 지정할 수 있습니다. 자세한 내용은 동적 검색을 참조하세요.

    • 인라인 텍스트: 요청에 제공된 사실 텍스트에서 답변을 그라운딩합니다. 사실 텍스트는 지정된 요청에 대해 사실로 간주되는 사용자가 제공한 문구입니다. 이 모델은 사실 텍스트의 진위를 확인하지 않습니다. 각 인라인 텍스트 소스에서 최대 100개의 사실 텍스트를 제공할 수 있습니다. 사실 텍스트는 제목, 저자, URI와 같은 메타 속성을 사용하여 지원할 수 있습니다. 이러한 메타 속성은 답변을 지원하는 청크를 참조할 때 응답에 반환됩니다.

    • Vertex AI Search 데이터 스토어: Vertex AI Search 데이터 스토어의 문서에서 답변을 그라운딩합니다.

    제공된 요청에서 인라인 텍스트 소스와 Vertex AI Search 데이터 스토어 소스를 모두 제공할 수 있습니다. Google 검색을 이러한 소스와 조합할 수는 없습니다. 따라서 Google 검색 결과로 답변을 그라운딩하려면 Google 검색을 유일한 그라운딩 소스로 지정하여 개별 요청을 전송해야 합니다.

    순서에 관계없이 최대 10개의 그라운딩 소스를 제공할 수 있습니다. 예를 들어 총 10개의 그라운딩 소스를 얻기 위해 다음 순서로 다음 개수의 그라운딩 소스를 제공한다고 가정해 보세요.

    • 인라인 텍스트 소스 3개(각 소스에 최대 100개의 사실 텍스트 포함 가능)
    • Vertex AI Search 데이터 스토어 6개
    • 인라인 텍스트 소스 4개(각 소스에 최대 100개의 사실 텍스트 포함 가능)

    각 소스에는 요청에 지정된 순서로 색인이 할당됩니다. 예를 들어 요청에 소스 조합을 지정한 경우 다음 테이블에 표시된 것처럼 소스 색인이 할당됩니다.

    그라운딩 소스 색인
    인라인 텍스트 1번 0
    인라인 텍스트 2번 1
    Vertex AI Search 데이터 스토어 1번 2
    인라인 텍스트 3번 3
    Vertex AI Search 데이터 스토어 2번 4

    이 색인은 응답에서 인용되며 출처를 추적할 때 유용합니다.

  • 생성 사양: 다음 정보로 구성된 모델 구성의 사양입니다.

    • 모델 ID: 답변 생성에 사용할 Vertex AI Gemini 모델을 지정합니다. 그라운딩된 답변을 생성하는 데 사용할 수 있는 모델 목록은 지원되는 모델을 참조하세요.
    • 모델 매개변수: 사용하도록 선택하는 모델에 설정할 수 있는 매개변수를 지정합니다. 이러한 매개변수에는 언어, 강도, Top-P, Top-K가 있습니다. 이러한 매개변수에 대한 자세한 내용은 Gemini 모델 매개변수를 참조하세요.

출력 데이터

모델이 생성하는 응답은 후보라고 부르며 다음 데이터를 포함합니다. 모든 필드가 출력에 제공되지 않을 수 있습니다.

  • 역할: 그라운딩된 답변의 발신자입니다. 응답에는 항상 그라운딩된 답변 텍스트가 포함됩니다. 따라서 응답의 역할은 항상 모델입니다.

  • 텍스트: 그라운딩된 답변입니다.

  • 그라운딩 점수: 지정된 소스에서 답변이 그라운딩된 정도를 나타내는 [0, 1] 범위의 부동 소수점 값입니다.

  • 그라운딩 메타데이터: 그라운딩 소스에 대한 메타데이터입니다. 그라운딩 메타데이터에는 다음 정보가 포함됩니다.

    • 지원 청크: 답변을 지원하는 청크 목록입니다. 각 지원 청크에는 출처를 추적할 때 도움이 되는 지원 청크 색인이 할당됩니다. 각 지원 청크에는 다음이 포함됩니다.

      • 청크 텍스트: 답변 또는 답변의 일부(주장 텍스트라고 부름)가 추출되는 소스에서 가져온 정확한 인용 텍스트 부분입니다. 이 부분은 응답에 항상 표시되지 않을 수 있습니다.
      • 소스: 요청의 소스에 할당된 색인입니다.
      • 소스 메타데이터: 청크에 대한 메타데이터입니다. 소스에 따라 소스 메타데이터는 다음 중 하나일 수 있습니다.

        • 인라인 소스의 경우에는 제목, 저자, URI와 같이 요청에 지정된 추가 세부정보가 메타데이터가 될 수 있습니다.
        • Vertex AI Search 데이터 스토어의 경우에는 문서 ID, 문서 제목, URI(Cloud Storage 위치), 페이지 번호가 메타데이터가 될 수 있습니다.
        • Google 검색을 통한 그라운딩의 경우 그라운딩된 결과가 생성되면 그라운딩된 결과를 생성하는 데 사용된 콘텐츠의 게시자로 리디렉션되는 URI가 메타데이터에 포함됩니다. 메타데이터에는 게시자의 도메인도 포함됩니다. 제공된 URI는 그라운딩된 결과가 생성된 후 최대 30일 동안 액세스 가능한 상태로 유지됩니다.
    • 그라운딩 지원: 답변의 주장에 대한 그라운딩 정보입니다. 그라운딩 지원에는 다음 정보가 포함됩니다.

      • 주장 텍스트: 지원 청크 텍스트로 지원되는 답변 또는 답변의 일부입니다.
      • 지원 청크 색인: 청크가 지원 청크 목록에 표시되는 순서로 지원 청크에 할당된 색인입니다.
      • 웹 검색어: Google 검색 추천을 위해 추천되는 검색어입니다.
      • 검색 추천: 응답과 함께 Google 검색 추천이 수신된 경우 이러한 응답은 Google 검색을 사용한 그라운딩에 대한 서비스 약관의 영향을 받는 "그라운딩된 결과"입니다. 자세한 내용은 서비스 약관을 참조하세요. searchEntryPoint 필드 내의 renderedContent 필드는 Google 검색 추천을 구현하기 위해 제공된 코드입니다. Google 검색 추천을 사용하려면 Google 검색 추천 사용을 참조하세요.

싱글턴에서 그라운딩된 답변 생성

이 섹션에서는 다음 소스에서 그라운딩된 답변을 생성하는 방법을 설명합니다.

인라인 텍스트 및 Vertex AI Search 데이터 스토어에서 답변 그라운딩

다음 샘플은 인라인 텍스트 및 Vertex AI Search 데이터 스토어를 그라운딩 소스로 지정하여 프롬프트 텍스트를 전송하는 방법을 보여줍니다. 이 샘플은 generateGroundedContent 메서드를 사용합니다.

REST

  1. 다음 curl 요청에 프롬프트를 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_NUMBER/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT"
         }
       ]
     }
    ],
    "systemInstruction": {
       "parts": {
           "text": "SYSTEM_INSTRUCTION"
       }
    },
    "groundingSpec": {
     "groundingSources": [
       {
         "inlineSource": {
           "groundingFacts": [
             {
               "factText": "FACT_TEXT_1",
               "attributes": {
                 "title": "TITLE_1",
                 "uri": "URI_1",
                 "author": "AUTHOR_1"
               }
             }
           ]
         }
       },
       {
         "inlineSource": {
           "groundingFacts": [
             {
               "factText": "FACT_TEXT_2",
               "attributes": {
                 "title": "TITLE_2",
                 "uri": "URI_2"
               }
             },
             {
               "factText": "FACT_TEXT_3",
               "attributes": {
                 "title": "TITLE_3",
                 "uri": "URI_3"
               }
             }
           ]
         }
       },
       {
         "searchSource": {
           "servingConfig": "projects/PROJECT_NUMBER/locations/global/collections/default_collection/engines/APP_ID_1/servingConfigs/default_search"
         }
       },
       {
         "searchSource": {
           "servingConfig": "projects/PROJECT_NUMBER/locations/global/collections/default_collection/engines/APP_ID_2/servingConfigs/default_search"
         }
       }
      ]
    },
    "generationSpec": {
      "modelId": "MODEL_ID",
      "temperature": TEMPERATURE,
      "topP": TOP_P,
      "topK": TOP_K
    }
    }'
    

    다음을 바꿉니다.

    • PROJECT_NUMBER: Google Cloud 프로젝트의 수입니다.
    • PROMPT_TEXT: 사용자의 프롬프트입니다.
    • SYSTEM_INSTRUCTION: 프리앰블 또는 추가 컨텍스트를 제공하는 선택적인 필드입니다.
    • FACT_TEXT_N: 답변을 그라운딩하는 인라인 텍스트입니다. 최대 100개의 사실 텍스트를 제공할 수 있습니다.
    • TITLE_N: 인라인 텍스트에 대해 제목 메타 속성을 설정하는 선택적인 필드입니다.
    • URI_N: 인라인 텍스트에 대해 URI 메타 속성을 설정하는 선택적인 필드입니다.
    • AUTHOR_N: 인라인 텍스트에 대해 저자 메타 속성을 설정하는 선택적인 필드입니다.
    • APP_ID_N: Vertex AI Search 앱의 ID입니다.
    • MODEL_ID: 그라운딩된 답변을 생성하는 데 사용하려는 Gemini 모델의 모델 ID를 설정하는 선택적인 필드입니다. 사용 가능한 모델 ID 목록은 지원되는 모델을 참조하세요.
    • TEMPERATURE: 샘플링에 사용되는 강도를 설정하는 선택적인 필드입니다. Google에서는 0.0 강도가 권장됩니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.
    • TOP_P: 모델의 Top-P 값을 설정하는 선택적인 필드입니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.
    • TOP_K: 모델의 Top-K 값을 설정하는 선택적인 필드입니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.

Python

from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_number = "YOUR_PROJECT_NUMBER"
# engine_id = "YOUR_ENGINE_ID"

client = discoveryengine.GroundedGenerationServiceClient()

request = discoveryengine.GenerateGroundedContentRequest(
    # The full resource name of the location.
    # Format: projects/{project_number}/locations/{location}
    location=client.common_location_path(project=project_number, location="global"),
    generation_spec=discoveryengine.GenerateGroundedContentRequest.GenerationSpec(
        model_id="gemini-1.5-flash",
    ),
    # Conversation between user and model
    contents=[
        discoveryengine.GroundedGenerationContent(
            role="user",
            parts=[
                discoveryengine.GroundedGenerationContent.Part(
                    text="How did Google do in 2020? Where can I find BigQuery docs?"
                )
            ],
        )
    ],
    system_instruction=discoveryengine.GroundedGenerationContent(
        parts=[
            discoveryengine.GroundedGenerationContent.Part(
                text="Add a smiley emoji after the answer."
            )
        ],
    ),
    # What to ground on.
    grounding_spec=discoveryengine.GenerateGroundedContentRequest.GroundingSpec(
        grounding_sources=[
            discoveryengine.GenerateGroundedContentRequest.GroundingSource(
                inline_source=discoveryengine.GenerateGroundedContentRequest.GroundingSource.InlineSource(
                    grounding_facts=[
                        discoveryengine.GroundingFact(
                            fact_text=(
                                "The BigQuery documentation can be found at https://cloud.google.com/bigquery/docs/introduction"
                            ),
                            attributes={
                                "title": "BigQuery Overview",
                                "uri": "https://cloud.google.com/bigquery/docs/introduction",
                            },
                        ),
                    ]
                ),
            ),
            discoveryengine.GenerateGroundedContentRequest.GroundingSource(
                search_source=discoveryengine.GenerateGroundedContentRequest.GroundingSource.SearchSource(
                    # The full resource name of the serving config for a Vertex AI Search App
                    serving_config=f"projects/{project_number}/locations/global/collections/default_collection/engines/{engine_id}/servingConfigs/default_search",
                ),
            ),
        ]
    ),
)
response = client.generate_grounded_content(request)

# Handle the response
print(response)

인라인 텍스트 및 Vertex AI Search에서 그라운딩된 싱글턴 답변 생성 예시

다음 예시에서 요청은 하나의 인라인 사실 텍스트와 하나의 Vertex AI Search 데이터 스토어를 포함한 그라운딩 소스를 지정합니다. 이 샘플은 generateGroundedContent 메서드를 사용합니다. 이 예시에서는 또한 웃는 이모티콘으로 답변을 끝내는 시스템 명령을 사용합니다.

REST

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://discoveryengine.googleapis.com/v1/projects/123456/locations/global:generateGroundedContent" \
-d '
{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "How did google do in 2020? Where can I find Bigquery docs?"
        }
      ]
    }
  ],
  "systemInstruction": {
      "parts": {
          "text": "Add a smiley emoji after the answer."
      }
  },
  "groundingSpec": {
    "groundingSources": [
      {
        "inline_source": {
          "grounding_facts": [
            {
              "fact_text": "The BigQuery documentation can be found at https://cloud.google.com/bigquery/docs/introduction",
              "attributes": {
                "title": "BigQuery Overview",
                "uri": "https://cloud.google.com/bigquery/docs/introduction"
              }
            }
          ]
        }
      },
      {
        "searchSource": {
          "servingConfig": "projects/123456/locations/global/collections/default_collection/engines/app_id_example/servingConfigs/default_search"
        }
      }
    ]
  },
  "generationSpec": {
    "modelId": "gemini-1.5-flash"
  }
}'

Google 검색으로 그라운딩된 답변 생성

공개적으로 사용 가능한 웹 데이터를 이용해서 생성된 응답을 그라운딩할 수 있습니다.

동적 검색

요청에서 동적 검색을 사용하여 Google 검색 시 그라운딩을 해제할 경우를 선택할 수 있습니다. 이 기능은 Google 검색으로 그라운딩된 답변이 프롬프트에 필요하지 않고 지원되는 모델이 그라운딩 없이도 기존 지식을 기반으로 답변을 제공할 수 있는 경우에 유용합니다. 이렇게 하면 지연 시간, 품질, 비용을 더 효과적으로 관리할 수 있습니다.

동적 검색 예측 점수 및 기준점

그라운딩된 답변을 생성하도록 요청을 전송하면 Vertex AI Agent Builder가 프롬프트에 예측 점수를 할당합니다. 예측 점수는 [0,1] 범위의 부동 소수점 값입니다. 값은 프롬프트가 Google 검색의 최신 정보로 답변을 그라운딩함으로써 이득을 얻을 수 있는지 여부에 따라 달라집니다. 따라서 웹의 최신 사실 데이터로 그라운딩된 답변이 필요한 프롬프트는 예측 점수가 더 높고, 모델에서 생성된 답변으로 충분한 프롬프트는 예측 점수가 더 낮습니다.

다음은 몇 가지 프롬프트와 해당 예측 점수에 대한 예시입니다.

프롬프트 예측 점수 의견
"피오니에 대한 시를 만들어주세요" 0.13 모델이 기본 지식에 의존할 수 있고 답변에 그라운딩이 필요하지 않습니다.
"2세 아이를 위한 장난감을 추천해주세요" 0.36 모델이 기본 지식에 의존할 수 있고 답변에 그라운딩이 필요하지 않습니다.
"아시아식 과카몰리 레시피를 알려줄 수 있을까요?" 0.55 Google 검색은 그라운딩된 답변을 제공할 수 있지만 그라운딩이 엄격하게 필요하지는 않습니다. 모델 지식으로 충분할 수 있습니다.
"Agent Builder란 무엇인가요? Agent Builder에서 그라운딩 비용은 어떻게 청구되나요?" 0.72 Google 검색으로 잘 그라운딩된 답변을 생성해야 합니다.
"최근 F1 그랑프리 우승자는 누구인가요?" 0.97 Google 검색으로 잘 그라운딩된 답변을 생성해야 합니다.

그라운딩된 답변 생성 요청에서 기준점과 함께 동적 검색 구성을 지정할 수 있습니다. 기준점은 [0,1] 범위의 부동 소수점 값이며 기본값은 0.7입니다. 기준점 값이 0이면 응답이 항상 Google 검색에서 그라운딩됩니다. 다른 모든 기준점 값에는 다음이 적용됩니다.

  • 예측 점수가 기준점보다 크거나 같으면 답변이 Google 검색에서 그라운딩됩니다. 기준점이 낮으면 Google 검색의 그라운딩을 사용하여 생성된 답변이 포함되는 프롬프트가 증가합니다.
  • 예측 점수가 기준점보다 낮으면 모델이 여전히 답변을 생성할 수 있지만 Google 검색으로 그라운딩되지 않습니다.

비즈니스 요구에 적합한 올바른 기준점을 찾으려면 발생할 것으로 예상되는 쿼리 대표 집합을 만들 수 있습니다. 그런 후 응답의 예측 점수에 따라 쿼리를 정렬하고 사용 사례에 적합한 기준점을 선택할 수 있습니다.

Google 검색으로 답변 그라운딩

다음 샘플은 Google 검색을 그라운딩 소스로 지정하여 프롬프트에서 그라운딩된 답변을 생성하는 방법을 보여줍니다. 이 샘플은 generateGroundedContent 메서드를 사용합니다.

REST

  1. 다음 curl 요청에 프롬프트를 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_NUMBER/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT"
         }
       ]
     }
    ],
    "systemInstruction": {
       "parts": {
           "text": "SYSTEM_INSTRUCTION"
       }
    },
    "groundingSpec": {
     "groundingSources": [
     {
         "googleSearchSource": {
              "dynamicRetrievalConfig": {
                  "predictor":{
                      "threshold": DYNAMIC_RETRIEVAL_THRESHOLD
                  }
              }
         }
     }
    ]
    },
    "generationSpec": {
     "modelId": "MODEL_ID",
     "temperature": TEMPERATURE,
     "topP": TOP_P,
     "topK": TOP_K
    }
    }'
    

    다음을 바꿉니다.

    • PROJECT_NUMBER: Google Cloud 프로젝트의 수입니다.
    • PROMPT_TEXT: 사용자의 프롬프트입니다.
    • SYSTEM_INSTRUCTION: 프리앰블 또는 추가 컨텍스트를 제공하는 선택적인 필드입니다.
    • MODEL_ID: 그라운딩된 답변을 생성하는 데 사용하려는 Gemini 모델의 모델 ID를 설정하는 선택적인 필드입니다. 사용 가능한 모델 ID 목록은 지원되는 모델을 참조하세요.
    • TEMPERATURE: 샘플링에 사용되는 강도를 설정하는 선택적인 필드입니다. Google에서는 0.0 강도가 권장됩니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.
    • TOP_P: 모델의 Top-P 값을 설정하는 선택적인 필드입니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.
    • TOP_K: 모델의 Top-K 값을 설정하는 선택적인 필드입니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.
    • DYNAMIC_RETRIEVAL_THRESHOLD: 동적 검색 구성을 호출하기 위한 기준점을 설정하는 선택적인 필드입니다. [0,1] 범위의 부동 소수점 값입니다. dynamicRetrievalConfig 필드를 추가하지만 predictor 또는 threshold 필드를 설정하지 않을 때 기본 기준점 값은 0.7입니다. dynamicRetrievalConfig 필드를 설정하지 않으면 답변이 항상 그라운딩됩니다.

Python

from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_number = "YOUR_PROJECT_NUMBER"

client = discoveryengine.GroundedGenerationServiceClient()

request = discoveryengine.GenerateGroundedContentRequest(
    # The full resource name of the location.
    # Format: projects/{project_number}/locations/{location}
    location=client.common_location_path(project=project_number, location="global"),
    generation_spec=discoveryengine.GenerateGroundedContentRequest.GenerationSpec(
        model_id="gemini-1.5-flash",
    ),
    # Conversation between user and model
    contents=[
        discoveryengine.GroundedGenerationContent(
            role="user",
            parts=[
                discoveryengine.GroundedGenerationContent.Part(
                    text="How much is Google stock?"
                )
            ],
        )
    ],
    system_instruction=discoveryengine.GroundedGenerationContent(
        parts=[
            discoveryengine.GroundedGenerationContent.Part(text="Be comprehensive.")
        ],
    ),
    # What to ground on.
    grounding_spec=discoveryengine.GenerateGroundedContentRequest.GroundingSpec(
        grounding_sources=[
            discoveryengine.GenerateGroundedContentRequest.GroundingSource(
                google_search_source=discoveryengine.GenerateGroundedContentRequest.GroundingSource.GoogleSearchSource(
                    # Optional: For Dynamic Retrieval
                    dynamic_retrieval_config=discoveryengine.GenerateGroundedContentRequest.DynamicRetrievalConfiguration(
                        predictor=discoveryengine.GenerateGroundedContentRequest.DynamicRetrievalConfiguration.DynamicRetrievalPredictor(
                            threshold=0.7
                        )
                    )
                )
            ),
        ]
    ),
)
response = client.generate_grounded_content(request)

# Handle the response
print(response)

다음 예시에서 요청은 Google Search를 그라운딩 소스로 지정합니다. 이 샘플은 generateGroundedContent 메서드를 사용합니다. 이 예시에서는 또한 웃는 이모티콘으로 답변을 끝내는 시스템 명령을 사용합니다.

REST

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://discoveryengine.googleapis.com/v1/projects/123456/locations/global:generateGroundedContent" \
-d '
{
"contents": [{
  "role": "user",
  "parts": [{
    "text": "What is vertex ai agent builder?"
}]
}],
"systemInstruction": {
   "parts": {
      "text": "Add a smiley emoji after the answer."
   }
},
"groundingSpec": {
  "groundingSources": [
  {
      "googleSearchSource": {
        "dynamicRetrievalConfig": {
               "predictor":{
                   "threshold": 0.6
               }
           }
      }
  }
 ]
},
"generationSpec": {
  "modelId": "gemini-1.5-flash"
}
}
'

멀티턴에서 그라운딩된 답변 생성

멀티턴 답변 생성의 각 요청에서는 모든 이전 턴에 사용자와 모델 사이에 교환된 모든 텍스트를 전송해야 합니다. 이렇게 하면 연속성이 보장되고 최신 프롬프트에 대해 답변을 생성하기 위한 컨텍스트가 유지됩니다.

멀티턴 답변 생성으로 그라운딩된 답변을 얻으려면 다음을 수행합니다.

REST

다음 샘플은 멀티턴으로 후속 질문 프롬프트 텍스트를 전송하는 방법을 보여줍니다. 이러한 샘플에서는 generateGroundedContent 메서드를 사용하고 Google 검색으로 답변을 그라운딩합니다. 비슷한 단계를 사용해서 다른 그라운딩 소스를 사용하여 그라운딩된 답변을 생성할 수 있습니다.

  1. 다음 curl 요청에 첫 번째 프롬프트를 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_NUMBER/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT_TURN_1"
         }
       ]
     }
    ],
    "systemInstruction": {
       "parts": {
           "text": "SYSTEM_INSTRUCTION_TURN_1"
       }
    },
    "groundingSpec": {
     "groundingSources": [
       {
         "googleSearchSource": {}
       }
     ]
    },
    "generationSpec": {
     "modelId": "MODEL_ID",
     "temperature": TEMPERATURE,
     "topP": TOP_P,
     "topK": TOP_K
    }
    }'
    

    다음을 바꿉니다.

    • PROJECT_NUMBER: Google Cloud 프로젝트의 수입니다.
    • PROMPT_TEXT_TURN_1: 첫 번째 턴의 사용자의 프롬프트 텍스트입니다.
    • SYSTEM_INSTRUCTION_TURN_1: 프리앰블 또는 추가 컨텍스트를 제공하는 선택적인 필드입니다. 멀티턴 답변 생성의 경우 모든 턴에 대해 시스템 안내를 제공해야 합니다.
    • MODEL_ID: 그라운딩된 답변을 생성하는 데 사용하려는 Gemini 모델의 모델 ID를 설정하는 선택적인 필드입니다. 사용 가능한 모델 ID 목록은 지원되는 모델을 참조하세요.
    • TEMPERATURE: 샘플링에 사용되는 강도를 설정하는 선택적인 필드입니다. Google에서는 0.0 강도가 권장됩니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.
    • TOP_P: 모델의 Top-P 값을 설정하는 선택적인 필드입니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.
    • TOP_K: 모델의 Top-K 값을 설정하는 선택적인 필드입니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.
  2. 후속 질문으로 두 번째 프롬프트를 전송합니다. 컨텍스트를 위해 모델의 해당 답변과 함께 사용자의 첫 번째 프롬프트를 추가합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_NUMBER/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT_TURN_1"
         }
       ]
     },
     {
       "role": "model",
       "parts": [
         {
           "text": "ANSWER_TEXT_TURN_1"
         }
       ]
     },
     {
       "role": "user",
       "parts": [
         {
           "text": "PROMPT_TEXT_TURN_2"
         }
       ]
     }
    ],
    "systemInstruction": {
       "parts": {
           "text": "SYSTEM_INSTRUCTION_TURN_2"
       }
    },
    "groundingSpec": {
     "groundingSources": [
       {
         "googleSearchSource": {}
       }
     ]
    },
    "generationSpec": {
     "modelId": "MODEL_ID",
     "temperature": TEMPERATURE,
     "topP": TOP_P,
     "topK": TOP_K
    }
    }'
    

    다음을 바꿉니다.

    • PROJECT_NUMBER: Google Cloud 프로젝트의 수입니다.
    • PROMPT_TEXT_TURN_1: 첫 번째 턴의 사용자의 프롬프트 텍스트입니다.
    • ANSWER_TEXT_TURN_1: 첫 번째 턴의 모델의 답변 텍스트입니다.
    • PROMPT_TEXT_TURN_2: 두 번째 턴의 사용자의 프롬프트 텍스트입니다.
    • SYSTEM_INSTRUCTION_TURN_2: 프리앰블 또는 추가 컨텍스트를 제공하는 선택적인 필드입니다. 멀티턴 답변 생성의 경우 모든 턴에 대해 시스템 안내를 제공해야 합니다.
    • MODEL_ID: 그라운딩된 답변을 생성하는 데 사용하려는 Gemini 모델의 모델 ID를 설정하는 선택적인 필드입니다. 사용 가능한 모델 ID 목록은 지원되는 모델을 참조하세요.
    • TEMPERATURE: 샘플링에 사용되는 강도를 설정하는 선택적인 필드입니다. Google에서는 0.0 강도가 권장됩니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.
    • TOP_P: 모델의 Top-P 값을 설정하는 선택적인 필드입니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.
    • TOP_K: 모델의 Top-K 값을 설정하는 선택적인 필드입니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.
  3. 이 프로세스를 반복하여 추가 후속 질문 답변을 얻습니다. 각 턴마다 모델의 해당 답변과 함께 사용자의 이전 프롬프트를 모두 추가합니다.

멀티턴 답변 생성 예시

다음 예시에서 요청은 두 번의 턴으로 답변을 생성하기 위해 3개의 인라인 사실 텍스트를 그라운딩 소스로 지정합니다. 이 샘플은 generateGroundedContent 메서드를 사용합니다. 이 예시에서는 또한 첫 번째 턴에서 웃는 이모티콘으로 답변을 끝내는 시스템 명령을 사용합니다.

REST

  1. 다음 curl 요청에 첫 번째 프롬프트를 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/123456/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "Summarize what happened in 2023 in one paragraph."
         }
       ]
     }
    ],
    "systemInstruction": {
      "parts": {
          "text": "Add a smiley emoji after the answer."
      }
    },
    "grounding_spec": {
     "grounding_sources": [
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, the world population surpassed 8 billion. This milestone marked a significant moment in human history, highlighting both the rapid growth of our species and the challenges of resource management and sustainability in the years to come.",
               "attributes": {
                 "title": "title_1",
                 "uri": "some-uri-1"
               }
             }
           ]
         }
       },
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, global e-commerce sales reached an estimated $5.7 trillion. The continued rise of online shopping solidified its position as a dominant force in retail, with major implications for traditional brick-and-mortar stores and the logistics networks supporting worldwide deliveries.",
               "attributes": {
                 "title": "title_2",
                 "uri": "some-uri-2"
               }
             }
           ]
         }
       },
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, the global average surface temperature was approximately 0.2 degrees Celsius higher than the 20th-century average. This continued the worrying trend of global warming, underscoring the urgency of worldwide climate initiatives, carbon reduction efforts, and investment in renewable energy sources.",
               "attributes": {
                 "title": "title_3",
                 "uri": "some-uri-3"
               }
             }
           ]
         }
       }
     ]
    },
    "generationSpec": {
     "modelId": "gemini-1.5-flash"
    }
    }'
    
  2. 후속 질문으로 두 번째 프롬프트를 전송합니다. 컨텍스트를 위해 모델의 해당 답변과 함께 사용자의 첫 번째 프롬프트를 추가합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/123456/locations/global:generateGroundedContent" \
    -d '
    {
    "contents": [
     {
       "role": "user",
       "parts": [
         {
           "text": "Summarize what happened in 2023 in one paragraph."
         }
       ]
     },
     {
       "role": "model",
       "parts": [
         {
           "text": "In 2023, the global average surface temperature increased, the world population surpassed 8 billion, and global e-commerce sales reached an estimated $5.7 trillion.  😊 \n"
         }
       ]
     },
     {
       "role": "user",
       "parts": [
         {
           "text": "Rephrase the answer in an abstracted list."
         }
       ]
     }
    ],
    "grounding_spec": {
     "grounding_sources": [
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, the world population surpassed 8 billion. This milestone marked a significant moment in human history, highlighting both the rapid growth of our species and the challenges of resource management and sustainability in the years to come.",
               "attributes": {
                 "title": "title_1",
                 "uri": "some-uri-1"
               }
             }
           ]
         }
       },
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, global e-commerce sales reached an estimated $5.7 trillion. The continued rise of online shopping solidified its position as a dominant force in retail, with major implications for traditional brick-and-mortar stores and the logistics networks supporting worldwide deliveries.",
               "attributes": {
                 "title": "title_2",
                 "uri": "some-uri-2"
               }
             }
           ]
         }
       },
       {
         "inline_source": {
           "grounding_facts": [
             {
               "fact_text": "In 2023, the global average surface temperature was approximately 0.2 degrees Celsius higher than the 20th-century average. This continued the worrying trend of global warming, underscoring the urgency of worldwide climate initiatives, carbon reduction efforts, and investment in renewable energy sources.",
               "attributes": {
                 "title": "title_3",
                 "uri": "some-uri-3"
               }
             }
           ]
         }
       }
     ]
    },
    "generationSpec": {
     "modelId": "gemini-1.5-flash"
    }
    }'
    

그라운딩된 답변 스트리밍

모델로부터 답변을 스트리밍하도록 선택할 수 있습니다. 이 기능은 답변이 특히 길고 전체 응답을 한 번에 전송할 때 상당한 지연이 발생할 수 있는 사용 사례에서 유용합니다. 답변을 스트리밍하면 답변 텍스트의 순차적 부분이 포함된 여러 후보 배열로 응답이 구분됩니다.

스트리밍되고 그라운딩된 답변을 얻으려면 다음을 수행합니다.

REST

다음 샘플은 그라운딩된 답변을 스트리밍하는 방법을 보여줍니다. 이 샘플은 streamGenerateGroundedContent 메서드를 사용하고 동적 검색 구성 없이 Google 검색으로 답변을 그라운딩합니다. 비슷한 단계를 사용해서 다른 그라운딩 소스를 사용하여 그라운딩된 답변을 생성할 수 있습니다.

  1. 다음 curl 요청에 프롬프트를 전송합니다.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_NUMBER/locations/global:streamGenerateGroundedContent" \
    -d '
    [
    {
     "contents": [
       {
         "role": "user",
         "parts": [
           {
             "text": "PROMPT_TEXT"
           }
         ]
       }
     ],
     "systemInstruction": {
         "parts": {
             "text": "SYSTEM_INSTRUCTION"
         }
     },
     "groundingSpec": {
       "groundingSources": [
         {
           "googleSearchSource": {}
         }
       ]
     },
    "generationSpec": {
     "modelId": "MODEL_ID",
     "temperature": TEMPERATURE,
     "topP": TOP_P,
     "topK": TOP_K
    }
    }
    ]'
    

    다음을 바꿉니다.

    • PROJECT_NUMBER: Google Cloud 프로젝트의 수입니다.
    • PROMPT_TEXT: 사용자의 프롬프트입니다.
    • SYSTEM_INSTRUCTION: 프리앰블 또는 추가 컨텍스트를 제공하는 선택적인 필드입니다.
    • MODEL_ID: 그라운딩된 답변을 생성하는 데 사용하려는 Gemini 모델의 모델 ID를 설정하는 선택적인 필드입니다. 사용 가능한 모델 ID 목록은 지원되는 모델을 참조하세요.
    • TEMPERATURE: 샘플링에 사용되는 강도를 설정하는 선택적인 필드입니다. Google에서는 0.0 강도가 권장됩니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.
    • TOP_P: 모델의 Top-P 값을 설정하는 선택적인 필드입니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.
    • TOP_K: 모델의 Top-K 값을 설정하는 선택적인 필드입니다. 자세한 내용은 Gemini 모델 매개변수를 참조하세요.

Python

from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"

client = discoveryengine.GroundedGenerationServiceClient()

request = discoveryengine.GenerateGroundedContentRequest(
    # The full resource name of the location.
    # Format: projects/{project_number}/locations/{location}
    location=client.common_location_path(project=project_number, location="global"),
    generation_spec=discoveryengine.GenerateGroundedContentRequest.GenerationSpec(
        model_id="gemini-1.5-flash",
    ),
    # Conversation between user and model
    contents=[
        discoveryengine.GroundedGenerationContent(
            role="user",
            parts=[
                discoveryengine.GroundedGenerationContent.Part(
                    text="Summarize how to delete a data store in Vertex AI Agent Builder?"
                )
            ],
        )
    ],
    grounding_spec=discoveryengine.GenerateGroundedContentRequest.GroundingSpec(
        grounding_sources=[
            discoveryengine.GenerateGroundedContentRequest.GroundingSource(
                google_search_source=discoveryengine.GenerateGroundedContentRequest.GroundingSource.GoogleSearchSource()
            ),
        ]
    ),
)
responses = client.stream_generate_grounded_content(iter([request]))

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

그라운딩된 답변 스트리밍 예시

다음 예시에서 요청은 Google 검색을 그라운딩 소스로 지정하고 동적 검색 구성 없이 답변을 스트리밍합니다. 스트리밍된 답변은 여러 응답 후보로 분산됩니다. 이 샘플은 streamGenerateGroundedContent 메서드를 사용합니다.

REST

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://discoveryengine.googleapis.com/v1alpha/projects/123456/locations/global:streamGenerateGroundedContent" \
-d '
[
{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "Summarize How to delete a data store in Vertex AI Agent Builder?"
        }
      ]
    }
  ],
  "groundingSpec": {
    "groundingSources": [
      {
        "googleSearchSource": {}
      }
    ]
  },
  "generationSpec": {
    "modelId": "gemini-1.5-flash"
  }
}
]'

지원되는 모델

다음 모델은 그라운딩을 지원합니다.

  • 텍스트 입력만 지원되는 Gemini 1.5 Pro
  • 텍스트 입력만 지원되는 Gemini 1.5 Flash
  • 텍스트 입력만 지원되는 Gemini 1.0 Pro

이러한 Gemini 모델에 대한 자세한 내용은 Gemini 모델 버전 및 수명 주기를 참조하세요.

generateGroundedContent 메서드를 호출할 때는 다음 모델 ID를 사용할 수 있습니다.

모델 ID 자동 업데이트됨
default
gemini-1.0-pro
gemini-1.0-pro-001 아니요
gemini-1.0-pro-002 아니요
gemini-1.5-flash
gemini-1.5-flash-001 아니요
gemini-1.5-pro
gemini-1.5-pro-001 아니요

다음 단계

다른 RAG API를 통한 그라운딩된 생성 방법으로 비정형 데이터로부터 그라운딩된 답변 생성하는 방법 알아보기