RAG 系统搭建流程(上):离线基础工程落地指南

一、搭建核心前提:明确目标与技术选型

RAG 系统搭建的核心是 “围绕场景落地”,前期需先明确目标与工具选型,避免盲目开发:

  • 场景目标:确定核心用途(如企业知识库问答、客服咨询、个人笔记检索),明确数据范围(如仅内部手册、含网页资讯)和性能要求(如响应速度、准确率);
  • 技术选型原则:新手优先 “轻量、易部署、低成本”,企业级场景侧重 “高并发、可扩展”,核心工具选型聚焦三大模块(下文详细说明)。

二、第一步:环境搭建与工具准备

环境搭建是基础,需完成 “开发环境 + 核心工具” 部署,新手可按以下步骤快速落地:

1. 开发环境配置

  • 基础环境:安装 Python 3.8+(兼容性最佳),搭配 PyCharm、VS Code 等开发工具;
  • 依赖库安装:通过pip命令批量安装核心库,关键库及作用如下:
    • 工具链核心:langchain(串联全流程)、langchain-community(扩展组件);
    • 向量处理:sentence-transformers(开源嵌入模型)、openai(闭源嵌入模型,需 API 密钥);
    • 向量数据库:chromadb(轻量本地库)、faiss-cpu(单机海量数据)、pymilvus(企业级分布式库);
    • 数据处理:pypdf(PDF 解析)、python-docx(Word 处理)、beautifulsoup4(网页爬取)。

2. 核心工具选型(按场景分类)

工具类型 新手 / 轻量场景 企业级场景 核心优势
嵌入模型 Sentence-BERT(all-MiniLM-L6-v2) OpenAI Embeddings、通义 Embeddings 轻量模型:免费、本地运行;闭源模型:语义匹配更精准
向量数据库 Chroma Milvus、Pinecone 轻量库:无需部署,本地启动;企业库:支持亿级数据、高并发
数据处理工具 LangChain 内置 Loader(PyPDFLoader 等) 自定义 Loader+Spark 数据清洗 内置工具:快速上手;自定义工具:适配复杂数据格式

三、第二步:数据处理全流程(离线核心环节)

数据处理直接决定知识库质量,核心是 “从原始数据到可检索片段” 的转化,分四步落地:

1. 数据采集:聚焦 “相关、权威”

  • 采集范围:按场景目标筛选数据源,例如企业知识库场景可采集:
    • 内部文档:产品手册(PDF/Word)、规章制度、培训资料、客服对话记录;
    • 公开数据:行业报告、官方网页资讯(需合规爬取);
  • 采集工具:
    • 本地文档:用 LangChain 的PyPDFLoader(PDF)、Docx2txtLoader(Word)直接读取;
    • 网页数据:用WebBaseLoader爬取静态网页,需配置请求头(避免反爬);
    • 数据库数据:用SQLDatabaseLoader连接 MySQL/PostgreSQL,通过 SQL 查询提取文本数据。

2. 数据清洗:去除噪声,优化质量

  • 核心目标:剔除无关信息,确保数据准确性与可读性;
  • 关键操作:
    • 格式统一:将扫描件 PDF 通过 OCR(如pytesseract)转化为纯文本,Excel 表格提取 “字段名 + 内容” 组合文本;
    • 噪声过滤:删除页眉页脚、水印、重复段落、特殊字符(如\n、乱码);
    • 内容筛选:剔除广告、无意义短句(如 “仅供参考”)、与场景无关的内容(如企业知识库剔除个人闲聊记录);
    • 脱敏处理:对私有数据(手机号、身份证号、敏感业务数据)进行替换(如 “138XXXX1234”)或删除。

3. 文本拆分:兼顾 “检索精准度 + 语义完整性”

文本拆分是 RAG 搭建的关键步骤,直接影响后续检索效果:

  • 拆分原则:按 “语义完整单元” 拆分,而非固定字数,避免拆分后语义断裂;
  • 拆分策略与工具:
    • 基础拆分:用 LangChain 的RecursiveCharacterTextSplitter,按标点(。!?)、段落分隔符智能拆分,单段长度建议 300-500 字(轻量场景)、500-800 字(长文本场景);
    • 进阶拆分:复杂文档(如技术手册)用SemanticChunker,基于语义相似度拆分,确保同一主题的内容不被拆分;
    • 元数据添加:为每个拆分后的文本片段(Chunk)添加元数据,包含 “来源文档名、章节、页码、采集时间”,方便后续溯源。

4. 向量转化:将文本转为 “可检索格式”

通过嵌入模型将文本片段转化为向量,为后续相似度检索奠定基础:

  • 模型选择与调用:
    • 新手首选:Sentence-BERT 的all-MiniLM-L6-v2模型(轻量、免费、本地运行),调用代码示例:

      python

      运行

      from sentence_transformers import SentenceTransformer
      model = SentenceTransformer('all-MiniLM-L6-v2')
      chunk_embeddings = model.encode(chunk_texts)  # chunk_texts为拆分后的文本列表
      
    • 专业场景:OpenAI Embeddings(需 API 密钥),语义表征更精准,调用代码示例:

      python

      运行

      from openai import OpenAI
      client = OpenAI(api_key="your-api-key")
      def get_embedding(text):
          response = client.embeddings.create(input=text, model="text-embedding-3-small")
          return response.data[0].embedding
      chunk_embeddings = [get_embedding(chunk) for chunk in chunk_texts]
      
  • 向量维度适配:确保嵌入模型输出维度与向量数据库兼容(如 Chroma 支持任意维度,Milvus 需提前指定维度)。

四、第三步:知识库构建与存储(离线收尾)

将转化后的向量与文本片段存储到向量数据库,形成可检索的知识库:

1. 向量数据库初始化

  • 轻量场景(Chroma):无需复杂配置,本地启动即可,初始化代码示例:

    python

    运行

    import chromadb
    # 创建本地数据库(持久化存储,重启后不丢失数据)
    db = chromadb.PersistentClient(path="./rag_database")
    # 创建集合(类似数据库表)
    collection = db.create_collection(name="enterprise_knowledge_base")
    
  • 企业级场景(Milvus):需先部署 Milvus 服务(支持本地或云端),再通过 SDK 连接,核心步骤:
    1. 安装 Milvus 服务(参考官方文档);
    2. pymilvus连接服务,创建集合并定义字段(向量字段、文本字段、元数据字段)。

2. 数据入库:向量 + 文本 + 元数据关联存储

将向量、文本片段、元数据批量写入数据库,确保关联关系完整:

python

运行

# Chroma入库示例(批量插入)
collection.add(
    documents=chunk_texts,  # 拆分后的文本片段
    embeddings=chunk_embeddings,  # 对应的向量
    metadatas=chunk_metadata,  # 元数据列表(与文本片段一一对应)
    ids=[f"chunk_{i}" for i in range(len(chunk_texts))]  # 唯一ID(便于后续更新/删除)
)
  • 关键注意:确保documentsembeddingsmetadatasids长度一致,避免数据错位;
  • 入库后验证:通过collection.count()查看入库数量,用collection.query()查询指定 ID 的片段,确认数据存储正常。

五、上半程搭建核心总结

RAG 系统搭建(上)的核心是 “离线基础工程”,重点完成 “环境准备→数据处理→知识库构建” 三大环节:

  • 环境搭建:优先轻量工具,降低入门门槛;
  • 数据处理:核心是 “去噪声、保语义、加元数据”,为检索精准度打基础;
  • 知识库存储:确保向量与文本关联完整,支持后续快速检索。

下半程将聚焦 “在线检索流程搭建、生成优化、系统测试”,完成从 “知识库” 到 “可交互 RAG 系统” 的闭环。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐