## 儲存紀錄
每次執行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")
```

</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的組合

</br>
</br>
#### 你也可以直接比較不同次實驗的結果

</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,)
```