iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
生成式 AI

RAG自己來系列:客服機器人系列 第 18

[Day 18] 設計上傳文件頁面

  • 分享至 

  • xImage
  •  

前面的單元都屬於小兒科,再來就得認真刻我們的前端頁面了

這邊要先來刻的是,RAG 的核心 -- 資料檢索,所以我們要先來刻處理文件的頁面

首先是主頁的部分,我們使用了可以單次上傳多份文件的元件,並且搭配一個 Markdown 元件去顯示當前上傳檔案的狀態

那直接來看程式碼的部分

這邊是先啟好 Ollama 的服務與 Qdrant 的 Docker 容器

  • ./.env

    這邊統一將服務的位置當成環境變數做儲存

    OLLAMA_SERVER_URL=http://127.0.0.1:11434
    QDRANT_SERVER_URL=http://127.0.0.1:6333
    
  • ./upload_page.py

    主程式的部分使用 gradio(4.32.1) 當作核心套件,dotenv 用來協助我們讀取 .env 中的變數資訊,向量搜尋的部分使用 Qdrant 官方支援的 fastembed 套件,而文字擷取的部分則是透過 PyPDF2 的套件去幫助我們做文字擷取

    以上套件安裝即在終端中輸入pip3 install python-dotenv fastembed PyPDF2 gradio==4.32.1即可

    import gradio as gr
    from utils import File, qdrant_client
    from dotenv import load_dotenv
    load_dotenv(dotenv_path="./.env", override=True)
    
    # 定義主頁面的元素
    with gr.Blocks() as demo:
        with gr.Row():
            with gr.Row():
                upload = gr.Files(label="上傳檔案")
    
            with gr.Row():
                upload_status = gr.Markdown(value="")
    
        # 設定當用戶上傳檔案的行為
        upload.upload(
            File.upload_file,
            inputs=[upload],
            outputs=[upload_status]
        )
    
    if __name__ == "__main__":
        collection_list = []
        collections = qdrant_client.get_collections()
        for collection in collections:
            for c in list(collection[1]):
                collection_list.append(c.name)
    
        # 詞嵌入模型我們使用 "intfloat/multilingual-e5-large",且確認 Collection 是否有在 Qdrant 裡面
        qdrant_client.set_model("intfloat/multilingual-e5-large", cache_dir="./.cache")
        if "iron" not in collection_list:
            qdrant_client.create_collection(
                collection_name="iron",
                vectors_config=qdrant_client.get_fastembed_vector_params()
            )
        demo.launch(
            server_port=7860, 
            server_name="0.0.0.0"
        )
    
  • ./utils.py

    import os
    import PyPDF2
    import gradio as gr
    from qdrant_client import QdrantClient
    
    qdrant_client = QdrantClient(url=os.getenv("OLLAMA_SERVER_URL"))
    drant_client.set_model("intfloat/multilingual-e5-large", cache_dir="./.cache")
    
    
    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)}]
    	     )
            except:
                yield "上傳失敗"
    
            yield "上傳成功"
    

這時我們試著上傳一個來自快打旋風的經典角色 -- 豪鬼 的維基 PDF 檔案

https://ithelp.ithome.com.tw/upload/images/20240926/20146555hS5aD6K7mI.png

右方的進度條就是 Markdown 的元件正在運作中的效果

https://ithelp.ithome.com.tw/upload/images/20240926/2014655503gcWZoOJm.png

我們也可以在瀏覽器中輸入http://127.0.0.1:6333/dashboard#/collections/iron確認 collection 內的狀況

https://ithelp.ithome.com.tw/upload/images/20240926/201465555veSk9DFc2.png


上一篇
[Day 17] [複習篇] Day10 ~ Day16 周回複習
下一篇
[Day 19] 設計聊天頁面
系列文
RAG自己來系列:客服機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言