Skip to main content
Open In Colab在 GitHub 上打开

Google 云端硬盘

Google Drive 是由 Google 开发的文件存储和同步服务。

此笔记本介绍如何从Google Drive.目前,只有Google Docs受支持。

先决条件

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

🧑 有关提取 Google 文档数据的说明

设置环境变量GOOGLE_APPLICATION_CREDENTIALS转换为空字符串 ()。""

默认情况下,GoogleDriveLoader期望credentials.json文件~/.credentials/credentials.json,但这可以使用credentials_pathkeyword 参数。同样token.json- 默认路径:~/.credentials/token.json,构造函数参数:token_path.

首次使用 GoogleDriveLoader 时,浏览器中会显示同意屏幕以进行用户身份验证。身份验证后,token.json将在提供的路径或默认路径中自动创建。此外,如果已经有token.json在该路径上,则不会提示您进行身份验证。

GoogleDriveLoader可以从 Google Docs 文档 ID 列表或文件夹 ID 加载。您可以从 URL 获取文件夹和文档 ID:

%pip install --upgrade --quiet langchain-google-community[drive]
from langchain_google_community import GoogleDriveLoader
API 参考:GoogleDriveLoader
loader = GoogleDriveLoader(
folder_id="1yucgL9WGgWZdM1TOuKkeghlPizuzMYb5",
token_path="/path/where/you/want/token/to/be/created/google_token.json",
# Optional: configure whether to recursively fetch files from subfolders. Defaults to False.
recursive=False,
)
docs = loader.load()

当您传递folder_id默认情况下,将加载 document、sheet 和 pdf 类型的所有文件。您可以通过传递file_types论点

loader = GoogleDriveLoader(
folder_id="1yucgL9WGgWZdM1TOuKkeghlPizuzMYb5",
file_types=["document", "sheet"],
recursive=False,
)

传入可选的文件加载器

在处理 Google Docs 和 Google Sheets 以外的文件时,将可选的文件加载程序传递给GoogleDriveLoader.如果您传入文件加载器,则该文件加载器将用于没有 Google 文档或 Google 表格 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 文档/表格的文件夹:

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到 Credential 文件(对于 User 或 Service)。

%pip install --upgrade --quiet  langchain-googledrive
folder_id = "root"
# folder_id='1yucgL9WGgWZdM1TOuKkeghlPizuzMYb5'
# Use the advanced version.
from langchain_googledrive.document_loaders import GoogleDriveLoader
loader = GoogleDriveLoader(
folder_id=folder_id,
recursive=False,
num_results=2, # Maximum number of file to load
)

默认情况下,所有具有这些 mime 类型的文件都可以转换为Document.

  • 文本/文本
  • 文本/纯文本
  • 文本/html
  • 文本/CSV
  • 文本/Markdown
  • 图片/png
  • 图片/jpeg
  • 应用程序/epub+zip
  • 申请/PDF
  • 应用程序/RTF
  • application/vnd.google-apps.document (GDoc)
  • application/vnd.google-apps.presentation (GSlide)
  • application/vnd.google-apps.spreadsheet (GSheet)
  • application/vnd.google.colaboratory(笔记本 colab)
  • application/vnd.openxmlformats-officedocument.presentationml.presentation (PPTX)
  • application/vnd.openxmlformats-officedocument.wordprocessingml.document (DOCX)

可以更新或自定义此内容。请参阅GDriveLoader.

但是,必须安装相应的软件包。

%pip install --upgrade --quiet  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,
# Optional: configure whether to load authorized identities for each Document.
)

doc = loader.load()
API 参考:GoogleDriveLoader

您可以传递 load_auth=True,以将 Google Drive 文档访问身份添加到元数据中。

doc[0].metadata

加载扩展元数据

还可以在每个 Document 的元数据中获取以下额外字段:

  • full_path - Google Drive 中文件的完整路径。
  • owner - 文件的所有者。
  • size - 文件大小。
from langchain_google_community import GoogleDriveLoader

loader = GoogleDriveLoader(
folder_id=folder_id,
load_extended_matadata=True,
# Optional: configure whether to load extended metadata for each Document.
)

doc = loader.load()
API 参考:GoogleDriveLoader

您可以传递 load_extended_matadata=True,以将 Google Drive 文档扩展详细信息添加到元数据。

doc[0].metadata

自定义搜索模式

所有参数均与 Google 兼容list()可以设置 API。

要指定 Google 请求的新模式,您可以使用PromptTemplate(). 提示的变量可以通过kwargs在构造函数中。 建议一些预先格式化的请求(使用{query},{folder_id}和/或{mime_type}):

您可以自定义条件以选择文件。提出了一组预定义的过滤器:

模板描述
gdrive-all-in-folderReturn all compatible files from a folder_id
gdrive-querySearch query in all drives
gdrive-by-nameSearch file with name query
gdrive-query-in-folderSearch query in folder_id (and sub-folders if recursive=true)
gdrive-mime-typeSearch a specific mime_type
gdrive-mime-type-in-folderSearch a specific mime_type in folder_id
gdrive-query-with-mime-typeSearch query with a specific mime_type
gdrive-query-with-mime-type-and-folderSearch query with a specific mime_type and in folder_id
loader = GoogleDriveLoader(
folder_id=folder_id,
recursive=False,
template="gdrive-query", # Default template to use
query="machine learning",
num_results=2, # Maximum number of file to load
supportsAllDrives=False, # GDrive `list()` parameter
)
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",
), # Default template to use
query="machine learning",
query_name="ML",
num_results=2, # Maximum number of file to load
)
for doc in loader.load():
print("---")
print(doc.page_content.strip()[:60] + "...")
API 参考:PromptTemplate

转换可以以 Markdown 格式进行管理:

  • 子弹
  • 链接
  • 桌子
  • 标题

设置 attributreturn_linkTrue以导出链接。

GSlide 和 GSheet 的模式

参数 mode 接受不同的值:

  • “document”:返回每个文档的正文
  • “snippets”:返回每个文件的描述(在 Google Drive 文件的元数据中设置)。

参数gslide_mode接受不同的值:

  • “single” :一个带有 <分页符> 的文档
  • “slide” : 逐张幻灯片 1 个文档
  • “elements” :每个元素一个文档。
loader = GoogleDriveLoader(
template="gdrive-mime-type",
mime_type="application/vnd.google-apps.presentation", # Only GSlide files
gslide_mode="slide",
num_results=2, # Maximum number of file to load
)
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", # Only GSheet files
gsheet_mode="elements",
num_results=2, # Maximum number of file to load
)
for doc in loader.load():
print("---")
print(doc.page_content.strip()[:60] + "...")

高级用法

所有 Google 文件在元数据中都有“描述”。此字段可用于记住文档的摘要或其他索引标签(请参阅方法lazy_update_description_with_summary()).

如果您使用mode="snippet",则只有 description 将用于正文。否则,metadata['summary']具有该字段。

有时,可以使用特定的过滤器从文件名中提取一些信息,以选择具有特定条件的一些文件。您可以使用过滤器。

有时,会返回许多文档。不必同时将所有文档都放在内存中。你可以使用 Methods的 lazy 版本,一次获取一个文档。最好使用复杂查询代替递归搜索。对于每个文件夹,如果您激活了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] + "...")