当前位置: 首页 > ds >正文

基于Langchain框架的DeepSeek-v3+Faiss实现RAG知识问答系统(含完整代码)

总体流程逻辑设计:

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_textelse: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 Tongyillm = 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系统。

http://www.xdnf.cn/news/18807.html

相关文章:

  • 华为云Stack环境中计算资源,存储资源,网络资源发放前的准备工作(上篇)
  • wpf之Grid控件
  • 鸿蒙分布式计算实战:用 ArkTS+Worker 池落地可运行任务管理 Demo,从单设备到跨设备全方案
  • 07-分布式能力与多设备协同
  • JDBC入门
  • DAY 55 序列预测任务介绍
  • 小红书自动评论插件
  • JUC之并发容器
  • 深度学习与自动驾驶中的一些技术
  • Java基础(十四)分布式
  • KingBase数据库迁移利器:KDTS工具深度解析与实战指南
  • golang6 条件循环
  • 01-鸿蒙系统概览与发展历程
  • Android面试指南(五)
  • 青少年机器人技术(二级)等级考试试卷-实操题(2024年9月)
  • C语言文件操作精讲:从格式化读写到随机访问
  • GOLANG 接口
  • Axure:如何打开自定义操作界面
  • loj数列分块入门2-3
  • c++string
  • crypto.randomUUID is not a function
  • 拓扑排序|hash
  • frp+go-mmproxy 实现透明代理的内网穿透
  • Qt5 高级功能
  • 关于说明锂电池充电芯片实际应用
  • 曲面方程的三维可视化:从数学解析到Python实现
  • 从罗永浩访谈李想中学习现代家庭教育智慧
  • 定时器互补PWM输出和死区
  • 54.Redis持久化-AOF
  • JEI(Journal of Electronic lmaging)SCI四区期刊