Skip to main content
Open In ColabOpen on GitHub

Google Cloud端硬盘

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

这个笔记本介绍了如何从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_path关键字参数进行配置。同样的事情也适用于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
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时,默认加载所有类型的文件(文档、表格和PDF)。您可以通过传递一个file_types参数来修改这种行为。

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

传递可选文件加载器

当处理除了Google文档和Google表格之外的文件时,可以传递一个可选的文件加载器给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 --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

  • text/text
  • text/plain
  • text/html
  • text/csv
  • text/markdown
  • image/png
  • image/jpeg
  • application/epub+zip
  • application/pdf
  • 应用程序/rtf
  • application/vnd.google-apps.document (GDoc)
  • application/vnd.google-apps.presentation (谷歌幻灯片)
  • 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 --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()

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

doc[0].metadata

加载扩展元数据

以下每个文档的元数据中还可以获取到额外字段:

  • full_path - Google 驱动器中文件/文件夹的完整路径。
  • owner - 文件的所有者。
  • 大小 - 文件/文件夹的大小。
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()

您可以将 load_extended_matadata=True 传递进去,以将Google云端硬盘文档的扩展详情添加到元数据中。

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 参考:提示模板

The conversion can manage in Markdown format:

  • bullet
  • link
  • table
  • 标题

将属性return_link设置为True以导出链接。

Modes for GSlide 和 GSheet

参数 mode 接受不同的值:

  • "document": 返回每个文档的正文
  • "片段": 返回每个文件的描述(设置在Google_drive文件的元数据中)。

The parameter gslide_mode 接受不同的值:

  • "单个" : 一个文档带有 <PAGE BREAK>
  • "slide" : 一页文档由一个幻灯片组成
  • "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] + "...")

The parameter 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",则仅使用描述作为主体。否则,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] + "...")