LangChain组件(二) - RAG

Documents

LangChain中的Document对象,还是非常重要的,因为在RAG的时候,我们需要从自己的知识库中检索。文档对象一般也是和EmbeddingRetrievers结合在一起使用。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容