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作为输出。