跳至主要內容

Google Drive

Google Drive 是由 Google 開發的檔案儲存和同步服務。

本筆記本涵蓋如何從 Google Drive 載入文件。目前僅支援 Google Docs

先決條件 (Prerequisites)

  1. 建立一個 Google Cloud 專案或使用現有專案
  2. 啟用 Google Drive API
  3. 授權桌面應用程式憑證
  4. pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

🧑 如何擷取您的 Google Docs 資料的指示 (🧑 Instructions for ingesting your Google Docs data)

將環境變數 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 參考: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,
)

傳遞可選的文件載入器 (Passing in Optional File Loaders)

處理 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]

擴展用法 (Extended usage)

一個外部(非官方)組件可以管理 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
  • 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] + "...")

載入驗證身分 (Loading auth Identities)

Google Drive Loader 擷取的每個檔案的授權身分可以與每個 Document 的元資料一起載入。

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

載入擴展元資料 (Loading extended 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

自訂搜尋模式 (Customize the search pattern)

所有與 Google list() API 相容的參數都可以設定。

要指定 Google 請求的新模式,您可以使用 PromptTemplate()。 提示的變數可以使用建構函式中的 kwargs 進行設定。 提出了一些預先格式化的請求(使用 {query}{folder_id} 和/或 {mime_type}

您可以自訂選擇檔案的條件。 提出了一組預定義的篩選器

templatedescription
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-folderfolder_id 中使用特定的 mime_type 搜尋 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 參考:PromptTemplate

轉換可以在 Markdown 格式中管理

  • 項目符號
  • 連結
  • 表格
  • 標題

設定屬性 return_linkTrue 以匯出連結。

GSlide 和 GSheet 的模式

參數 mode 接受不同的值

  • "document": 傳回每個文件的主體
  • "snippets": 傳回每個檔案的描述(設定在 Google Drive 檔案的 metadata 中)。

參數 gslide_mode 接受不同的值

  • "single" : 一個包含 <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] + "...")

參數 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 檔案在 metadata 中都有一個 'description'。此欄位可用於記憶文件的摘要或其他索引標籤(參閱方法 lazy_update_description_with_summary())。

如果您使用 mode="snippet",則只會將 description 用於主體。否則,metadata['summary'] 具有該欄位。

有時,可以使用特定的篩選器從檔案名稱中提取一些資訊,以使用特定條件選擇某些檔案。您可以使用篩選器。

有時,會傳回許多文件。沒有必要同時將所有文件都放在記憶體中。您可以使用方法的 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] + "...")

此頁面有幫助嗎?