知识库检索增强生成系统

基于DeepSeek和Silicon Flow API的智能文档管理与问答系统

项目概述

知识库检索增强生成系统是一个智能文档管理与问答系统,它允许用户上传各种格式的文档(PDF、TXT、Markdown、Word),将其转换为向量存储在知识库中,然后通过自然语言提问来检索相关信息。

系统核心功能包含两大部分:

  • 文档处理与向量化:支持多种文档格式,智能分块,使用Silicon Flow API生成高质量语义向量
  • 检索增强生成(RAG):基于用户问题检索相关文档片段,利用DeepSeek API生成准确、连贯的回答
技术特点
  • 使用Streamlit构建直观友好的Web界面
  • 集成DeepSeek API进行高质量文本生成
  • 使用Silicon Flow API (BAAI/bge-m3)生成文档嵌入向量
  • 基于Chroma实现高效向量存储和相似度检索
  • 自定义文档加载器处理多种文件格式
  • 批处理机制优化大型文档处理性能

系统架构

graph TD A[用户] -->|上传文档| B[文档处理模块] A -->|提问| K[问答模块] A -->|管理| Z[知识库管理] subgraph 文档处理流程 B -->|PDF文件| C[SimplePDFLoader] B -->|TXT文件| D[SimpleTextLoader] B -->|MD文件| E[MarkdownLoader] B -->|DOCX/DOC文件| F[DocxLoader] C & D & E & F --> G1[标准化元数据] G1 --> G[文档分块] G -->|文本块| H1[批量处理] H1 -->|批次| H[Silicon Flow API] H -->|嵌入向量| I[Chroma向量数据库] end subgraph 问答流程 K -->|复合问题检测| K1[问题拆分] K1 -->|子问题| L[向量检索] L --> I I -->|相关文档| M[上下文构建] M -->|提示模板| N[LLM生成] N -->|回答| O[结果展示] end subgraph 知识库管理流程 Z -->|列表| Z1[文档列表] Z -->|删除| Z2[文档删除] Z -->|诊断| Z3[健康检查] Z -->|重建| Z4[知识库重建] Z1 & Z2 --> I Z3 -->|评估| Z5[完整性评分] Z4 --> B end style 文档处理流程 fill:#e1f5fe,stroke:#01579b style 问答流程 fill:#f9fbe7,stroke:#827717 style 知识库管理流程 fill:#fce4ec,stroke:#880e4f

主要功能

多格式文档处理

支持PDF、TXT、Markdown和Word文档,自动提取文本内容,智能清理格式,保留核心信息。标准化元数据处理确保文档可靠检索。

智能向量化存储

使用先进的语义嵌入模型(BAAI/bge-m3),通过批处理机制高效处理大量文档,将文档内容转换为高维向量,实现语义级别的精准检索。

自然语言问答

支持DeepSeek或Ollama大语言模型,基于检索到的相关文档生成准确、连贯的回答,支持复合问题检测和解析,智能处理多部分问题。

知识库健康检查

提供知识库健康状态诊断,评估元数据和内容完整性,生成健康分数,及时发现和解决潜在问题,确保知识库稳定运行。

强化元数据管理

使用统一规范的元数据体系,为每个文档和文本块分配唯一ID,标准化路径和属性,确保大型知识库的稳定性和可靠性。

批处理与性能优化

实现文档批量处理机制,高效处理大型知识库,优化嵌入生成和存储过程,提高系统响应速度和稳定性。

代码结构

核心模块
  • app.py:应用主程序,负责Web界面和业务逻辑
  • deepseek_client.py:DeepSeek API客户端,处理大语言模型调用
  • silicon_flow_embeddings.py:向量嵌入模块,生成文本嵌入
自定义加载器
  • DocxLoader:处理Word文档的自定义加载器
  • MarkdownLoader:处理Markdown文件的自定义加载器
关键流程
  1. 用户上传文档,系统根据文件类型选择合适的加载器
  2. 文档内容被分块处理,保持语义完整性
  3. 使用Silicon Flow API生成文本块的嵌入向量
  4. 将嵌入向量存储到Chroma数据库中
  5. 用户提问后,系统计算问题的嵌入向量
  6. 在向量空间中检索与问题最相似的文档片段
  7. 构建包含相关文档的提示模板
  8. DeepSeek API基于提示生成回答
  9. 返回回答并显示来源文档

核心代码示例

1. 强化元数据处理
# 文档标准化元数据处理
# 统一元数据标准化处理
for doc in docs:
    if not hasattr(doc, 'metadata') or not doc.metadata:
        doc.metadata = {}
        
    # 确保关键元数据字段存在且格式一致
    doc.metadata['source'] = norm_file_path  # 统一使用正斜杠
    doc.metadata['filename'] = safe_filename
    doc.metadata['file_type'] = file_extension[1:]  # 移除前导点
    doc.metadata['doc_id'] = str(uuid.uuid4())  # 为每个文档分配唯一ID
    doc.metadata['timestamp'] = int(time.time())
    
    # 对不同类型的文档添加特定元数据
    if 'page' not in doc.metadata and file_extension == '.pdf':
        doc.metadata['page'] = 1  # 默认页码
2. 批处理文档添加
# 将文档添加到集合中 - 使用批处理避免超时
batch_size = 16  # 批处理大小限制
total_batches = (len(texts) + batch_size - 1) // batch_size

print(f"开始批量添加文档,共 {len(texts)} 个文本块,分 {total_batches} 批处理")

for i in range(total_batches):
    start_idx = i * batch_size
    end_idx = min(start_idx + batch_size, len(texts))
    
    batch_texts = texts[start_idx:end_idx]
    batch_metadatas = metadatas[start_idx:end_idx]
    batch_ids = ids[start_idx:end_idx]
    
    print(f"添加第 {i+1}/{total_batches} 批文档,包含 {len(batch_texts)} 个文本块")
    collection.add(
        documents=batch_texts,
        metadatas=batch_metadatas,
        ids=batch_ids
    )
3. 知识库健康检查
# 检查知识库健康状态
def check_knowledge_base_health():
    """检查知识库健康状态并修复可能的问题"""
    try:
        if not os.path.exists("./chroma_db"):
            return {"status": "error", "message": "知识库不存在"}

        client = chromadb.PersistentClient(path="./chroma_db")
        
        # 获取所有IDs
        all_ids = collection.get(include=["metadatas"])["ids"]
        if not all_ids:
            return {"status": "warning", "message": "知识库中没有文档ID", "count": 0}
            
        # 随机抽查5个文档或全部(取较小值)
        sample_size = min(5, len(all_ids))
        import random
        sample_ids = random.sample(all_ids, sample_size)
        
        # 检查这些文档是否有完整的元数据和内容
        samples = collection.get(ids=sample_ids, include=["metadatas", "documents"])
        
        # 计算元数据和内容的完整性
        metadata_integrity = sum(1 for meta in samples["metadatas"] if meta and "source" in meta) / sample_size
        content_integrity = sum(1 for doc in samples["documents"] if doc and len(doc) > 10) / sample_size
        
        integrity_score = (metadata_integrity + content_integrity) / 2
        
        return {
            "status": "healthy" if integrity_score > 0.8 else "warning",
            "message": f"知识库健康度: {integrity_score*100:.1f}%",
            "count": doc_count,
            "metadata_integrity": f"{metadata_integrity*100:.1f}%",
            "content_integrity": f"{content_integrity*100:.1f}%"
        }
    except Exception as e:
        return {"status": "error", "message": f"知识库健康检查失败: {str(e)}"}

元数据管理系统

强化元数据体系

项目采用统一规范的元数据管理方式,确保文档处理和检索的稳定性:

  • 标准化文件路径:统一使用正斜杠,避免跨平台路径问题
  • 唯一文档ID:使用UUID为每个文档和文本块分配唯一标识符
  • 批次ID管理:使用时间戳和批次ID组合,追踪文档上传批次
  • 完整元数据:为每个文档保存文件名、类型、来源、时间戳等完整信息
  • 块级元数据:记录文本块在原文档中的位置和关系
graph TD A[文档] --> B[标准化路径] B --> C[提取元数据] C --> D[生成唯一ID] C --> E[添加时间戳] C --> F[添加文件类型] D & E & F --> G[元数据对象] G --> H[文档分块] H --> I[块级元数据] I --> J[批处理存储] style A fill:#e3f2fd style G fill:#e8f5e9 style J fill:#ede7f6

知识库健康诊断

graph TD A[开始健康检查] --> B{知识库存在?} B -->|否| C[错误: 知识库不存在] B -->|是| D{集合存在?} D -->|否| E[错误: 集合不存在] D -->|是| F[获取文档计数] F --> G{文档数>0?} G -->|否| H[警告: 知识库为空] G -->|是| I[随机抽样验证] I --> J[计算元数据完整性] I --> K[计算内容完整性] J & K --> L[计算健康分数] L --> M{分数>80%?} M -->|是| N[健康: 显示分数] M -->|否| O[警告: 显示分数和问题] style A fill:#bbdefb style L fill:#c8e6c9 style N fill:#dcedc8 style O fill:#ffccbc
健康检查功能

系统提供知识库健康检查功能,确保知识库处于最佳状态:

  • 完整性检查:评估元数据和文档内容的完整性
  • 随机抽样验证:随机抽查文档内容和元数据匹配情况
  • 健康分数:计算整体知识库健康度分数
  • 问题诊断:在发现问题时提供详细诊断信息
  • 修复建议:对检测到的问题提供修复建议
健康检查功能可以帮助及时发现知识库问题,避免文档检索失效或回答质量下降。

批处理与性能优化

高效批处理机制

为优化大型知识库性能,系统实现批处理机制:

  • 分批处理文档嵌入:避免API请求超时
  • 批处理文档添加:提高大量文档处理效率
  • 批次跟踪:通过批次ID追踪每批上传的文档
  • 嵌入向量缓存:避免重复计算嵌入向量
批处理机制大幅提升了系统处理大型文档集的能力,降低了API超时风险。
graph TD A[大量文档] --> B[文档分块] B --> C[计算块总数] C --> D[确定批次大小] D --> E[创建批次任务] E --> F[批次1] E --> G[批次2] E --> H[...批次N] F & G & H --> I[并行/串行处理] I --> J[结果合并] J --> K[验证完整性] style A fill:#e8eaf6 style E fill:#fff9c4 style K fill:#e0f2f1

应用场景

个人学习助手

整理学习笔记和资料,智能检索重点知识

企业知识库

管理公司文档、规章制度、技术文献

研究资料管理

整理学术论文、研究报告、实验数据

个人工作助手

管理项目文档、会议记录、工作笔记