langChain存储文档片段,并进行相似性检索
https://python.langchain.ac.cn/docs/how_to/document_loader_pdf/#vector-search-over-pdfs
这段代码展示了如何使用LangChain框架中的InMemoryVectorStore
和OpenAIEmbeddings
来存储文档片段,并基于提供的查询进行相似性搜索。下面是对每一行代码的详细解释:
1. 导入必要的模块
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_openai import OpenAIEmbeddings
- 这里从
langchain_core.vectorstores
模块中导入了InMemoryVectorStore
类,它用于在内存中创建一个向量存储,以便对文本数据执行相似性搜索。 - 同时从
langchain_openai
模块中导入了OpenAIEmbeddings
类,用于生成文本的嵌入(即向量化表示),这些嵌入将被用来计算文本之间的相似度。
2. 创建并填充向量存储
vector_store = InMemoryVectorStore.from_documents(pages, OpenAIEmbeddings())
- 使用
InMemoryVectorStore.from_documents()
方法创建了一个名为vector_store
的实例。这个方法接受两个参数:pages
: 这是一个包含之前加载的PDF文档页面的对象列表(假设pages
变量已经被正确初始化)。OpenAIEmbeddings()
: 这是用来生成文本嵌入的对象。通过调用OpenAIEmbeddings()
,我们创建了一个对象,该对象可以将文本转换为向量形式,便于后续的相似性比较。
- 此步骤的结果是将
pages
中的每一页转换成向量,并存储在内存中的向量数据库里。
3. 执行相似性搜索
docs = vector_store.similarity_search("What is LayoutParser?", k=2)
- 调用了
vector_store
对象上的similarity_search
方法,以执行基于文本的相似性搜索。 - 参数
"What is LayoutParser?"
是我们要查询的问题或关键词。 k=2
指定了返回最相似的前2个结果。这里的k
值可以根据需要调整,以返回更多或更少的相关文档片段。
4. 输出搜索结果
for doc in docs:print(f'Page {doc.metadata["page"]}: {doc.page_content[:300]}\n')
- 这段代码遍历了由
similarity_search
方法返回的所有文档片段(docs
),并逐个打印出来。 - 对于每个文档片段
doc
,它首先打印出该片段所属的PDF页码(通过访问doc.metadata["page"]
获取),然后截取并显示该片段的前300个字符(doc.page_content[:300]
),以便快速查看内容概览。 \n
用于在每个文档片段输出后添加一个空行,使得输出更加清晰易读。
综上所述,这段代码演示了如何利用LangChain框架将一组文档转换为向量表示,并基于特定查询执行相似性搜索,最后展示与查询最相关的文档片段。这对于信息检索、问答系统等应用场景非常有用。