总体流程逻辑设计:
PDF文件 → 提取文本 → 分块 → 向量化 → FAISS存储
↓
相似度检索
↓
LLM问答
↓
返回答案
核心代码块功能实现:
from PyPDF2 import PdfReader
from langchain.chains.question_answering import load_qa_chain
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.vectorstores import FAISS
import os
1. 本地PDF 文本提取内容
def extract_text_from_pdf(pdf) -> str:
"""
从PDF中提取文本内容
参数:
pdf: PDF文件对象
返回:
text: 提取的文本内容
"""
text = ""
for page_number, page in enumerate(pdf.pages, start=1):
extracted_text = page.extract_text()
if extracted_text:
text += extracted_text
else:
print(f"第 {page_number} 页未找到文本内容。")
return text
2.文本分割与向量数据库加载
def create_knowledge_base(text: str) -> FAISS:
"""
处理文本并创建向量存储
参数:
text: 提取的文本内容
返回:
knowledgeBase: 基于FAISS的向量存储对象
"""
# 创建文本分割器,用于将长文本分割成小块
text_splitter = RecursiveCharacterTextSplitter(
separators=["\n\n", "\n", ".", " ", ""],
chunk_size=200,
chunk_overlap=50,
length_function=len,
)
# 分割文本
chunks = text_splitter.split_text(text)
print(f"文本被分割成 {len(chunks)} 个块。")
# 创建嵌入模型
embeddings = DashScopeEmbeddings(
model="text-embedding-v1",
dashscope_api_key=DASHSCOPE_API_KEY,
)
# 从文本块创建知识库
knowledgeBase = FAISS.from_texts(chunks, embeddings)
print("已从文本块创建知识库。")
return knowledgeBase
3.模型相似度匹配,基于LangChain问答链进行查询
def query_pdf(knowledgeBase, query: str, llm) -> str:
"""
查询PDF内容
参数:
knowledgeBase: FAISS向量存储对象
query: 查询问题
llm: 语言模型
返回:
response: 查询结果
"""
# 执行相似度搜索,找到与查询相关的文档
docs = knowledgeBase.similarity_search(query, k=1)
# 加载问答链
chain = load_qa_chain(llm, chain_type="stuff")
# 准备输入数据
input_data = {"input_documents": docs, "question": query}
# 执行问答链
response = chain.invoke(input=input_data)
return response["output_text"]
4.主函数流程
def main():
"""主函数"""
# 读取PDF文件
pdf_path = 'xxx.pdf' #加载你自己本地的pdf文件
pdf_reader = PdfReader(pdf_path)
# 提取文本
text = extract_text_from_pdf(pdf_reader)
print(f"提取的文本长度: {len(text)} 个字符。")
# 创建知识库
knowledgeBase = create_knowledge_base(text)
# 创建语言模型
from langchain_community.llms import Tongyi
llm = Tongyi(model_name="deepseek-v3", dashscope_api_key=DASHSCOPE_API_KEY)
# 设置查询问题
query = "研究生专业实践时间需要多长时间" #这里是我调用了自己学校的实践说明文档,发起的提问
if query:
# 执行查询
response = query_pdf(knowledgeBase, query, llm)
print(f"问题: {query}")
print(f"回答: {response}")
if __name__ == "__main__":
main()
通过以上代码,可以将自己的本地数据(pdf文件)分块向量化,并存入向量数据库中,通过deepseek-v3模型和langchain问答链,进行知识问答,搭建了一个简易的RAG系统。