泰州建设局网站,一个完整的营销策划方案范文,wordpress生成纯html,3d游戏建模培训你是否也遇到过这样的情况#xff1a;RAG系统里的LLM明明很强大#xff0c;Prompt也精心调校过#xff0c;但最终的问答效果就是不尽如人意#xff1f;答案时常上下文不全#xff0c;甚至出现事实性错误。
我们排查了检索算法#xff0c;优化了Embedding模型#xff0c;…你是否也遇到过这样的情况RAG系统里的LLM明明很强大Prompt也精心调校过但最终的问答效果就是不尽如人意答案时常上下文不全甚至出现事实性错误。我们排查了检索算法优化了Embedding模型却往往忽略了数据进入向量库之前的最关键一步文档分块。不恰当的分块就像是给模型提供了一堆被打乱顺序、信息残缺的“坏数据”。模型能力再强也无法从支离破碎的知识中推理出正确、完整的答案。可以说分块的质量直接决定了RAG系统性能的下限。这篇文章我们就来深入聊聊这个基础却至关重要的环节。本文不谈空泛的理论而是聚焦于各类分块策略的实战代码和经验总结希望能帮你为你的RAG系统打下最坚实的地基。分块的本质为何与如何分块的必要性源于两个核心限制•模型上下文窗口大语言模型LLM无法一次性处理无限长度的文本。分块是将长文档切分为模型可以处理的、大小适中的片段。•检索信噪比在检索时如果一个文本块包含过多无关信息噪声就会稀释核心信号导致检索器难以精确匹配用户意图。理想的分块是在上下文完整性与信息密度之间找到最佳平衡。chunk_size和chunk_overlap是调控这一平衡的基础参数。chunk_overlap通过在相邻块之间保留部分重复文本确保了跨越块边界的语义连续性。分块策略详解与代码实践2.1 基础分块策略2.1.1 固定长度分块这是最直接的方法按预设的字符数进行切割。它不考虑文本的任何逻辑结构实现简单但容易破坏语义完整性。•核心思想按固定字符数chunk_size切分文本。•适用场景结构性弱的纯文本或对语义要求不高的预处理阶段。from langchain_text_splitters importCharacterTextSplitter sample_text ( LangChain was created by Harrison Chase in 2022. It provides a framework for developing applications powered by language models. The library is known for its modularity and ease of use. One of its key components is the TextSplitter class, which helps in document chunking. ) text_splitter CharacterTextSplitter( separator ,# 按空格分割 chunk_size100,# 增大块大小 chunk_overlap20,# 调整重叠比例 length_functionlen, ) docs text_splitter.create_documents([sample_text]) for i, doc in enumerate(docs): print(f--- Chunk {i1} ---) print(doc.page_content)2.1.2 递归字符分块LangChain推荐的通用策略。它按预设的字符列表如[\n\n, \n, , ]进行递归分割尝试优先保留段落、句子等逻辑单元的完整性。•核心思想按层次化分隔符列表进行递归切分。•适用场景绝大多数文本类型的首选通用策略。from langchain_text_splitters importRecursiveCharacterTextSplitter # 使用与上文相同的 sample_text text_splitter RecursiveCharacterTextSplitter( chunk_size100, chunk_overlap20, # 默认分隔符为 [\n\n, \n, , ] ) docs text_splitter.create_documents([sample_text]) for i, doc in enumerate(docs): print(f--- Chunk {i1} ---) print(doc.page_content)**参数调优说明**对于固定长度和递归分块chunk_size和chunk_overlap的设置至关重要•chunk_size: 决定了每个块的大小。块太小可能导致上下文信息不足模型无法充分理解块太大则可能引入过多噪声降低检索的信噪比并增加API调用成本。通常根据嵌入模型的最佳输入长度和文本特性来选择例如 256, 512, 1024。•chunk_overlap: 决定了相邻块之间的重叠字符数。设置合理的重叠如chunk_size的10%-20%可以有效防止在块边界处切断完整的语义单元如一个长句子是保证语义连续性的关键。2.1.3 基于句子的分块以句子为最小单元进行组合确保了最基本的语义完整性。•核心思想将文本分割成句子再将句子聚合成块。•适用场景对句子完整性要求高的场景如法律文书、新闻报道。import nltk try: nltk.data.find(tokenizers/punkt) except nltk.downloader.DownloadError: nltk.download(punkt) from nltk.tokenize import sent_tokenize def chunk_by_sentences(text, max_chars500, overlap_sentences1): sentences sent_tokenize(text) chunks [] current_chunk for i, sentence in enumerate(sentences): if len(current_chunk) len(sentence) max_chars: current_chunk sentence else: chunks.append(current_chunk.strip()) # 创建重叠 start_index max(0, i - overlap_sentences) current_chunk .join(sentences[start_index:i1]) if current_chunk: chunks.append(current_chunk.strip()) return chunks long_text This is the first sentence. This is the second sentence, which is a bit longer. Now we have a third one. The fourth sentence follows. Finally, the fifth sentence concludes this paragraph. chunks chunk_by_sentences(long_text, max_chars100) for i, chunk in enumerate(chunks): print(f--- Chunk {i1} ---) print(chunk)注意事项语言模型的选择许多标准库的默认配置是为英文设计的。例如nltk.tokenize.sent_tokenize默认使用基于英文训练的Punkt模型进行分句。如果直接用于处理中文文本会因无法识别中文标点而导致分句失败。 处理中文时必须采用适合中文的分割方法例如•基于中文标点符号如 。的正则表达式进行切分。•使用加载了中文模型的NLP库如 spaCy, HanLP 等进行更准确的分句。2.2 结构感知分块利用文档固有的结构信息如标题、列表、对话轮次作为分块边界这种方法逻辑性强能更好地保留上下文。2.2.1 结构化文本分块•核心思想根据Markdown的标题层级或HTML的标签来定义块的边界。•适用场景格式规范的Markdown、HTML文档。from langchain_text_splitters importMarkdownHeaderTextSplitter markdown_document # Chapter 1: The Beginning ## Section 1.1: The Old World Thisis the story of a time long past. ## Section 1.2: A New Hope A new hero emerges. # Chapter 2: The Journey ## Section 2.1: The Call to Adventure The hero receives a mysterious call. headers_to_split_on [ (#,Header 1), (##,Header 2), ] markdown_splitter MarkdownHeaderTextSplitter(headers_to_split_onheaders_to_split_on) md_header_splits markdown_splitter.split_text(markdown_document) for split in md_header_splits: print(fMetadata: {split.metadata}) print(split.page_content) print(-*20)2.2.2 对话式分块•核心思想根据对话的发言人或轮次进行分块。•适用场景客服对话、访谈记录、会议纪要。dialogue [ Alice: Hi, Im having trouble with my order., Bot: I can help with that. Whats your order number?, Alice: Its 12345., Alice: I havent received any shipping updates., Bot: Let me check... It seems your order was shipped yesterday., Alice: Oh, great! Thank you., ] def chunk_dialogue(dialogue_lines, max_turns_per_chunk3): chunks [] for i in range(0, len(dialogue_lines), max_turns_per_chunk): chunk \n.join(dialogue_lines[i:i max_turns_per_chunk]) chunks.append(chunk) return chunks chunks chunk_dialogue(dialogue) for i, chunk in enumerate(chunks): print(f--- Chunk {i1} ---) print(chunk)2.3 语义与主题分块这类方法超越了文本的物理结构根据内容的语义含义进行切分。2.3.1 语义分块•核心思想计算相邻句子/段落的向量相似度在语义发生突变相似度低的位置进行切分。•适用场景知识库、研究论文等需要高精度语义内聚的文档。import os from langchain_experimental.text_splitter importSemanticChunker from langchain_huggingface importHuggingFaceEmbeddings os.environ[TOKENIZERS_PARALLELISM]false embeddings HuggingFaceEmbeddings(model_namesentence-transformers/all-MiniLM-L6-v2) # 创建 SemanticChunker 实例 # LangChain 的 SemanticChunker 默认使用 percentile 阈值 # 可以尝试不同的 breakpoint_threshold_type: percentile, standard_deviation, interquartile, gradient text_splitter SemanticChunker( embeddings, breakpoint_threshold_typepercentile,# 使用百分位作为阈值类型 breakpoint_threshold_amount70# 设置阈值为80 ) print(SemanticChunker configured.) print(-*50) long_text ( The Wright brothers, Orville and Wilbur, were two American aviation pioneers generally credited with inventing, building, and flying the worlds first successful motor-operated airplane. They made the first controlled, sustained flight of a powered, heavier-than-air aircraft on December 17, 1903. In the following years, they continued to develop their aircraft. Switching topics completely, lets talk about cooking. A good pizza starts with a perfect dough, which needs yeast, flour, water, and salt. The sauce is typically tomato-based, seasoned with herbs like oregano and basil. Toppings can vary from simple mozzarella to a wide range of meats and vegetables. Finally, lets consider the solar system. It is a gravitationally bound system of the Sun and the objects that orbit it. The largest objects are the eight planets, in order from the Sun: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and Neptune. ) docs text_splitter.create_documents([long_text]) for i, doc in enumerate(docs): print(f--- Chunk {i1} ---) print(doc.page_content) print()参数调优说明SemanticChunker的效果高度依赖breakpoint_threshold_amount这个阈值参数。•阈值的作用可以将其理解为一个“语义变化敏感度”的控制器。当相邻句子的语义相似度差异超过这个阈值时就在此处进行切分。•如何调整阈值较低切分会非常敏感即使微小的语义变化也可能导致分块。这会产生大量非常小且高度内聚的块。阈值较高对语义变化的容忍度更大只有在话题发生显著转变时才会切分从而产生更少、更大的块。•这个值没有固定的最佳答案需要根据您的文档内容和领域进行反复实验和调整以达到最理想的分块效果。2.3.2 基于主题的分块•核心思想利用主题模型如LDA或聚类算法在文档的宏观主题发生转换时进行切分。•适用场景长篇、多主题的报告或书籍。import numpy as np import re from sklearn.feature_extraction.text importCountVectorizer from sklearn.decomposition importLatentDirichletAllocation import nltk from nltk.corpus import stopwords try: stopwords.words(english) exceptLookupError: nltk.download(stopwords) def lda_topic_chunking(text: str, n_topics:int3)- list[str]: 基于LDA主题模型的分块函数。 :param text:需要分块的原始文本。 :param n_topics:期望从文本中发现的主题数量。 :return:文本块列表。 # 1. 文本预处理 和 重新定义“文档”单元 # 将文本按段落分割一个段落作为一个“文档” paragraphs [p.strip()for p in text.split(\n\n)if p.strip()] if len(paragraphs)1: return[text]# 如果只有一个段落无需分割 # 简单的文本清洗移除特殊字符转为小写 cleaned_paragraphs [re.sub(r[^a-zA-Z\s],, p).lower()for p in paragraphs] # 2. 词袋模型 去停用词 # min_df1 因为在单文档上下文中一个词只在一个段落出现也是有意义的 vectorizer CountVectorizer(min_df1, stop_wordsstopwords.words(english)) X vectorizer.fit_transform(cleaned_paragraphs) # 如果词汇表为空则无法进行LDA直接返回段落 if X.shape[1]0: return paragraphs # 3. LDA 主题建模 # n_components 是正确的参数名 lda LatentDirichletAllocation(n_componentsn_topics, random_state42) lda.fit(X) # 4. 计算每个段落的主导主题 topic_dist lda.transform(X) # np.argmax 返回每行每个段落最大值的索引即主导主题的编号 dominant_topics np.argmax(topic_dist, axis1) # 5. 实现正确的分块逻辑在主题变化时切分 chunks [] current_chunk_paragraphs [] # 第一个段落的主题作为起始主题 current_topic dominant_topics[0] for i, paragraph in enumerate(paragraphs): if dominant_topics[i] current_topic: # 如果主题相同则加入当前块 current_chunk_paragraphs.append(paragraph) else: # 如果主题变化则保存上一个块并开始一个新块 chunks.append(\n\n.join(current_chunk_paragraphs)) current_chunk_paragraphs [paragraph] current_topic dominant_topics[i] # 添加最后一个块 chunks.append(\n\n.join(current_chunk_paragraphs)) return chunks document ............................... final_chunks lda_topic_chunking(document, n_topics3) print(f文档被分成了 {len(final_chunks)} 个块) print(*80) for i, chunk in enumerate(final_chunks): print(f--- 块 {i1} ---) print(chunk) print(-*80)**注意事项**基于主题的分块在实践中需要谨慎使用因为它存在一些固有挑战•数据依赖性强主题模型和聚类算法通常需要足够长的文本和明确的主题区分度才能生效。对于短文本或主题交叉频繁的文档效果可能不佳。•预处理要求高文本清洗、停用词去除、词形还原等预处理步骤对最终的主题识别质量有巨大影响。•超参数敏感需要预先设定主题数量n_topics等超参数而这往往难以准确估计。因此当直接应用此类方法时可能会发现分出的块在逻辑上不连贯或者与实际主题边界不符。 此方法更适合作为一种探索性工具在主题边界清晰的长文档上使用并需要进行充分的实验验证。2.4 高级分块策略2.4.1 小-大分块•核心思想使用小块如句子进行高精度检索然后将包含该小块的原始大块如段落作为上下文送入LLM。•适用场景需要高检索精度和丰富生成上下文的复杂问答场景。from langchain.embeddings importOpenAIEmbeddings from langchain_text_splitters importRecursiveCharacterTextSplitter from langchain.retrievers importParentDocumentRetriever from langchain_community.document_loaders importTextLoader from langchain_chroma importChroma from langchain.storage importInMemoryStore # from langchain_core.documents import Document # 假设 Document 已被导入 # docs [Document(page_content......)] # 假设这是你的文档 # embeddings OpenAIEmbeddings() # vectorstore Chroma(embedding_functionembeddings, collection_namesplit_parents) # store InMemoryStore() # parent_splitter RecursiveCharacterTextSplitter(chunk_size2000) # child_splitter RecursiveCharacterTextSplitter(chunk_size400) # retriever ParentDocumentRetriever( # vectorstorevectorstore, # docstorestore, # child_splitterchild_splitter, # parent_splitterparent_splitter, # ) # retriever.add_documents(docs) # sub_docs vectorstore.similarity_search(query) # retrieved_docs retriever.get_relevant_documents(query) # print(retrieved_docs[0].page_content)2.4.2 代理式分块•核心思想利用一个LLM Agent来模拟人类的阅读理解过程动态决定分块边界。•适用场景实验性项目或处理高度复杂、非结构化的文本。import textwrap from langchain_openai importChatOpenAI from langchain.prompts importPromptTemplate from langchain_core.output_parsers importPydanticOutputParser from pydantic importBaseModel,Field from typing importList classKnowledgeChunk(BaseModel): chunk_title: str Field(description这个知识块的简洁明了的标题) chunk_text: str Field(description从原文中提取并重组的、自包含的文本内容) representative_question: str Field(description一个可以被这个块内容直接回答的典型问题) classChunkList(BaseModel): chunks:List[KnowledgeChunk] parser PydanticOutputParser(pydantic_objectChunkList) prompt_template 【角色】:你是一位顶尖的科学文档分析师你的任务是将复杂的科学文本段落分解成一组核心的、自包含的“知识块(KnowledgeChunks)”。 【核心任务】:阅读用户提供的文本段落识别其中包含的独立的核心概念。 【规则】: 1.**自包含性**:每个“知识块”必须是“自包含的(self-contained)”。 2.**概念单一性**:每个“知识块”应该只围绕一个核心概念。 3.**提取并重组**:从原文中提取与该核心概念相关的所有句子并将它们组合成一个通顺、连贯的段落。 4.**遵循格式**:严格按照下面的JSON格式指令来构建你的输出。 {format_instructions} 【待处理文本】: {paragraph_text} prompt PromptTemplate( templateprompt_template, input_variables[paragraph_text], partial_variables{format_instructions: parser.get_format_instructions()}, ) # 以下 model 定义需要根据实际情况修改 # model ChatOpenAI(modelQwen3-235B-A22B, base_urlhttp://10.1.18.99:8089/v1,api_keysk-,temperature0.0).bind( # response_format{type: json_object} # ) # chain prompt | model | parser def agentic_chunker(paragraph_text: str)-List[KnowledgeChunk]: try: # result: ChunkList chain.invoke({paragraph_text: paragraph_text}) # return result.chunks # 模拟返回因为无法执行 chain.invoke print(模拟 agentic_chunker 调用) return[] exceptExceptionas e: return[] document 水循环也称为水文循环描述了水在地球表面、之上和之下的连续运动。这个循环至关重要因为它确保了水对所有生命形式的可用性。循环的第一阶段是蒸发这是水从海洋、湖泊和河流等表面转化为水蒸气并上升到大气中的过程植物的蒸腾作用也对此有贡献。当温暖、潮湿的空气上升并冷却时会发生第二阶段凝结。在这个阶段水蒸气变回微小的液态水滴形成云。随着这些水滴碰撞并增长它们最终变得足够重以降水的形式落回地球这是第三阶段形式可以是雨、雪、雨夹雪或冰雹。最后一旦水到达地面它可能以多种方式移动构成了第四个阶段汇集。一些水会作为地表径流流入河流、湖泊和海洋。其他水则会渗入地下成为地下水最终也可能返回地表或海洋从而重新开始整个循环。 paragraphs document.strip().split(\n\n) all_chunks [] for i, para in enumerate(paragraphs): print(f--- 正在处理第 {i1}/{len(paragraphs)} 段 ---) chunks_from_para agentic_chunker(para)# 调用新函数 if chunks_from_para: all_chunks.extend(chunks_from_para) print(f成功从该段落中提取了 {len(chunks_from_para)} 个知识块。) ifnot all_chunks: print(未能生成任何知识块。) else: for i, chunk in enumerate(all_chunks): print(f【知识块 {i1}】) print(f - 标题: {chunk.chunk_title}) print(f - 代表性问题: {chunk.representative_question}) print(f - 文本内容:) wrapped_text textwrap.fill(chunk.chunk_text, width78, initial_indent , subsequent_indent ) print(wrapped_text) print(-*80)混合分块平衡效率与质量在实践中单一策略往往难以应对所有情况。混合分块结合了多种策略的优点是一种非常实用的技巧。•核心思想先用一种宏观策略如结构化分块进行粗粒度切分再对过大的块使用更精细的策略如递归或语义分块进行二次切分。•适用场景处理结构复杂且内容密度不均的文档。代码示例 (结构化 递归混合):from langchain_text_splitters importMarkdownHeaderTextSplitter,RecursiveCharacterTextSplitter from langchain_core.documents importDocument markdown_document # 第一章公司简介 本公司成立于2017年致力于推动人工智能技术的创新与应用。我们的使命是通过先进的AI解决方案为各行各业赋能创造更大的价值。我们拥有一支由顶尖科学家和工程师组成的团队专注于深度学习、自然语言处理和计算机视觉等前沿领域。 ## 1.1 发展历程 公司自创立以来经历了快速的发展。从最初的几人团队到如今拥有数百名员工的规模我们始终坚持技术驱动、客户至上的原则。 # 第二章核心技术 本章将详细介绍我们的核心技术。我们的技术框架基于先进的分布式计算理念确保了高可用性和可扩展性。系统的核心是一个自主研发的深度学习引擎它能够处理海量数据并进行高效的模型训练。这个引擎支持多种神经网络结构包括卷积神经网络CNNs用于图像识别以及循环神经网络RNNs和Transformer模型用于自然语言理解。我们特别优化了Transformer架构提出了一种名为“注意力压缩”的新机制该机制在保持模型性能的同时显著减少了计算资源的需求。这一创新使得我们能够在边缘设备上部署复杂的AI模型为物联网IoT应用场景提供了强大的支持。不仅如此我们还构建了一套完整的数据处理流水线从数据采集、清洗、标注到最终的模型评估全程自动化极大地提升了研发效率。这套流水线处理的数据量已达到PB级别每日处理的请求数超过十亿次。为了保障数据安全我们采用了端到-端加密和联邦学习等多种先进技术确保客户数据的隐私和安全。我们相信强大的技术实力是公司发展的基石也是我们服务客户的信心所在。我们不断探索技术的边界致力于将最新的科研成果转化为可靠、易用的产品和服务帮助客户在激烈的市场竞争中保持领先地位。 ## 2.1 技术原理 我们的技术原理融合了统计学、机器学习和运筹学等多个学科的知识。 # 第三章未来展望 展望未来我们将继续加大在人工智能领域的投入探索通用人工智能AGI的可能性。 # 定义混合分块函数 def hybrid_chunking_optimized( markdown_document: str, coarse_chunk_threshold:int400,# 定义一个粗粒度块的大小阈值 fine_chunk_size:int100,# 定义精细切分的目标大小 fine_chunk_overlap:int20# 定义精细切分的重叠大小 )- list[Document]: 使用结构化递归的混合策略并确保元数据在二次切分中得以保留。 :param markdown_document:完整的Markdown格式文档。 :param coarse_chunk_threshold:粗粒度块的长度阈值超过则进行二次切分。 :param fine_chunk_size:二次切分时每个小块的目标长度。 :param fine_chunk_overlap:二次切分时小块间的重叠长度。 :return:Document对象的列表包含最终的所有分块。 # 宏观的结构化分块 (按H1和H2标题) headers_to_split_on [(#,Header 1),(##,Header 2)] markdown_splitter MarkdownHeaderTextSplitter(headers_to_split_onheaders_to_split_on) coarse_chunks markdown_splitter.split_text(markdown_document) # 初始化精细分块器 fine_splitter RecursiveCharacterTextSplitter( chunk_sizefine_chunk_size, chunk_overlapfine_chunk_overlap ) # 迭代处理对过大的块进行二次切分 final_chunks [] for chunk in coarse_chunks: # 检查块的文本长度是否超过阈值 if len(chunk.page_content) coarse_chunk_threshold: print(f--- 块过大 (长度: {len(chunk.page_content)}), 正在进行二次切分... ---) print(f 原始元数据: {chunk.metadata}) finer_chunks fine_splitter.split_documents([chunk]) final_chunks.extend(finer_chunks) else: final_chunks.append(chunk) return final_chunks final_chunks hybrid_chunking_optimized(markdown_document) for i, chunk in enumerate(final_chunks): print(f--- 最终块 {i1} (长度: {len(chunk.page_content)}) ---) print(f元数据: {chunk.metadata}) print(文本内容:) print(chunk.page_content) print(-*80)如何选择最佳分块策略面对众多策略合理的选择路径比逐一尝试更重要。个人建议遵循以下分层决策框架从简单高效的基准开始逐步引入更复杂的策略。第一步从基准策略开始•默认选项RecursiveCharacterTextSplitter无论处理何种文本这都是最稳妥的起点。它在通用性、简单性和效果之间取得了很好的平衡。首先使用它建立一个性能基线。第二步检查结构化特征•优先选项结构感知分块 在应用基准策略后检查你的文档是否具有明确的结构如Markdown标题、HTML标签、代码或对话格式。如果有可以切换到MarkdownHeaderTextSplitter等相应的结构化分块方法。这是成本最低、收益较好的优化步骤。第三步当精度成为瓶颈时•进阶选项语义分块 或 小-大分块 如果基础策略和结构化策略的检索效果仍不理想无法满足业务需求说明需要更高维度的语义信息。•SemanticChunker适用于需要块内语义高度一致的场景。•ParentDocumentRetriever(小-大分块)适用于既要保证检索精准度又需要为LLM提供完整上下文的复杂问答场景。第四步应对极端复杂的文档•高级实践混合分块 对于那些结构复杂、内容密度不均、混合多种格式的复杂文档单一策略难以应对。此时混合分块是平衡成本与效果的最佳实践。例如先用MarkdownHeaderTextSplitter进行宏观切分再对过长的块用RecursiveCharacterTextSplitter进行二次细分。为了方便查阅和对比下表总结了所有讨论过的分块策略。分块策略核心逻辑优点缺点固定长度分块按固定字符数或token数切分实现最简单速度快简单粗暴极易破坏语义完整性递归分块按预定分隔符段落、句子递归切分通用性强最大程度保留文档结构对无规律文档效果一般基于句子的分块以句子为最小单元再组合成块保证句子完整性避免语义截断单句上下文可能不足需处理长句结构化分块利用文档的固有结构如标题、对话切分块边界清晰上下文逻辑性强强依赖文档格式不适用于混乱文本语义分块根据局部语义相似度变化切分块内概念高度内聚检索精度高计算成本高依赖高质量嵌入模型基于主题的分块利用主题模型按全局主题边界切分块内信息高度相关精准匹配主题依赖主题模型效果实现相对复杂混合分块宏观粗分如结构微观细分如递归平衡效率与质量实用性强实现逻辑更复杂需要两步处理小-大分块检索用小块生成用大块结合高精度检索和丰富上下文效果拔群管道复杂需要管理两套索引代理式分块AI代理动态分析和切分文档模拟人类理解理论上效果最优实验性阶段极度复杂资源消耗高结论分块是实践而非理论文档分块远不止是简单的文本预处理它深刻影响着RAG系统中信息流的质量是典型的“细节决定成败”的环节。 通过本文的梳理我们应形成三个核心认知1.不存在“银弹”没有任何一种分块策略能完美适应所有场景。将分块视为一个需要根据数据特性和业务需求不断迭代优化的工程问题。2.始于简单终于复合始终从RecursiveCharacterTextSplitter等简单、可靠的方法入手建立基线再根据需要逐步引入结构化、语义化乃至混合策略是一种高效且稳健的实践路径。3.分块即“建模”从某种意义上说如何分块就是你如何理解和“建模”你的知识。一个高质量的分块本身就是对原始数据的一种结构化和语义增强。最终高质量的分块是通往高质量生成结果的前提。掌握这项技能是每一位RAG应用构建者提升系统性能的必经之路。想入门 AI 大模型却找不到清晰方向备考大厂 AI 岗还在四处搜集零散资料别再浪费时间啦2025 年AI 大模型全套学习资料已整理完毕从学习路线到面试真题从工具教程到行业报告一站式覆盖你的所有需求现在全部免费分享扫码免费领取全部内容一、学习必备100本大模型电子书26 份行业报告 600 套技术PPT帮你看透 AI 趋势想了解大模型的行业动态、商业落地案例大模型电子书这份资料帮你站在 “行业高度” 学 AI1. 100本大模型方向电子书2. 26 份行业研究报告覆盖多领域实践与趋势报告包含阿里、DeepSeek 等权威机构发布的核心内容涵盖职业趋势《AI 职业趋势报告》《中国 AI 人才粮仓模型解析》商业落地《生成式 AI 商业落地白皮书》《AI Agent 应用落地技术白皮书》领域细分《AGI 在金融领域的应用报告》《AI GC 实践案例集》行业监测《2024 年中国大模型季度监测报告》《2025 年中国技术市场发展趋势》。3. 600套技术大会 PPT听行业大咖讲实战PPT 整理自 2024-2025 年热门技术大会包含百度、腾讯、字节等企业的一线实践安全方向《端侧大模型的安全建设》《大模型驱动安全升级腾讯代码安全实践》产品与创新《大模型产品如何创新与创收》《AI 时代的新范式构建 AI 产品》多模态与 Agent《Step-Video 开源模型视频生成进展》《Agentic RAG 的现在与未来》工程落地《从原型到生产AgentOps 加速字节 AI 应用落地》《智能代码助手 CodeFuse 的架构设计》。二、求职必看大厂 AI 岗面试 “弹药库”300 真题 107 道面经直接抱走想冲字节、腾讯、阿里、蔚来等大厂 AI 岗这份面试资料帮你提前 “押题”拒绝临场慌1. 107 道大厂面经覆盖 Prompt、RAG、大模型应用工程师等热门岗位面经整理自 2021-2025 年真实面试场景包含 TPlink、字节、腾讯、蔚来、虾皮、中兴、科大讯飞、京东等企业的高频考题每道题都附带思路解析2. 102 道 AI 大模型真题直击大模型核心考点针对大模型专属考题从概念到实践全面覆盖帮你理清底层逻辑3. 97 道 LLMs 真题聚焦大型语言模型高频问题专门拆解 LLMs 的核心痛点与解决方案比如让很多人头疼的 “复读机问题”三、路线必明 AI 大模型学习路线图1 张图理清核心内容刚接触 AI 大模型不知道该从哪学起这份「AI大模型 学习路线图」直接帮你划重点不用再盲目摸索路线图涵盖 5 大核心板块从基础到进阶层层递进一步步带你从入门到进阶从理论到实战。L1阶段:启航篇丨极速破界AI新时代L1阶段了解大模型的基础知识以及大模型在各个行业的应用和分析学习理解大模型的核心原理、关键技术以及大模型应用场景。L2阶段攻坚篇丨RAG开发实战工坊L2阶段AI大模型RAG应用开发工程主要学习RAG检索增强生成包括Naive RAG、Advanced-RAG以及RAG性能评估还有GraphRAG在内的多个RAG热门项目的分析。L3阶段跃迁篇丨Agent智能体架构设计L3阶段大模型Agent应用架构进阶实现主要学习LangChain、 LIamaIndex框架也会学习到AutoGPT、 MetaGPT等多Agent系统打造Agent智能体。L4阶段精进篇丨模型微调与私有化部署L4阶段大模型的微调和私有化部署更加深入的探讨Transformer架构学习大模型的微调技术利用DeepSpeed、Lamam Factory等工具快速进行模型微调并通过Ollama、vLLM等推理部署框架实现模型的快速部署。L5阶段专题集丨特训篇 【录播课】四、资料领取全套内容免费抱走学 AI 不用再找第二份不管你是 0 基础想入门 AI 大模型还是有基础想冲刺大厂、了解行业趋势这份资料都能满足你现在只需按照提示操作就能免费领取扫码免费领取全部内容2025 年想抓住 AI 大模型的风口别犹豫这份免费资料就是你的 “起跑线”