基于DeepSeek和Silicon Flow API的智能文档管理与问答系统
知识库检索增强生成系统是一个智能文档管理与问答系统,它允许用户上传各种格式的文档(PDF、TXT、Markdown、Word),将其转换为向量存储在知识库中,然后通过自然语言提问来检索相关信息。
系统核心功能包含两大部分:
支持PDF、TXT、Markdown和Word文档,自动提取文本内容,智能清理格式,保留核心信息。标准化元数据处理确保文档可靠检索。
使用先进的语义嵌入模型(BAAI/bge-m3),通过批处理机制高效处理大量文档,将文档内容转换为高维向量,实现语义级别的精准检索。
支持DeepSeek或Ollama大语言模型,基于检索到的相关文档生成准确、连贯的回答,支持复合问题检测和解析,智能处理多部分问题。
提供知识库健康状态诊断,评估元数据和内容完整性,生成健康分数,及时发现和解决潜在问题,确保知识库稳定运行。
使用统一规范的元数据体系,为每个文档和文本块分配唯一ID,标准化路径和属性,确保大型知识库的稳定性和可靠性。
实现文档批量处理机制,高效处理大型知识库,优化嵌入生成和存储过程,提高系统响应速度和稳定性。
# 文档标准化元数据处理
# 统一元数据标准化处理
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 # 默认页码
# 将文档添加到集合中 - 使用批处理避免超时
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
)
# 检查知识库健康状态
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)}"}
项目采用统一规范的元数据管理方式,确保文档处理和检索的稳定性:
系统提供知识库健康检查功能,确保知识库处于最佳状态:
为优化大型知识库性能,系统实现批处理机制:
整理学习笔记和资料,智能检索重点知识
管理公司文档、规章制度、技术文献
整理学术论文、研究报告、实验数据
管理项目文档、会议记录、工作笔记