基于 LangChain 和 Streamlit 搭建 PDF 问答知识库
如何使用 Python、LangChain 和 Streamlit 搭建一个基于 PDF 的 ChatGPT 问答知识库。内容涵盖环境配置、依赖安装、PDF 文本提取、文本分片策略、向量数据库 FAISS 的构建以及问答链的实现流程。同时针对国内网络环境提供了代理解决方案和 API 版本兼容性修复方法,并补充了安全实践与性能优化建议,帮助开发者快速落地 RAG 应用场景。

如何使用 Python、LangChain 和 Streamlit 搭建一个基于 PDF 的 ChatGPT 问答知识库。内容涵盖环境配置、依赖安装、PDF 文本提取、文本分片策略、向量数据库 FAISS 的构建以及问答链的实现流程。同时针对国内网络环境提供了代理解决方案和 API 版本兼容性修复方法,并补充了安全实践与性能优化建议,帮助开发者快速落地 RAG 应用场景。

检索增强生成(RAG, Retrieval-Augmented Generation)技术允许大语言模型利用外部知识库进行回答,从而解决模型幻觉和知识时效性问题。本项目旨在使用 Python、LangChain 框架以及 Streamlit 快速构建一个支持 PDF 文件上传的本地问答系统。
该系统主要包含以下核心组件:
pdfplumber 用于解析 PDF 文本。CharacterTextSplitter 将长文本分割为适合向量化的片段。OpenAIEmbeddings 将文本转换为向量。FAISS 用于存储和检索向量相似度。OpenAI API 用于生成最终答案。确保已安装 Python 3.8 及以上版本。访问官网下载并安装,安装时请勾选 "Add Python to PATH"。
为避免依赖冲突,建议使用虚拟环境管理项目依赖。
# 创建项目目录
mkdir chatgpt-pdf-kb
cd chatgpt-pdf-kb
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
# Windows: venv\Scripts\activate
# macOS/Linux: source venv/bin/activate
安装运行所需的核心库。
pip install langchain pdfplumber python-dotenv streamlit faiss-cpu openai tiktoken
langchain: 简化与大模型交互的框架。pdfplumber: 高效提取 PDF 文本内容,对中文支持良好。python-dotenv: 安全读取环境变量中的 API Key。streamlit: 快速构建 Web UI 界面。faiss-cpu: Facebook 开源的相似性搜索库(CPU 版)。openai & tiktoken: OpenAI 接口调用及 Token 计数。注意:若需 GPU 加速,可安装
faiss-gpu,但需注意 CUDA 版本兼容性。
在根目录下创建 .env 文件,存放敏感信息如 API Key。
OPENAI_API_KEY=sk-your-api-key-here
请勿将 .env 文件提交至 Git 仓库,建议在 .gitignore 中添加该文件名。
Streamlit 默认会收集使用数据。出于隐私考虑,建议关闭统计功能。
在用户主目录下创建 ~/.streamlit/config.toml (macOS/Linux) 或 %userprofile%\.streamlit\config.toml (Windows),添加以下内容:
[browser]
gatherUsageStats = false
创建 app.py 文件,引入必要的模块。
from dotenv import load_dotenv
import os
import streamlit as st
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains.question_answering import load_qa_chain
from langchain.llms import OpenAI
from langchain.callbacks import get_openai_callback
import pdfplumber
load_dotenv()
使用 Streamlit 构建简洁的上传与输入界面。
st.set_page_config(page_title="专属 PDF 知识库")
st.header("📚 专属 PDF 知识库")
# 文件上传组件
uploaded_file = st.file_uploader("上传 PDF 文件", type="pdf")
读取 PDF 内容并进行分片。合理的分片大小对检索效果至关重要。
if uploaded_file is not None:
# 提取文本
text = ""
with pdfplumber.open(uploaded_file) as pdf_reader:
for page in pdf_reader.pages:
page_text = page.extract_text()
if page_text:
text += page_text + "\n"
# 文本分片
# chunk_size: 每个分片的字符数
# chunk_overlap: 重叠部分,保留上下文信息
text_splitter = CharacterTextSplitter(
separator="\n",
chunk_size=1000,
chunk_overlap=200,
length_function=len
)
chunks = text_splitter.split_text(text)
st.success(f"成功提取 {len(chunks)} 个文本分片")
将文本分片转化为向量并存储到 FAISS 数据库中。
# 初始化 Embedding 模型
embeddings = OpenAIEmbeddings()
# 创建向量库
knowledge_base = FAISS.from_texts(chunks, embeddings)
接收用户问题,检索相关文档,并调用 LLM 生成回答。
user_question = st.text_input("请输入您的问题:")
if user_question:
# 相似度搜索
docs = knowledge_base.similarity_search(user_question, k=3)
# 初始化 LLM
llm = OpenAI(temperature=0)
# 加载 QA 链
chain = load_qa_chain(llm, chain_type="stuff")
# 执行查询
with get_openai_callback() as cb:
response = chain.run(input_documents=docs, question=user_question)
print(f"消耗 Token: {cb.total_tokens}, 成本:${cb.total_cost}")
st.write(response)
由于 OpenAI 服务在国内访问不稳定,可能需要代理。
部署一个中间层代理,转发请求。需在 .env 中配置 OPENAI_API_BASE。
OPENAI_API_BASE=https://your-worker-domain.com/v1
使用科学上网工具开启全局模式或指定端口。
如果遇到 Unsupported OpenAI-Version header provided 错误,可在初始化 Embedding 或 LLM 时指定版本。
embeddings = OpenAIEmbeddings(openai_api_version='2020-11-07')
llm = OpenAI(openai_api_version='2020-11-07')
chunk_size。代码类文档可适当减小,文章类文档可适当增大。本教程演示了如何利用 LangChain 生态快速构建一个基于 PDF 的私有知识库应用。通过结合流式计算与向量检索技术,实现了高效的问答体验。开发者可根据实际需求进一步扩展功能,例如支持多种文件格式、多轮对话记忆或集成更多类型的向量数据库。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online