選擇不同嵌入模型
使用參數embeddings便可以選擇不同的嵌入模型,預設是openai:text-embedding-ada-002.
範例
1. openai
(請先完成設定 API Key)
1 2 3 4
| import akasha
akasha.Doc_QA() ak.get_response(dir_path, prompt, embeddings="openai:text-embedding-ada-002",)
|
2. huggingface
1 2 3 4
| import akasha
ak = akasha.Doc_QA(embeddings="huggingface:all-MiniLM-L6-v2") resposne = ak.get_response(dir_path, prompt)
|
3. gemini
(請先完成設定 API Key)
1 2 3 4 5 6 7
| import akasha
akasha.Doc_QA() ak.get_response(dir_path, prompt, embeddings="gemini:models/text-embedding-004", model="gemini:gemini-1.5-flash")
|
可使用的模型
每個嵌入模型都有max sequence length,超過的話後面的文字就會被截斷,不會拿進去做嵌入。
1 2 3 4 5 6 7 8 9
| openai_emb = "openai:text-embedding-ada-002" # need environment variable "OPENAI_API_KEY" # 8192 max seq length openai_3l_emb = "openai:text-embedding-3-large" openai_3s_emb = "openai:text-embedding-3-small" gemini_emb = "gemini:models/text-embedding-004" huggingface_emb = "hf:all-MiniLM-L6-v2" alibaba_bge_emb = "hf:Alibaba-NLP/gte-multilingual-base" #8192 max seq length bge_en_emb = "hf:BAAI/bge-base-en-v1.5" # 512 max seq length bge_ch_emb = "hf:BAAI/bge-base-zh-v1.5" # 512 max seq length
|
自訂嵌入模型
如果你想使用其他模型,可以建立一個輸入是texts:list的函數,代表的是文件庫中所有分割好的文字段落,此函數需回傳embedding之後每段文字的向量,並將此函數作為embeddings參數
example
我們建立一個test_embed函數,並可以將它作為參數輸入進get_response回答問題
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import akasha
def test_embed(texts:list)->list:
from sentence_transformers import SentenceTransformer mdl = SentenceTransformer('BAAI/bge-large-zh-v1.5') embeds = mdl.encode(texts,normalize_embeddings=True)
return embeds
doc_path = "./mic/" prompt = "五軸是什麼?"
qa = akasha.Doc_QA(verbose=True, search_type = "svm", embeddings = test_embed) qa.get_response(doc_path= doc_path, prompt = prompt)
|
建立Embeddings物件
以上使用embeddings參數選擇模型後,便會在Doc_QA物件內建立模型的物件embeddings_obj(Embeddings)
1 2 3 4 5 6
| import akasha
AK = akasha.Doc_QA(embeddings="openai:text-embedding-ada-002")
print(type(AK.embeddings_obj))
|
也可以使用輔助函數建立Embeddings物件
1 2 3 4 5 6
| import akasha
embeddings_obj = akasha.handle_embeddings("openai:text-embedding-ada-002",verbose=False)
print(type(embeddings_obj))
|
此Embeddings物件也可直接傳入Doc_QA,避免重複宣告
1 2 3 4 5 6 7
| import akasha
model_obj = akasha.handle_model("openai:gpt-3.5-turbo",verbose=False,temperature=0.0) embeddings_obj = akasha.handle_embeddings("openai:text-embedding-ada-002",verbose=False) AK = Doc_QA(model=model_obj, embeddings=embeddings_obj)
|
直接使用Embeddings物件
embed_documents
創建完Embeddings物件後,可以直接使用來得到文件片段的向量資料(list[list[float]])
1 2 3 4 5 6 7 8 9 10
| import akasha
text_list = ["範例文件內容1", "範例文件內容2", "範例文件內容3"] embeddings_obj = akasha.handle_embeddings("openai:text-embedding-ada-002",verbose=False) vectors = embeddings_obj.embed_documents(text_list)
print(vectors)
|
取出特定文件db
當你想從大量文檔db中取出特定的文件db,以縮小搜尋範圍時,可以使用 extract_db_by_file (by file source name) 或 extract_db_by_keyword (by id)
example
1 2 3 4 5 6 7 8 9 10 11
| import akasha emb_name = "openai:text-embedding-ada-002" emb_obj = akasha.handle_embeddings(emb_name, False) doc_path = ["文檔資料夾1","文檔資料夾2"] db, _ = akasha.db.processMultiDB(doc_path, True, emb_obj, chunk_size=1000, ignore_check=True)
## extract from db ## file_name_list = ["f1.txt", "g2.docx", "h3.pdf"] ex_db = akasha.extract_db_by_file(db, file_name_list)
|