Skip to main content
Microsoft SharePoint는 워크플로 애플리케이션, “목록” 데이터베이스 및 기타 웹 파트와 보안 기능을 사용하여 비즈니스 팀이 함께 작업할 수 있도록 지원하는 웹 사이트 기반 협업 시스템으로 Microsoft에서 개발했습니다.
이 노트북은 SharePoint Document Library에서 문서를 로드하는 방법을 다룹니다. 기본적으로 문서 로더는 pdf, doc, docxtxt 파일을 로드합니다. 적절한 파서를 제공하여 다른 파일 형식을 로드할 수 있습니다(자세한 내용은 아래 참조).

사전 요구사항

  1. Microsoft identity platform 지침에 따라 애플리케이션을 등록합니다.
  2. 등록이 완료되면 Azure Portal에 앱 등록의 개요 페이지가 표시됩니다. 여기서 애플리케이션(클라이언트) ID를 확인할 수 있습니다. client ID라고도 하는 이 값은 Microsoft identity platform에서 애플리케이션을 고유하게 식별합니다.
  3. 항목 1의 단계를 따르는 동안 리디렉션 URI를 https://login.microsoftonline.com/common/oauth2/nativeclient로 설정할 수 있습니다.
  4. 항목 1의 단계를 따르는 동안 Application Secrets 섹션에서 새 비밀번호(client_secret)를 생성합니다.
  5. 문서의 지침에 따라 애플리케이션에 다음 SCOPES(offline_accessSites.Read.All)를 추가합니다.
  6. Document Library에서 파일을 검색하려면 해당 ID가 필요합니다. 이를 얻으려면 Tenant Name, Collection IDSubsite ID 값이 필요합니다.
  7. Tenant Name을 찾으려면 이 문서의 지침을 따르세요. 이 값을 얻으면 .onmicrosoft.com을 제거하고 나머지를 Tenant Name으로 유지하세요.
  8. Collection IDSubsite ID를 얻으려면 SharePoint site-name이 필요합니다. SharePoint 사이트 URL은 다음 형식을 따릅니다: https://<tenant-name>.sharepoint.com/sites/<site-name>. 이 URL의 마지막 부분이 site-name입니다.
  9. Site Collection ID를 가져오려면 브라우저에서 다음 URL에 접속하세요: https://<tenant>.sharepoint.com/sites/<site-name>/_api/site/id를 입력하고 Edm.Guid 속성 값을 복사하세요.
  10. Subsite ID(또는 web ID)를 얻으려면 https://<tenant>.sharepoint.com/sites/<site-name>/_api/web/id를 사용하고 Edm.Guid 속성 값을 복사하세요.
  11. SharePoint site ID는 다음 형식을 따릅니다: <tenant-name>.sharepoint.com,<Collection ID>,<subsite ID>. 이 값을 다음 단계에서 사용하도록 보관할 수 있습니다.
  12. Graph Explorer Playground를 방문하여 Document Library ID를 얻으세요. 첫 번째 단계는 SharePoint 사이트와 연결된 계정으로 로그인했는지 확인하는 것입니다. 그런 다음 https://graph.microsoft.com/v1.0/sites/<SharePoint site ID>/drive에 요청해야 하며 응답은 Document Library ID의 ID를 보유하는 id 필드가 있는 페이로드를 반환합니다.

🧑 SharePoint Document Library에서 문서 수집 지침

🔑 인증

기본적으로 SharePointLoaderCLIENT_IDCLIENT_SECRET 값이 각각 O365_CLIENT_IDO365_CLIENT_SECRET이라는 환경 변수로 저장되어야 합니다. 애플리케이션 루트에 .env 파일을 통해 또는 스크립트에서 다음 명령을 사용하여 이러한 환경 변수를 전달할 수 있습니다.
os.environ['O365_CLIENT_ID'] = "YOUR CLIENT ID"
os.environ['O365_CLIENT_SECRET'] = "YOUR CLIENT SECRET"
이 로더는 on behalf of a user라는 인증 방식을 사용합니다. 이는 사용자 동의가 필요한 2단계 인증입니다. 로더를 인스턴스화하면 사용자가 방문하여 필요한 권한에 대한 동의를 제공해야 하는 URL이 출력됩니다. 그런 다음 사용자는 이 URL을 방문하여 애플리케이션에 동의해야 합니다. 그 후 사용자는 결과 페이지 URL을 복사하여 콘솔에 다시 붙여넣어야 합니다. 로그인 시도가 성공하면 메서드는 True를 반환합니다.
from langchain_community.document_loaders.sharepoint import SharePointLoader

loader = SharePointLoader(document_library_id="YOUR DOCUMENT LIBRARY ID")
인증이 완료되면 로더는 ~/.credentials/ 폴더에 토큰(o365_token.txt)을 저장합니다. 이 토큰은 나중에 앞서 설명한 복사/붙여넣기 단계 없이 인증하는 데 사용할 수 있습니다. 인증에 이 토큰을 사용하려면 로더를 인스턴스화할 때 auth_with_token 매개변수를 True로 변경해야 합니다.
from langchain_community.document_loaders.sharepoint import SharePointLoader

loader = SharePointLoader(document_library_id="YOUR DOCUMENT LIBRARY ID", auth_with_token=True)

🗂️ 문서 로더

📑 Document Library 디렉터리에서 문서 로드

SharePointLoader는 Document Library 내의 특정 폴더에서 문서를 로드할 수 있습니다. 예를 들어 Document Library 내 Documents/marketing 폴더에 저장된 모든 문서를 로드하려는 경우입니다.
from langchain_community.document_loaders.sharepoint import SharePointLoader

loader = SharePointLoader(document_library_id="YOUR DOCUMENT LIBRARY ID", folder_path="Documents/marketing", auth_with_token=True)
documents = loader.load()
Resource not found for the segment 오류가 발생하면 Microsoft Graph API에서 얻을 수 있는 folder_id를 folder path 대신 사용해 보세요.
loader = SharePointLoader(document_library_id="YOUR DOCUMENT LIBRARY ID", auth_with_token=True
                          folder_id="<folder-id>")
documents = loader.load()
루트 디렉터리에서 문서를 로드하려면 folder_id, folder_pathdocuments_ids를 생략하면 로더가 루트 디렉터리를 로드합니다.
# loads documents from root directory
loader = SharePointLoader(document_library_id="YOUR DOCUMENT LIBRARY ID", auth_with_token=True)
documents = loader.load()
recursive=True와 결합하면 전체 SharePoint의 모든 문서를 간단히 로드할 수 있습니다:
# loads documents from root directory
loader = SharePointLoader(document_library_id="YOUR DOCUMENT LIBRARY ID",
                          recursive=True,
                          auth_with_token=True)
documents = loader.load()

📑 문서 ID 목록에서 문서 로드

또 다른 방법은 로드하려는 각 문서에 대한 object_id 목록을 제공하는 것입니다. 이를 위해서는 Microsoft Graph API를 쿼리하여 관심 있는 모든 문서 ID를 찾아야 합니다. 이 링크는 문서 ID를 검색하는 데 유용한 엔드포인트 목록을 제공합니다. 예를 들어 data/finance/ 폴더에 저장된 모든 객체에 대한 정보를 검색하려면 https://graph.microsoft.com/v1.0/drives/<document-library-id>/root:/data/finance:/children에 요청해야 합니다. 관심 있는 ID 목록을 확보하면 다음 매개변수로 로더를 인스턴스화할 수 있습니다.
from langchain_community.document_loaders.sharepoint import SharePointLoader

loader = SharePointLoader(document_library_id="YOUR DOCUMENT LIBRARY ID", object_ids=["ID_1", "ID_2"], auth_with_token=True)
documents = loader.load()

📑 지원되는 파일 형식 및 선호하는 파서 선택

기본적으로 SharePointLoader는 기본 파서를 사용하여 document_loaders/parsers/registry에 정의된 파일 형식을 로드합니다(아래 참조).
def _get_default_parser() -> BaseBlobParser:
    """Get default mime-type based parser."""
    return MimeTypeBasedParser(
        handlers={
            "application/pdf": PyMuPDFParser(),
            "text/plain": TextParser(),
            "application/msword": MsWordParser(),
            "application/vnd.openxmlformats-officedocument.wordprocessingml.document": (
                MsWordParser()
            ),
        },
        fallback_parser=None,
    )
SharePointLoaderhandlers 인수를 전달하여 이 동작을 재정의할 수 있습니다. 파일 확장자("doc", "pdf" 등) 또는 MIME 타입("application/pdf", "text/plain" 등)을 파서에 매핑하는 딕셔너리를 전달합니다. 파일 확장자 또는 MIME 타입 중 하나만 독점적으로 사용해야 하며 혼합할 수 없습니다. 파일 확장자의 경우 선행 점을 포함하지 마세요.
# using file extensions:
handlers = {
    "doc": MsWordParser(),
    "pdf": PDFMinerParser(),
    "mp3": OpenAIWhisperParser()
}

# using MIME types:
handlers = {
    "application/msword": MsWordParser(),
    "application/pdf": PDFMinerParser(),
    "audio/mpeg": OpenAIWhisperParser()
}

loader = SharePointLoader(document_library_id="...",
                            handlers=handlers # pass handlers to SharePointLoader
                            )
여러 파일 확장자가 동일한 MIME 타입에 매핑되는 경우 마지막 딕셔너리 항목이 적용됩니다. 예시:
# 'jpg' 및 'jpeg'는 모두 'image/jpeg' MIME 타입에 매핑됩니다. SecondParser()가
# 모든 jpg/jpeg 파일을 파싱하는 데 사용됩니다.
handlers = {
    "jpg": FirstParser(),
    "jpeg": SecondParser()
}

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