ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

AI Agent从无到有42: RAG 数据预处理实战 — 文档加载、切片与向量化

2026/8/18 13:31:31 拓冰建站 浏览量
AI Agent从无到有42: RAG 数据预处理实战 — 文档加载、切片与向量化 纲要RAG核心概念检索增强生成的原理与价值解决大模型数据时效性与领域知识缺失的关键技术数据预处理全流程Document Loader从多种数据源加载原始文档Text Splitter将大文档切分为语义连贯的片段Embedding Model将文本片段转换为向量Vector Store持久化存储向量并支持相似性检索LangChain实现组件TextLoader、RecursiveCharacterTextSplitterFakeEmbeddings与Chroma向量数据库完整可运行代码从文本到向量存储的端到端示例引言大语言模型虽然具备广泛的通用知识但普遍存在两个固有局限一是知识截止日期Knowledge Cutoff Date问题模型无法获知训练数据截止时间之后的最新信息二是领域知识盲区对于企业内部文档、专业法规等非公开或垂直领域知识模型难以给出准确回答。检索增强生成通过将外部知识库与模型生成能力相结合在回答用户问题前先从知识库中检索相关文档片段并将其作为上下文注入提示词从而显著提升答案的准确性、时效性与可追溯性。本文聚焦RAG流水线的第一环——数据预处理介绍如何利用LangChain将原始文档转化为可供语义搜索的向量存储并提供可直接运行的代码示例。RAG基本原理RAG的核心理念可概括为“先检索后生成”。当用户提出问题时系统执行以下步骤向量化用户问题使用与知识库相同的嵌入模型将问题转换为向量。向量相似性搜索在向量数据库中检索与问题向量最接近的若干文档片段。构建增强提示词将检索到的文档片段与原始问题拼接为最终的模型输入。调用大模型生成模型基于提供的上下文生成可靠答案。用户提问问题向量化向量相似性搜索获取相关文档片段拼接增强提示词大模型生成回答上述流程顺畅运转的前提是知识库的数据预处理——将原始文档加工成适合向量检索的格式这也是本文的核心内容。数据预处理四步骤一个典型的RAG数据预处理流水线包含四个关键环节加载 → 切片 → 嵌入 → 存储。文档加载LangChain提供了多种内置加载器支持TXT、PDF、Markdown、CSV、HTML、Notion等主流格式。所有加载器的输出统一为Document对象包含page_content文本内容和metadata元数据两个字段。TextLoader是最基础的文本文件加载器默认将整个文件作为一个Document返回。文本切片大语言模型的上下文窗口有限过长的文档无法直接输入模型也不利于精确检索——过大的文本块会降低检索的语义粒度。切片器负责将长文本分割为较小的语义块。RecursiveCharacterTextSplitter是LangChain官方推荐的最常用的文本分割器。它通过递归地尝试多个分隔符段落、句子、词等边界来切分文本尽量保持语义单元的完整性。向量化嵌入嵌入模型将文本片段映射为高维空间中的稠密向量语义相近的文本在向量空间中距离更近。LangChain支持OpenAI、HuggingFace以及各类国产嵌入模型。为便于本地测试和流程验证LangChain提供了FakeEmbeddings类可生成随机向量模拟嵌入过程无需任何外部API密钥。生产环境需替换为真实的嵌入模型。向量存储将向量与对应的文本片段存入向量数据库并提供快速的相似性搜索接口。Chroma是一个轻量级的开源向量数据库专为LLM应用设计非常适合本地开发和原型验证。Chroma支持内存模式和持久化模式。LangChain数据预处理实战以下代码演示从原始文本出发完成加载、切片、嵌入和存储的完整流程。使用FakeEmbeddings模拟嵌入无需任何外部API即可运行。环境准备安装所需依赖包pipinstalllangchain langchain-core langchain-community langchain-text-splitters chromadb注意LangChain 0.2.0及以上版本对模块结构进行了重构文档加载器需从langchain_community导入文本分割器需从langchain_text_splitters导入。Chroma的导入可通过langchain_community.vectorstores或独立的langchain_chroma包。完整代码fromlangchain_community.document_loadersimportTextLoaderfromlangchain_community.embeddingsimportFakeEmbeddingsfromlangchain_community.vectorstoresimportChromafromlangchain_core.documentsimportDocumentfromlangchain_text_splittersimportRecursiveCharacterTextSplitter# ---------- 1. 准备原始文本 ----------# 模拟一段产品手册raw_text 产品名称智能温控水杯 X-200 功能描述 1. 实时显示水温精确到 ±0.5°C。 2. 支持手机 App 远程设置目标温度。 3. 内置 5000mAh 电池可续航 48 小时。 4. 采用 316 不锈钢内胆安全健康。 5. 具有过热保护功能超过 99°C 自动断电。 使用说明 - 首次使用前请用清水冲洗内胆。 - 长按电源键 3 秒开机蓝牙自动配对。 - 可通过 App 调节温度范围40°C~100°C。 注意事项 - 请勿将杯体浸入水中清洗。 - 充电时请使用 5V/2A 适配器。 # ---------- 2. 文档加载 ----------# 从字符串直接构造 Document 列表实际使用中可从文件加载docs[Document(page_contentraw_text.strip(),metadata{source:产品手册})]print(f加载文档数:{len(docs)})print(f文档长度:{len(docs[0].page_content)}字符)# ---------- 3. 文本切片 ----------text_splitterRecursiveCharacterTextSplitter(chunk_size100,# 每个块的最大字符数chunk_overlap20,# 相邻块之间的重叠字符数保证语义连贯separators[\n\n,\n,。,, ,]# 优先按段落、换行、标点切分)split_docstext_splitter.split_documents(docs)print(f切片数量:{len(split_docs)})fori,docinenumerate(split_docs):print(f切片{i1}:{doc.page_content[:50]}... (长度{len(doc.page_content)}))# ---------- 4. 向量化与存储 ----------# 使用 FakeEmbeddings 模拟嵌入维度设为 128embeddingsFakeEmbeddings(size128)# 初始化 Chroma 向量库默认存储于内存vectorstoreChroma.from_documents(documentssplit_docs,embeddingembeddings,collection_nameproduct_manual)print(f向量库中文档数量:{vectorstore._collection.count()})# ---------- 5. 相似性检索测试 ----------query如何给水杯充电print(f\n查询:{query})# 将查询向量化并搜索最相似的 2 个文档resultsvectorstore.similarity_search(query,k2)foridx,docinenumerate(results):print(f检索结果{idx1}:{doc.page_content})运行结果解析加载阶段原始文本被封装为一个Document对象包含文本内容和元数据。切片阶段根据chunk_size100和chunk_overlap20文本被分割为多个语义块每个块尽可能保持语义完整。嵌入与存储阶段FakeEmbeddings生成随机向量维度128并存入Chroma向量库。实际应用中应替换为OpenAIEmbeddings或HuggingFaceEmbeddings。检索测试阶段对于“如何给水杯充电”这一查询向量搜索返回了包含充电相关信息的文档片段验证了语义匹配的基本能力。注意事项与最佳实践切片大小选择chunk_size需根据嵌入模型的上下文窗口和业务需求调整。通用场景下500~1000字符通常效果较好过小会丢失上下文过大会降低检索精度。重叠尺寸设置保留chunk_overlap可避免关键信息在切片边界被截断一般设为chunk_size的10%~20%。嵌入模型选型中文场景推荐使用OpenAI的text-embedding-ada-002或HuggingFace的bge-large-zh-v1.5两者均具备良好的中文语义理解能力。向量数据库选型原型开发阶段可使用Chroma内存模式或FAISS生产环境可考虑Pinecone、Weaviate或Milvus等具备分布式能力的方案。导入路径注意事项LangChain 0.2.0及以上版本中TextLoader应从langchain_community.document_loaders导入RecursiveCharacterTextSplitter应从langchain_text_splitters导入Chroma可从langchain_community.vectorstores或langchain_chroma导入。总结数据预处理是构建高质量RAG应用的基石。通过LangChain的文档加载器、文本分割器、嵌入模型和向量数据库四件套开发者可以快速将海量非结构化文本转化为可供语义搜索的知识库。本文的完整代码使用FakeEmbeddings模拟嵌入无需任何外部API密钥便于初学者在本地即刻体验RAG预处理全流程。掌握这些基础后下一步可将检索结果接入大模型构建完整的智能问答系统。