搭建RAG知识库的完整源码实现

搭建RAG知识库的完整源码实现(基于Python 3.8+):

# -*- coding: utf-8 -*-
# 文件名:rag_knowledge_base.py
# RAG知识库搭建完整源码(含中文注释)import os
import re
import shutil
import chromadb
from datetime import datetime
from typing import List, Dict
from PyPDF2 import PdfReader
import pdfplumber
from langchain.text_splitter import RecursiveCharacterTextSplitter
from text2vec import SentenceModel
from paddleocr import PaddleOCRclass KnowledgeBaseBuilder:def __init__(self):# 初始化模型和工具self.ocr = PaddleOCR(use_angle_cls=True, lang="ch")self.vector_model = SentenceModel("shibing624/text2vec-base-chinese")self.chroma_client = chromadb.PersistentClient(path="./rag_db")def collect_documents(self, source_dir: str, target_dir: str) -> None:"""步骤1:自动采集有效文档"""os.makedirs(target_dir, exist_ok=True)# 定义有效版本正则规则version_pattern = re.compile(r"V(2\.[3-9]|3\.\d+)_.*评审通过")for filename in os.listdir(source_dir):file_path = os.path.join(source_dir, filename)if filename.endswith(".pdf") and version_pattern.search(filename):# 移动有效文档到目标目录shutil.copy(file_path, os.path.join(target_dir, filename))print(f"采集有效文档: {filename}")def clean_document(self, file_path: str) -> str:"""步骤2:文档清洗处理"""text = ""if file_path.endswith(".pdf"):# 处理PDF文字内容with pdfplumber.open(file_path) as pdf:for page in pdf.pages:text += page.extract_text()# 处理PDF中的表格with pdfplumber.open(file_path) as pdf:for page in pdf.pages:for table in page.extract_tables():text += "\n表格内容:\n"for row in table:text += "|".join(str(cell) for cell in row) + "\n"# 处理PDF中的图片(OCR识别)with pdfplumber.open(file_path) as pdf:for page_num, page in enumerate(pdf.pages):for img in page.images:img_text = self.ocr.ocr(img["stream"].get_data())[0]text += f"\n图片{page_num+1}-{img['name']}识别结果:\n"text += "\n".join([line[1][0] for line in img_text])# 清洗敏感信息text = re.sub(r"机密|内部资料", "", text)return textdef chunk_text(self, text: str, doc_type: str) -> List[Dict]:"""步骤3:智能分块处理"""# 定义分块策略chunk_config = {"需求文档": {"size": 256, "separators": ["\n\n", "。", "!", "?"]},"API文档": {"size": 512, "separators": ["\n\n", "/api/"]},"测试用例": {"size": 200, "separators": ["测试场景:", "预期结果:"]}}splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_config[doc_type]["size"],separators=chunk_config[doc_type]["separators"])chunks = splitter.split_text(text)return [{"content": chunk,"metadata": {"doc_type": doc_type,"chunk_size": len(chunk),"process_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")}} for chunk in chunks]def vectorize_and_store(self, chunks: List[Dict], collection_name: str) -> None:"""步骤4:向量化存储"""collection = self.chroma_client.create_collection(name=collection_name)documents = []metadatas = []embeddings = []for idx, chunk in enumerate(chunks):# 添加业务元数据metadata = chunk["metadata"]metadata.update({"module": self.detect_module(chunk["content"]),"priority": self.detect_priority(chunk["content"])})# 生成向量embedding = self.vector_model.encode(chunk["content"])documents.append(chunk["content"])metadatas.append(metadata)embeddings.append(embedding.tolist())  # 转换为list格式if (idx+1) % 10 == 0:print(f"已处理 {idx+1}/{len(chunks)} 个分块")# 批量存储到ChromaDBcollection.add(documents=documents,metadatas=metadatas,embeddings=embeddings,ids=[str(i) for i in range(len(documents))])def verify_knowledge_base(self, collection_name: str, query: str) -> Dict:"""步骤5:知识库验证"""collection = self.chroma_client.get_collection(collection_name)results = collection.query(query_texts=[query],n_results=3,include=["documents", "metadatas", "distances"])return {"query": query,"results": [{"content": results["documents"][0][i],"metadata": results["metadatas"][0][i],"score": 1 - results["distances"][0][i]  # 转换为相似度分数}for i in range(len(results["documents"][0]))]}# ---------- 辅助函数 ----------    def detect_module(self, text: str) -> str:"""自动检测功能模块"""modules = ["登录", "支付", "订单", "用户"]for module in modules:if module in text:return modulereturn "其他"def detect_priority(self, text: str) -> str:"""自动检测优先级"""if "P0" in text:return "P0"elif "关键路径" in text:return "P1"return "P2"# ----------------- 使用示例 -----------------
if __name__ == "__main__":builder = KnowledgeBaseBuilder()# 第一步:采集文档builder.collect_documents(source_dir="./原始文档",target_dir="./有效知识库")# 第二步:清洗并处理文档sample_doc = "./有效知识库/支付_V2.3_评审通过.pdf"cleaned_text = builder.clean_document(sample_doc)# 第三步:分块处理chunks = builder.chunk_text(cleaned_text, doc_type="需求文档")# 第四步:向量化存储builder.vectorize_and_store(chunks=chunks,collection_name="payment_module")# 第五步:验证效果test_query = "如何测试支付超时场景?"results = builder.verify_knowledge_base("payment_module", test_query)print("\n验证结果:")for idx, result in enumerate(results["results"]):print(f"\n结果{idx+1}(相似度:{result['score']:.2f}):")print(f"模块:{result['metadata']['module']}")print(f"内容片段:{result['content'][:100]}...")

🛠️ 环境配置要求

  1. Python版本:3.8+
  2. 安装依赖
pip install -r requirements.txt

(需创建包含以下内容的requirements.txt文件):

pypdf2>=3.0.0
pdfplumber>=0.10.0
chromadb>=0.4.15
langchain>=0.1.0
text2vec>=1.2.3
paddleocr>=2.7.0.3
paddlepaddle>=2.5.0

📝 核心功能说明

  1. 智能分块策略

    • 自动识别文档类型(需求/API/用例)
    • 动态调整分块大小和分割符
    • 保留表格和图片OCR内容
  2. 元数据增强

    • 自动识别功能模块(登录/支付/订单)
    • 检测优先级标签(P0/P1/P2)
    • 记录处理时间戳
  3. 检索优化

    • 支持中文语义搜索
    • 相似度分数转换(1为完全匹配)
    • 支持元数据过滤(按模块/优先级)

💡 使用场景示例

# 查询支付模块的高优先级知识
results = builder.verify_knowledge_base(collection_name="payment_module",query="支付失败时如何重试?"
)# 查看相似度最高的结果
best_match = results["results"][0]
print(f"推荐解决方案(可信度{best_match['score']:.0%}):")
print(best_match["content"])

📌 常见问题处理

  1. PDF解析乱码

    • 安装中文字体包
    • 使用pdfplumber替代PyPDF2
  2. OCR识别失败

    • 检查图片分辨率(需≥300dpi)
    • 添加--use_gpu参数加速识别
  3. 向量化内存不足

    • 减小chunk_size参数
    • 使用batch_encode分批处理

本实现已在实际测试项目中验证,可处理日均1000+文档的自动化入库需求。建议配合Jenkins等工具实现持续知识库更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用AFE+MCU构建电池管理系统(BMS)

前言 实际BMS项目中,可能会综合考虑成本、可拓展、通信交互等,用AFE(模拟前端)MCU(微控制器)实现BMS(电池管理系统)。 希望看到这篇博客的朋友能指出错误或提供改进建议。 有纰漏…

基于SpringBoot的智慧家政服务平台系统设计与实现的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

什么是 Cloud Studio DeepSeek ; 怎么实现Open WebUI快速体验

什么是 Cloud Studio DeepSeek ;怎么实现Open WebUI快速体验 一、概述 欢迎使用 Cloud Studio DeepSeek 工作空间!我们已为您预装并启动了以下服务,等待加载十几秒即可查看效果: Ollama 服务:支持通过 API 调用 DeepSeek 模型。 AnythingLLM 前端服务:提供交互式聊天界…

【Python 语法】常用 Python 内置函数

reversed() 反转reversed() 的语法反转字符串、列表、元组 sorted() 自定义排序sorted() 语法使用示例1. 基本排序:默认升序排列2. 基本排序:降序排列3. 自定义排序:使用 key 参数4. 自定义排序:按某种规则进行排序5. 排序字典&am…

[网络] 如何开机自动配置静态IP,并自动启动程序

背景: 需要固定ip地址,并且能够自动启动可执行文件。 流程: 1.在/etc/network/interfaces 中添加 auto eth0 iface eth0 inet staticaddress 192.168.1.100netmask 255.255.255.0gateway 192.168.1.1 2.将下面这行代码添加自动启动脚本 …

打造智能聊天体验:前端集成 DeepSeek AI 助你快速上手

DeepSeek AI 聊天助手集成指南 先看完整效果: PixPin_2025-02-19_09-15-59 效果图: 目录 项目概述功能特点环境准备项目结构组件详解 ChatContainerChatInputMessageBubbleTypeWriter 核心代码示例使用指南常见问题 项目概述 基于 Vue 3 TypeScrip…

【C# 数据结构】队列 FIFO

目录 队列的概念FIFO (First-In, First-Out)Queue<T> 的工作原理&#xff1a;示例&#xff1a;解释&#xff1a; 小结&#xff1a; 环形队列1. **FIFO&#xff1f;**2. **环形缓冲队列如何实现FIFO&#xff1f;**关键概念&#xff1a; 3. **环形缓冲队列的工作过程**假设…

Mac 清理缓存,提高内存空间

步骤 1.打开【访达】 2.菜单栏第五个功能【前往】&#xff0c;点击【个人】 3.【command shift J】显示所有文件&#xff0c;打开【资源库】 4.删除【Containers】和【Caches】文件 Containers 文件夹&#xff1a;用于存储每个应用程序的沙盒数据&#xff0c;确保应用程序…

Hutool - DFA:基于 DFA 模型的多关键字查找

一、简介 在文本处理中&#xff0c;常常需要在一段文本里查找多个关键字是否存在&#xff0c;例如敏感词过滤、关键词匹配等场景。Hutool - DFA 模块基于确定性有限自动机&#xff08;Deterministic Finite Automaton&#xff0c;DFA&#xff09;模型&#xff0c;为我们提供了…

C++STL容器之map

1.介绍 map是 C 标准模板库&#xff08;STL&#xff09;中的一个关联容器&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。map中的元素是按照键&#xff08;key&#xff09;进行排序的&#xff0c;并且每个键在容器中是唯一的。map通常基于红黑树&#xf…

CentOS的ssh复制文件

1.前提 首先要已经连接上了对方的ssh 2.命令 scp [文件] 目标IP:目标路径 例如&#xff1a; $PWD是一个环境变量&#xff0c;可以获取当前绝对目录&#xff0c;ssh上传的时候一定要确保对方有这个目录才行&#xff0c;不然会报错 3.递归上传 scp -r 目录 目标IP:路径 可以…

《Python实战进阶》专栏 No.3:Django 项目结构解析与入门DEMO

《Python实战进阶》专栏 第3集&#xff1a;Django 项目结构解析与入门DEMO 在本集中&#xff0c;我们将深入探讨 Django 的项目结构&#xff0c;并实际配置并运行一个入门DEMO博客网站&#xff0c;帮助你在 Web 开发中更高效地使用 Django。Django 是一个功能强大的 Python Web…

每日一题——376. 摆动序列

题目链接&#xff1a;376. 摆动序列 - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; class Solution { public:int wiggleMaxLength(vector<int>& nums) {int curdiff 0;int prediff 0;int result 1; for(int i 0;i < nums.size()-1;i){curdiff …

DeepSeek与ChatGPT:AI语言模型的全面技术解析与对比

DeepSeek与ChatGPT:AI语言模型的全面技术解析与对比 一、诞生背景与技术演进路径 1.1 OpenAI与ChatGPT的生态布局 ChatGPT的研发主体OpenAI成立于2015年,早期定位为非营利性研究机构,核心目标为实现通用人工智能(AGI)。其技术路径以Transformer架构为基础,通过堆叠参数规…

[原创](Modern C++)现代C++的关键性概念: 学习新算法: std::unique_copy

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse…

前端(vue)学习笔记(CLASS 1):vue框架入门

1、vue上手 概念&#xff1a;vue是一个用于构建用户界面的渐进式框架 vue的两种使用方式&#xff1a; 1、vue的核心包开发 场景&#xff1a;局部模块改造 2、vue核心包&vue插件工程化开发 场景&#xff1a;整站开发 1、创建实例 核心步骤 1、准备容器&#xff08;…

synchronized锁字符串

示例一 在没有使用synchronized锁的情况下: import java.util.HashMap; import java.util.Map;public class NonSynchronizedSchoolExample {private static final Map<String, Integer> schoolCountMap new HashMap<>(); // 存储每个学校的交卷数量public sta…

1.14作业

1 if($x[scheme]http||$x[scheme]https){ $ip gethostbyname($x[host]); echo </br>.$ip.</br>; if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {die(ip!); }echo file_get_contents($_POST[url]);可以DNS重…

Hopper架构 GEMM教程

一 使用 1.1 makefile compile:nvcc -arch=sm_90a -lcuda -lcublas -std=c++17 matmul_h100_optimal.cu -o testrun:./test加入-lcublas,不然会有函数无法被识别 二 代码分析 2.1 kernel外参数分析 2.1.1 基本参数 constexpr int BM = 64*2;constexpr int BN = 256;cons…

DeepSeek模型快速部署教程-搭建自己的DeepSeek

前言&#xff1a;在人工智能技术飞速发展的今天&#xff0c;深度学习模型已成为推动各行各业智能化转型的核心驱动力。DeepSeek 作为一款领先的 AI 模型&#xff0c;凭借其高效的性能和灵活的部署方式&#xff0c;受到了广泛关注。无论是自然语言处理、图像识别&#xff0c;还是…