搭建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.pswp.cn/bicheng/71604.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71604.shtml
英文地址,請注明出處:http://en.pswp.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;還是…