这将帮助您开始使用 Box 检索器.
概述
该 BoxRetriever 类帮助您获取 LangChain 的 Document 格式的非结构化 Box 内容。您可以通过基于全文搜索来搜索文件,或使用 Box AI 检索包含 Document 的结果(针对文件的 AI 查询结果)。这需要包含一个 List[str] 包含 Box 文件 ID,例如 ["12345","67890"]
没有文本表示的文件将被跳过。
集成详情
1: 自带数据(即,对自定义文档语料库进行索引和搜索):
| 检索器 | 自托管 | 云服务 | 包 |
|---|---|---|---|
BoxRetriever | ❌ | ✅ | langchain-box |
设置
要使用 Box 包,您需要准备以下内容:
- * Box 账户 — 如果您不是 Box 现有客户或想在生产 Box 实例之外进行测试,您可以使用 免费开发者账户.
- * Box 应用 — 这在 开发者控制台中配置,Box AI 必须启用
Manage AI作用域。您还将在此处选择身份验证方法 - * 该应用必须由 管理员启用。对于免费开发者账户,这是注册账户的任何人。
凭证
在这些示例中,我们将使用 令牌身份验证。这可以与任何 身份验证方法配合使用。只需使用任何方法获取令牌即可。如果您想了解如何将其他身份验证类型与 langchain-box配合使用,请访问 Box 提供商 document.
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 package:
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.SearchTypeFilter 和 langchain_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 参数提供这种灵活性, answer 和 citations。Answer 默认为 True ,citations 默认为 False,因此如果您只想要答案,可以省略这两个参数。如果您想要两者,可以只包含 citations=True ,如果您只想要引用,则需要包含 answer=False 和 citations=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')]
作为代理工具使用
与其他检索器一样,BoxRetriever 也可以作为工具添加到 LangGraph 代理中。
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"].
连接器会将此字段添加到集成所需字段列表中,然后会将结果添加到 Document or Blob 中返回的元数据中,如 "metadata" : { "source" : "source, "shared_link" : "shared_link" }。如果该字段对该文件不可用,则会返回空字符串,如 "shared_link" : "".