Skip to main content
本指南将帮助你开始使用 Box 检索器。有关所有 BoxRetriever 功能和配置的详细文档,请参阅 API 参考

概述

BoxRetriever 类帮助你以 LangChain 的 Document 格式从 Box 获取非结构化内容。你可以通过基于全文搜索的文件搜索来实现这一点,或者使用 Box AI 检索包含针对文件进行 AI 查询结果的 Document。这需要包含一个 List[str],其中包含 Box 文件 ID,例如 ["12345","67890"]
Box AI 需要 Enterprise Plus 许可证
没有文本表示的文件将被跳过。

集成详情

1:自带数据(即索引和搜索自定义文档语料库):
检索器自托管云端服务
BoxRetrieverlangchain-box

设置

要使用 Box 包,你需要以下几样东西:
  • Box 账户——如果你不是当前 Box 客户,或者想在生产 Box 实例之外进行测试,可以使用免费开发者账户
  • Box 应用程序——在开发者控制台中配置,对于 Box AI,必须启用 Manage AI 范围。你还需要在此选择你的认证方式。
  • 该应用程序必须由管理员启用。对于免费开发者账户,这是注册账户的人。

凭据

在这些示例中,我们将使用令牌认证。这可以与任何认证方式一起使用。只需使用任何方法获取令牌即可。如果你想了解更多关于如何在 langchain-box 中使用其他认证类型,请访问 Box 提供商文档。
import getpass
import os

box_developer_token = getpass.getpass("Enter your Box Developer Token: ")
如果你想要从各个查询中获取自动追踪,也可以通过取消以下注释来设置你的 LangSmith API 密钥:
os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
os.environ["LANGSMITH_TRACING"] = "true"

安装

此检索器位于 langchain-box 包中:
pip install -qU langchain-box

实例化

现在我们可以实例化我们的检索器:

搜索

from langchain_box import BoxRetriever

retriever = BoxRetriever(box_developer_token=box_developer_token)
为了进行更精细的搜索,我们提供了一系列选项来帮助你缩小结果范围。这使用 langchain_box.utilities.SearchOptions 结合 langchain_box.utilities.SearchTypeFilterlangchain_box.utilities.DocumentFiles 枚举来过滤创建日期、文件搜索部分,甚至将搜索范围限制到特定文件夹。 有关更多信息,请查看 API 参考
from langchain_box.utilities import BoxSearchOptions, DocumentFiles, SearchTypeFilter

box_folder_id = "260931903795"

box_search_options = BoxSearchOptions(
    ancestor_folder_ids=[box_folder_id],
    search_type_filter=[SearchTypeFilter.FILE_CONTENT],
    created_date_range=["2023-01-01T00:00:00-07:00", "2024-08-01T00:00:00-07:00,"],
    k=200,
    size_range=[1, 1000000],
    updated_data_range=None,
)

retriever = BoxRetriever(
    box_developer_token=box_developer_token, box_search_options=box_search_options
)

retriever.invoke("AstroTech Solutions")
[Document(metadata={'source': 'https://dl.boxcloud.com/api/2.0/internal_files/1514555423624/versions/1663171610024/representations/extracted_text/content/', 'title': 'Invoice-A5555_txt'}, page_content='Vendor: AstroTech Solutions\nInvoice Number: A5555\n\nLine Items:\n    - Gravitational Wave Detector Kit: $800\n    - Exoplanet Terrarium: $120\nTotal: $920')]

Box AI

from langchain_box import BoxRetriever

box_file_ids = ["1514555423624", "1514553902288"]

retriever = BoxRetriever(
    box_developer_token=box_developer_token, box_file_ids=box_file_ids
)

使用方法

query = "What was the most expensive item purchased"

retriever.invoke(query)
[Document(metadata={'source': 'Box AI', 'title': 'Box AI What was the most expensive item purchased'}, page_content='The most expensive item purchased is the **Gravitational Wave Detector Kit** from AstroTech Solutions, which costs **$800**.')]

引用

使用 Box AI 和 BoxRetriever,你可以返回提示的答案、Box 用于获取答案的引用,或两者都返回。无论你如何选择使用 Box AI,检索器都返回一个 List[Document] 对象。我们通过两个 bool 参数提供此灵活性:answercitationsanswer 默认为 Truecitations 默认为 False,因此如果你只想要答案,可以省略两者。如果你想要两者,只需包含 citations=True;如果只想要引用,则包含 answer=Falsecitations=True

同时获取两者

retriever = BoxRetriever(
    box_developer_token=box_developer_token, box_file_ids=box_file_ids, citations=True
)

retriever.invoke(query)
[Document(metadata={'source': 'Box AI', 'title': 'Box AI What was the most expensive item purchased'}, page_content='The most expensive item purchased is the **Gravitational Wave Detector Kit** from AstroTech Solutions, which costs **$800**.'),
 Document(metadata={'source': 'Box AI What was the most expensive item purchased', 'file_name': 'Invoice-A5555.txt', 'file_id': '1514555423624', 'file_type': 'file'}, page_content='Vendor: AstroTech Solutions\nInvoice Number: A5555\n\nLine Items:\n    - Gravitational Wave Detector Kit: $800\n    - Exoplanet Terrarium: $120\nTotal: $920')]

仅获取引用

retriever = BoxRetriever(
    box_developer_token=box_developer_token,
    box_file_ids=box_file_ids,
    answer=False,
    citations=True,
)

retriever.invoke(query)
[Document(metadata={'source': 'Box AI What was the most expensive item purchased', 'file_name': 'Invoice-A5555.txt', 'file_id': '1514555423624', 'file_type': 'file'}, page_content='Vendor: AstroTech Solutions\nInvoice Number: A5555\n\nLine Items:\n    - Gravitational Wave Detector Kit: $800\n    - Exoplanet Terrarium: $120\nTotal: $920')]

作为 agent 工具使用

与其他检索器一样,BoxRetriever 也可以作为工具添加到 LangGraph agent 中。
pip install -U langsmith
from langchain_classic import hub
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain.tools.retriever import create_retriever_tool
box_search_options = BoxSearchOptions(
    ancestor_folder_ids=[box_folder_id],
    search_type_filter=[SearchTypeFilter.FILE_CONTENT],
    created_date_range=["2023-01-01T00:00:00-07:00", "2024-08-01T00:00:00-07:00,"],
    k=200,
    size_range=[1, 1000000],
    updated_data_range=None,
)

retriever = BoxRetriever(
    box_developer_token=box_developer_token, box_search_options=box_search_options
)

box_search_tool = create_retriever_tool(
    retriever,
    "box_search_tool",
    "This tool is used to search Box and retrieve documents that match the search criteria",
)
tools = [box_search_tool]
prompt = hub.pull("hwchase17/openai-tools-agent")
prompt.messages

llm = ChatOpenAI(temperature=0, openai_api_key=openai_key)

agent = create_openai_tools_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)
/Users/shurrey/local/langchain/.venv/lib/python3.11/site-packages/langsmith/client.py:312: LangSmithMissingAPIKeyWarning: API key must be provided when using hosted LangSmith API
  warnings.warn(
result = agent_executor.invoke(
    {
        "input": "list the items I purchased from AstroTech Solutions from most expensive to least expensive"
    }
)
print(f"result {result['output']}")
result The items you purchased from AstroTech Solutions from most expensive to least expensive are:

1. Gravitational Wave Detector Kit: $800
2. Exoplanet Terrarium: $120

Total: $920

额外字段

所有 Box 连接器都提供从 Box FileFull 对象中选择其他字段作为自定义 LangChain 元数据的能力。每个对象接受一个可选的 List[str],名为 extra_fields,包含返回对象中的 JSON 键,例如 extra_fields=["shared_link"] 连接器会将此字段添加到集成所需的字段列表中,然后将结果添加到 DocumentBlob 中返回的元数据中,例如 "metadata" : { "source" : "source, "shared_link" : "shared_link" }。如果该字段对该文件不可用,它将作为空字符串返回,例如 "shared_link" : ""

API 参考

有关所有 BoxRetriever 功能和配置的详细文档,请参阅 API 参考

帮助

如有问题,可查看我们的开发者文档或在我们的开发者社区中联系我们。