基于LangChain的问答任务中如何从文档获取页码
解决LangChain拆分PDF文本块后获取答案页码的问题
当然可以获取答案来源的页码,核心是确保拆分后的每个文本块都保留原文档的页码元数据,具体操作如下:
- 加载PDF时保留页码元数据:使用
PyPDFLoader加载PDF后,每个生成的Document对象的metadata字段里默认包含page_number属性,这是后续操作的基础。 - 拆分文本时继承元数据:
CharacterTextSplitter默认会将原文档的所有元数据复制到拆分后的每个子文本块中,只要原文档有页码元数据,拆分后的块就会携带对应的页码,无需额外配置。 - QA链中返回源文档并提取页码:构建检索式QA链时,开启返回源文档的配置,从返回结果的源文档中即可提取对应的页码。
示例代码
from langchain.document_loaders import PyPDFLoader from langchain.text_splitter import CharacterTextSplitter from langchain.vectorstores import Chroma from langchain.embeddings import OpenAIEmbeddings from langchain.chains import RetrievalQA from langchain.llms import OpenAI # 1. 加载PDF,每个文档对应一页,自带page_number元数据 loader = PyPDFLoader("your_pdf_file.pdf") pages = loader.load() # 2. 用CharacterTextSplitter拆分文本块,自动继承原页码元数据 text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200) split_docs = text_splitter.split_documents(pages) # 验证拆分后的块是否携带页码(可选) for doc in split_docs[:3]: print(f"页码: {doc.metadata['page_number']}, 文本片段: {doc.page_content[:50]}...") # 3. 构建向量库 embeddings = OpenAIEmbeddings() db = Chroma.from_documents(split_docs, embeddings) # 4. 构建QA链,设置返回源文档 qa_chain = RetrievalQA.from_chain_type( llm=OpenAI(), chain_type="stuff", retriever=db.as_retriever(), return_source_documents=True # 关键:开启返回源文档 ) # 5. 查询并提取页码 query = "你的问题内容" result = qa_chain({"query": query}) # 从源文档中提取唯一的页码(去重,因为可能多个块来自同一页) source_pages = list({doc.metadata['page_number'] for doc in result['source_documents']}) print(f"答案来源页码: {source_pages}")
注意事项
- 如果你的PDF加载方式不是
PyPDFLoader,需要确保加载后的Document对象的metadata中包含页码信息,否则拆分后也无法获取。 - 若拆分后的多个块来自同一页,会重复携带相同页码,建议用集合去重后展示。
内容的提问来源于stack exchange,提问作者Shuhul Handoo
相关产品推荐
相关产品推荐

