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_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的詳細資訊可參考設定嵌入模型