跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

基于 LangChain 和 ChatGPT 构建 PDF 问答机器人

介绍使用 LangChain 结合向量数据库和大模型构建 PDF 问答机器人的方案。通过加载文档、文本分割、嵌入向量化及索引构建,实现基于语义搜索的问答功能。利用 OpenAI API 或私有部署模型,结合多种 Chain 类型处理检索与生成,有效解决大模型幻觉问题,提升对非结构化文档信息的提取与问答准确性。

热情发布于 2025/2/7更新于 2026/6/522 浏览
基于 LangChain 和 ChatGPT 构建 PDF 问答机器人

基于 LangChain 和 ChatGPT 构建 PDF 问答机器人

引言

在使用 ChatGPT 等通用大模型后,我们常面临一个需求:能否利用它来处理我们自己的私有文档资料,并提供精准的文档问答与摘要?

直接微调模型虽然可行,但成本高且需要大量数据集,且通常只能赋予模型单一技能。另一种方法是使用提示词(Prompt)将文档上下文传入,但受限于 Token 长度和 API 调用成本,处理大量文档时效率较低。

本文介绍一种基于检索增强生成(RAG)的思路,使用 LangChain 结合向量数据库和大模型构建 PDF 聊天机器人原型。该方案证明了从非结构化文档中提取信息并进行问答的可行性,同时避免了大模型在未训练知识上的幻觉问题。

系统架构

核心流程如下:

  1. 数据加载:加载 PDF、HTML、文本等源文件。
  2. 文本分割:将长文档切分为适合嵌入的小块(Chunks)。
  3. 向量化:使用 Embedding 模型将文本转换为数字向量表示。
  4. 索引构建:将向量存入向量数据库(如 ChromaDB)并建立索引。
  5. 检索与生成:用户提问经向量化后,在数据库中检索相似内容,连同问题一起发送给 LLM 生成回答。

项目架构图

注:上图展示源文件经工程化处理存入向量库,用户问题向量化后匹配最近邻数据返回给大模型,并记录聊天历史。

开发环境准备

运行本项目需要 Python 版本不低于 3.7。建议创建虚拟环境以隔离依赖。

1. 创建虚拟环境

# 创建虚拟环境
$ python3 -m venv llm_app_env 

# 在 MacOS 或 Linux 上激活
$ source llm_app_env/bin/activate 

# 在 Windows 上激活
$ llm_app_env\Scripts\activate.bat 

2. 安装依赖库

openai[embeddings]==0.27.6 
langchain==0.0.155 
pypdf==3.8.1 
tiktoken==0.3.3 
faiss-cpu==1.7.4
unstructured==0.6.2 
chromadb==0.3.21 
llama-index ==0.6.1 
jupyterlab

LangChain 是一个功能强大的开源工具,可作为中间层连接应用程序与各种 LLM 提供商(如 OpenAI、Cohere、Huggingface 等)。它提供了处理内存、长文档及令牌限制问题的特性,支持自定义应用构建。

推荐使用 Jupyter Notebook 进行开发,也可使用 Google Colab 在线平台。

配置 OpenAI API 密钥

在代码中设置环境变量以使用 OpenAI 服务。

import logging
import sys
import os

os.environ["OPENAI_API_KEY"] = "<YOUR_OPENAI_API_KEY>"

获取 API Key 请访问:https://platform.openai.com/account/api-keys

数据加载与预处理

我们需要加载 PDF 文档并将其分割成合适的片段。RecursiveCharacterTextSplitter 是推荐的通用文本分割器,它尝试按字符列表顺序分割,直到块足够小。

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 加载数据
loader = PyPDFLoader('../notebooks/documents/Apple-Financial-Report-Q1-2022.pdf')
data = loader.load()

# 文本分割器配置
# chunk_size: 每个块的最大字符数
# chunk_overlap: 块之间的重叠字符数,有助于保持上下文连贯性
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(data)

# 查看第一个块
print(texts[0])

向量数据库集成

Chroma 是一种嵌入式数据库,专为 LLM 应用设计。它将文本映射为实数向量(Embedding),使得语义相似的词汇在向量空间中距离更近。

例如,在嵌入空间中,"国王"和"女王"的向量会比"苹果"更接近,因为它们具有语义关联。通过向量数据库,我们可以执行高效的语义搜索,而非简单的关键词匹配。

初始化 Embedding 与 Chroma

from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings

# 初始化 OpenAI Embedding 模型
embeddings = OpenAIEmbeddings(model='text-embedding-ada-002')

# 从文档创建内存中的嵌入数据库
# metadatas: 可选的元数据,用于过滤或追踪来源
docsearch = Chroma.from_documents(
    texts, 
    embeddings, 
    metadatas=[{"source": str(i)} for i in range(len(texts))]
)

# 执行相似性搜索
query = "What is the operating income?"
docs = docsearch.similarity_search(query)

问答链(Chain)实现

LangChain 提供了多种预建的 Chain 类型来处理问答任务。它们的主要区别在于如何处理检索到的上下文以及是否返回来源引用。

1. load_qa_chain

将所有检索到的文档内容作为上下文传递给 LLM。

from langchain.chains.question_answering import load_qa_chain
from langchain.chat_models import ChatOpenAI

chain = load_qa_chain(
    ChatOpenAI(temperature=0.2, model_name='gpt-3.5-turbo'), 
    chain_type="stuff"
)
query = "What is the operating income?"
result = chain.run(input_documents=docs, question=query)
print(result)

2. load_qa_with_sources_chain

类似上述方法,但会尝试识别信息来源。

from langchain.chains.qa_with_sources import load_qa_with_sources_chain

chain = load_qa_with_sources_chain(
    ChatOpenAI(temperature=0.2, model_name='gpt-3.5-turbo'), 
    chain_type="stuff"
)
result = chain({"input_documents": docs, "question": query}, return_only_outputs=True)
print(result)

3. RetrievalQA

简化接口,自动处理检索步骤。

from langchain.chains import RetrievalQA

qa = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(temperature=0.2, model_name='gpt-3.5-turbo'), 
    chain_type="stuff", 
    retriever=docsearch.as_retriever()
)
query = "What is the operating income?"
result = qa.run(query)
print(result)

4. RetrievalQAWithSourcesChain

结合检索与来源引用的简化版。

from langchain.chains import RetrievalQAWithSourcesChain

chain = RetrievalQAWithSourcesChain.from_chain_type(
    ChatOpenAI(temperature=0.2, model_name='gpt-3.5-turbo'), 
    chain_type="stuff", 
    retriever=docsearch.as_retriever()
)
result = chain({"question": "What is the operating income?"}, return_only_outputs=True)
print(result)

总结与优化方向

至此,一个基于 PDF 文档的问答聊天机器人原型已完成。该机器人能够读取 PDF 内容并根据文档内容进行交互问答。

后续优化建议

  1. 模型替换:除了 OpenAI API,可接入私有部署的开源模型(如 ChatGLM、Llama2)以降低隐私风险和成本。
  2. 向量存储扩展:对于大规模数据,可将 Chroma 替换为 Milvus、Pinecone 或 Elasticsearch 等分布式向量数据库。
  3. 混合检索:结合关键词检索(BM25)与语义检索,提高召回率。
  4. 错误处理:增加对网络超时、API 限流及无效输入的异常捕获机制。
  5. 多轮对话:引入 Memory 组件,保存聊天历史以实现上下文相关的多轮对话。

通过上述方案,我们可以有效地利用自有数据,构建安全、可控的智能问答系统。

目录

  1. 基于 LangChain 和 ChatGPT 构建 PDF 问答机器人
  2. 引言
  3. 系统架构
  4. 开发环境准备
  5. 1. 创建虚拟环境
  6. 创建虚拟环境
  7. 在 MacOS 或 Linux 上激活
  8. 在 Windows 上激活
  9. 2. 安装依赖库
  10. 配置 OpenAI API 密钥
  11. 数据加载与预处理
  12. 加载数据
  13. 文本分割器配置
  14. chunk_size: 每个块的最大字符数
  15. chunk_overlap: 块之间的重叠字符数,有助于保持上下文连贯性
  16. 查看第一个块
  17. 向量数据库集成
  18. 初始化 Embedding 与 Chroma
  19. 初始化 OpenAI Embedding 模型
  20. 从文档创建内存中的嵌入数据库
  21. metadatas: 可选的元数据,用于过滤或追踪来源
  22. 执行相似性搜索
  23. 问答链(Chain)实现
  24. 1. loadqachain
  25. 2. loadqawithsourceschain
  26. 3. RetrievalQA
  27. 4. RetrievalQAWithSourcesChain
  28. 总结与优化方向
  29. 后续优化建议
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 两个月从入门到独立进行漏洞挖掘的渗透测试指南
  • Axure 制作 AI 自动对话机器人原型教程
  • Obsidian 看板 + Copilot:项目管理与每日总结的自动化工作流
  • Windows 平台零基础部署 Qwen1.5 大模型教程
  • Spring Cloud OpenFeign 远程调用最佳实践
  • C++ 各标准版本核心特性差异对比
  • TSW-30 浊度传感器技术原理及智能家居应用
  • Talker-Reasoner:基于双系统架构的 AI Agent 设计
  • Python Mode for Processing 创意编程使用指南
  • Python 构建 GraphQL API:从原理到企业级实战
  • Python 异步编程与协程详解
  • MySQL 数据库核心操作:创建、修改与备份恢复
  • Flutter 底部导航与顶部选项卡实战:状态保持与鸿蒙适配
  • 2026 届学位论文 AIGC 检测率要求及应对策略
  • C++ 并发核心:内存序、可见性与指令重排
  • 无人机视角山区泥石流与滑坡图像识别数据集
  • Python 环境变量配置指南
  • 基于 Python 的 Telegram 信息检索机器人搭建指南
  • AI 个性化导师重塑 K12 在线学习体验与教育公平
  • GitHub 日榜精选:AI 代理与开发工具趋势 (2026-02-24)

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online