首页 / 文章

层层递进:为AI智能体设计真正的RAG检索流程

设计一个基于SourceDocument和DocumentChunk合约的RAG流程,包括数据分块、嵌入生成以及ChromaDB的使用,所有功能都由RetrievalService统一管理,从而保障智能体的稳定性。

发布者:REACTAPP.TOP阅读约 10 分钟2216 词

来源: Building a Real RAG Retrieval Pipeline for an Enterprise Multi-Agent AI Platform

用真正的 RAG 流水线取代玩具版的检索代理是个适合放慢节奏、分步推进工作的时机。在多代理企业平台中,RetrievalAgent 最初是在一个刻意简化的本地实现上运行的。这足以验证架构的可行性,但实际生产环境需要真实的文档、嵌入向量、向量存储以及语义搜索功能。目标流程是从文档开始,经过数据摄取、分块处理和生成嵌入向量,再将其存储到 ChromaDB 中,随后进行语义检索,最终由 RetrievalAgent 以及整个平台来完成后续操作。

与其一次性构建所有功能,不如逐步添加每一层,在每个阶段都进行测试,并确保持续集成流水线始终处于正常状态。稳步推进、稳定的持续集成以及合理的架构才是最终目标。

RAG 流水线的组成部分

一个完整的流程链整合了多个独立的工程要素,下图从源文档开始展示了这些要素的构成。

Source Documents
       ↓
Document Ingestion
       ↓
    Chunking
       ↓
   Embeddings
       ↓
 Vector Storage
       ↓
Semantic Search
       ↓
Retrieved Context
       ↓
Retrieval Agent

可以同时构建所有组件,但这会使得故障定位变得困难。当检索质量不佳时,问题出在哪里?可能是文档解析、分块处理、嵌入生成、向量存储、查询逻辑、元数据或代理集成方面的问题。为每一层明确职责、定义接口规范并设定测试边界,就能让这些问题有据可查。在持续集成流程中,应遵循“构建、测试、推送、验证”的节奏,确保系统始终正常运行,然后再继续下一步。

从数据接口规范开始

在涉及任何嵌入生成或ChromaDB功能之前,首要任务是制定数据接口规范。该流程需要区分两个概念:SourceDocument和DocumentChunk。

SourceDocument指的是在被拆分之前的原始知识来源。它可以是PDF、DOCX或TXT文件,也可以是内部文档、财务报告、企业政策、技术手册或知识库内容。其概念结构如下所示:

SourceDocument
 ├── document_id
 ├── content
 ├── source
 └── metadata

因此,每份原始文档在检索架构中都会拥有一个稳定的标识。

大型企业文档通常不应被作为一个巨大的文本块嵌入其中。需要将其拆分成更小且具有意义的单元,而这正是DocumentChunk的功能:

DocumentChunk
 ├── chunk_id
 ├── document_id
 ├── content
 ├── source
 ├── chunk_index
 └── metadata

两者之间的关系是一对多:

SourceDocument
                       │
          ┌────────────┼────────────┐
          ▼            ▼            ▼
       Chunk 0       Chunk 1      Chunk 2
          │            │            │
          └────────────┼────────────┘
                       ↓
                 Same document_id
                  + source metadata

一个来源文件可能会生成数十个数据块,甚至数百个,但每个数据块都会保留指向其原始document_id及来源的链接。一旦语义检索开始返回更大文档中的各个片段,这一链接就变得至关重要。

为何从一开始就注重可追溯性

想象一份50页的财务报告。系统可能会将其拆分为数十个数据块,而语义搜索可能只返回其中三个。系统仍需能够指出这些信息源自哪份原始文档。在检索后再重建这种关联十分脆弱,因此应在处理流程的每一步都保留这种关联。

Original Document
       ↓
SourceDocument
       ↓
DocumentChunk
       ↓
Embedding
       ↓
Vector Record
       ↓
Semantic Search
       ↓
RetrievedDocument
       ↓
Original Source

可追溯性从一开始就是数据架构的组成部分,而非事后添加的功能。

合约测试

在模型定义完成后,自动化测试会覆盖SourceDocument和DocumentChunk。这些测试会检查模型是否构建正确,以及关键字段(包括文档ID、来源信息、内容及分块索引)是否按预期运行。

这看似只是一个小里程碑,但实际上这些模型将贯穿整个检索流程:

Document Models
      ↓
   Chunking
      ↓
  Embeddings
      ↓
   ChromaDB
      ↓
  Retrieval
      ↓
    Agents

该链条起始处的合同出现故障可能会影响后续的所有环节,因此在构建更多上层基础设施之前,数据基础必须得到保护。

另一个刻意做出的选择是让这一阶段不依赖任何外部组件。这里不会发起对OpenAI的调用,也不会使用ChromaDB,测试仅用于验证文档合同。因此,快速的CI流程能够保持确定性。

Code Change
     ↓
Local Fast Tests
     ↓
Commit
     ↓
Push to GitHub
     ↓
GitHub Actions
     ↓
Clean CI Environment
     ↓
Fast Unit Tests
     ↓
CI PASSED ✅

快速开发套件不断扩展,而外部集成测试则保持独立的分类。其背后的原则是:每一层新功能加入平台时都会配备自动保护机制。

完整路线图

文档处理功能仅是第一层。以下为整个目标架构:

Enterprise Documents
        │
        ▼
     Ingestion
        │
        ▼
      Chunking
        │
        ▼
     Embeddings
        │
        ▼
     ChromaDB
   Vector Storage
        │
        ▼
 Semantic Retrieval
        │
        ▼
 Retrieved Context
        │
        ▼
  RetrievalAgent
        │
        ▼
Multi-Agent Platform

每个阶段都有特定的职责,且应能够独立被理解与测试。

接下来是分块处理

下一个组件是分块服务,它可将SourceDocument转换为多个DocumentChunk对象。

SourceDocument
      │
      ▼
ChunkingService
      │
      ├── DocumentChunk 0
      ├── DocumentChunk 1
      ├── DocumentChunk 2
      └── DocumentChunk N

随着时间推移,该服务需要处理数据块的大小与重叠问题,传递元数据及源文件详情,为每个数据块分配索引并生成稳定的标识符。其中有一个架构设计要点十分重要:数据分块功能不应由检索代理承担,因为该代理仅负责检索功能,不应同时处理文档准备工作。

嵌入向量与存储

在完成数据分块功能的实现与测试后,下一层便会生成向量嵌入结果。

DocumentChunk
      ↓
Embedding Service
      ↓
Embedding Model
      ↓
Vector Representation

每个数据块都会转化为一个向量,用以编码其含义。随后,这些向量会与嵌入的用户查询进行比对,从而找到相关内容。

DocumentChunk
      ↓
EmbeddingService
      ↓
Embedding Provider
      ↓
Vector

日后更换嵌入模型几乎不会影响RAG设计的其他部分。

嵌入模型之后是持久向量存储。在本地开发时,ChromaDB的持久化客户端能够确保索引过的知识在应用程序重启后依然存在。

DocumentChunk
      +
Embedding
      +
Metadata
      ↓
   ChromaDB
      ↓
Persistent Vector Collection

存储的记录不仅仅需要一个向量,还需包含足够的信息以维持上下文关联与可追溯性:

Vector Record
 ├── chunk_id
 ├── embedding
 ├── content
 ├── document_id
 ├── source
 ├── chunk_index
 └── metadata

这样检索就能返回有意义的文档上下文,而不仅仅是相似的向量。

查询

当数据存储完成后,系统即可进行语义搜索。查询路径为:

User Query
    ↓
Query Embedding
    ↓
ChromaDB Similarity Search
    ↓
Top-K Relevant Chunks
    ↓
Scores + Metadata
    ↓
Retrieved Context

语义检索并非完全依赖精确的关键词匹配,而是寻找在概念上与用户请求相关的内容片段。随后这些结果会被转换为平台已使用的标准化检索格式。

重新连接智能体

只有当检索基础设施正常运行时,整个流程才会重新接入 RetrievalAgent。从智能体的角度来看,情况依然很简单:

AgentRequest
     ↓
RetrievalAgent
     ↓
RetrievalService
     ↓
Relevant Documents
     ↓
Structured RetrievalResult

RetrievalService背后,其实现方式要复杂得多:

RetrievalService
      ↓
Query Embedding
      ↓
ChromaDB
      ↓
Semantic Search
      ↓
Ranking
      ↓
Retrieved Context

分离这一点很重要。检索代理应将检索视为一项功能,无需了解向量数据库、嵌入生成、分块存储或文档导入等相关内容。

最初的代理在本地数据上运行,其架构大致如下:

RetrievalAgent
      ↓
RetrievalService
      ↓
Local Documents

该实现现在可以朝着更丰富的方向发展:

RetrievalAgent
      ↓
RetrievalService
      ↓
Semantic Retrieval
      ↓
ChromaDB
      ↓
Embedded Enterprise Documents

注意那些保持不变的部分:从 RetrievalAgent 到 RetrievalService 的链接。只有该契约背后的基础设施会发生变化,这也正是为什么在向量数据库出现之前就先创建了检索抽象层。基础设施应当能够自由发展,而不必强制重新设计代理架构。

融入平台

RAG 流水线并非独立存在,它的作用是为更大的多代理系统提供基于实际数据的企业知识。

User
                          │
                          ▼
                    Supervisor Agent
                          │
                          ▼
                     Planning Agent
                          │
                          ▼
                    Execution Plan
                          │
                          ▼
                     Agent Registry
                          │
             ┌────────────┼────────────┐
             ▼            ▼            ▼
       RetrievalAgent  ResearchAgent AnalysisAgent
             │
             ▼
      RetrievalService
             │
             ▼
         RAG Pipeline
             │
             ▼
      Relevant Context
             │
             ▼
       Downstream Agents

在那张图中,检索代理将多个代理执行所在的层与存储企业知识的那层连接起来。

有一点需要特别强调:RAG并非简单的“添加一个向量数据库”那么简单。一个完善的检索架构涉及诸多决策:

  • 文档的格式化与导入
  • 分块处理及嵌入向量生成
  • 向量存储与元数据管理
  • 语义检索与排序
  • 来源可追溯性
  • 代理集成
  • 测试与监控

向量数据库只是整个庞大检索系统中的一个组成部分。

刻意设计的重复模式

实现这一目标的工程流程是刻意设计成重复性的:

Build One Layer
      ↓
Add Unit Tests
      ↓
Run Fast Suite
      ↓
Push to GitHub
      ↓
CI Validates
      ↓
Keep Green
      ↓
Build Next Layer

它允许在保持对现有系统信心的同时逐步增加复杂性。无需一次性添加五个组件并同时进行调试,而是会在每新增一个功能之前对其进行验证。

实际开发流程的第一个里程碑已经完成:包括SourceDocument合约、DocumentChunk合约、针对这两种模型的测试,以及一次成功的快速持续集成测试。接下来的路线图为:

1. Document Contract             ✅ COMPLETE
          ↓
2. Chunking Service              ← NEXT
          ↓
3. Embedding Service
          ↓
4. ChromaDB Integration
          ↓
5. Semantic Retrieval
          ↓
6. RetrievalAgent Integration
          ↓
7. End-to-End RAG Pipeline

在进入下一阶段之前,每个层次都会被独立实现并测试。

为何这很重要

第一个检索代理证明了代理架构是可行的。现在的目标是用真正的基础设施取代其临时的检索方式,从本地检索逐步过渡到文档处理流程、分块技术、嵌入模型、向量存储、语义搜索,最终实现基于RAG的代理。由于该代理依赖于服务抽象层而非直接依赖ChromaDB,因此无需重新设计多代理平台即可实现这些改进。

还有一个更普遍的原则:为那些可能发生变化的组件构建稳定的接口规范。模型会更新,向量数据库可能会更换,分块策略也会演变,检索算法也会不断改进,但围绕这些组件的平台无需每次都重新编写。

正在构建的其实是一种属于企业多智能体平台内部的检索能力,而非一次性的RAG演示。在该体系中,监督器负责协调调度,注册表用于解析各种能力,专用智能体执行任务,RAG提供基于事实的知识支持,测试机制保障行为规范,持续集成工具监控每一次变更,而可观测性功能则用于评估生产环境的表现。其实现方法始终如一:构建一个层,进行测试,将其部署,保持持续集成状态正常,然后再构建下一个层。