文档理解

您可以在 Gemini 请求中添加文档(.pdf.txt 文件),以执行涉及理解所含文档内容的任务。本页面介绍了如何使用 Google Cloud 控制台和 Vertex AI API 将 PDF 添加到 Vertex AI 中对 Gemini 的请求。

支持的模型

下表列出了支持文档理解的模型:

模型 PDF 模态详情

Gemini 1.5 Flash

前往 Gemini 1.5 Flash 模型卡片

每个 PDF 的页数上限:1000

PDF 文件大小上限:30 MB

Gemini 1.5 Pro

前往 Gemini 1.5 Pro 模型卡片

每个 PDF 的页数上限:1000

PDF 文件大小上限:30 MB

Gemini 1.0 Pro Vision

前往 Gemini 1.0 Pro Vision 模型卡片

每个提示的页数上限:16

PDF 文件大小上限:30 MB

如需查看 Gemini 模型支持的语言列表,请参阅 Google 模型的模型信息。如需详细了解如何设计多模态提示,请参阅设计多模态提示。如果您正在寻找一种直接在移动应用和 Web 应用中使用 Gemini 的方法,请参阅适用于 Android、Swift、Web 和 Flutter 应用的 Vertex AI in Firebase SDK

在请求中添加文档

以下代码示例展示了如何在提示请求中添加 PDF 文件。此 PDF 文件示例适用于所有 Gemini 多模态模型。

Python

如需了解如何安装或更新 Vertex AI SDK for Python,请参阅安装 Vertex AI SDK for Python。如需了解详情,请参阅 Vertex AI SDK for Python API 参考文档

流式回答和非流式回答

您可以选择模型是生成流式回答还是非流式回答。 对于流式回答,您将在生成每个响应的输出词元后立即收到响应。对于非流式回答,您将在生成所有输出词元后收到所有响应。

对于流式回答,请使用 generate_content 中的 stream 参数。

  response = model.generate_content(contents=[...], stream = True)
  

对于非流式回答,请移除该参数或将参数设置为 False

示例代码

import vertexai

from vertexai.generative_models import GenerativeModel, Part

# TODO(developer): Update project_id and location
vertexai.init(project=PROJECT_ID, location="us-central1")

model = GenerativeModel("gemini-1.5-flash-002")

prompt = """
You are a very professional document summarization specialist.
Please summarize the given document.
"""

pdf_file = Part.from_uri(
    uri="gs://cloud-samples-data/generative-ai/pdf/2403.05530.pdf",
    mime_type="application/pdf",
)
contents = [pdf_file, prompt]

response = model.generate_content(contents)
print(response.text)

Java

在尝试此示例之前,请按照《Vertex AI 快速入门》中的 Java 设置说明执行操作。如需了解详情,请参阅适用于 Gemini 的 Vertex AI Java SDK 参考文档

如需向 Vertex AI 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为本地开发环境设置身份验证

流式回答和非流式回答

您可以选择模型是生成流式回答还是非流式回答。 对于流式回答,您将在生成每个响应的输出词元后立即收到响应。对于非流式回答,您会在生成所有输出词元之后收到所有回答。

对于流式回答,请使用 generateContentStream 方法。

  public ResponseStream<GenerateContentResponse> generateContentStream(Content content)
  

对于非流式回答,请使用 generateContent 方法。

  public GenerateContentResponse generateContent(Content content)
  

示例代码


import com.google.cloud.vertexai.VertexAI;
import com.google.cloud.vertexai.api.GenerateContentResponse;
import com.google.cloud.vertexai.generativeai.ContentMaker;
import com.google.cloud.vertexai.generativeai.GenerativeModel;
import com.google.cloud.vertexai.generativeai.PartMaker;
import com.google.cloud.vertexai.generativeai.ResponseHandler;
import java.io.IOException;

public class PdfInput {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-google-cloud-project-id";
    String location = "us-central1";
    String modelName = "gemini-1.5-flash-001";

    pdfInput(projectId, location, modelName);
  }

  // Analyzes the given video input.
  public static String pdfInput(String projectId, String location, String modelName)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs
    // to be created once, and can be reused for multiple requests.
    try (VertexAI vertexAI = new VertexAI(projectId, location)) {
      String pdfUri = "gs://cloud-samples-data/generative-ai/pdf/2403.05530.pdf";

      GenerativeModel model = new GenerativeModel(modelName, vertexAI);
      GenerateContentResponse response = model.generateContent(
          ContentMaker.fromMultiModalData(
              "You are a very professional document summarization specialist.\n"
                  + "Please summarize the given document.",
              PartMaker.fromMimeTypeAndData("application/pdf", pdfUri)
          ));

      String output = ResponseHandler.getText(response);
      System.out.println(output);
      return output;
    }
  }
}

Node.js

在尝试此示例之前,请按照《生成式 AI 快速入门:使用 Node.js SDK》中的 Node.js 设置说明执行操作。如需了解详情,请参阅适用于 Gemini 的 Node.js SDK 参考文档

如需向 Vertex AI 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为本地开发环境设置身份验证

流式回答和非流式回答

您可以选择模型是生成流式回答还是非流式回答。 对于流式回答,您将在生成每个响应的输出词元后立即收到响应。对于非流式回答,您会在生成所有输出词元之后收到所有回答。

对于流式回答,请使用 generateContentStream 方法。

  const streamingResp = await generativeModel.generateContentStream(request);
  

对于非流式回答,请使用 generateContent 方法。

  const streamingResp = await generativeModel.generateContent(request);
  

示例代码

const {VertexAI} = require('@google-cloud/vertexai');

/**
 * TODO(developer): Update these variables before running the sample.
 */
async function analyze_pdf(projectId = 'PROJECT_ID') {
  const vertexAI = new VertexAI({project: projectId, location: 'us-central1'});

  const generativeModel = vertexAI.getGenerativeModel({
    model: 'gemini-1.5-flash-001',
  });

  const filePart = {
    file_data: {
      file_uri: 'gs://cloud-samples-data/generative-ai/pdf/2403.05530.pdf',
      mime_type: 'application/pdf',
    },
  };
  const textPart = {
    text: `
    You are a very professional document summarization specialist.
    Please summarize the given document.`,
  };

  const request = {
    contents: [{role: 'user', parts: [filePart, textPart]}],
  };

  const resp = await generativeModel.generateContent(request);
  const contentResponse = await resp.response;
  console.log(JSON.stringify(contentResponse));
}

Go

在尝试此示例之前,请按照《Vertex AI 快速入门》中的 Go 设置说明执行操作。如需了解详情,请参阅适用于 Gemini 的 Vertex AI Go SDK 参考文档

如需向 Vertex AI 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为本地开发环境设置身份验证

流式回答和非流式回答

您可以选择模型是生成流式回答还是非流式回答。 对于流式回答,您将在生成每个响应的输出词元后立即收到响应。对于非流式回答,您会在生成所有输出词元之后收到所有回答。

对于流式回答,请使用 GenerateContentStream 方法。

  iter := model.GenerateContentStream(ctx, genai.Text("Tell me a story about a lumberjack and his giant ox. Keep it very short."))
  

对于非流式回答,请使用 GenerateContent 方法。

  resp, err := model.GenerateContent(ctx, genai.Text("What is the average size of a swallow?"))
  

示例代码

import (
	"context"
	"errors"
	"fmt"
	"io"

	"cloud.google.com/go/vertexai/genai"
)

// generateContentFromPDF generates a response into the provided io.Writer, based upon the PDF
func generateContentFromPDF(w io.Writer, projectID, location, modelName string) error {
	// location := "us-central1"
	// modelName := "gemini-1.5-flash-001"

	ctx := context.Background()

	client, err := genai.NewClient(ctx, projectID, location)
	if err != nil {
		return fmt.Errorf("unable to create client: %w", err)
	}
	defer client.Close()

	model := client.GenerativeModel(modelName)

	part := genai.FileData{
		MIMEType: "application/pdf",
		FileURI:  "gs://cloud-samples-data/generative-ai/pdf/2403.05530.pdf",
	}

	res, err := model.GenerateContent(ctx, part, genai.Text(`
			You are a very professional document summarization specialist.
    		Please summarize the given document.
	`))
	if err != nil {
		return fmt.Errorf("unable to generate contents: %w", err)
	}

	if len(res.Candidates) == 0 ||
		len(res.Candidates[0].Content.Parts) == 0 {
		return errors.New("empty response from model")
	}

	fmt.Fprintf(w, "generated response: %s\n", res.Candidates[0].Content.Parts[0])
	return nil
}

C#

在尝试此示例之前,请按照《Vertex AI 快速入门》中的 C# 设置说明执行操作。如需了解详情,请参阅 Vertex AI C# 参考文档

如需向 Vertex AI 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为本地开发环境设置身份验证

流式回答和非流式回答

您可以选择模型是生成流式回答还是非流式回答。 对于流式回答,您将在生成每个响应的输出词元后立即收到响应。对于非流式回答,您会在生成所有输出词元之后收到所有回答。

对于流式回答,请使用 StreamGenerateContent 方法。

  public virtual PredictionServiceClient.StreamGenerateContentStream StreamGenerateContent(GenerateContentRequest request)
  

对于非流式回答,请使用 GenerateContentAsync 方法。

  public virtual Task<GenerateContentResponse> GenerateContentAsync(GenerateContentRequest request)
  

如需详细了解服务器如何流式传输回答,请参阅流式传输 RPC

示例代码


using Google.Cloud.AIPlatform.V1;
using System;
using System.Threading.Tasks;

public class PdfInput
{
    public async Task<string> SummarizePdf(
        string projectId = "your-project-id",
        string location = "us-central1",
        string publisher = "google",
        string model = "gemini-1.5-flash-001")
    {

        var predictionServiceClient = new PredictionServiceClientBuilder
        {
            Endpoint = $"{location}-aiplatform.googleapis.com"
        }.Build();

        string prompt = @"You are a very professional document summarization specialist.
Please summarize the given document.";

        var generateContentRequest = new GenerateContentRequest
        {
            Model = $"projects/{projectId}/locations/{location}/publishers/{publisher}/models/{model}",
            Contents =
            {
                new Content
                {
                    Role = "USER",
                    Parts =
                    {
                        new Part { Text = prompt },
                        new Part { FileData = new() { MimeType = "application/pdf", FileUri = "gs://cloud-samples-data/generative-ai/pdf/2403.05530.pdf" }}
                    }
                }
            }
        };

        GenerateContentResponse response = await predictionServiceClient.GenerateContentAsync(generateContentRequest);

        string responseText = response.Candidates[0].Content.Parts[0].Text;
        Console.WriteLine(responseText);

        return responseText;
    }
}

REST

设置您的环境后,您可以使用 REST 测试文本提示。以下示例会向发布方模型端点发送请求。

在使用任何请求数据之前,请先进行以下替换:

  • LOCATION:处理请求的区域。输入支持的区域。如需查看支持的区域的完整列表,请参阅可用位置

    点击即可展开可用区域的部分列表

    • us-central1
    • us-west4
    • northamerica-northeast1
    • us-east4
    • us-west1
    • asia-northeast3
    • asia-southeast1
    • asia-northeast1
  • PROJECT_ID:您的项目 ID
  • FILE_URI:要包含在提示中的文件的 URI 或网址。可接受的值包括:
    • Cloud Storage 存储桶 URI:对象必须可公开读取,或者位于发送请求的同一 Google Cloud 项目中。
    • HTTP 网址:文件网址必须可公开读取。您可以为每个请求指定一个视频文件和最多 10 个图片文件。音频文件和文档的大小不得超过 15 MB。
    • YouTube 视频网址:YouTube 视频必须由您用于登录 Google Cloud 控制台的账号所拥有,或者是公开的。每个请求仅支持一个 YouTube 视频网址。

    指定 fileURI 时,您还必须指定文件的媒体类型 (mimeType)。

    如果您在 Cloud Storage 中没有 PDF 文件,则可以使用以下公开可用的文件:gs://cloud-samples-data/generative-ai/pdf/2403.05530.pdf,其 MIME 类型为 application/pdf。如需查看此 PDF,请打开示例 PDF 文件

  • MIME_TYPE:在 datafileUri 字段中指定的文件的媒体类型。可接受的值包括:

    点击即可展开 MIME 类型

    • application/pdf
    • audio/mpeg
    • audio/mp3
    • audio/wav
    • image/png
    • image/jpeg
    • image/webp
    • text/plain
    • video/mov
    • video/mpeg
    • video/mp4
    • video/mpg
    • video/avi
    • video/wmv
    • video/mpegps
    • video/flv
  • TEXT:要包含在提示中的文本说明。 例如 You are a very professional document summarization specialist. Please summarize the given document.

如需发送请求,请选择以下方式之一:

curl

将请求正文保存在名为 request.json 的文件中。在终端中运行以下命令,在当前目录中创建或覆盖此文件:

cat > request.json << 'EOF'
{
  "contents": {
    "role": "USER",
    "parts": [
      {
        "fileData": {
          "fileUri": "FILE_URI",
          "mimeType": "MIME_TYPE"
        }
      },
      {
        "text": "TEXT"
      }
    ]
  }
}
EOF

然后,执行以下命令以发送 REST 请求:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-flash:generateContent"

PowerShell

将请求正文保存在名为 request.json 的文件中。在终端中运行以下命令,在当前目录中创建或覆盖此文件:

@'
{
  "contents": {
    "role": "USER",
    "parts": [
      {
        "fileData": {
          "fileUri": "FILE_URI",
          "mimeType": "MIME_TYPE"
        }
      },
      {
        "text": "TEXT"
      }
    ]
  }
}
'@  | Out-File -FilePath request.json -Encoding utf8

然后,执行以下命令以发送 REST 请求:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-flash:generateContent" | Select-Object -Expand Content

您应该收到类似以下内容的 JSON 响应。

请注意此示例网址中的以下内容:
  • 使用 generateContent 方法请求在回答完全生成后返回回答。 为了降低真人观众对于延迟的感知度,请使用 streamGenerateContent 方法在生成回答时流式传输回答。
  • 多模态模型 ID 位于网址末尾且位于方法之前(例如 gemini-1.5-flashgemini-1.0-pro-vision)。此示例可能还支持其他模型。

控制台

如需使用 Google Cloud 控制台发送多模态提示,请执行以下操作:

  1. 在 Google Cloud 控制台的 Vertex AI 部分中,进入 Vertex AI Studio 页面。

    前往 Vertex AI Studio

  2. 点击打开自由格式模式

  3. 可选:配置模型和参数:

    • 模型:选择一个模型。
    • 区域:选择您要使用的区域。
    • 温度:使用滑块或文本框输入温度值。

      温度 (temperature) 在生成回复期间用于采样,在应用 topPtopK 时会生成回复。温度可以控制词元选择的随机性。 较低的温度有利于需要更少开放性或创造性回复的提示,而较高的温度可以带来更具多样性或创造性的结果。温度为 0 表示始终选择概率最高的词元。在这种情况下,给定提示的回复大多是确定的,但可能仍然有少量变化。

      如果模型返回的回答过于笼统、过于简短,或者模型给出后备回答,请尝试提高温度。

    • 输出 token 限制:使用滑块或文本框输入输出上限值。

      回复中可生成的词元数量上限。词元约为 4 个字符。100 个词元对应大约 60-80 个单词。

      指定较低的值可获得较短的回答,指定较高的值可获得可能较长的回答。

    • 添加停止序列:可选。输入停止序列,即包含空格的一系列字符。如果模型遇到停止序列,则回答生成会停止。停止序列不包含在回答中,您最多可以添加五个停止序列。

  4. 可选:如需配置高级参数,请点击高级,然后按如下方式进行配置:

    点击即可展开高级配置

    • Top-K:使用滑块或文本框输入 top-K 值。 (Gemini 1.5 不支持)。

      Top-K 可更改模型选择输出词元的方式。如果 top-K 设为 1,表示所选词元是模型词汇表的所有词元中概率最高的词元(也称为贪心解码)。如果 top-K 设为 3,则表示系统将从 3 个概率最高的词元(通过温度确定)中选择下一个词元。

      在每个词元选择步骤中,系统都会对概率最高的 top-K 词元进行采样。然后,系统会根据 top-P 进一步过滤词元,并使用温度采样选择最终的词元。

      指定较低的值可获得随机程度较低的回答,指定较高的值可获得随机程度较高的回答。

    • Top-P:使用滑块或文本框输入 top-P 值。 系统会按照概率从最高到最低的顺序选择词元,直到所选词元的概率总和等于 top-P 的值。如需获得数量最小的变量结果,请将 top-P 设置为 0
    • 回答数量上限:使用滑块或文本框输入要生成的回答数量的值。
    • 流式回答:启用此选项可在生成回答时输出回答。
    • 安全过滤器阈值:选择您看到可能有害的回答的可能性的阈值。
    • 启用接地:多模态提示不支持接地。

  5. 点击插入媒体,然后为文件选择一个来源。

    上传

    选择您要上传的文件,然后点击打开

    通过网址

    输入要使用的文件的网址,然后点击插入

    Cloud Storage

    选择存储桶,接着从存储桶选择您要导入的文件,然后点击选择

    Google 云端硬盘

    1. 选择一个账号,并在您首次选择此选项时同意 Vertex AI Studio 访问您的账号。您可以上传多个文件,但总大小不得超过 10 MB。单个文件的大小不能超过 7 MB。
    2. 点击要添加的文件。
    3. 点击选择

      文件缩略图会显示在提示窗格中。 系统还会显示 token 总数。如果提示数据超过 token 限制,则 token 会被截断,并且不会用于处理数据。

  6. 提示窗格中输入文本提示。

  7. 可选:如需查看 Token ID 到文本Token ID,请点击提示窗格中的 token 数量

  8. 点击提交

  9. 可选:如需将提示保存到我的提示,请点击 保存

  10. 可选:如需获取提示的 Python 代码或 curl 命令,请点击 获取代码

设置模型参数

可以对多模态模型设置以下模型参数:

Top-P

Top-P 可更改模型选择输出词元的方式。系统会按照概率从最高(见 top-K)到最低的顺序选择词元,直到所选词元的概率总和等于 top-P 的值。例如,如果词元 A、B 和 C 的概率分别为 0.3、0.2 和 0.1,并且 top-P 值为 0.5,则模型将选择 A 或 B 作为下一个词元(通过温度确定),并会排除 C,将其作为候选词元。

指定较低的值可获得随机程度较低的回答,指定较高的值可获得随机程度较高的回答。

Top-K

Top-K 可更改模型选择输出词元的方式。如果 top-K 设为 1,表示所选词元是模型词汇表的所有词元中概率最高的词元(也称为贪心解码)。如果 top-K 设为 3,则表示系统将从 3 个概率最高的词元(通过温度确定)中选择下一个词元。

在每个词元选择步骤中,系统都会对概率最高的 top-K 词元进行采样。然后,系统会根据 top-P 进一步过滤词元,并使用温度采样选择最终的词元。

指定较低的值可获得随机程度较低的回答,指定较高的值可获得随机程度较高的回答。

温度

温度 (temperature) 在生成回复期间用于采样,在应用 topPtopK 时会生成回复。温度可以控制词元选择的随机性。 较低的温度有利于需要更少开放性或创造性回复的提示,而较高的温度可以带来更具多样性或创造性的结果。温度为 0 表示始终选择概率最高的词元。在这种情况下,给定提示的回复大多是确定的,但可能仍然有少量变化。

如果模型返回的回答过于笼统、过于简短,或者模型给出后备回答,请尝试提高温度。

有效的参数值

参数 Gemini 1.0 Pro Vision Gemini 1.5 Pro Gemini 1.5 Flash
Top-K 1 - 40(默认为 32) 不支持 不支持
Top-P 0 - 1.0(默认 1.0) 0 - 1.0(默认 0.95) 0 - 1.0(默认 0.95)
温度 0 - 1.0(默认 0.4) 0 - 2.0(默认 1.0) 0 - 2.0(默认 1.0)

文档要求

多模态 Gemini 模型支持以下文档 MIME 类型:

MIME 类型文档 Gemini 1.5 Flash Gemini 1.5 Pro Gemini 1.0 Pro Vision
PDF - application/pdf
文本 - text/plain

PDF 文件被视为图片,因此 PDF 文件的单页被视为一张图片。提示中允许的页面数取决于模型可以支持的图片数量:

  • Gemini 1.0 Pro Vision:16 页
  • Gemini 1.5 Pro 和 Gemini 1.5 Flash:1,000 页

PDF 词元化

PDF 文件被视为图片,因此 PDF 文件的每页都会以与图片相同的方式进行词元化。

此外,PDF 的费用遵循 Gemini 图片价格。 例如,如果您在 Gemini API 调用中包含一个两页的 PDF 文件,则会产生处理两张图片的输入费用。

纯文本词元化

纯文本文档会被词元化为文本。例如,如果您在 Gemini API 调用中包含一个 100 字的纯文本文档,则会产生处理 100 个字的输入费用。

PDF 文件最佳实践

使用 PDF 文件时,请遵循以下最佳实践和信息以获得最佳结果:

  • 如果提示包含单个 PDF 文件,请将 PDF 文件放在请求中的文本提示前面。
  • 如果您的文档很长,请考虑将其拆分为多个 PDF 进行处理。
  • 使用以文本形式呈现的 PDF 文件,而不是使用扫描图片中的文本。此格式可确保文本是机器可读的,与扫描的图片 PDF 相比,文本更易于模型修改、搜索和操作。在使用合同等包含大量文本的文档时,这样可以提供最佳结果。

限制

虽然多模态 Gemini 模型在许多多模态应用场景中表现出强大功能,但了解模型的限制非常重要:

  • 空间推理:模型在定位 PDF 中的文本或对象时并不精确。它们可能只返回对象数的近似值。
  • 准确性:模型在解读 PDF 文档中的手写文字时可能会产生幻觉。

后续步骤