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

基于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.dtcms.com/a/348156.html

相关文章:

  • 【股票数据API接口12】如何获取股票近年分红数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • AI-调查研究-59-机器人 行业职业地图:发展路径、技能要求与薪资全解读
  • Android - 用Scrcpy 将手机投屏到Windows电脑上
  • [创业之路-567]:数字技术、数字产品、数字资产、数字货币、数字企业、数字经济、数字世界、数字人生、数字智能、数字生命
  • 第一个小项目java
  • Linux 软件编程(十)网络编程:网络协议,UDP 与 TCP 知识点
  • 逆光场景识别率↑76%!陌讯多模态融合算法在手机拍照识别的落地实践​
  • 【网络运维】Shell 脚本编程: for 循环与 select 循环
  • ARINC 825板卡的应用
  • vue-pure-admin页面引入和功能添加流程解析
  • Smooze Pro for mac 鼠标手势增强软件
  • 力扣【1277. 统计全为1的正方形子矩阵】——从暴力到最优的思考过程
  • 商超客流密度统计误差率↓35%!陌讯多模态融合算法在零售智慧运营的实战解析
  • 智慧零售商品识别误报率↓74%!陌讯多模态融合算法在自助结算场景的落地优化
  • Ubuntu24.04 安装 Zabbix
  • 使用UE5开发2.5D开放世界战略养成类游戏的硬件配置指南
  • IDM 下载失败排查指南:全面解析与解决方案
  • 马斯克宣布开源Grok 2.5:非商业许可引争议,模型需8×40GB GPU运行,Grok 3半年后开源
  • Redis实战-缓存的解决方案(一)
  • 【贪心算法】day1
  • 【数学建模】灰色关联分析的核心步骤
  • 上位机知识篇---电脑参数
  • Shell脚本-影响shell程序的内置命令
  • [机械结构设计-32]:机械加工中,3D图评审OK,没有问题,后续的主要风险有哪些
  • Bright Data MCP:突破AI数据获取限制的革命性工具
  • M8504报错,开票数量大于收货数量
  • 请求上下文对象RequestContextHolder
  • 【datawhale组队学习】RAG技术 - TASK04 向量及多模态嵌入(第三章1、2节)
  • AI Agent全栈开发流程推荐(全栈开发步骤)
  • 在 vue3 和 vue2 中,v-for 和 v-if 可以一起用吗,区别是什么