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 Docs 데이터 수집 지침

환경 변수 GOOGLE_APPLICATION_CREDENTIALS를 빈 문자열("")로 설정합니다. 기본적으로 GoogleDriveLoadercredentials.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",
    # 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,
)

선택적 File Loader 전달하기

Google Docs 및 Google Sheets 이외의 파일을 처리할 때 GoogleDriveLoader에 선택적 file loader를 전달하는 것이 유용할 수 있습니다. file loader를 전달하면 Google Docs 또는 Google Sheets MIME 타입이 없는 문서에 해당 file loader가 사용됩니다. 다음은 file loader를 사용하여 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'
# 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-type을 가진 모든 파일을 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] + "...")

인증 Identity 로드하기

Google Drive Loader에서 수집한 각 파일에 대한 승인된 identity를 Document별 metadata와 함께 로드할 수 있습니다.
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 Drive 문서 액세스 identity를 metadata에 추가할 수 있습니다.
doc[0].metadata

확장 metadata 로드하기

각 Document의 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()
load_extended_matadata=True를 전달하여 Google Drive 문서의 확장 세부 정보를 metadata에 추가할 수 있습니다.
doc[0].metadata

검색 패턴 사용자 정의하기

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-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] + "...")
변환은 Markdown 형식으로 다음을 관리할 수 있습니다:
  • bullet
  • link
  • table
  • titles
링크를 내보내려면 return_link 속성을 True로 설정하세요.

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 File은 metadata에 ‘description’이 있습니다. 이 필드는 문서의 요약이나 다른 인덱싱된 태그를 저장하는 데 사용할 수 있습니다 (lazy_update_description_with_summary() 메서드 참조). mode="snippet"을 사용하면 본문에 설명만 사용됩니다. 그렇지 않으면 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] + "...")

Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.
I