## 儲存紀錄 每次執行akasha 的任何函數時,如果使用參數keep_logs=True,它都會保存此次運行的參數和結果到logs。每個運行都有一個timestamp,您可以使用 {obj_name}.timestamp_list 來查看它們,並使用它來找到您想要查看的logs。 您還可以將logs保存為 .txt 文件或 .json 文件。 ### 範例 執行完get_response後,可以利用timestamp獲取log,也可以使用***save_logs***來保存log ```python!= qa = akasha.Doc_QA(verbose=False, keep_logs=True, search_type="merge", max_doc_len=1500,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_doc_len":1500,....."response":....} qa.save_logs(file_name="logs.json",file_type="json") ``` ![logs](https://hackmd.io/_uploads/SyfwoYk5T.png) </br> </br> ## AiiDO akasha也可以利用AiiDO來保存執行紀錄,您需要在 AiiDO 平台上創建一個項目。完成後,您將收到自動上傳實驗所需的所有參數。 在程序的同一目錄下創建一個 .env 文件,並貼上所有參數。 ```text ##.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 服務器。 ```python!= 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) ``` </br> </br> #### 在你指定的實驗名稱中,可以看到不同次實驗的紀錄,每個紀錄的名稱是embedding, search type and model name的組合 ![upload_experiments](https://hackmd.io/_uploads/rkSjnt19p.png) </br> </br> #### 你也可以直接比較不同次實驗的結果 ![response_comparison](https://hackmd.io/_uploads/SyvahY1qp.png) </br> </br> ## 翻譯器 helper模組中提供寫好的函數***call_translator***讓LLM協助翻譯回答,如以下的範例使用語言模型將中文的回答翻譯成英文。 ```python!= 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") ``` </br> </br> ## JSON 格式輸出器 helper模組中提供寫好的函數***call_JSON_formatter***讓LLM協助將回答轉成JSON格式。 ```python!= ak = akasha.Doc_QA(threshold=0.0,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)) ``` ```TEXT!= {'學歷': 'xxx大學電資學士班四技', '經驗': '帶班導師xx文理補習班擔任補習班導師/管理人員', '專長': '計算機網路(協定)、資料庫系統、物件導向程式設計、C語言、Python、C++、Gitlab、Jenkins、Git、Linux(Bash shell、Ubuntu), '年資': '0-1年'} <class 'dict'> ``` </br> </br> ## call_model 若要呼叫語言模型,可以使用輔助函數call_model ```python!= 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) ``` </br> </br> ## call_stream_model 若要呼叫語言模型即時回答,可以使用輔助函數call_stream_model ```python!= 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) ``` </br> </br> ## call_batch_model 如果你有大量不需要連貫的推理需求,可以使用**akasha.helper.call_batch_model** 來進行批量推理來提升速度。 ```text def call_batch_model(model: LLM, prompt: List[str], system_prompt: Union[List[str], str] = "") -> List[str]: ``` ``` python 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"] ``` </br> </br> ## self-rag 實作[self-rag](https://github.com/AkariAsai/self-rag),利用語言模型來找出與問題相關的文件片段。 ```python!= question = "LPWAN和5G的區別是什麼?" model_obj = akasha.handle_model("openai:gpt-3.5-turbo", 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, False, 0.0, "auto", {}) docs, doc_length, doc_tokens = akasha.search.get_docs( db2, emb_obj, retrivers_list, question, False, "ch", "auto", False, model_obj, 6000, compression=False, ) RAGed_docs = akasha.self_RAG(model_obj, question, docs,) ```