Skip to main content
Open In ColabOpen on GitHub

Google Drive

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 Docs数据的说明

将环境变量 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
API Reference: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文档或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 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

  • 文本/文本
  • 纯文本
  • 文本/HTML
  • 文本/CSV
  • 文本/标记
  • 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 --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 Reference:GoogleDriveLoader

您可以传递 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,
# Optional: configure whether to load extended metadata for each Document.
)

doc = loader.load()
API Reference:GoogleDriveLoader

您可以传递 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_type搜索query
gdrive-query-with-mime-type-and-folder使用特定的mime_typefolder_id中搜索query
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 Reference:PromptTemplate

转换可以以Markdown格式管理:

  • 项目符号
  • 链接
  • 表格
  • 标题

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

GSlide 和 GSheet 的模式

参数模式接受不同的值:

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

参数 gslide_mode 接受不同的值:

  • "single" : 一个带有的文档
  • "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] + "...")

参数 gsheet_mode 接受不同的值:

  • "single": 每行生成一个文档
  • "elements" : 一个包含markdown数组和标签的文档。
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文件在元数据中都有一个'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] + "...")

这个页面有帮助吗?