輔助函數

儲存紀錄

每次執行akasha 的任何函數時,如果使用參數keep_logs=True,它都會保存此次運行的參數和結果到logs。每個運行都有一個timestamp,您可以使用 {obj_name}.timestamp_list 來查看它們,並使用它來找到您想要查看的logs。
您還可以將logs保存為 .txt 文件或 .json 文件。

範例

執行完get_response後,可以利用timestamp獲取log,也可以使用save_logs來保存log

1
2
3
4
5
6
7
8
9
10
11
12
13
qa = akasha.Doc_QA(verbose=False, keep_logs=True, search_type="merge", max_input_tokens=3000,model="llama-gpu:model/chinese-alpaca-2-7b.Q5_K_S.gguf")
query1 = "五軸是什麼"
qa.get_response(doc_path="./doc/mic/", prompt = query1)

tp = qa.timestamp_list
print(tp)
## ["2023/09/26, 10:52:36", "2023/09/26, 10:59:49", "2023/09/26, 11:09:23"]

print(qa.logs[tp[-1]])
## {"fn_type":"get_response","search_type":"merge", "max_input_tokens":3000,....."response":....}


qa.save_logs(file_name="logs.json",file_type="json")

logs



AiiDO

akasha也可以利用AiiDO來保存執行紀錄,您需要在 AiiDO 平台上創建一個項目。完成後,您將收到自動上傳實驗所需的所有參數。
在程序的同一目錄下創建一個 .env 文件,並貼上所有參數。

1
2
3
4
5
##.env file
MINIO_URL= YOUR_MINIO_URL
MINIO_USER= YOUR_MINIO_USER
MINIO_PASSWORD= YOUR_MINIO_PASSWORD
TRACKING_SERVER_URI= YOUR_TRACKING_SERVER_URI

在創建了 .env 文件之後,您可以使用 record_exp 來設置實驗名稱,它將自動記錄實驗指標和結果到 mlflow 服務器。

1
2
3
4
5
6
7
8
9
10
11
12
import akasha
import os
from dotenv import load_dotenv
load_dotenv()

os.environ["OPENAI_API_KEY"] = "your openAI key"

dir_path = "doc/"
prompt = "「塞西莉亞花」的花語是什麼? 「失之交臂的感情」 「赤誠的心」 「浪子的真情」 「無法挽回的愛」"
exp_name = "exp_akasha_get_response"
ak = akasha.Doc_QA(record_exp=exp_name)
response = ak.get_response(dir_path, prompt)


在你指定的實驗名稱中,可以看到不同次實驗的紀錄,每個紀錄的名稱是embedding, search type and model name的組合

upload_experiments



你也可以直接比較不同次實驗的結果

response_comparison



翻譯器

helper模組中提供寫好的函數call_translator讓LLM協助翻譯回答,如以下的範例使用語言模型將中文的回答翻譯成英文。

1
2
3
4
5
6
ak = akasha.Doc_QA(verbose=False, search_type="auto")

response = ak.get_response(doc_path="docs/mic/", prompt="五軸是什麼?")

translated_response = akasha.helper.call_translator(ak.model_obj, response, language="en")



JSON 格式輸出器

helper模組中提供寫好的函數call_JSON_formatter讓LLM協助將回答轉成JSON格式。

1
2
3
4
5
6
ak = akasha.Doc_QA(verbose=True,)
response = ak.ask_whole_file(file_path="docs/resume_pool/A.docx", prompt=f'''以上是受試者的履歷,請回答該受試者的學歷、經驗、專長、年資''')
formatted_response = akasha.helper.call_JSON_formatter(ak.model_obj, response, keys=["學歷", "經驗", "專長", "年資"])

print(formatted_response, type(formatted_response))

1
{'學歷': 'xxx大學電資學士班四技', '經驗': '帶班導師xx文理補習班擔任補習班導師/管理人員', '專長': '計算機網路(協定)、資料庫系統、物件導向程式設計、C語言、Python、C++、Gitlab、Jenkins、Git、Linux(Bash shell、Ubuntu), '年資': '0-1年'} <class 'dict'>


call_model

若要呼叫語言模型,可以使用輔助函數call_model

1
2
3
4
5
6
7
8
9
import akasha
system_prompt = "用中文回答"
prompt = "五軸是什麼?"
model_obj = akasha.handle_model("openai:gpt-e3.5-turbo", False, 0.0)
input_text = akasha.prompts.format_sys_prompt(system_prompt, prompt, "gpt")

response = akasha.call_model(model_obj, input_text)




call_stream_model

若要呼叫語言模型即時回答,可以使用輔助函數call_stream_model

1
2
3
4
5
6
7
8
9
10
11
12
import akasha

system_prompt = "用中文回答"
prompt = "五軸是什麼?"
model_obj = akasha.handle_model("openai:gpt-e3.5-turbo", False, 0.0)
input_text = akasha.prompts.format_sys_prompt(system_prompt, prompt, "gpt")

streaming = akasha.call_stream_model(model_obj, input_text)

for s in streaming:
print(s)



call_batch_model

如果你有大量不需要連貫的推理需求,可以使用akasha.helper.call_batch_model 來進行批量推理來提升速度。

1
2
def call_batch_model(model: LLM, prompt: List[str], 
system_prompt: Union[List[str], str] = "") -> List[str]:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import akasha

model_obj = akasha.helper.handle_model("openai:gpt-3.5-turbo", False, 0.0)
# this prompt ask LLM to response 'yes' or 'no' if the document segment is relevant to the user question or not.
SYSTEM_PROMPT = akasha.prompts.default_doc_grader_prompt()
documents = ["Doc1...", "Doc2...", "Doc3...", "Doc4..."]
question = "五軸是什麼?"

prompts = ["document: " + doc +"\n\n" + "User Question: "+ question for doc in documents]

response_list = call_batch_model(model_obj, prompt, SYSTEM_PROMPT)

## ["yes", "no", "yes", "yes"]





self-rag

實作self-rag,利用語言模型來找出與問題相關的文件片段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
question = "LPWAN和5G的區別是什麼?"

model_name = "openai:gpt-3.5-turbo"
model_obj = akasha.handle_model(model_name, False, 0.0)
emb_obj = akasha.handle_embeddings()


db = akasha.createDB_directory("./docs/mic/", emb_obj, ignore_check=True)


retrivers_list = akasha.search.get_retrivers(db2, emb_obj, 0.0,
"auto", {})

### max_input_tokens is the max length of tokens, so get_docs function will return top relevant docs that their total legnth do not exceed 6000 tokens ###
docs, doc_length, doc_tokens = akasha.search.get_docs(
db2,
retrivers_list,
question,
"ch",
"auto",
False,
model_name,
max_input_tokens=6000,
compression=False,
)

### we use self-RAG to sort those docs and using llm to determine the order of relevant docs ###
RAGed_docs = akasha.self_RAG(model_obj,
question,
docs,)


計算token數量

Tokenizer.compute_tokens,此函數回傳該語言模型輸入的文字所需要的token數量

1
2
3
4
5
6
7
8

text = "你是一個歷史學家詳細介紹札幌的歷史"
model = "openai:gpt-3.5-turbo"
num_tokens = akasha.myTokenizer.compute_tokens(
text=text, model_id=model)

print(num_tokens)

根據文件產生關鍵句子

generate_keyword使用keybert,根據輸入的文件來產生相關的關鍵字,可用於建立embeddings

注意

akasha.generate_keyword需安裝keybert套件

1
pip install keybert
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

text = """五軸工具機是一種比三軸工具機更先進的加工裝置。它透過兩個軸控制工具的旋轉方向,再透過長寬高三個軸移動進行切削加工,能
進行更複雜形狀的加工,確保加工精密度並符合自動化的訴求。 五軸加工的優勢在於首次手動調整後就能無人運作,節省人力物力,尤其在電動車等
領域的生產中,因應零件種類和產量變動頻繁的需求。 然而,五軸加工也面臨加工誤差穩定性的挑戰,例如溫度變動可能導致加工差距。 因此,廠
商也致力於開發相關技術,例如大隈的「熱親和理念」和「5軸微調」,以確保加工精密度在自動化環境下保持穩定。"""

keyword_num = 3 #產生的關鍵字數量

keyword_model = "paraphrase-multilingual-MiniLM-L12-v2" #default


keywords = akasha.generate_keyword(text=text, keyword_num=keyword_num, keyword_model=keyword_model)

print(keywords)

### ['五軸工具機是一種比三軸工具機更先進的加工裝置', '五軸加工的優勢在於首次手動調整後就能無人運作', '五軸加工也面臨加工誤差穩定性的挑戰']