為了進一步完善我們的系統,有新增文件的功能,也要來個刪除文件的功能
在上傳文件的時候,我們有給每筆文件一個 metadata,內容則是給當前段落的檔案名稱
為此,我們也需要可以儲存歷史上傳過文件的檔案資訊,而在這邊我的選擇是,用一個本地的 Json 協助我們儲存這些資訊,所以先在工作目錄底下新增一個 config.json 的檔案
{
"uploads": []
}
程式的部分我們修改部分的片段即可
./utils.py
import json
class File:
def upload_file(file_paths: list):
yield "上傳中"
try:
for file_path in file_paths:
reader = PyPDF2.PdfReader(open(file_path, 'rb'))
for index in range(len(reader.pages)):
qdrant_client.add(
collection_name="iron",
documents=[reader.pages[index].extract_text()],
metadata=[{"filename": os.path.basename(file_path)}]
)
config = json.loads(open("./config.json", "r").read())
config["uploads"].append(os.path.basename(file_path))
open("./config.json", "w").write(json.dumps(config, indent=4))
except:
yield "上傳失敗"
yield "上傳成功"
這時我們進入http://127.0.0.1:6333/dashboard
中將 collection 刪掉後重新上傳一次文件
可以看到我們上傳過的文件出現在 config.json 中
這時再修改一點前端頁面
./main.py
...
with gr.Blocks() as demo:
...
with gr.Tab(label="manage"):
with gr.Row():
filelist_dropdown = gr.Dropdown(
value="None",
choices=File.list_files(),
multiselect=True
)
filelist_btn = gr.Button(
value="刪除"
)
filelist_btn.click(
File.delete_file,
inputs=[filelist_dropdown],
outputs=[filelist_dropdown]
)
utils.py
這邊我們建立一個函數讓前端頁面初始化時可以讀取 config.json 中的內容,再定義了當filelist_btn
有了 click 的行為時,執行delete_file
的函式,且根據使用者選取的檔案名稱遞迴地刪除在 Qdrant 中,metadata 的 filename 符合file
的資料列
...
class File:
...
def list_files():
return json.loads(open("./config.json", "r").read())["uploads"]
def delete_file(selected_files: list):
config = json.loads(open("./config.json", "r").read())
for file in selected_files:
qdrant_client.delete(
collection_name="iron",
points_selector=models.FilterSelector(
filter=models.Filter(
must=[
models.FieldCondition(
key="filename",
match=models.MatchValue(value=file),
),
],
)
)
)
config["uploads"].remove(file)
open("./config.json", "w").write(json.dumps(config, indent=4))
yield gr.update(choices=File.list_files(), value=[])
實際測試刪除效果,在 Qdrant 中的第一筆為豪鬼 - 維基百科自由的百科全書.pdf
的資料
這時我們回到前端頁面,並選取該文件後點選刪除的按鈕後
重新刷新 Qdrant 的前端後,有關豪鬼 - 維基百科自由的百科全書.pdf
的資訊已全數移除