- 文檔加載(Document Loading):從多種不同來源加載文檔。LangChain提供了100多種不同的文檔加載器,包括PDF在內的非結構化的數據、SQL在內的結構化的數據,以及Python、Java之類的代碼等? ?
- 文本分割(Splitting):文本分割器把Documents 切分為指定大小的塊,我把它們稱為“文檔塊”或者“文檔片”?
- 存儲(Storage):存儲涉及到兩個環節,分別是:?
? 將切分好的文檔塊進行嵌入(Embedding)轉換成向量的形式?
? 將Embedding后的向量數據存儲到向量數據庫? - 檢索(Retrieval):一旦數據進入向量數據庫,我們仍然需要將數據檢索出來,我們會通過某種檢索算法找到與輸入問題相似的嵌入片?
- Output(輸出):把問題以及檢索出來的嵌入片一起提交給LLM,LLM會通過問題和檢索出來的提示一起來生成更加合理的答案
文本加載器(Document Loaders)?
文本加載器就是將用戶提供的文本加載到內存中,便于進行后續的處理? ?
文本切割器(Text Splitters)?
文本分割器把Documents 切分為指定大小的塊,我把它們稱為“文檔塊”或者“文檔片”? 文本切割通常有以下幾個原因?
? 為了更好的進行文本嵌入以及向量數據庫的存儲?
? 通常大語言模型都有上下文的限制,如果不進行切割,文本在傳遞給大模型的時候可能超出上下文限制導致大模型隨機丟失信息?
文本切割器的概念是非常容易理解的,這里我們簡單了解下文本切割器的工作流程?
- 將文本切割成小的,語義上有意義的塊(通常是句子)?
- 開始將這些小塊組成一個較大的塊,直到達到某個塊的大小(這個會通過某種函數測量)?
- 一旦達到該大小,就將該塊作為自己的文本片段,并開始創建一個新的文本塊,同時保留一些重疊(以保持塊之間的上下文)。? ?
文本嵌入模型(Text Embedding models)?
文本嵌入模型是用來將文本轉換成數值向量的工具,這些向量能夠捕捉文本的語義信息,使得相似的文本在向量空間中彼此接近。這對于各種自然語言處理任務,如文本相似性比較、聚類和檢索等,都是非常有用的。下面是一段對嵌入的解釋
文本檢索?
一旦數據進入向量數據庫,我們仍然需要將數據檢索出來,我們會通過某種檢索算法找到與輸入問題相似的嵌入片。這里主要利用了大模型的能力
AnythingLLM 本地安裝、配置
- 選擇大模型
- 選擇文本嵌入模型
- 選擇向量數據庫
構建本地知識庫
AnythingLLM中有一個Workspace的概念,我們可以創建自己獨有的Workspace跟其他的項目數據進行隔離。
- 首先創建一個工作空間
- 上傳文檔并且在工作空間中進行文本嵌入
3. 選擇對話模式?
AnythingLLM提供了兩種對話模式:?
- Chat模式:大模型會根據自己的訓練數據和我們上傳的文檔數據綜合給出答案?
- Query模式:大模型僅僅會依靠文檔中的數據給出答案
- 測試對話?
當上述配置完成之后,我們就可以跟大模型進行對話了