前言

本文基于RAG Challenge竞赛获奖方案,深入分析现代RAG系统的最佳实践,为企业知识库构建提供完整的技术指南。 完整代码看每段的python代码的详解。

比赛背景

RAG Challenge是由TrustBit组织举办的企业级RAG系统竞赛,旨在推动检索增强生成技术在企业知识库应用中的创新与发展。比赛官网:https://github.com/trustbit/enterprise-rag-challenge

为什么关注这个比赛?

随着企业数字化转型的深入,传统的知识管理方式已无法满足快速检索和高效利用的需求。企业知识库问答系统成为解决这一问题的关键技术,而RAG Challenge竞赛正是这一领域最具权威性的技术验证平台。通过分析获奖方案,我们可以学习到最前沿的RAG技术实践,为企业构建智能知识库系统提供宝贵经验。

比赛目标
  • 构建高效的企业知识库问答系统

  • 处理企业年报等复杂文档

  • 实现高精度的信息检索和答案生成

  • 探索RAG技术在企业场景下的最佳实践

技术挑战
  1. 复杂文档处理:企业年报包含大量表格、图表和结构化信息

  2. 多公司对比:需要处理涉及多个公司的比较类问题

  3. 高精度要求:企业级应用对答案准确性要求极高

  4. 大规模数据:需要处理海量的企业文档数据

比赛评估标准
  • 准确性:答案与标准答案的匹配度

  • 完整性:答案是否包含所有必要信息

  • 相关性:答案是否直接回答用户问题

  • 可解释性:提供答案来源和推理过程

获奖方案特点

本文分析的获奖方案(GitHub: https://github.com/IlyaRice/RAG-Challenge-2)在比赛中取得了优异成绩,其核心创新包括:

  • Small-to-Big检索策略:先检索摘要,再获取详细内容

  • LLM重排序技术:使用大模型提升检索精度

  • 父文档检索:基于chunk检索相关完整页面

  • 多模型支持:集成多种LLM提供商

  • 结构化输出:确保答案格式一致性

技术突破点
  1. 混合检索架构:结合向量检索和关键词检索的优势

  2. 智能重排序:使用LLM对检索结果进行精确排序

  3. 表格序列化:将复杂表格转换为LLM友好的结构化文本

  4. 多公司路由:自动识别问题涉及的公司并分别处理

  5. 并行处理优化:大幅提升系统处理效率

在人工智能快速发展的今天,检索增强生成(RAG)技术已成为构建智能问答系统的核心技术。本文基于RAG Challenge竞赛获奖方案,深入分析现代RAG系统的最佳实践,为企业知识库构建提供完整的技术指南。

1. RAG系统架构概览

1.1 整体架构设计

现代RAG系统采用摄取(Ingestion)回答(Answering)两阶段架构:

摄入

PDF → PDF 解析 → 文本清理、分块 → 向量数据库

问答

问题 → 向量数据库 → 父页面检索 → 大语言模型(LLM)重排 → 相关上下文(虚线:路由到相关提示词)→ 提示词集合 → 提示词模板 → 请求 → 答案


1.2 核心技术栈

  • PDF解析: Docling (高质量文档解析)

  • 文本处理: LangChain TextSplitter

  • 向量化: DashScope/OpenAI Embedding

  • 存储: FAISS + BM25双索引

  • 重排序: LLM-based Reranking

  • 生成: 多模型支持 (GPT-4o, Qwen, Gemini等)

  • BM25的定义与核心原理

    BM25是一种基于概率检索模型的排名函数,由Stephen E. Robertson和Karen Spärck Jones在1990年代开发,现已成为搜索引擎(如Elasticsearch、Solr)和向量数据库(如Milvus)中的核心算法

    与传统TF-IDF的比较

    相比传统的TF-IDF算法,BM25主要做了两大关键优化:

    ​词频饱和处理​:避免高频词权重无限增长。例如"的"在文档中出现100次,其重要性不会线性增长,而是趋于饱和
    ​文档长度归一化​:消除长文档天然权重偏高的偏差。两篇内容相似的文档,不会因篇幅差异导致检索结果倾斜

    BM25的应用场景

    ​精准关键词匹配场景​
    企业知识库检索(如查找"数据合规条款")
    法律文书检索(精确匹配"违约责任"等关键词)
    日志分析(定位包含"错误代码500"的条目)

2. 摄取阶段:从文档到知识

2.1 PDF解析模块 (pdf_parsing.py)

PDF解析模块 (pdf_parsing.py) 详解附代码https://blog.csdn.net/chenchihwen/article/details/153259938?spm=1001.2014.3001.5502

核心功能

  • 使用Docling进行高质量PDF解析

  • 支持OCR文字识别和表格结构识别

  • 并行处理提升效率

关键代码逻辑

class PDFParser:
    def __init__(self, pdf_backend=DoclingParseV2DocumentBackend):
        # 配置OCR和表格识别选项
        pipeline_options = PdfPipelineOptions()
        pipeline_options.do_ocr = True
        pipeline_options.do_table_structure = True
        pipeline_options.table_structure_options.mode = TableFormerMode.ACCURATE

创新点

  • 支持多进程并行解析

  • 自动元数据管理(公司名称、SHA1等)

  • 调试数据保存便于问题排查

2.2 文本处理模块 (text_splitter.py)

文本处理模块 (text_splitter.py) 详解附代码https://blog.csdn.net/chenchihwen/article/details/153261285?sharetype=blogdetail&sharerId=153261285&sharerefer=PC&sharesource=chenchihwen&spm=1011.2480.3001.8118

核心功能

  • 智能文本分块,保持语义完整性

  • 支持序列化表格的插入

  • Token精确统计

关键代码逻辑

class TextSplitter:
    def _split_page(self, page, chunk_size=300, chunk_overlap=50):
        text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
            model_name="gpt-4o",
            chunk_size=chunk_size,
            chunk_overlap=chunk_overlap
        )

最佳实践

  • chunk_size=300,chunk_overlap=50 平衡检索精度和上下文完整性

  • 按页分块保持文档结构

  • 支持表格和文本的混合处理

2.3 表格序列化模块 (tables_serialization.py)

表格序列化模块 (tables_serialization.py) 详解附代码https://blog.csdn.net/chenchihwen/article/details/153263528?sharetype=blogdetail&sharerId=153263528&sharerefer=PC&sharesource=chenchihwen&spm=1011.2480.3001.8118

核心功能

  • 使用LLM将表格转换为结构化文本

  • 上下文感知的表格处理

  • 并行处理多个表格

关键代码逻辑

class TableSerializer:
    def _get_table_context(self, json_report, target_table_index):
        # 获取表格前后文本作为上下文
        # 定位表格在页面中的位置
        # 提取相关上下文信息

创新应用

  • 表格结构化提升LLM理解能力

  • 上下文信息增强表格语义

  • 支持复杂表格的智能处理

2.4 向量化存储模块 (ingestion.py)

向量化存储模块 (ingestion.py)详解 附代码https://blog.csdn.net/chenchihwen/article/details/153263651?sharetype=blogdetail&sharerId=153263651&sharerefer=PC&sharesource=chenchihwen&spm=1011.2480.3001.8118

核心功能

  • 双索引系统:FAISS向量索引 + BM25关键词索引

  • 批量embedding生成

  • 元数据管理

关键代码逻辑

class VectorDBIngestor:
    def _get_embeddings(self, text, model="text-embedding-v1"):
        # 批量处理,每批25个文本
        MAX_BATCH_SIZE = 25
        for i in range(0, len(text_chunks), MAX_BATCH_SIZE):
            batch = text_chunks[i:i+MAX_BATCH_SIZE]
            resp = TextEmbedding.call(model=TextEmbedding.Models.text_embedding_v1, input=batch)

技术优势

  • 混合检索策略提升召回率

  • 批量处理提高效率

  • 完善的错误处理和重试机制

3. 回答阶段:从问题到答案

3.1 检索模块 (retrieval.py)

RAG 检索系统核心实现解析:多模态检索与重排序技术retrieval.py详解https://blog.csdn.net/chenchihwen/article/details/153316412?spm=1001.2014.3001.5501

核心功能

  • 多策略检索:向量检索、BM25检索、混合检索

  • 父文档检索(Parent Document Retrieval)

  • 多数据库并行检索

关键代码逻辑

class VectorRetriever:
    def retrieve_by_company_name(self, company_name, query, top_n=10):
        # 1. 根据公司名找到对应数据库
        # 2. 执行向量相似度搜索
        # 3. 支持父文档检索
        if return_parent_pages:
            # 返回完整页面而非单个chunk

创新技术

  • Small-to-Big检索:先检索摘要,再获取详细内容

  • 父文档检索:基于chunk检索相关完整页面

  • 多公司路由:自动识别问题涉及的公司

3.2 重排序模块 (reranking.py)

RAG 重排序系统深度解析:多模态重排与智能融合技术实战https://blog.csdn.net/chenchihwen/article/details/153317099?spm=1001.2014.3001.5501

核心功能

  • LLM-based重排序提升检索精度

  • 支持单块和批量重排序

  • 多模型提供商支持

关键代码逻辑

class LLMReranker:
    def get_rank_for_multiple_blocks(self, query, retrieved_documents):
        # 使用LLM对多个检索结果进行相关性评分
        # 返回重新排序后的结果

技术优势

  • 显著提升检索精度

  • 结构化输出确保一致性

  • 支持多种LLM提供商

3.3 问答生成模块 (questions_processing.py)

问答生成模块 (questions_processing.py)详解附代码https://blog.csdn.net/chenchihwen/article/details/153321791?spm=1001.2014.3001.5501

核心功能

  • 结构化输出确保答案格式规范

  • 并行处理多个问题

  • 引用验证和页码校验

关键代码逻辑

class QuestionsProcessor:
    def _validate_page_references(self, claimed_pages, retrieval_results):
        # 校验LLM答案中引用的页码是否真实存在
        # 若不足最小页数,则补充检索结果中的top页

最佳实践

  • 使用Pydantic确保输出格式一致

  • 分步推理要求模型详细分析

  • 引用验证提升答案可信度

4. 核心流程控制 (pipeline.py)

核心流程控制 (pipeline.py)详解附代码https://blog.csdn.net/chenchihwen/article/details/153260567?sharetype=blogdetail&sharerId=153260567&sharerefer=PC&sharesource=chenchihwen&spm=1011.2480.3001.8118

4.1 配置系统设计

PipelineConfig类:管理所有路径配置

@dataclass
class PipelineConfig:
    def __init__(self, root_path, serialized=False, config_suffix=""):
        # 支持序列化表格的路径切换
        suffix = "_ser_tab" if serialized else ""
        # 分层目录结构管理

RunConfig类:控制运行参数

@dataclass
class RunConfig:
    use_serialized_tables: bool = False
    parent_document_retrieval: bool = False
    llm_reranking: bool = False
    top_n_retrieval: int = 10
    api_provider: str = "dashscope"

4.2 预定义配置

最佳配置 (max_nst_o3m_config):

max_nst_o3m_config = RunConfig(
    use_serialized_tables=False,
    parent_document_retrieval=True,
    llm_reranking=True,
    top_n_retrieval=14,
    answering_model="o3-mini-2025-01-31"
)

5. API集成和模型调用 (api_requests.py)

API集成和模型调用 (api_requests.py) 详细说明 附源码https://blog.csdn.net/chenchihwen/article/details/153326533?spm=1001.2014.3001.5501

5.1 多模型支持

支持的模型提供商

  • OpenAI: GPT-4o, o3-mini

  • DashScope: 通义千问系列

  • IBM: Llama 70B

  • Gemini: Google Gemini

关键代码逻辑

class APIProcessor:
    def send_message(self, model=None, is_structured=False, response_format=None):
        if is_structured:
            # 使用结构化输出
            completion = self.llm.beta.chat.completions.parse(**params)
            response = completion.choices[0].message.parsed

5.2 并发控制

并行处理机制

  • 支持并行API请求处理

  • 智能限流控制(请求数、Token数)

  • 失败重试和错误日志记录

6. 数据流转和模块交互

6.1 完整数据流

摄取阶段

PDF文档 → Docling解析 → 复杂JSON → 表格序列化 → 报告合并 → 文本分块 → 向量化存储

回答阶段

问题输入 → 公司路由 → 检索器选择 → 向量/BM25检索 → 重排序 → 上下文构建 → LLM生成 → 结构化输出

6.2 存储结构

debug_data/
├── 01_parsed_reports/     # 原始解析结果
├── 02_merged_reports/     # 合并后结果
└── 03_reports_markdown/   # Markdown格式

databases/
├── vector_dbs/           # FAISS向量索引
├── chunked_reports/      # 分块文档
└── bm25_dbs/            # BM25索引

7. 企业文档处理创新应用

7.1 当前优势

  1. 高质量PDF解析:支持复杂表格和图像识别

  2. 智能检索策略:混合检索 + LLM重排序

  3. 结构化输出:确保答案格式一致性

  4. 多模型支持:适应不同场景需求

  5. 并行处理:提升系统效率

7.2 未来优化方向

7.2.1 文档类型扩展
# 可扩展的文档解析器
class DocumentParser:
    def __init__(self):
        self.parsers = {
            'pdf': PDFParser(),
            'docx': DocxParser(),
            'html': HTMLParser(),
            'markdown': MarkdownParser()
        }
7.2.2 多模态支持
# 图像和文本联合处理
class MultimodalProcessor:
    def process_document(self, text, images):
        # 文本embedding
        text_embeddings = self.get_text_embeddings(text)
        # 图像embedding
        image_embeddings = self.get_image_embeddings(images)
        # 联合检索
        return self.hybrid_retrieval(text_embeddings, image_embeddings)
7.2.3 实时更新机制
# 增量更新系统
class IncrementalUpdater:
    def update_knowledge_base(self, new_documents):
        # 检测文档变化
        changes = self.detect_changes(new_documents)
        # 增量更新向量索引
        self.update_vector_index(changes)
        # 更新元数据
        self.update_metadata(changes)
7.2.4 智能路由优化
# 基于问题类型的智能路由
class IntelligentRouter:
    def route_question(self, question):
        question_type = self.classify_question(question)
        if question_type == "numerical":
            return self.numerical_retrieval_config
        elif question_type == "comparative":
            return self.comparative_retrieval_config
        else:
            return self.general_retrieval_config
7.2.5 质量评估系统
# 答案质量评估
class QualityAssessor:
    def assess_answer_quality(self, question, answer, context):
        # 事实准确性评估
        factual_accuracy = self.check_factual_accuracy(answer, context)
        # 完整性评估
        completeness = self.check_completeness(question, answer)
        # 相关性评估
        relevance = self.check_relevance(answer, question)
        return {
            'factual_accuracy': factual_accuracy,
            'completeness': completeness,
            'relevance': relevance
        }

8. 实践建议

8.1 部署建议

  1. 硬件配置

    • GPU: 用于PDF解析和embedding生成

    • 内存: 16GB+ 用于向量索引加载

    • 存储: SSD用于快速检索

  2. 软件环境

    • Python 3.8+

    • CUDA支持(可选)

    • Docker容器化部署

8.2 性能优化

  1. 缓存策略

    • 缓存embedding结果

    • 缓存检索结果

    • 缓存LLM响应

  2. 并发控制

    • 合理设置并发数

    • 实现请求队列

    • 监控API限流

8.3 监控和维护

  1. 系统监控

    • API调用次数和延迟

    • 检索准确率

    • 用户满意度

  2. 数据维护

    • 定期更新知识库

    • 清理过期数据

    • 优化索引结构

9. 总结

现代RAG系统通过摄取回答两阶段的精心设计,实现了从非结构化文档到智能问答的完整转换。本文分析的RAG-Challenge获奖方案展示了以下最佳实践:

核心技术亮点

  1. 高质量文档解析:Docling + OCR + 表格识别

  2. 智能检索策略:向量检索 + BM25 + 父文档检索

  3. LLM重排序:显著提升检索精度

  4. 结构化输出:确保答案格式一致性

  5. 多模型支持:适应不同场景需求

企业应用价值

  • 知识管理:将企业文档转化为可查询的知识库

  • 智能客服:基于企业知识库的自动问答

  • 决策支持:快速检索和分析企业信息

  • 合规审查:自动化文档审查和合规检查

未来发展方向

  • 多模态支持:文本、图像、音频联合处理

  • 实时更新:增量式知识库更新

  • 智能路由:基于问题类型的智能检索策略

  • 质量评估:自动化答案质量评估系统

通过本文的深入分析,希望为读者构建企业级RAG系统提供完整的技术指导和实践参考。随着AI技术的不断发展,RAG系统将在企业数字化转型中发挥越来越重要的作用。


作者简介:专注于AI技术在企业应用中的实践,擅长RAG系统设计和优化。

技术交流:欢迎在评论区分享您的实践经验和遇到的问题,共同探讨RAG技术的最佳实践。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐