2025 updates 0.9
安裝&使用
使用anaconda和pip安裝akasha套件
Linux使用者安裝完畢anaconda,進行安裝akasha套件。
1 | ###create environment |
使用uv安裝akasha套件
1 | ###create environment |
在Python中使用
1 | # PYTHON3.10 |
簡單UI介面
在terminal上輸入,便會開起streamlit使用介面
1 | $ akasha toy |
在瀏覽器中開啟 http://localhost:8501/
進行設定後,便可在ui介面使用akasha的功能,詳情見
此介面僅為簡單展示,不適合作為服務使用
CLI
透過command line interface使用akasha,你可以用’keep-rag’來建立一個文檔問答模型,並可以提出不同的問題,根據給定目錄中的文檔獲取語言模型的回答。
1 | $ akasha keep-rag -d ../doc/plc/ -c 400 |
現在可使用的指令: rag, keep-rag, toy, api and auto-evaluation.
1 | $ akasha keep-rag --help |
安裝WSL
windows使用者可以安裝Windows子系統(WSL),直接在Windows 執行Linux,請先確認windows版本是 Windows 10 版本 2004(組建 19041 和更新版本)或 Windows 11以上的版本才能安裝WSL。
先搜尋PowerShell,以系統管理員開啟 PowerShell執行WSL並安裝linux ubuntu,安裝完畢後要重新開機。
install wsl
安裝WSL並且安裝linux ubuntu。
1 | $ wsl --install |
安裝完畢,重新開機
更新ubuntu
重新開機後,開啟wsl,更新ubuntu到最新版本
1 | $ sudo apt update -y && sudo apt upgrade -y |
更新系統套件到最新版本
1 | $sudo apt update && upgrade |
安裝curl 套件
1 | $sudo apt install curl |
安裝anaconda
先建立一個資料夾
1 | $mkdir temp |
進入資料夾
1 | $cd temp |
下載anaconda.sh
1 | $curl https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh --output anaconda.sh |
安裝anaconda
1 | $bash anaconda.sh |
新增conda 指令
1 | $source ~/.bashrc |
確認conda 有安裝成功
1 | $conda info |
設定 API Key
openAI API Key
openAI:
如果需要使用openAI的模型,必須先去openai取得API金鑰。取得金鑰後,你可以選擇其中一種方法來匯入key:
1.將KEY放於.env檔案中OPENAI_API_KEY=your api key
1 | OPENAI_API_KEY={your api key} |
2.設定成環境變數(變數名:OPENAI_API_KEY)
3.在terminal中使用export設定環境變數
1 | export OPENAI_API_KEY={your api key} |
4.在Python中使用os.environ[‘OPENAI_API_KEY’]=your api key
Azure openAI
如果你想使用Azure openAI,先去azureAI取得base url 和 API key。
將OPENAI_API_KEY=your azure key, OPENAI_API_BASE=your Language API base url, OPENAI_API_TYPE=azure, OPENAI_API_VERSION=2023-05-15 寫於.env檔案並放於你要執行akasha的路徑中。
1 | ## .env file |
請記得在Azure openAI Studio部署所有你需要的模型,且部署名稱與模型名稱相同。
gemini API Key
如果你想使用Gemini 模型,請至google aistudio 或 GCP申請API金鑰。
取得金鑰後,你可以選擇其中一種方法來匯入key:
1.將KEY放於.env檔案中GEMINI_API_KEY=your api key
1 | GEMINI_API_KEY={your api key} |
2.設定成環境變數(變數名:GEMINI_API_KEY)
3.在terminal中使用export設定環境變數
1 | export GEMINI_API_KEY={your api key} |
4.在Python中使用os.environ[‘GEMINI_API_KEY’]=your api key
anthropic API Key
如果你想使用Gemini 模型,請至anthropic申請API金鑰。
取得金鑰後,你可以選擇其中一種方法來匯入key:
1.將KEY放於.env檔案中ANTHROPIC_API_KEY=your api key
1 | ANTHROPIC_API_KEY={your api key} |
2.設定成環境變數(變數名:ANTHROPIC_API_KEY)
3.在terminal中使用export設定環境變數
1 | export ANTHROPIC_API_KEY={your api key} |
4.在Python中使用os.environ[‘ANTHROPIC_API_KEY’]=your api key
遠端API Key
如果你想使用的遠端模型需指定API金鑰
1.將KEY放於.env檔案中RETMOE_API_KEY=your api key
1 | REMOTE_API_KEY={your api key} |
2.設定成環境變數(變數名:REMOTE_API_KEY)
3.在terminal中使用export設定環境變數
1 | export REMOTE_API_KEY={your api key} |
4.在Python中使用os.environ[‘REMOTE_API_KEY’]=your api key
1 | import os |
LLAMA-2
如果你想使用原版的meta-llama model,並須先去meta-llama去取得授權,並註冊huggingface取得access token,取得授權後才能經由huggingface下載並使用模型。
the account on Hugging Face and the email you use to request access to Meta-Llama must be the same, so that you can download models from Hugging Face once your account is approved.
You should see the Gated model You have been granted access to this model once your account is approved
同樣的,取得huggingface key值後,你可以選擇其中一種方法來匯入key:
1.將KEY放於.env檔案中HF_TOKEN=your api key
1 | HF_TOKEN={your api key} |
2.設定成環境變數(變數名:HF_TOKEN)
3.在terminal中使用export設定環境變數
1 | export HF_TOKEN={your api key} |
4.在Python中使用os.environ[‘HF_TOKEN’]=your api key
1 | #PYTHON3.9 |
設定多組不同API KEY
若你需要根據不同模型設定不同的API KEY,在Doc_QA, Model_Eval, Summary Class中皆提供env_file參數,可輸入不同的.env檔來export API KEY
若不存在或為空值,則為預設值(.env)
1 |
|
設定語言模型
選擇不同語言模型
使用參數model便可以選擇不同的語言模型,預設是openai:gpt-3.5-turbo.
範例
1. openai
(請先完成設定 API Key)
1 | import akasha |
2. huggingface
1 | import akasha |
3. llama-cpp
安裝llama-cpp-python可以使用cpu推論.gguf格式的模型,或是安裝akasha時選擇llama-cpp
1 | pip install llama-cpp-python |
llama-cpp允許使用quantized模型並執行在cpu上,你可以從huggingface上下載.gguf llama-cpp 模型,如範例,如果你的模型下載到”model/“路徑下,可以使用以下方法加載模型
1 | import akasha |
llama-cpp同樣允許使用gpu運算模型,但安裝套件時需要使用cmake安裝,並確認已安裝g++, gcc和nvidia driver & toolkit,詳細請見llama-cpp-python
1 | CMAKE_ARGS="-DGGML_CUDA=on" FORCE_CMAKE=1 python -m pip install --upgrade --force-reinstall llama-cpp-python>=0.3.1 --no-cache-dir |
4. 遠端api
如果你使用別人的api或者透過支援openAI api框架的部署自己的模型(例如vllm, TGI, litellm…),你可以使用 remote:{your LLM api url} 來加載模型,若須指定模型名稱,使用 remote:{your LLM api url}@{your model name} 。
若遠端api需要api金鑰,請先完成設定環境變數 REMOTE_API_KEY ,參考設定 API Key
1 | import akasha |
5. gemini
(請先完成設定 API Key)
1 | import akasha |
6. anthropic
(請先完成設定 API Key)
1 | import akasha |
推薦一些可使用的模型
1 | openai_model = "openai:gpt-3.5-turbo" # need environment variable "OPENAI_API_KEY" |
自訂語言模型
如果你想使用其他模型,可以建立一個輸入是prompt的函數並回傳語言模型的回答,並將此函數作為model參數
example
我們建立一個test_model函數,並可以將它作為參數輸入進RAG 或 ask物件回答問題
1 | import akasha |
建立LLM物件
以上使用model參數選擇模型後,便會在Doc_QA物件內建立模型的物件model_obj(LLM)
1 | import akasha |
也可以使用輔助函數建立LLM物件
1 | import akasha.helper as ah |
此LLM物件也可直接傳入高級物件,避免重複宣告
1 | import akasha |
直接使用LLM物件
取得模型類別
使用_llm_type()可取得語言模型的類別
1 |
|
模型推論
若要使用語言模型進行推論,可以使用函式call_model
1 | import akasha.helper as ah |
流輸出
若要呼叫語言模型即時回答,可以使用函式call_stream_model
1 | import akasha.helper as ah |
批量推論
如果你有大量不需要連貫的推理需求,可以使用akasha.helper.call_batch_model 來進行批量推理來提升速度。
1 | def call_batch_model(model: LLM, prompt: List[str], |
1 | import akasha |
輸出格式化
如果你想強制使語言模型輸出符合JSON格式的回答,可以使用 call_JSON_formatter,會轉換語言模型的輸出為字典或字典串列。
1 | import akasha.helper as ah |
設定嵌入模型
選擇不同嵌入模型
使用參數embeddings便可以選擇不同的嵌入模型,預設是openai:text-embedding-ada-002.
範例
1. openai
(請先完成設定 API Key)
1 | import akasha |
2. huggingface
1 | import akasha |
3. gemini
(請先完成設定 API Key)
1 | akasha.RAG( embeddings="gemini:models/text-embedding-004", |
推薦一些可使用的模型
每個嵌入模型都有max sequence length,超過的話後面的文字就會被截斷,不會拿進去做嵌入。
1 | openai_emb = "openai:text-embedding-ada-002" # need environment variable "OPENAI_API_KEY" # 8192 max seq length |
自訂嵌入模型
如果你想使用其他模型,可以建立一個輸入是texts:list的函數,代表的是文件庫中所有分割好的文字段落,此函數需回傳embedding之後每段文字的向量,並將此函數作為embeddings參數
example
我們建立一個test_embed函數,並可以將它作為參數輸入進get_response回答問題
1 | import akasha |
建立Embeddings物件
以上使用embeddings參數選擇模型後,便會在Doc_QA物件內建立模型的物件embeddings_obj(Embeddings)
1 | import akasha |
也可以使用輔助函數建立Embeddings物件
1 | import akasha |
此Embeddings物件也可直接傳入高級物件,避免重複宣告
1 |
|
直接使用Embeddings物件
embed_documents
創建完Embeddings物件後,可以直接使用來得到文件片段的向量資料(list[list[float]])
1 |
|
RAG
RAG
使用者可輸入一個或多個文件(.pdf, .docx, .md, .txt, .csv, .pptx)、資料夾、或網址,RAG將藉由嵌入模型將文件儲存成向量資料庫(儲存在/chromadb中)
此函數可以讓語言模型根據搜尋到的文件回答問題。藉由使用者的問題和文件庫搜尋到知識片段,可以不用將整份文件輸入給模型,就讓語言模型正確回答問題。
範例
宣告一個RAG的物件,可設定語言模型、嵌入模型、文本長度上限等參數。
使用 data_source 指定需要參考的文件資料,並建成向量資料庫(若已建立則直接讀取),根據prompt回答問題
詢問完問題後,若有keep_logs參數,可選擇儲存成json檔案,也可使用reference()取得回答問題所使用的文件名稱、頁數(dict)
1 | import akasha |
RAG 參數
verbose: bool 如果設True,會顯示每個步驟產生的文字和狀態
search_type: Union[str, Callable] 用來搜尋文件段落的方法,可選擇: auto, svm, tfidf, bm25, mmr, knn.
model: Union[str, BaseLanguageModel] 使用的語言模型,如 openai:gpt-3.5-turbo, gemini:gemini-1.5-flash
embeddings: Union[str, Embeddings]
chunk_size: int 單個文件段落的長度
temperature: float 語言模型的變化度(0~1)
system_prompt: str 指示給語言模型的output格式需求
stream: bool 如果設為True,會回傳generator
max_input_tokens: int 單次輸入模型的最大token數
max_output_tokens: int 模型輸出的最大token數
env_file:str 指定.env環境設定檔名
keep_logs: bool 是否保存執行過程和結果
call 參數
doc_source: Union[List[Union[str, Path]], Path, str, dbs] 一個或多個包含文件檔案的資料夾路徑名稱、網址,或單一個dbs物件
prompt: str 使用者的問題
history_messages: List[str] 需要一併提供給語言模型的對話紀錄
stream輸出
若需要即時輸出的場合(如UI即時顯示回答),使用stream=True可使RAG回傳generator。
1 | import akasha |
dbs物件
如想對同個文件集做多次問答,可以先建立dbs物件並傳入,避免多次重複載入文件的chromadb,若文件內容、使用嵌入模型、chunk size相等的chromadb已存在,則不會重新創建而直接讀取。
創建chromadb可使用 process_db
1 | import akasha |
RAG 輸出
使用完RAG的函式後,物件內部會儲存用來搜尋的db(self.db)、讓語言模型參考的文件(self.docs)、使用者的問題(self.prompt)和回答(self.response)等資訊,若需要更完整的資訊可參考輔助函數中的 儲存紀錄
1 | import akasha |
selfask_RAG
selfask_RAG會先將使用者問題嘗試使用語言模型進行拆分,再進行RAG回答問題,對於需要多個知識點的問題可能會獲得較好的結果
1 |
|
相關連結
self.db的詳細資訊可參考向量資料庫
self.docs的詳細資訊可參考文件搜尋
self.model_obj的詳細資訊可參考設定語言模型
self.embeddings_obj的詳細資訊可參考設定嵌入模型
ask
ask
如果你不想使用文件檔案,希望直接輸入文件內容,你可以使用ask物件,使用 info 參數將文件的內容傳給語言模型,info參數可輸入的內容為純文字、文件檔案名、文件資料夾名、網址,ask物件會讀取所有文件和純文字內容,並使用所有文件進行回答,因此若使用過多文件或文件內容過多,將花費大量時間與token。
若 info中的單一字串長度大於語言模型上限,該字串會強制被自行切割成 list of str,因此建議若文字過多,請自行分段成 list of str
若 info中的總文字內容過多,文件內容會被分別提供給語言模型作回答,並最終整合成一個最終回答,因此可能會花費較久時間。
詢問完問題後,若有keep_logs參數,可選擇儲存成json檔案
ask範例
1 | import akasha |
ask 參數
verbose: bool 如果設True,會顯示每個步驟產生的文字和狀態
model: Union[str, BaseLanguageModel] 使用的語言模型,如 openai:gpt-3.5-turbo, gemini:gemini-1.5-flash
temperature: float 語言模型的變化度(0~1)
system_prompt: str 指示給語言模型的output格式需求
stream: bool 如果設為True,會回傳generator
max_input_tokens: int 單次輸入模型的最大token數
max_output_tokens: int 模型輸出的最大token數
env_file:str 指定.env環境設定檔名
keep_logs: bool 是否保存執行過程和結果
call 參數
info: Union[str, list, Path, Document] 一個或多個包含文件檔案的資料夾路徑名稱、文件名稱、網址、純文字
prompt: str 使用者的問題
history_messages: List[str] 需要一併提供給語言模型的對話紀錄
vision
有些語言模型可以輸入圖片進行辨識,使用函式vision便可傳入圖片給語言模型。
參數 image_path 可為圖片的本機路徑或網址,也可以使用list傳入多張圖片
vision範例
1 | import akasha |
vision 參數
image_path: Union[List[str], str] 圖片的本機路徑或網址,也可以使用list傳入多張圖片
prompt: str 使用者的問題
相關連結
eval
eval
eval
是一個用於生成問題集並評估語言模型表現的class。它可以根據提供的資料來源自動生成問題集,並使用語言模型回答問題,最後根據答案的正確性或相似性進行評估。eval
支援多種問題類型與格式,並提供詳細的日誌記錄功能。
eval 功能
- 生成問題集:根據提供的資料來源,生成指定數量的問題與答案。
- 生成特定主題的問題集:根據主題篩選相關文件,生成與主題相關的問題集。
- 評估模型表現:使用生成的問題集評估語言模型的回答表現,並計算分數(如 Bert Score、Rouge-L 或正確率)。
- 日誌保存:支持保存執行過程與結果的日誌,便於後續分析。
使用question_type測試不同方面的能力
question_type 参数提供了四種問題類型:fact、summary、irrelevant、compared,預設是 fact。
- fact測試回答一般事實的能力
- summary測試模型做摘要的能力
- irrelevant測試模型能否分辨文件中不存在答案的問題
- compared測試模型比較不同事物的能力
eval 範例
生成問題集
1 | import akasha |
生成特定主題的問題集
1 | # 生成與主題相關的問題集 |
生成問題集格式
利用create_questionset生成的問題集為JSON格式,並包含 question 和 answer list 代表問題與參考答案。
1 | { |
評估模型表現
若 question_style 為 "single_choice"
(選擇題),evalution結果為正確率, 若為 "essay"
(問答題),結果為 bert score,
rouge score 和 ***llm score *** 的分數,皆介於0~1之間
bert-score
使用bert-score套件計算回答與參考答案的每個token之間的contextual embeddings similarity.
ROUGE-score
將語言模型的回答與問答題文件中的參考答案進行分詞後,藉由ROUGE 評估生成相似度分數
llm-score
利用另一種語言模型,將語言模型的回答與問答題文件中的參考答案進行比較,生成相似度分數,可以使用參數 eval_model 指定使用作為評判的語言模型
1 | # 使用生成的問題集評估模型表現 |
eval 參數
初始化參數
model: Union[str, BaseLanguageModel]
使用的語言模型,例如 "openai:gpt-4o"
或 "openai:gpt-3.5-turbo"
。
question_type: str
問題類型,包括 "fact"
(事實型)、"irrelevant"
(無關型)、"summary"
(摘要型)、"compared"
(比較型)。
question_style: str
問題格式,包括 "essay"
(問答題)或 "single_choice"
(選擇題)。
keep_logs: bool
是否保存執行過程與結果的日誌。
verbose: bool
是否顯示詳細的執行過程。
max_input_tokens: int
單次輸入模型的最大 token 數。
max_output_tokens: int
模型輸出的最大 token 數。
temperature: float
語言模型的隨機性參數,範圍為 0.0 到 1.0。
system_prompt: str
指示語言模型的輸出格式需求。
create_questionset 參數
data_source: Union[List[Union[str, Path]], Path, str, dbs]
資料來源,可以是文件目錄、文件路徑或資料庫。
question_num: int
生成的問題數量。
choice_num: int
選擇題的選項數量(僅在 question_style="single_choice"
時有效)。
output_file_path: str
輸出問題集的文件路徑。
create_topic_questionset 參數
data_source: Union[List[str], str]
資料來源,可以是文件目錄或文件路徑。
topic: str
生成問題集的主題。
question_num: int
生成的問題數量。
choice_num: int
選擇題的選項數量(僅在 question_style="single_choice"
時有效)。
output_file_path: str
輸出問題集的文件路徑。
evaluation 參數
questionset_file: str
問題集文件的路徑,(.json) 格式。
data_source: Union[List[Union[str, Path]], Path, str, dbs]
一個或多個包含文件檔案的資料夾路徑名稱、網址,或單一個dbs物件
eval_model: Union[BaseLanguageModel, str]
用於評估的語言模型,默認為初始化時的模型。
日誌與結果
- 問題集生成過程與結果會保存到指定的日誌文件中。
- 評估結果包括 Bert Score、Rouge-L 分數或正確率,具體取決於問題的格式。
相關連結
self.db的詳細資訊可參考向量資料庫
self.docs的詳細資訊可參考文件搜尋
self.model_obj的詳細資訊可參考設定語言模型
self.embeddings_obj的詳細資訊可參考設定嵌入模型
summary
summary
summary
是一個用於總結文件內容的class,支援多種摘要方法(如 map_reduce
和 refine
),可以處理多種格式的文件(如 .txt
, .docx
, .pdf
, .md
, .csv
, .pptx
),並將內容分塊後進行摘要,最終合併成一個完整的摘要。
summary 功能
- 多種摘要方法:
map_reduce
:將內容分塊後分別摘要,最後合併成完整摘要,速度較快,適合大規模內容。refine
:逐塊摘要並使用前一塊的摘要作為提示,摘要一致性較高,但速度較慢。
- 支援多種輸入格式:可處理本地文件、目錄、網址或純文字內容。
- 日誌保存:支持保存執行過程與結果的日誌,便於後續分析。
summary 範例
使用 map_reduce
方法進行摘要
1 | import akasha |
使用 refine
方法進行摘要
1 | summ = akasha.summary( |
summary 參數
初始化參數
model: str
使用的語言模型,例如 "openai:gpt-4o"
或 "openai:gpt-3.5-turbo"
。
sum_type: str
摘要方法,支持:
"map_reduce"
:分塊摘要後合併,速度較快。"refine"
:逐塊摘要並使用前一塊的摘要作為提示,摘要一致性較高。
sum_len: int
建議的摘要長度(以字數或 token 數計)。
chunk_size: int
分塊大小,單位為字數或 token。
chunk_overlap: int
分塊重疊大小,單位為字數或 token。
max_input_tokens: int
單次輸入模型的最大 token 數。
max_output_tokens: int
模型輸出的最大 token 數。
language: str
內容的語言,支持 "en"
(英文)和 "zh"
(中文)。
keep_logs: bool
是否保存執行過程與結果的日誌。
verbose: bool
是否顯示詳細的執行過程。
temperature: float
語言模型的隨機性參數,範圍為 0.0 到 1.0。
system_prompt: str
指示語言模型的輸出格式需求。
call 參數
content: Union[str, list, Path, Document]
需要總結的內容,可以是:
- 單個或多個文件路徑(如
.txt
,.docx
,.pdf
)。 - 單個或多個網址。
- 單個或多個純文字內容。
sum_type: str
摘要方法,支持 "map_reduce"
或 "refine"
。
sum_len: int
建議的摘要長度。
chunk_size: int
分塊大小。
chunk_overlap: int
分塊重疊大小。
max_input_tokens: int
單次輸入模型的最大 token 數。
max_output_tokens: int
模型輸出的最大 token 數。
temperature: float
語言模型的隨機性參數。
日誌與結果
- 總結過程與結果會保存到指定的日誌文件中。
- 日誌包括摘要的詳細過程、分塊信息、模型輸入輸出 token 數等。