Skip to main content
Microsoft SharePoint is a website-based collaboration system that uses workflow applications, “list” databases, and other web parts and security features to empower business teams to work together developed by Microsoft.
本笔记本介绍如何从 SharePoint 文档库加载文档。默认情况下,文档加载器加载 pdfdocdocxtxt 文件。您可以通过提供适当的解析器来加载其他文件类型(详见下文)。

前提条件

  1. 按照 Microsoft 身份平台的说明注册应用程序。
  2. 注册完成后,Azure 门户将显示应用程序注册的概览页面。您会看到应用程序(客户端)ID,也称为 client ID,该值在 Microsoft 身份平台中唯一标识您的应用程序。
  3. 按照步骤 1操作时,可以将重定向 URI 设置为 https://login.microsoftonline.com/common/oauth2/nativeclient
  4. 按照步骤 1操作时,在”应用程序机密”部分生成新密码(client_secret)。
  5. 按照此文档的说明,向您的应用程序添加以下 SCOPESoffline_accessSites.Read.All)。
  6. 要从文档库检索文件,您需要其 ID。为此需要 Tenant NameCollection 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. 要获取站点 Collection ID,在浏览器中访问: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 发起请求,响应中的 id 字段即为您的 Document Library ID

🧑 从 SharePoint 文档库导入文档的说明

🔑 认证

默认情况下,SharePointLoader 期望 CLIENT_IDCLIENT_SECRET 分别以环境变量 O365_CLIENT_IDO365_CLIENT_SECRET 的形式存储。您可以通过应用程序根目录下的 .env 文件或在脚本中使用以下命令来传递这些环境变量。
os.environ['O365_CLIENT_ID'] = "YOUR CLIENT ID"
os.environ['O365_CLIENT_SECRET'] = "YOUR CLIENT SECRET"
该加载器使用一种称为代表用户的认证方式,是需要用户同意的两步认证。实例化加载器时,它会打印一个 URL,用户需要访问该 URL 以授予应用程序所需权限。用户访问该 URL 并同意应用程序后,需要将结果页面的 URL 复制粘贴回控制台。如果登录成功,该方法将返回 True。
from langchain_community.document_loaders.sharepoint import SharePointLoader

loader = SharePointLoader(document_library_id="YOUR DOCUMENT LIBRARY ID")
认证完成后,加载器会将令牌(o365_token.txt)存储在 ~/.credentials/ 文件夹中。之后可以使用此令牌进行认证,无需再执行上述复制粘贴步骤。要使用此令牌进行认证,需要在实例化加载器时将 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)

🗂️ 文档加载器

📑 从文档库目录加载文档

SharePointLoader 可以从文档库中的特定文件夹加载文档。例如,加载文档库中 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 错误,请尝试使用 folder_id 代替文件夹路径,可以从 Microsoft Graph API 获取该 ID
loader = SharePointLoader(document_library_id="YOUR DOCUMENT LIBRARY ID", auth_with_token=True
                          folder_id="<folder-id>")
documents = loader.load()
如果希望从根目录加载文档,可以省略 folder_idfolder_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,
    )
您可以通过向 SharePointLoader 传递 handlers 参数来覆盖此行为。 传入一个字典,将文件扩展名(如 "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' and 'jpeg' both map to 'image/jpeg' MIME type. SecondParser() will be used
# to parse all jpg/jpeg files.
handlers = {
    "jpg": FirstParser(),
    "jpeg": SecondParser()
}