BoxRetriever
這將幫助您開始使用 Box 檢索器。如需所有 BoxRetriever 功能和配置的詳細文件,請前往 API 參考。
概觀
BoxRetriever
類別可協助您從 Box 以 Langchain 的 Document
格式取得非結構化內容。您可以透過基於全文搜尋搜尋檔案,或使用 Box AI 檢索包含針對檔案進行 AI 查詢結果的 Document
來完成此操作。這需要包含一個 List[str]
,其中包含 Box 檔案 ID,即 ["12345","67890"]
Box AI 需要 Enterprise Plus 授權
沒有文字表示的檔案將會被跳過。
整合詳細資訊
1:自帶數據(即,索引和搜尋自訂的文件語料庫)
檢索器 | 自託管 | 雲端服務 | 套件 |
---|---|---|---|
BoxRetriever | ❌ | ✅ | langchain-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
Note: you may need to restart the kernel to use updated packages.
實例化
現在我們可以實例化我們的檢索器
搜尋
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 可以透過鏈整合到 LLM 應用程式中。
我們將需要 LLM 或聊天模型
pip install -qU "langchain[openai]"
import getpass
import os
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter API key for OpenAI: ")
from langchain.chat_models import init_chat_model
llm = init_chat_model("gpt-4o-mini", model_provider="openai")
openai_key = getpass.getpass("Enter your OpenAI key: ")
Enter your OpenAI key: ········
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
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
)
context = "You are a finance professional that handles invoices and purchase orders."
question = "Show me all the items purchased from AstroTech Solutions"
prompt = ChatPromptTemplate.from_template(
"""Answer the question based only on the context provided.
Context: {context}
Question: {question}"""
)
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
chain.invoke(question)
'- Gravitational Wave Detector Kit: $800\n- Exoplanet Terrarium: $120'
用作代理工具
與其他檢索器一樣,BoxRetriever 也可以作為工具添加到 LangGraph 代理中。
pip install -U langsmith
from langchain 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 元數據傳回。每個物件都接受一個名為 extra_fields
的可選 List[str]
,其中包含傳回物件中的 json 金鑰,例如 extra_fields=["shared_link"]
。
連接器會將此欄位新增至整合需要運作的欄位清單,然後將結果新增至 Document
或 Blob
中傳回的元數據,例如 "metadata" : { "source" : "source, "shared_link" : "shared_link" }
。如果該檔案的欄位不可用,則將其作為空字串傳回,例如 "shared_link" : ""
。
API 參考
如需所有 BoxRetriever 功能和配置的詳細文件,請前往 API 參考。
協助
如果您有任何疑問,可以查看我們的開發人員文件或在我們的開發人員社群中與我們聯繫。