0%

RAG

RAG

使用者可輸入一個或多個文件(.pdf, .docx, .md, .txt, .csv, .pptx)、資料夾、或網址,RAG將藉由嵌入模型將文件儲存成向量資料庫(儲存在/chromadb中)
此函數可以讓語言模型根據搜尋到的文件回答問題。藉由使用者的問題和文件庫搜尋到知識片段,可以不用將整份文件輸入給模型,就讓語言模型正確回答問題。

範例

宣告一個RAG的物件,可設定語言模型、嵌入模型、文本長度上限等參數。
使用 data_source 指定需要參考的文件資料,並建成向量資料庫(若已建立則直接讀取),根據prompt回答問題
詢問完問題後,若有keep_logs參數,可選擇儲存成json檔案,也可使用reference()取得回答問題所使用的文件名稱、頁數(dict)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import akasha

ak = akasha.RAG(
embeddings="openai:text-embedding-3-small",
model="openai:gpt-4o",
max_input_tokens=3000,
keep_logs=True,
verbose=True,
)

res = ak(
data_source=["docs/mic", "https://github.com/iii-org/akasha"],
prompt="akasha是甚麼?",
)

## optional
ref = ak.reference() #{"1.pdf":2,3,4}

ak.save_logs("logs.json")

RAG 參數

verbose: bool 如果設True,會顯示每個步驟產生的文字和狀態
search_type: Union[str, Callable] 用來搜尋文件段落的方法,可選擇: auto, svm, tfidf, bm25, mmr, knn.
model: Union[str, BaseLanguageModel] 使用的語言模型,如 openai:gpt-3.5-turbo, gemini:gemini-1.5-flash
embeddings: Union[str, Embeddings]
chunk_size: int 單個文件段落的長度
temperature: float 語言模型的變化度(0~1)
system_prompt: str 指示給語言模型的output格式需求

stream: bool 如果設為True,會回傳generator

max_input_tokens: int 單次輸入模型的最大token數

max_output_tokens: int 模型輸出的最大token數

env_file:str 指定.env環境設定檔名

keep_logs: bool 是否保存執行過程和結果

call 參數

doc_source: Union[List[Union[str, Path]], Path, str, dbs] 一個或多個包含文件檔案的資料夾路徑名稱、網址,或單一個dbs物件
prompt: str 使用者的問題

history_messages: List[str] 需要一併提供給語言模型的對話紀錄

stream輸出

若需要即時輸出的場合(如UI即時顯示回答),使用stream=True可使RAG回傳generator。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import akasha

ak = akasha.RAG(
embeddings="openai:text-embedding-3-small",
model="openai:gpt-4o",
max_input_tokens=3000,
keep_logs=True,
verbose=True,
stream=True
)


streaming = ak(
data_source=["docs/mic", "https://github.com/iii-org/akasha"],
prompt="akasha是甚麼?",
)

for s in streaming:
print(s)

dbs物件

如想對同個文件集做多次問答,可以先建立dbs物件並傳入,避免多次重複載入文件的chromadb,若文件內容、使用嵌入模型、chunk size相等的chromadb已存在,則不會重新創建而直接讀取。

創建chromadb可使用 process_db

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import akasha
import akasha.utils.db as adb
db_files = adb.process_db(data_source = ["docs/mic"], embeddings="openai:text-embedding-ada-002",chunk_size=500)

qa = akasha.RAG(
verbose=True,
search_type="knn",
embeddings="openai:text-embedding-ada-002",
chunk_size=500,
model="openai:gpt-3.5-turbo",
)

qa(
doc_path=db_files,
prompt="五軸是甚麼?",
system_prompt="請用中文回答",
)




RAG 輸出

使用完RAG的函式後,物件內部會儲存用來搜尋的db(self.db)、讓語言模型參考的文件(self.docs)、使用者的問題(self.prompt)和回答(self.response)等資訊,若需要更完整的資訊可參考輔助函數中的 儲存紀錄

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
import akasha

ak = akasha.RAG(
embeddings="openai:text-embedding-3-small",
model="openai:gpt-4o",
max_input_tokens=3000,
keep_logs=True,
verbose=True,
)


response = ak(
data_source=["docs/mic", "https://github.com/iii-org/akasha"],
prompt="akasha是甚麼?",
)

## self.db (dbs class) ##
print(len(ak.db.ids), ak.db.metadatas[0])

## self.docs (list of Documents) ##
print(ak.docs[0])

## self.doc_tokens (integer, length of document tokens) ##
print(ak.prompt_tokens, ak.doc_tokens)

print(ak.prompt, ak.response)



selfask_RAG

selfask_RAG會先將使用者問題嘗試使用語言模型進行拆分,再進行RAG回答問題,對於需要多個知識點的問題可能會獲得較好的結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

import akasha


ak = akasha.RAG(
embeddings="openai:text-embedding-3-small",
model="openai:gpt-4o",
max_input_tokens=DEFAULT_MAX_INPUT_TOKENS,
keep_logs=True,
verbose=True,
)

res = ak.selfask_RAG(data_source=["docs/mic"],
prompt="LPWAN和5G的區別是什麼?")

相關連結

self.db的詳細資訊可參考向量資料庫
self.docs的詳細資訊可參考文件搜尋
self.model_obj的詳細資訊可參考設定語言模型
self.embeddings_obj的詳細資訊可參考設定嵌入模型