Documents
LangChain中的Document對象,還是非常重要的,因為在RAG的時候,我們需要從自己的知識庫中檢索。文檔對象一般也是和Embedding、Retrievers結合在一起使用。
Document object有兩個attributes:
-
page_content: str
:內容是string類型 -
metadata: dict
:對于這個document的描述,一般有document id,file name等
Document loaders
這里面包含了一系列的classes,LangChain集成了各種數據源,用于load數據。
每個DocumentLoader,都有具體的parameters,不過都需要通過.load
方法進行加載。
from langchain_community.document_loaders.csv_loader import CSVLoader
loader = CSVLoader(
... # <-- Integration specific parameters here
)
data = loader.load()
輸出類似:
[Document(page_content='\ufeff所屬小區: 海爾公館\n戶型: 3室2廳\n面積: 88.0\n樓層: 28.0\n建造年限: 2016.0\n總價: 115.0\n單價: 13068.0\n房屋朝向: 南北\n裝修程度: 精裝修\n配套電梯: 有\n容積率: 2.5\n綠化率: 0.4\n物業費: 1.4\n距垃圾站距離(km): 1.8\n周圍公交線路(0.5km): 4.0\n周圍學校數量(1km): 5.0\n距地鐵站距離(km): 0.7\n距商圈距離(km): 6.6\n距公園距離(km): 1.1\n中介對房子安全性打分: 5.0\n中介對房子舒適性打分: 3.5\n中介對房子性價比打分: 5.0\n中介對房子地段打分: 4.0\n中介對房子未來增值打分: 5.0\n中介對房子環境打分: 5.0\n中介對房子物業服務打分: 5.0', metadata={'source': '/Users/matrix/Downloads/house_price_predict.csv', 'row': 1366}),
Document(page_content='\ufeff所屬小區: 海洲景秀世家(三期)\n戶型: 4室2廳\n面積: 141.0\n樓層: 11.0\n建造年限: 2013.0\n總價: 166.0\n單價: 11719.0\n房屋朝向: 南北\n裝修程度: 毛坯\n配套電梯: 有\n容積率: 1.38\n綠化率: 0.38\n物業費: 1.0\n距垃圾站距離(km): 2.4\n周圍公交線路(0.5km): 6.0\n周圍學校數量(1km): 5.0\n距地鐵站距離(km): 1.3\n距商圈距離(km): 6.6\n距公園距離(km): 0.65\n中介對房子安全性打分: 2.67\n中介對房子舒適性打分: 2.0\n中介對房子性價比打分: 3.0\n中介對房子地段打分: 2.5\n中介對房子未來增值打分: 3.0\n中介對房子環境打分: 4.0\n中介對房子物業服務打分: 3.25', metadata={'source': '/Users/matrix/Downloads/house_price_predict.csv', 'row': 1490})]
后面還會涉及到 PDF、Word 等文檔的加載。
Text splitters
文檔加載后,需要將long document,切成小的chunks。為什么要切割呢?這是因為檢索的時候,模型一方面不能處理太長的文本;另外一方面,文本太長檢索效果會變差,對于后處理的要求會更高。
LangChain建議一些內置的文檔轉換器,用于做split、combine、filter,還包括了其它一些操作文檔的功能。
text splitter,一般會分為三步:
- 將text切分為小的,語義相關的small chunks(通常按照sentences)
- 將上面步驟中的這些small chunks進行合并,形成larger chunk(當達到某個size會停止merge)
- 當達到了這個size,構建的chunk就作為獨立的一個text了,繼續創建一些新的chunk(具有上下兩個chunk的context),也就是說有overlap
有些參數控制這個text splitter:
- text 如何切分
- chunk size如何衡量
Embedding models
Embeddings class,用于對text進行embedding,LangChain里面封裝了很多的接口(OpenAI,Hugging Face等)。
Embeddings將text表示為向量空間,這樣利于我們進行semantic search。
Embeddings class提供了兩個方法:
- embedding documents:接受多個texts
- embedding query:接受單個text
看到會很奇怪,為什么不用一個方法(method)解決,這是因為他們可能用不同的embedding方式。
Vector stores
vector store會將embedded的數據進行存儲,并且也會提供vector search。
Retrievers
它主要是進行檢索,接受string query作為input,返回Documents作為輸出。