Skip to main content
Google Drive 是由 Google 开发的文件存储和同步服务。
本笔记本介绍如何从 Google Drive 加载文档。目前,仅支持 Google Docs

前提条件

  1. 创建一个 Google Cloud 项目或使用现有项目
  2. 启用 Google Drive API
  3. 为桌面应用授权凭证
  4. pip install -U google-api-python-client google-auth-httplib2 google-auth-oauthlib

🧑 摄入您的 Google 文档数据的说明

将环境变量 GOOGLE_APPLICATION_CREDENTIALS 设置为空字符串 ("")。 默认情况下,GoogleDriveLoader 期望 credentials.json 文件位于 ~/.credentials/credentials.json,但可以使用 credentials_path 关键字参数进行配置。token.json 也是如此 - 默认路径:~/.credentials/token.json,构造函数参数:token_path 首次使用 GoogleDriveLoader 时,浏览器中会显示同意屏幕以进行用户身份验证。身份验证后,token.json 将在提供的或默认路径下自动创建。此外,如果该路径下已存在 token.json,则不会提示您进行身份验证。 GoogleDriveLoader 可以从 Google Docs 文档 ID 列表或文件夹 ID 加载。您可以从 URL 获取您的文件夹和文档 ID:
pip install -qU langchain-google-community[drive]
from langchain_google_community import GoogleDriveLoader
loader = GoogleDriveLoader(
    folder_id="1yucgL9WGgWZdM1TOuKkeghlPizuzMYb5",
    token_path="/path/where/you/want/token/to/be/created/google_token.json",
    # 可选:配置是否递归获取子文件夹中的文件。默认为 False。
    recursive=False,
)
docs = loader.load()
当您传递 folder_id 时,默认情况下会加载所有类型为文档、表格和 PDF 的文件。您可以通过传递 file_types 参数来修改此行为。
loader = GoogleDriveLoader(
    folder_id="1yucgL9WGgWZdM1TOuKkeghlPizuzMYb5",
    file_types=["document", "sheet"],
    recursive=False,
)

传递可选的文件加载器

处理 Google Docs 和 Google Sheets 以外的文件时,向 GoogleDriveLoader 传递可选的文件加载器可能会有所帮助。如果您传递了文件加载器,该文件加载器将用于处理没有 Google Docs 或 Google Sheets MIME 类型的文档。以下是使用文件加载器从 Google Drive 加载 Excel 文档的示例。
from langchain_community.document_loaders import UnstructuredFileIOLoader
from langchain_google_community import GoogleDriveLoader
file_id = "1x9WBtFPWMEAdjcJzPScRsjpjQvpSo_kz"
loader = GoogleDriveLoader(
    file_ids=[file_id],
    file_loader_cls=UnstructuredFileIOLoader,
    file_loader_kwargs={"mode": "elements"},
)
docs = loader.load()
docs[0]
您也可以使用以下模式处理包含混合文件和 Google Docs/Sheets 的文件夹:
folder_id = "1asMOHY1BqBS84JcRbOag5LOJac74gpmD"
loader = GoogleDriveLoader(
    folder_id=folder_id,
    file_loader_cls=UnstructuredFileIOLoader,
    file_loader_kwargs={"mode": "elements"},
)
docs = loader.load()
docs[0]

扩展用法

一个外部(非官方)组件可以管理 Google Drive 的复杂性:langchain-googledrive 它与 langchain_community.document_loaders.GoogleDriveLoader 兼容,可以替代使用。 为了与容器兼容,身份验证使用环境变量 GOOGLE_ACCOUNT_FILE 指向凭证文件(用于用户或服务)。
pip install -qU  langchain-googledrive
folder_id = "root"
# folder_id='1yucgL9WGgWZdM1TOuKkeghlPizuzMYb5'
# 使用高级版本。
from langchain_googledrive.document_loaders import GoogleDriveLoader
loader = GoogleDriveLoader(
    folder_id=folder_id,
    recursive=False,
    num_results=2,  # 要加载的最大文件数
)
默认情况下,所有具有以下 MIME 类型的文件都可以转换为 Document
  • text/text
  • text/plain
  • text/html
  • text/csv
  • text/markdown
  • image/png
  • image/jpeg
  • application/epub+zip
  • application/pdf
  • application/rtf
  • application/vnd.google-apps.document (GDoc)
  • application/vnd.google-apps.presentation (GSlide)
  • application/vnd.google-apps.spreadsheet (GSheet)
  • application/vnd.google.colaboratory (Notebook colab)
  • application/vnd.openxmlformats-officedocument.presentationml.presentation (PPTX)
  • application/vnd.openxmlformats-officedocument.wordprocessingml.document (DOCX)
可以更新或自定义此列表。请参阅 GDriveLoader 的文档。 必须安装相应的包。
pip install -qU  unstructured
for doc in loader.load():
    print("---")
    print(doc.page_content.strip()[:60] + "...")

加载授权身份

可以加载由 Google Drive Loader 摄入的每个文件的授权身份,以及每个文档的元数据。
from langchain_google_community import GoogleDriveLoader

loader = GoogleDriveLoader(
    folder_id=folder_id,
    load_auth=True,
    # 可选:配置是否为每个文档加载授权身份。
)

doc = loader.load()
您可以传递 load_auth=True,将 Google Drive 文档访问身份添加到元数据中。
doc[0].metadata

加载扩展元数据

以下额外字段也可以在每个文档的元数据中获取:
  • full_path - 文件在 Google Drive 中的完整路径。
  • owner - 文件的所有者。
  • size - 文件的大小。
from langchain_google_community import GoogleDriveLoader

loader = GoogleDriveLoader(
    folder_id=folder_id,
    load_extended_matadata=True,
    # 可选:配置是否为每个文档加载扩展元数据。
)

doc = loader.load()
您可以传递 load_extended_matadata=True,将 Google Drive 文档的扩展详细信息添加到元数据中。
doc[0].metadata

自定义搜索模式

所有与 Google list() API 兼容的参数都可以设置。 要指定 Google 请求的新模式,您可以使用 PromptTemplate()。 提示的变量可以在构造函数中使用 kwargs 设置。 提供了一些预格式化的请求(使用 {query}{folder_id} 和/或 {mime_type}): 您可以自定义选择文件的标准。提供了一组预定义的过滤器:
模板描述
gdrive-all-in-folderfolder_id 返回所有兼容的文件
gdrive-query在所有驱动器中搜索 query
gdrive-by-name搜索名称为 query 的文件
gdrive-query-in-folderfolder_id 中搜索 query(如果 recursive=true,则包括子文件夹)
gdrive-mime-type搜索特定的 mime_type
gdrive-mime-type-in-folderfolder_id 中搜索特定的 mime_type
gdrive-query-with-mime-type搜索具有特定 mime_typequery
gdrive-query-with-mime-type-and-folderfolder_id 中搜索具有特定 mime_typequery
loader = GoogleDriveLoader(
    folder_id=folder_id,
    recursive=False,
    template="gdrive-query",  # 要使用的默认模板
    query="machine learning",
    num_results=2,  # 要加载的最大文件数
    supportsAllDrives=False,  # GDrive `list()` 参数
)
for doc in loader.load():
    print("---")
    print(doc.page_content.strip()[:60] + "...")
您可以自定义您的模式。
from langchain_core.prompts.prompt import PromptTemplate

loader = GoogleDriveLoader(
    folder_id=folder_id,
    recursive=False,
    template=PromptTemplate(
        input_variables=["query", "query_name"],
        template="fullText contains '{query}' and name contains '{query_name}' and trashed=false",
    ),  # 要使用的默认模板
    query="machine learning",
    query_name="ML",
    num_results=2,  # 要加载的最大文件数
)
for doc in loader.load():
    print("---")
    print(doc.page_content.strip()[:60] + "...")
转换可以管理 Markdown 格式:
  • 项目符号
  • 链接
  • 表格
  • 标题
将属性 return_link 设置为 True 以导出链接。

GSlide 和 GSheet 的模式

参数 mode 接受不同的值:
  • “document”:返回每个文档的正文
  • “snippets”:返回每个文件的描述(在 Google Drive 文件的元数据中设置)。
参数 gslide_mode 接受不同的值:
  • “single”:一个包含 <PAGE BREAK> 的文档
  • “slide”:每张幻灯片一个文档
  • “elements”:每个元素一个文档。
loader = GoogleDriveLoader(
    template="gdrive-mime-type",
    mime_type="application/vnd.google-apps.presentation",  # 仅 GSlide 文件
    gslide_mode="slide",
    num_results=2,  # 要加载的最大文件数
)
for doc in loader.load():
    print("---")
    print(doc.page_content.strip()[:60] + "...")
参数 gsheet_mode 接受不同的值:
  • "single":每行生成一个文档
  • "elements":一个包含 markdown 数组和 <PAGE BREAK> 标签的文档。
loader = GoogleDriveLoader(
    template="gdrive-mime-type",
    mime_type="application/vnd.google-apps.spreadsheet",  # 仅 GSheet 文件
    gsheet_mode="elements",
    num_results=2,  # 要加载的最大文件数
)
for doc in loader.load():
    print("---")
    print(doc.page_content.strip()[:60] + "...")

高级用法

所有 Google 文件在元数据中都有一个 ‘description’ 字段。此字段可用于存储文档摘要或其他索引标签(参见方法 lazy_update_description_with_summary())。 如果您使用 mode="snippet",则仅使用描述作为正文。否则,metadata['summary'] 包含该字段。 有时,可以使用特定的过滤器从文件名中提取信息,以选择具有特定标准的文件。您可以使用过滤器。 有时,会返回许多文档。没有必要同时将所有文档保存在内存中。您可以使用方法的延迟版本,一次获取一个文档。最好使用复杂的查询代替递归搜索。对于每个文件夹,如果激活 recursive=True,则必须应用查询。
import os

loader = GoogleDriveLoader(
    gdrive_api_file=os.environ["GOOGLE_ACCOUNT_FILE"],
    num_results=2,
    template="gdrive-query",
    filter=lambda search, file: "#test" not in file.get("description", ""),
    query="machine learning",
    supportsAllDrives=False,
)
for doc in loader.load():
    print("---")
    print(doc.page_content.strip()[:60] + "...")