先下載相關程式
git clone https://github.com/kuwaai/genai-os/
cd genai-os/docker
將預設的 .admin-password.sample
, .db-password.sample
, .env.sample
三個檔案複製一份成檔名移除副檔名 .sample
的新檔案
cp .admin-password.sample .admin-password
cp .db-password.sample .db-password
cp .env.sample .env
依據網站說明,修改這三個檔案的內容
.admin-password
: 設定成未來系統管理員的密碼
.db-password
: 設定成未來系統資料庫的密碼
.env
: 環境變數設定(若只是自行測試,可先不用修改)
DOMAIN_NAME=localhost # 機器的domain name
PUBLIC_BASE_URL="http://${DOMAIN_NAME}/" # 機器的網址
ADMIN_NAME="Kuwa Admin" # 管理者名稱
ADMIN_EMAIL="admin@${DOMAIN_NAME}" # 管理者的登入 email 信箱
執行 run.sh,此時會執行預設的 compose/base.yaml、compose/pgsql.yaml、compose/gemini.yaml、compose/docqa_webqa.yaml、compose/searchqa.yaml 共五個應用程式的服務
./run.sh
需要等待一段時間將這幾個 containers 跑起來,之後可以在 Docker dashboard 上看到跑起來容器
以及跑起來的映像檔
接著打開瀏覽器,輸入 http://localhost (或剛剛設定的機器網址),就可以看到 Kuwa 已經跑起來了!
若要登入 Kuwa,先點選右上角的 Sing in,接著輸入剛剛設定的管理者登入email信箱,以及系統管理員密碼,就可以成功登入,並且看到預設的 Gemini Pro 模組已經安裝好放在桌面上了
我們使用原始安裝後唯一有跑起來的 geminipro 模組做為參考範例,先產生一個接下來要使用的 OpenAI GPT-4 的設定檔
cp gemini.yaml chatgpt.yaml
接著編輯這個新的 chatgpt.yaml 檔案,總共需要修改下列幾個地方:
將第二行 gemini-executor:
改成 chatgpt-executor:
將環境變數 EXECUTOR_TYPE
從原本的 geminipro
改成 chatgpt
,這邊可以參考 genai-os/src/executor/
目錄下的檔案名稱,為目前已支援的 EXECUTOR_TYPE
將環境變數 EXECUTOR_ACCESS_CODE
從原本的 gemini-pro
改成 gpt-4-turbo
,這邊只要是不重複使用的代號即可,建議可使用所欲使用的模型版本號碼
將環境變數 EXECUTOR_NAME
從原本的 Gemini Pro
改成 OpenAI GPT-4
,這邊所設定的代號,未來會出現在 Kuwa 的網頁介面中,因此以簡單易懂為原則
在 command
的內容加入指定 gpt-4-turbo 模型,從原本的
command: ["–api_key", ……
改成
command: ["–model", "gpt-4-turbo","–api_key", ……
由於 OpenAI GPT-4 需使用 API key 才能存取,因此在 command
的 api_key 中,將原本的 <YOUR_GLOBAL_API_KEY_HERE>
改成你的 OpenAI API key
設定完畢後,將 chatgpt.yaml 的主檔名 (chatgpt) 加入 run.sh 檔案中的 confs 陣列中,接著重新執行 run.sh 程式即可
接著登入 Kuwa 後,在 room 裡面就可以看到多了一個 OpenAI gpt-4-turbo 的模組了
點選這個新增模組後,我們可以請它自我介紹驗明正身 XD
Ollama 提供一個在地端快速部署 LLM 的平台,使用時可以先透過 Ollama 的 Library 網頁搜尋想要使用的 LLM,並且使用 ollama pull MODEL_NAME
的指令直接下載,接著便可以透過 Ollama 提供的類 ChatGPT 的 OpenAI API 相容方式提供 API 服務,預設的 API 網址為 http://localhost:11434/v1
,同時 API Key 為 ollama
。
我們以 Microsoft Phi 3 mini 這個 LLM 為例(其他的 LLM 請比照辦理即可),首先使用ollama pull phi3
的指令下載模型後,接著我們按照下列方式加入 Kuwa:
我們使用原始安裝後唯一有跑起來的 geminipro 模組做為參考範例,先產生一個接下來要使用的 ollama-phi3 的設定檔
cp gemini.yaml ollama-phi3.yaml
接著編輯這個新的 ollama-phi3.yaml 檔案,總共需要修改下列幾個地方:
將第二行 gemini-executor:
改成 ollama-phi3-executor:
將環境變數 EXECUTOR_TYPE
從原本的 geminipro
改成 chatgpt
將環境變數 EXECUTOR_ACCESS_CODE
從原本的 gemini-pro
改成 ollama-phi3
,這邊只要是不重複使用的代號即可,建議可使用所欲使用的模型版本號碼
將環境變數 EXECUTOR_NAME
從原本的 Gemini Pro
改成 Ollama Phi3
,這邊所設定的代號,未來會出現在 Kuwa 的網頁介面中,因此以簡單易懂為原則
在 command
的內容加入指定的模型、API 網址、API key,變成:
command: ["–model", "phi3", "–base_utl", "http://host.docker.internal:11434/v1", "–api_key", "ollama"]
請注意,原本在 Ollama 中所提示的 API 網址為http://[localhost](http://localhost):11434/v1
,但由於我們是使用 Docker 的模式載入這個 LLM,在容器中無法使用 localhost 連到直接跑在機器上面的服務,因此需將 localhost 改成機器本身的 IP address,或者直接使用 Docker 提供的機器名稱 host.docker.internal
,就可以連到直接跑在機器上面的服務
設定完畢後,將 ollama-phi3.yaml 的主檔名 (ollama-phi3) 加入 run.sh 檔案中的 confs 陣列中,接著重新執行 run.sh 程式即可
接著登入 Kuwa 後,在 room 裡面就可以看到多了一個 Ollama Phi3 的模組了
LM Studio 提供一個在地端快速部署 LLM 的平台,使用時可以先透過 LM Studio 的 Search 功能尋找想使用的開放模型,接著可以直接點選 Download 下載,然後可以透過 LM Studio 的 Local Server 功能,將想要啟動的 LLM 模型掛載到本機上,並透過類 ChatGPT 的 OpenAI API 相容方式提供 API 服務,預設的 API 網址為 http://localhost:11434/v1
,同時 API Key 為 lm-studio
。
我們以 Microsoft Phi 3 mini 這個 LLM 為例(其他的 LLM 請比照辦理即可),首先在 LM Studio 下載 microsoft/Phi-3-mini-4k-instruct-gguf
完成後,並在 Local Server 中載入這個模型,接著我們按照下列方式加入 Kuwa:
我們使用原始安裝後唯一有跑起來的 geminipro 模組做為參考範例,先產生一個接下來要使用的 lmstudio-microsoft-phi3-mini 的設定檔
cp gemini.yaml lmstudio-microsoft-phi3-mini.yaml
接著編輯這個新的 lmstudio-microsoft-phi3-mini.yaml 檔案,總共需要修改下列幾個地方:
將第二行 gemini-executor:
改成 lmstudio-microsoft-phi3-mini-executor:
將環境變數 EXECUTOR_TYPE
從原本的 geminipro
改成 chatgpt
將環境變數 EXECUTOR_ACCESS_CODE
從原本的 gemini-pro
改成 lmstudio-microsoft-phi3-mini
,這邊只要是不重複使用的代號即可,建議可使用所欲使用的模型版本號碼
將環境變數 EXECUTOR_NAME
從原本的 Gemini Pro
改成 LM Studio MS-Phi3-mini
,這邊所設定的代號,未來會出現在 Kuwa 的網頁介面中,因此以簡單易懂為原則
在 command
的內容加入指定的模型、API 網址、API key,變成:
command: ["–model", "microsoft/Phi-3-mini-4k-instruct-gguf", "–base_utl", "http://host.docker.internal:11434/v1", "–api_key", "lm-studio"]
請注意,原本在 LM Studio 中所提示的 API 網址為http://[localhost](http://localhost):11434/v1
,但由於我們是使用 Docker 的模式載入這個 LLM,在容器中無法使用 localhost 連到直接跑在機器上面的服務,因此需將 localhost 改成機器本身的 IP address,或者直接使用 Docker 提供的機器名稱 host.docker.internal
,就可以連到直接跑在機器上面的服務
設定完畢後,將 lmstudio-microsoft-phi3-mini.yaml 的主檔名 (lmstudio-microsoft-phi3-mini) 加入 run.sh 檔案中的 confs 陣列中,接著重新執行 run.sh 程式即可
接著登入 Kuwa 後,在 room 裡面就可以看到多了一個 LM Studio MS-Phi3-mini 的模組了
Kuwa 提供 llamacpp 的 executor,可以直接載入本機端使用 GGUF 檔案格式的 LLM 模組,我們以 Google Gemma 7B 為例,設定的方法如下:
前往 https://huggingface.co/google/gemma-7b/tree/main 下載 Google Gemma 7B 的 GGUF 檔案,檔名為 gemma-7b.gguf
,並將其存在 $HOME/gguf
目錄下。
我們使用原始安裝後所附的 llamacpp.yaml 做為參考範例,先產生一個接下來要使用的 llamacpp-gemma-7b.yaml 設定檔
cp llamacpp.yaml llamacpp-gemma-7b.yaml
接著編輯這個新的 llamacpp-gemma-7b.yaml 檔案,總共需要修改下列幾個地方:
llamacpp-executor:
改成 llamacpp-gemma-7b-executor:
EXECUTOR_ACCESS_CODE
改成 llamacpp-gemma-7b
,這邊只要是不重複使用的代號即可,建議可使用所欲使用的模型版本號碼EXECUTOR_NAME
改成 Llamacpp Gemma-7B
,這邊所設定的代號,未來會出現在 Kuwa 的網頁介面中,因此以簡單易懂為原則command
的設定中,將原本的 /var/model/taide-4bit.gguf
改成 /var/model/gemma-7b.gguf
volumes
的設定中,將原本的 /path/to/taide/model.gguf
改成 ${HOME}/gguf/gemma-7b.gguf
,再將/var/model/taide-4bit.gguf
改成 /var/model/gemma-7b.gguf
設定完畢後,將 llamacpp-gemma-7b.yaml 的主檔名 (llamacpp-gemma-7b) 加入 run.sh 檔案中的 confs 陣列中,接著重新執行 run.sh 程式即可
接著登入 Kuwa 後,在 room 裡面就可以看到多了一個 Llamacpp Gemma-7B 的模組了
cp gemini.yaml taide.yaml
將第二行 gemini-executor:
改成 taide-executor:
將環境變數 EXECUTOR_TYPE
從原本的 geminipro
改成 chatgpt
將環境變數 EXECUTOR_ACCESS_CODE
從原本的 gemini-pro
改成 taide-Llama3-TAIDE-LX-8B-Chat-Alpha1
,這邊只要是不重複使用的代號即可,建議可使用所欲使用的模型版本號碼
將環境變數 EXECUTOR_NAME
從原本的 Gemini Pro
改成 TAIDE Llama3-TAIDE-LX-8B-Chat-Alpha1
,這邊所設定的代號,未來會出現在 Kuwa 的網頁介面中,因此以簡單易懂為原則
在 command
的內容加入指定的 LLM 模型,以及 API 的網址,從原本的
command: ["–api_key", ……
改成
command: ["–model", "Llama3-TAIDE-LX-8B-Chat-Alpha1","–base_url", "https://xxxxx.xxx.xxx.xxx/api/v1","–system_prompt", "你是一個來自台灣的AI助理,你的名字是TAIDE,樂於以台灣人的立場幫助使用者,會用繁體中文回答問題。”, "–api_key", ……
由於 TAIDE API 需使用 API key 才能存取,因此在 command
的 api_key 中,將原本的 <YOUR_GLOBAL_API_KEY_HERE>
改成你的 TAIDE token
我們以 Ollama 官方網站上提供的 ryan4559/llama3-taide-lx-8b-chat-alpha1-4bit 這個 TAIDE 版本為例,首先使用ollama pull ryan4559/llama3-taide-lx-8b-chat-alpha1-4bit
的指令下載模型後,接著我們按照下列方式加入 Kuwa:
我們使用原始安裝後唯一有跑起來的 geminipro 模組做為參考範例,先產生一個接下來要使用的 ollama-taide 的設定檔
cp gemini.yaml ollama-taide.yaml
接著編輯這個新的 ollama-phi3.yaml 檔案,總共需要修改下列幾個地方:
將第二行 gemini-executor:
改成 ollama-taide-executor:
將環境變數 EXECUTOR_TYPE
從原本的 geminipro
改成 chatgpt
將環境變數 EXECUTOR_ACCESS_CODE
從原本的 gemini-pro
改成 ollama-taide
,這邊只要是不重複使用的代號即可,建議可使用所欲使用的模型版本號碼
將環境變數 EXECUTOR_NAME
從原本的 Gemini Pro
改成 Ollama TAIDE
,這邊所設定的代號,未來會出現在 Kuwa 的網頁介面中,因此以簡單易懂為原則
在 command
的內容加入指定的模型、API 網址、API key,變成:
command: ["–model", "ryan4559/llama3-taide-lx-8b-chat-alpha1-4bit", "–base_utl", "http://host.docker.internal:11434/v1", "–api_key", "ollama"]
請注意,原本在 Ollama 中所提示的 API 網址為http://[localhost](http://localhost):11434/v1
,但由於我們是使用 Docker 的模式載入這個 LLM,在容器中無法使用 localhost 連到直接跑在機器上面的服務,因此需將 localhost 改成機器本身的 IP address,或者直接使用 Docker 提供的機器名稱 host.docker.internal
,就可以連到直接跑在機器上面的服務
設定完畢後,將 ollama-taide.yaml 的主檔名 (ollama-taide) 加入 run.sh 檔案中的 confs 陣列中,接著重新執行 run.sh 程式即可
接著登入 Kuwa 後,在 room 裡面就可以看到多了一個 Ollama TAIDE 的模組了
我們以 Llama3-TAIDE-LX-8B-Chat-Alpha1 這個 LLM 為例,首先在 LM Studio 下載 ZoneTwelve/Llama3-TAIDE-LX-8B-Chat-Alpha1-GGUF
完成後(LM Studio 上有許多其他載點,可自行選擇),並在 Local Server 中載入這個模型,接著我們按照下列方式加入 Kuwa:
我們使用原始安裝後唯一有跑起來的 geminipro 模組做為參考範例,先產生一個接下來要使用的 lmstudio-llama3-taide-lx-8b-chat-alpha1 的設定檔
cp gemini.yaml lmstudio-llama3-taide-lx-8b-chat-alpha1.yaml
接著編輯這個新的 lmstudio-llama3-taide-lx-8b-chat-alpha1.yaml 檔案,總共需要修改下列幾個地方:
將第二行 gemini-executor:
改成 lmstudio-llama3-taide-lx-8b-chat-alpha1-executor:
將環境變數 EXECUTOR_TYPE
從原本的 geminipro
改成 chatgpt
將環境變數 EXECUTOR_ACCESS_CODE
從原本的 gemini-pro
改成 lmstudio-Llama3-TAIDE-LX-8B-Chat-Alpha1-GGUF
,這邊只要是不重複使用的代號即可,建議可使用所欲使用的模型版本號碼
將環境變數 EXECUTOR_NAME
從原本的 Gemini Pro
改成 LM Studio Llama3-TAIDE-LX-8B-Chat-Alpha1-GGUF
,這邊所設定的代號,未來會出現在 Kuwa 的網頁介面中,因此以簡單易懂為原則
在 command
的內容加入指定的模型、API 網址、API key,變成:
command: ["–model", "ZoneTwelve/Llama3-TAIDE-LX-8B-Chat-Alpha1-GGUF", "–base_url", "http://host.docker.internal:11434/v1", "–api_key", "lm-studio", "–system_prompt", "你是一個來自台灣的AI助理,你的名字是TAIDE,樂於以台灣人的立場幫助使用者,會用繁體中文回答問題。”]
請注意,原本在 LM Studio 中所提示的 API 網址為http://[localhost](http://localhost):11434/v1
,但由於我們是使用 Docker 的模式載入這個 LLM,在容器中無法使用 localhost 連到直接跑在機器上面的服務,因此需將 localhost 改成機器本身的 IP address,或者直接使用 Docker 提供的機器名稱 host.docker.internal
,就可以連到直接跑在機器上面的服務。
設定完畢後,將 lmstudio-llama3-taide-lx-8b-chat-alpha1.yaml 的主檔名 (lmstudio-llama3-taide-lx-8b-chat-alpha1) 加入 run.sh 檔案中的 confs 陣列中,接著重新執行 run.sh 程式即可
接著登入 Kuwa 後,在 room 裡面就可以看到多了一個 LM Studio Llama3-TAIDE-LX-8B-Chat-Alpha1-GGUF 的模組了
前往 https://huggingface.co/taide/Llama3-TAIDE-LX-8B-Chat-Alpha1-4bit/tree/main 下載基於 Llama3 的 TAIDE 8B 4bit 版本的 GGUF 檔案,檔名為 taide-8b-a.3-q4_k_m.gguf
,並將其存在 $HOME/gguf
目錄下。
我們使用原始安裝後所附的 llamacpp.yaml 做為參考範例,先產生一個接下來要使用的 llamacpp-taide.yaml 設定檔
cp llamacpp.yaml llamacpp-taide.yaml
接著編輯這個新的 llamacpp-gemma-7b.yaml 檔案,總共需要修改下列幾個地方:
llamacpp-executor:
改成 llamacpp-taide-executor:
EXECUTOR_ACCESS_CODE
改成 llamacpp-taide
,這邊只要是不重複使用的代號即可,建議可使用所欲使用的模型版本號碼EXECUTOR_NAME
改成 Llama3-TAIDE-LX-8B-Chat-Alpha1-4bit
,這邊所設定的代號,未來會出現在 Kuwa 的網頁介面中,因此以簡單易懂為原則command
的設定中,將原本的 /var/model/taide-4bit.gguf
改成 /var/model/taide-8b-a.3-q4_k_m.gguf
volumes
的設定中,將原本的 /path/to/taide/model.gguf
改成 ${HOME}/gguf/taide-8b-a.3-q4_k_m.gguf
,再將/var/model/taide-4bit.gguf
改成 /var/model/taide-8b-a.3-q4_k_m.gguf
設定完畢後,將 llamacpp-taide.yaml 的主檔名 (llamacpp-taide) 加入 run.sh 檔案中的 confs 陣列中,接著重新執行 run.sh 程式即可
接著登入 Kuwa 後,在 room 裡面就可以看到多了一個 Llama3-TAIDE-LX-8B-Chat-Alpha1-4bit 的模組了
Kuwa 已內建針對單一檔案或單一網頁進行內容讀取,然後透過 LLM 針對內容進行互動問答的功能,若要開啟使用這兩個功能 (DocQA 和 WebQA),必須編輯 docker/compose/docqa_webqa.yaml 的內容,並設定其中的參數
"--model"
:這邊可以使用原本在 run.sh 中已經放入 confs 陣列中啟動執行的其中一種語言模型,只要將該語言模型對應的 .yaml 檔案中的 EXECUTOR_ACCESS_CODE
的設定值,放入 "--model"
中即可。EXECUTOR_ACCESS_CODE
預設值為 doc-qa;web-qa
,這個設定請不要修改,否則將無法正常運作 。待完成所有設定後,接著在 docker/run.sh 中將 docqa_webqa 放入 confs 陣列中,然後執行 run.sh ,即可在 Kuwa 中執行 DocQA 和 WebQA 的功能。
Kuwa 同時也內建了搜尋網頁並將結果透過 LLM 進行摘要的功能,若要開啟使用這個功能 (SearchQA),必須編輯 docker/compose/searchqa.yaml 的內容,設定 SearchQA 所使用的兩個重要元件:
EXECUTOR_ACCESS_CODE
的設定值,放入 searchqa.yaml 的 "--model"
中即可。"--google_cse_id"
中置入 Search engine ID,並在 "--google_api_key"
中置入 Google API Key 即可。EXECUTOR_ACCESS_CODE
預設值為 search-qa
,這個設定請不要修改,否則將無法正常運作。待完成所有設定後,接著在 docker/run.sh 中將 searchqa 放入 confs 陣列中,然後執行 run.sh ,即可在 Kuwa 中執行 SearchQA 的功能。
Kuwa 也有提供 RAG 的功能,可以針對特定的資料庫(a.k.a. 一堆檔案,目前支援 pdf, doc, docx, html 等格式)進行讀取後,轉成機器可讀的向量資料庫,接著在使用者詢問時,可以根據已轉化後的資料庫內容,尋找對應的原始文件內容,再透過大型語言模型的語言能力,完成語法正確的問題回應。為了讓 Kuwa 完成這一系列工作,需進行下列步驟:
將原始文件集轉成向量資料庫
安裝所需要的相關套件 (假設目前在 genai-os 的目錄下)
cd src/toolchain/
pip3 install -r requirements.txt
假設原始文件存放在 ~/example/docs/ 目錄下,產生的向量資料庫預定要存放在 ~/example/database/ 目錄下,則執行下列指令
python3 construct_vector_db.py ~/example/docs/ ~/example/database/
執行過程中,倘若出現 ModuleNotFoundError: No module named 'six.moves'
的錯誤,代表 six 這個模組的安裝可能有問題,可以先手動解除安裝後再重先安裝
pip3 uninstall six; pip3 install --user six
使用 Kuwa 的 DBQA 功能提供問答服務
編輯 docker/compose/dbqa.yaml 的內容,並設定其中兩個參數
"--model"
:這邊可以使用原本在 run.sh 中已經放入 confs 陣列中啟動執行的其中一種語言模型,只要將該語言模型對應的 .yaml 檔案中的 EXECUTOR_ACCESS_CODE
的設定值,放入 "--model"
中即可。volumes
的設定中,將原本的 </path/to/vector-database>
改成 ${HOME}/example/database/
EXECUTOR_ACCESS_CODE
預設值為 dbqa
,這個設定請不要修改,否則將無法正常運作待完成所有設定後,接著在 docker/run.sh 中將 dbqa 放入 confs 陣列中,然後執行 run.sh ,即可在 Kuwa 中執行 DBQA 的功能。
感謝以下夥伴協助測試/驗證/修改/建議:詠翔、登傑、智漢、瑞恩