儲存紀錄 每次執行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")
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的組合
你也可以直接比較不同次實驗的結果
翻譯器 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 akashamodel_obj = akasha.helper.handle_model("openai:gpt-3.5-turbo" , False , 0.0 ) 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)
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 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" keywords = akasha.generate_keyword(text=text, keyword_num=keyword_num, keyword_model=keyword_model) print (keywords)