You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 07:52:46