DOCX RAG搜索是一个基于CrewAI框架的智能体开发项目,专注于处理Microsoft Word文档(.docx格式)的检索增强生成(Retrieval-Augmented Generation)任务。这个项目解决了传统RAG系统在处理复杂格式文档时的痛点——大多数现有方案要么只能处理纯文本,要么在解析.docx文件时会丢失关键格式信息。
我在实际开发中发现,许多企业文档(如合同、报告、技术手册)都采用.docx格式存储,其中包含的表格、页眉页脚、批注等结构化信息往往比正文更重要。传统方法将这些文档转换为纯文本时会丢失这些宝贵数据,而我们的方案能够完整保留文档的语义和结构特征。
我们采用python-docx库作为基础解析工具,但进行了深度改造:
python复制from docx import Document
import json
def parse_docx(filepath):
doc = Document(filepath)
structured_data = {
'paragraphs': [p.text for p in doc.paragraphs],
'tables': [[cell.text for cell in row.cells]
for table in doc.tables
for row in table.rows],
'comments': [comment.text for comment in doc.inline_shapes],
'metadata': {
'author': doc.core_properties.author,
'revision': doc.core_properties.revision
}
}
return json.dumps(structured_data, ensure_ascii=False)
关键改进包括:
注意:实际处理中我们发现python-docx对复杂格式文档的解析存在内存泄漏问题,解决方案是限制单次处理的文档大小不超过20MB,大文件采用分块处理。
不同于传统RAG的"检索-生成"两段式流程,我们设计了三级检索系统:
python复制def hybrid_retrieval(query, docs):
# 结构检索
bm25_scores = BM25Ranker().get_scores(query, docs)
# 语义检索
query_embed = model.encode(query)
doc_embeds = [model.encode(doc) for doc in docs]
cos_sims = cosine_similarity([query_embed], doc_embeds)[0]
# 混合排序 (权重可调)
combined_scores = 0.6*cos_sims + 0.4*bm25_scores
return sorted(zip(docs, combined_scores),
key=lambda x: x[1], reverse=True)
我们配置了三个协同工作的智能体:
解析专家:负责文档预处理和结构提取
检索专家:管理向量数据库和检索流程
生成专家:基于检索结果组织回答
python复制from crewai import Agent, Task, Crew
# 智能体初始化
parser = Agent(
role='DOCX解析专家',
goal='提取文档中的文本和结构信息',
backstory='专门处理复杂格式文档的数据工程师',
tools=[docx_parser]
)
retriever = Agent(
role='检索专家',
goal='找到最相关的文档片段',
backstory='信息检索领域的算法专家',
tools=[hybrid_retriever]
)
# 任务定义
parse_task = Task(
description='解析上传的DOCX文件:{}'.format(filepath),
agent=parser,
expected_output='结构化的JSON数据'
)
# 组队执行
crew = Crew(
agents=[parser, retriever],
tasks=[parse_task, retrieve_task],
verbose=2
)
测试发现,处理1000份平均15页的DOCX文档时,原始方案需要6.2小时。通过以下优化降至47分钟:
python复制from multiprocessing import Pool
def process_docx_batch(filepaths):
with Pool(processes=8) as pool:
results = pool.map(parse_docx, filepaths)
return build_index(results)
通过标注测试集发现,纯语义检索在合同条款查找场景准确率仅68%。引入以下改进后达到92%:
实现基于RBAC模型的文档访问控制:
python复制class AccessController:
def check_permission(user, doc, action):
role = user.role
policy = load_policy(doc.doc_type)
return action in policy[role]
生产环境部署方案:
症状:解析某些DOCX文件时程序崩溃
诊断步骤:
解决方案:
python复制try:
doc = Document(corrupted_file)
except Exception as e:
repaired_file = recover_docx(corrupted_file)
doc = Document(repaired_file)
常见原因:
优化方法:
实现插件式文档处理器加载:
python复制def load_processor(doc_type):
plugin_path = f'plugins/{doc_type}_processor.py'
spec = importlib.util.spec_from_file_location(doc_type, plugin_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module.Processor()
应对不同Word版本生成的DOCX:
实际测试中,这套方案可以正确处理从Word 2007到Microsoft 365生成的各种DOCX文档,包括包含复杂数学公式和VBA宏的文档。关键是在解析阶段保留所有原始信息,即使某些内容无法立即处理,也要确保不会丢失数据。