0%

輔助函數

MLflow

akasha也可以利用MLflow來保存執行紀錄,您需要自行建立MLflow server。
並將tracking server的url放在程序的同一目錄下的 .env 文件,TRACKING_SERVER_URI= {YOUR_TRACKING_SERVER_URI}。

1
2
3
##.env file

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"

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


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

upload_experiments



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

response_comparison



call_model

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

1
2
3
4
5
6
7
8
9
10
11
12
import akasha
import akasha.helper as ah
from akasha.utils.prompts.gen_prompt import format_sys_prompt

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

response = ah.call_model(model_obj, input_text)




call_stream_model

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import akasha
import akasha.helper as ah
from akasha.utils.prompts.gen_prompt import format_sys_prompt

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

streaming = ah.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.helper as ah
from akasha.utils.prompts.gen_prompt import default_doc_grader_prompt
model_obj = ah.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 = default_doc_grader_prompt()
documents = ["Doc1...", "Doc2...", "Doc3...", "Doc4..."]
question = "五軸是什麼?"

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

response_list = ah.call_batch_model(model_obj, prompt, SYSTEM_PROMPT)

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





call_JSON_formatter

如果你想強制使語言模型輸出符合JSON格式的回答,可以使用 call_JSON_formatter,會轉換語言模型的輸出為字典或字典串列。

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
import akasha.helper as ah
from pydantic import BaseModel


PROMPT3 = """
openai_model = "openai:gpt-3.5-turbo" # need environment variable "OPENAI_API_KEY"
gemini_model="gemini:gemini-1.5-flash" # need environment variable "GEMINI_API_KEY"
anthropic_model = "anthropic:claude-3-5-sonnet-20241022" # need environment variable "ANTHROPIC_API_KEY"
huggingface_model = "hf:meta-llama/Llama-2-7b-chat-hf" #need environment variable "HUGGINGFACEHUB_API_TOKEN" to download meta-llama model
qwen_model = "hf:Qwen/Qwen2.5-7B-Instruct"
quantized_ch_llama_model = "hf:FlagAlpha/Llama2-Chinese-13b-Chat-4bit"
taiwan_llama_gptq = "hf:weiren119/Taiwan-LLaMa-v1.0-4bits-GPTQ"
mistral = "hf:Mistral-7B-Instruct-v0.2"
mediatek_Breeze = "hf:MediaTek-Research/Breeze-7B-Instruct-64k-v0.1"
"""
model_obj = ah.handle_model("openai:gpt-4o", False, 0.0)


## 使用BaseModel 指定輸出的keys
class Model_Type(BaseModel):
model_type: str
model_name: str


json_response = ah.call_JSON_formatter(model_obj, PROMPT3, keys=Model_Type)
print(json_response)
# response: [{'model_type': 'openai', 'model_name': 'gpt-3.5-turbo'}, {'model_type': 'gemini', 'model_name': 'gemini-1.5-flash'}, {'model_type': 'anthropic', 'model_name': 'claude-3-5-sonnet-20241022'},...




計算token數量

Tokenizer.compute_tokens,此函數回傳該語言模型輸入的文字所需要的token數量
get_doc_length,此函數使用jieba計算字串長度
sim_to_trad,此函數將字串簡轉繁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import akasha.helper as ah

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

print(num_tokens)

### compute the length of the text by jieba ###
doc_length = ah.get_doc_length(TEXT)

### translate simplified chinese to traditional chinese ###
ret = ah.sim_to_trad(TEXT)

從字串中取出dictionary

extract_json將字串中的json格式轉成字典,若找不到則回傳None

1
2
3
4
5
6
7
8
9
10
11
import akasha.helper as ah
TEXT2 = """工業4.0是甚麼?
{
"title": "工業4.0",
"description": "工業4.0是一場製造業的數位轉型,融合了物聯網、人工智慧與自動化技術,提升生產效率與靈活性。"
}
"""

### get the json format dictionary from the text ###
text_dict = ah.extract_json(TEXT2)

相似度分數

此函式利用bert, rouge, llm計算兩字串的相似度分數(0~1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import akasha.helper as ah

DEFAULT_MODEL = "openai:gpt-4o"

rf1 = """工業4.0是指智慧與互聯的生產系統,旨在感知、預測物理世界並與之互動,以便即時做出支持生產的決策。這一概念最早於2011年在漢諾威工業博覽會上提出,並被
納入德國、美國、中國等國家的高科技產業發展策略中。工業4.0的核心在於利用物聯網、人工智慧、大數據等技術,將生產從自動化提升到智慧化,實現更高效的生
產管理和決策。"""

rf2 = """工業 4.0 是一種智慧與互聯的生產系統,旨在感知、預測物理世界並與之互動,以便即時做出支持生產的決策。
簡單來說,它利用像是物聯網、AI、大數據和雲端等技術,讓製造業更加智能化和自動化。
"""

### use bert to get the similarity score ###
bert_score = ah.get_bert_score(rf1, rf2)

### use rouge to get the similarity score ###
rouge_score = ah.get_rouge_score(rf1, rf2)

### use llm to get the similarity score ###
llm_score = ah.get_llm_score(rf1, rf2, DEFAULT_MODEL)