嵌入模型

選擇不同嵌入模型

使用參數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) # [[-0.004720511846244335, -2.9706923214689596e-06, -0.013798418454825878,...], [-0.004720511846244335, -2.9706923214689596e-06, -0.013798418454825878,...], [-0.004720511846244335, -2.9706923214689596e-06, -0.013798418454825878,...]]




取出特定文件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)