AI个人学习
和实操指南
资源推荐1

Agentic Chunking:AI Agent 驱动的语义文本分块

引言

在大型语言模型 (LLMs) 的应用领域,尤其是在检索增强生成 (RAG) 系统中,文本分块 (Chunking) 扮演着至关重要的角色。 文本分块的质量直接关系到上下文信息的有效性,进而影响 LLM 生成答案的准确性和完整性。 传统的文本分块方法,例如固定大小字符分块和递归文本分割,暴露出其固有的局限性,例如,可能会在句子或语义单元的中间截断,导致上下文丢失和语义不连贯。 本文将深入探讨一种更为智能的分块策略 —— Agentic Chunking。 这种方法旨在模拟人类的判断过程,创建语义上连贯的文本块,从而显著提升 RAG 系统的性能。 此外,本文还将提供详尽的代码示例,助力读者快速上手实践。

参考阅读:朴素、有效的RAG检索策略:稀疏+密集混合检索并重排,并利用“提示缓存”为文本块生成整体文档相关的上下文


 

什么是 Agentic Chunking?

Agentic Chunking 是一种基于 LLM 的先进分块方法,它模拟人类在文本分割时的理解和判断,旨在生成语义连贯的文本块。 其核心理念在于关注文本中的 “Agentic” 元素,例如人物、组织机构等,并将围绕这些 Agentic 元素相关的句子聚合在一起,形成有意义的语义单元。

核心思想: Agentic Chunking 的精髓在于,它并非简单地依赖字符计数或预定义分隔符来分割文本。 相反,它充分利用 LLM 的语义理解能力,将语义上紧密相关的句子组合成块,即使这些句子在原始文本中位置上不连续。 这种方法能够更准确地捕捉文本的内在结构和语义关联。

 

为什么需要 Agentic Chunking?

传统的文本分块方法存在着一些难以忽视的局限性:

  • 固定大小字符分块 (Fixed-Size Character Chunking):
    • 这种方法机械地将文本分割成预设固定长度的块。 这样做可能会在句子中间,甚至词语内部的字符之间截断,严重破坏文本的语义完整性。
    • 它完全忽略了文档的内在结构,例如标题、列表等,导致分块结果与文档的逻辑结构脱节。
    • 任意的分割方式还可能将原本不相关的主题内容混合在同一个文本块中,进一步损害上下文的连贯性。
  • 递归文本分割 (Recursive Text Splitting):
    • 递归文本分割依赖于预定义的层次分隔符,例如段落、句子、单词等进行分割。
    • 这种方法可能无法有效处理复杂的文档结构,例如多级标题、表格等,导致结构信息丢失。
    • 它仍然可能在段落或项目符号列表等语义单元的中间发生截断,影响语义完整性。
    • 最关键的是,递归文本分割同样缺乏对文本语义的深入理解,仅仅依赖于表面结构进行分割。
  • 语义分块 (Semantic Chunking):
    • 语义分块尝试根据句子嵌入向量的相似度进行分组,旨在创建语义相关的块。
    • 然而,如果一个段落内部的句子在语义上存在较大差异,语义分块可能会错误地将这些句子划分到不同的块中,导致段落内部的连贯性受损。
    • 此外,语义分块通常需要进行大量的相似度计算,尤其是在处理大型文档时,计算成本会显著增加。

Agentic Chunking 通过以下优势有效地克服了上述传统方法的局限性:

  • 语义连贯性: Agentic Chunking 能够生成语义上更有意义的文本块,从而显著提高检索相关信息的准确性。
  • 上下文保留: 它能够更好地保持文本块内部的上下文连贯性,这使得 LLM 能够生成更准确、更符合语境的响应。
  • 灵活性: Agentic Chunking 方法展现出高度的灵活性,能够适应不同长度、不同结构和不同内容类型的文档,适用范围更广。
  • 鲁棒性: Agentic Chunking 具备完善的防护机制和回退机制,即使在文档结构异常复杂或 LLM 性能受限等情况下,依然能够保证分块的有效性和稳定性。

 

Agentic Chunking 的工作原理

Agentic Chunking 的工作流程主要包括以下关键步骤:

  • 创建微型块 (Mini-Chunk Creation):
    • 首先,Agentic Chunking 采用递归文本分割技术将输入文档初步分割成较小的微型块。 例如,可以将每个微型块的大小控制在约 300 个字符左右。
    • 在分割过程中,Agentic Chunking 特别的注意确保微型块不会在句子的中间被截断,以维护基本的语义完整性。
  • 标记微型块 (Marking Mini-Chunks):
    • 接下来,为每个微型块添加独特的标记。 这种标记有助于 LLM 在后续处理中识别各个微型块的边界。
    • 需要注意的是,LLM 在处理文本时,更多的是基于 token 而非精确字符数,但其擅长识别文本中的结构和语义模式。 标记微型块可以帮助 LLM 识别块的边界,即使它不能精确计数字符。
  • LLM 辅助的块分组 (LLM-Assisted Chunk Grouping):
    • 将带有标记的文档以及特定的指令一同提供给 LLM。
    • 此时,LLM 的任务是对微型块序列进行深入分析,并基于语义的关联性将它们组合成更大、语义更连贯的文本块。
    • 在分组过程中,可以根据实际需求设置约束条件,例如每个块所包含的最大微型块数量,以控制块的大小。
  • 块组装 (Chunk Assembly):
    • 将 LLM 选定的微型块组合起来,最终形成 Agentic Chunking 的输出结果 —— 文本块。
    • 为了更好地管理和利用这些文本块,可以为每个块添加相关的元数据,例如原始文档的来源信息、文本块在文档中的索引位置等。
  • 块重叠 (Chunk Overlap for Context Preservation):
    为了确保块与块之间上下文的连贯性,最终生成的块通常会与前后的微型块存在一定程度的重叠。 这种重叠机制有助于 LLM 在处理相邻文本块时更好地理解上下文信息,避免信息割裂。
  • 防护机制和回退机制 (Guardrails and Fallback Mechanisms):
    • 块大小限制: 强制设定最大块大小,确保生成的文本块始终在 LLM 的输入长度限制之内,避免因输入过长而导致的问题。
    • 上下文窗口管理: 对于长度超出 LLM 上下文窗口限制的超长文档,Agentic Chunking 能够将其智能地分割成多个可管理的部分,分批进行处理,保证处理效率和效果。
    • 验证: 在完成分块后,Agentic Chunking 还会进行验证,确认所有微型块都已被正确包含在最终的文本块中,避免信息遗漏。
    • 回退到递归分割: 当 LLM 处理失败或因各种原因无法使用时,Agentic Chunking 能够优雅地回退到传统的递归文本分割方法,保证在任何情况下都能提供基本的分块功能。
    • 并行处理: Agentic Chunking 支持并行处理模式,通过利用多线程等技术,可以显著加快文本分块的处理速度,尤其是在处理大型文档时优势更加明显。

 

Agentic Chunking 的应用

Agentic Chunking 技术在多个领域展现出强大的应用潜力:

1. 增强学习 (Enhanced Learning)

  • 定义与解释: Agentic RAG 通过将复杂信息分解为易于管理的单元,优化学习过程,从而提升学习者的理解和记忆效率。 这种方法特别关注文本中 “Agentic” 元素(如人物、组织),通过围绕这些核心要素组织信息,Agentic RAG 能够创建更连贯、更易于理解的学习内容。
  • 在学习过程中的作用: Agentic RAG 框架在现代教育方法中扮演着日益重要的角色。 通过使用基于 RAG 技术的智能 Agent,教育工作者能够更灵活地定制教学内容,精准满足不同学习者的个性化需求。
  • 在教育中的应用: 越来越多的教育机构开始利用 Agentic RAG 技术来革新教学策略,开发更具吸引力和个性化的课程体系,提升教学效果。
  • 对学生参与度的影响: Agentic Chunking 通过以结构清晰、易于理解的文本块呈现信息,能够有效提高学生的学习专注度和积极性,激发学习兴趣。
  • 有效模式识别: 深入分析和识别 Agentic RAG 系统在教育应用中的有效模式,对于持续优化教育成果至关重要。

2. 提高信息保留 (Improved Information Retention)

  • 认知过程: Agentic RAG 技术利用人类认知过程中组织和关联信息的自然倾向,来增强信息保留效果。 大脑更倾向于将数据组织成可管理的单元,这大大简化了信息检索和回忆的过程。
  • 提高记忆回忆: 通过聚焦于文本中参与的 “Agentic” 元素 (如个人或组织机构),学习者能够更容易地将学习材料与已有的知识体系建立联系,从而更有效地回忆和巩固所学信息。
  • 长期保留策略: 将 Agentic RAG 技术融入日常学习实践,有助于构建持续学习和知识积累的有效策略,实现知识的长期保留和发展。
  • 实际应用: 在教育和商业培训等领域,可以根据特定受众的需求,定制 Agentic RAG 的内容呈现方式,以达到最佳的信息传递和吸收效果。

3. 高效决策 (Efficient Decision-Making)

  • 商业应用: 在商业领域,Agentic RAG 系统通过提供结构化的决策框架,正在革新商业领袖的决策模式。 它提供的框架能够显著增强战略规划的科学性和运营效率。
  • 决策框架: Agentic RAG 能够将复杂的商业数据和信息分解为更小、更易于管理的部分,帮助企业决策者聚焦于关键要素,避免在海量信息中迷失方向,提升决策效率。
  • 对商业领袖的好处: Agentic RAG 帮助商业领袖更深入地理解市场趋势和客户需求,从而为企业战略调整和市场应对提供更精准的决策支持。
  • 实施步骤:
    • 识别 Agentic RAG 技术能够为企业带来价值提升的关键业务领域。
    • 制定与组织战略目标高度契合的 Agentic RAG 系统定制化实施方案。
    • 对员工进行 Agentic RAG 系统应用培训,确保系统能够有效落地和应用。
    • 持续监控 Agentic RAG 系统的运行效果,并根据实际应用情况及时调整优化策略,确保系统性能最大化。

 

Agentic Chunking 的优势

  • 语义连贯性: Agentic Chunking 生成语义上更有意义的文本块,显著提升检索信息的准确性。
  • 上下文保留: Agentic Chunking 能够有效保持文本块内部的上下文连贯,使 LLM 可以生成更准确、更符合上下文语境的响应。
  • 灵活性: Agentic Chunking 展现出优秀的灵活性,可以灵活适应不同长度、结构和内容类型的文档。
  • 鲁棒性: Agentic Chunking 内置防护机制和回退机制,即使在文档结构异常或 LLM 性能受限的情况下,依然能保证系统稳定运行。
  • 可适应性: Agentic Chunking 可以与不同的 LLM 无缝集成,并支持根据具体应用需求进行微调优化。

 

Agentic Chunking 的实际效果

  • 错误假设减少 92%: 传统分块方法的不足之处在于,不精确的分块可能导致 AI 系统产生错误的假设。 Agentic Chunking 技术成功将此类错误减少了惊人的 92%。
  • 答案完整性提升: Agentic Chunking 显著提升了答案的完整性,为用户提供更全面、更精准的答复,用户体验得到大幅提升。

 

Agentic Chunking 的实现 (Python 示例)

本节将提供一个基于 Langchain 框架的 Agentic Chunking Python 代码实现示例,并对代码进行逐步详细讲解,帮助读者快速上手实践。

前提条件:

  • 确保已安装 Langchain 和 OpenAI Python 库:pip install langchain openai
  • 配置 OpenAI API 密钥。

示例代码:

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain import hub
# 1. 文本命题化 (Propositioning)
# 示例文本
text = """
On July 20, 1969, astronaut Neil Armstrong walked on the moon.
He was leading NASA's Apollo 11 mission.
Armstrong famously said, "That's one small step for man, one giant leap for mankind" as he stepped onto the lunar surface.
Later, he planted the American flag.
The mission was a success.
"""
# 从 Langchain hub 获取命题化提示模板
obj = hub.pull("wfh/proposal-indexing")
# 使用 GPT-4o 模型
llm = ChatOpenAI(model="gpt-4o")
# 定义 Pydantic 模型以提取句子
class Sentences(BaseModel):
sentences: list[str]
# 创建结构化输出的 LLM
extraction_llm = llm.with_structured_output(Sentences)
# 创建句子提取链
extraction_chain = obj | extraction_llm
# 将文本分割成段落 (为简化示例,本文假设输入文本仅包含一个段落,实际应用中可处理多段落文本。)
paragraphs = [text]
propositions = []
for p in paragraphs:
sentences = extraction_chain.invoke(p)
propositions.extend(sentences.sentences)
print("Propositions:", propositions)
# 2. 创建 LLM Agent
# 定义块元数据模型
class ChunkMeta(BaseModel):
title: str = Field(description="The title of the chunk.")
summary: str = Field(description="The summary of the chunk.")
# 用于生成摘要和标题的 LLM (这里可以使用温度较低的模型)
summary_llm = ChatOpenAI(temperature=0)
# 用于块分配的 LLM
allocation_llm = ChatOpenAI(temperature=0)
# 存储已创建的文本块的字典
chunks = {}
# 3. 创建新块的函数
def create_new_chunk(chunk_id, proposition):
summary_prompt_template = ChatPromptTemplate.from_messages(
[
(
"system",
"Generate a new summary and a title based on the propositions.",
),
(
"user",
"propositions:{propositions}",
),
]
)
summary_chain = summary_prompt_template | summary_llm
chunk_meta = summary_chain.invoke(
{
"propositions": [proposition],
}
)
chunks[chunk_id] = {
"chunk_id": chunk_id,  # 添加 chunk_id
"summary": chunk_meta.summary,
"title": chunk_meta.title,
"propositions": [proposition],
}
return chunk_id  # 返回 chunk_id
# 4. 将命题添加到现有块的函数
def add_proposition(chunk_id, proposition):
summary_prompt_template = ChatPromptTemplate.from_messages(
[
(
"system",
"If the current_summary and title is still valid for the propositions, return them."
"If not, generate a new summary and a title based on the propositions.",
),
(
"user",
"current_summary:{current_summary}\ncurrent_title:{current_title}\npropositions:{propositions}",
),
]
)
summary_chain = summary_prompt_template | summary_llm
chunk = chunks[chunk_id]
current_summary = chunk["summary"]
current_title = chunk["title"]
current_propositions = chunk["propositions"]
all_propositions = current_propositions + [proposition]
chunk_meta = summary_chain.invoke(
{
"current_summary": current_summary,
"current_title": current_title,
"propositions": all_propositions,
}
)
chunk["summary"] = chunk_meta.summary
chunk["title"] = chunk_meta.title
chunk["propositions"] = all_propositions
# 5. Agent 的核心逻辑
def find_chunk_and_push_proposition(proposition):
class ChunkID(BaseModel):
chunk_id: int = Field(description="The chunk id.")
allocation_prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"You have the chunk ids and the summaries. "
"Find the chunk that best matches the proposition. "
"If no chunk matches, return a new chunk id. "
"Return only the chunk id.",
),
(
"user",
"proposition:{proposition}\nchunks_summaries:{chunks_summaries}",
),
]
)
allocation_chain = allocation_prompt | allocation_llm.with_structured_output(ChunkID)
chunks_summaries = {
chunk_id: chunk["summary"] for chunk_id, chunk in chunks.items()
}
# 初始chunks可能为空,导致allocation_chain.invoke报错
if not chunks_summaries:
# 如果没有已存在的块,直接创建新块
next_chunk_id = 1
create_new_chunk(next_chunk_id, proposition)
return
best_chunk_id = allocation_chain.invoke(
{"proposition": proposition, "chunks_summaries": chunks_summaries}
).chunk_id
if best_chunk_id not in chunks:
# 如果返回的 chunk_id 不存在,创建新块
next_chunk_id = max(chunks.keys(), default=0) + 1 if chunks else 1
create_new_chunk(next_chunk_id, proposition)
else:
add_proposition(best_chunk_id, proposition)
# 遍历命题列表,进行分块
for i, proposition in enumerate(propositions):
find_chunk_and_push_proposition(proposition)
# 打印最终的块
print("\nFinal Chunks:")
for chunk_id, chunk in chunks.items():
print(f"Chunk {chunk_id}:")
print(f"  Title: {chunk['title']}")
print(f"  Summary: {chunk['summary']}")
print(f"  Propositions: {chunk['propositions']}")
print("-" * 20)

代码解释:

  • 命题化:
    • 代码示例首先使用 hub.pull("wfh/proposal-indexing") 从 Langchain Hub 加载预设的命题化提示模板。
    • 接着,使用 ChatOpenAI(model="gpt-4o") 初始化 LLM 实例,选用 GPT-4o 模型以获得更优的性能。
    • 定义 Sentences Pydantic 模型,用于结构化解析 LLM 输出的句子列表。
    • 构建提示模板与 LLM 的连接链 extraction_chain。
    • 为简化示例,本文假设输入文本仅包含一个段落,实际应用中可处理多段落文本。 代码将示例文本分割成段落列表。
    • 循环遍历段落,并使用 extraction_chain 将段落转化为命题列表。
  • 创建 LLM Agent:
    • 定义 ChunkMeta Pydantic 模型,定义块元数据结构(标题和摘要)。
    • 创建 summary_llm 和 allocation_llm 两个 LLM 实例。 summary_llm 用于生成文本块的摘要和标题,而 allocation_llm 则负责判断命题应归入哪个已有的块或创建新块。
    • 初始化 chunks 字典,用于存储已创建的文本块。
  • create_new_chunk 函数:
    • 函数接受 chunk_id 和 proposition 作为输入参数。
    • 基于命题,利用 summary_prompt_template 和 summary_llm 生成块的标题和摘要。
    • 并将新块存入 chunks 字典。
  • add_proposition 函数:
    • 函数同样接收 chunk_id 和 proposition 作为输入。
    • 从 chunks 字典检索现有块信息。
    • 更新当前块的命题列表。
    • 重新评估并更新块的标题和摘要。
    • 并更新 chunks 字典中对应块的元数据。
  • find_chunk_and_push_proposition 函数 (Agent 核心逻辑):
    • 定义 ChunkID Pydantic 模型,用于解析 LLM 输出的块 ID。
    • 创建 allocation_prompt,指示 LLM 寻找与当前命题最匹配的现有块,或返回新的块 ID。
    • 构建 allocation_chain,连接提示模板和 allocation_llm。
    • 构建 chunks_summaries 字典,其中存储了现有块的 ID 和摘要信息。
    • 若 chunks 字典为空(即尚无任何文本块),则直接创建新块。
    • 使用 allocation_chain 调用 LLM,以获取最佳匹配块的 ID。
    • 如果 LLM 返回的 chunk_id 不在 chunks 字典中,表明需要创建新的文本块,此时调用 create_new_chunk 函数。
    • 如果返回的 chunk_id 已存在于 chunks 字典中,表明应将当前命题添加到现有文本块中,调用 add_proposition 函数。
  • 主循环:
    • 循环遍历命题列表。
    • 针对每个命题,调用 find_chunk_and_push_proposition 函数,并将命题分配至相应的文本块。
  • 输出结果:
    • 最终输出生成的文本块,包括标题、摘要及包含的命题列表。

代码改进说明:

  • 改进 find_chunk_and_push_proposition 函数,在 chunks 字典为空时直接调用 create_new_chunk 函数,以避免潜在的错误。
  • 在 create_new_chunk 函数中,为 chunks[chunk_id] 字典添加了 chunk_id 键值对,以显式记录块 ID。
  • 优化 next_chunk_id 的生成逻辑,提升了 ID 生成逻辑的健壮性,确保在不同场景下 ID 生成的正确性。

 

自建 vs. 购买 (Build vs. Buy)

虽然 Agentic Chunking 只是 AI Agent 工作流程中的一个环节,但它对生成语义连贯的文本块至关重要。 关于自建 Agentic Chunking 方案与购买现成方案,各有优劣:

自建的优点:

  • 高度控制与定制化: 自建方案允许用户根据自身特定需求进行深度定制,从提示语设计到算法优化,都能与实际应用场景完美契合。
  • 精准的针对性: 企业可以根据自身特有的数据特点和应用需求,量身打造最合适的文本分块策略,实现最佳性能。

自建的缺点:

  • 高昂的工程成本: 自建 Agentic Chunking 方案需要专业的自然语言处理技术知识和大量的开发时间投入,成本较高。
  • LLM 行为的不可预测性: 大型语言模型的行为有时难以预测和控制,这为自建方案带来了技术挑战。
  • 持续维护开销: 生成式 AI 技术发展日新月异,自建方案需要持续投入维护和更新,以跟上技术发展的步伐。
  • 生产环境挑战: 在原型验证阶段取得良好效果是一回事,要将 Agentic Chunking 方案真正应用于生产环境,并达到 99% 以上的高准确率,仍然面临巨大的挑战。

 

总结

Agentic Chunking 是一项强大的文本分块技术,它通过模拟人类的理解和判断能力来创建语义连贯的文本块,从而显著提升 RAG 系统的性能。 相较于传统的文本分块方法,Agentic Chunking 克服了诸多局限性,使得 LLM 能够生成更准确、更完整且更符合上下文语境的答案。

本文通过详尽的代码示例和逐步讲解,帮助读者深入理解 Agentic Chunking 的工作原理和具体实现方法。 诚然,Agentic Chunking 的实现需要一定的技术投入,但其带来的性能提升和应用价值是显而易见的。 对于那些需要处理海量文本数据,并对 RAG 系统性能有较高要求的应用场景而言,Agentic Chunking 无疑是一种值得重点考虑的有效技术方案。

未来趋势: Agentic Chunking 的未来发展方向可能包括:

  • 与图数据库深度融合,构建知识图谱,进一步发展基于图结构的检索增强生成 (Graph RAG) 技术,实现更深层次的知识挖掘和利用。
  • 持续优化 LLM 的提示工程和指令设计,进一步提升文本分块的准确性和处理效率。
  • 研发更智能的文本块合并与分割策略,以有效应对更加复杂多样的文档结构,提升 Agentic Chunking 的通用性。
  • 积极探索 Agentic Chunking 在更广泛领域的应用,例如智能文本摘要、高质量机器翻译等,拓展其应用边界。
内容1
未经允许不得转载:首席AI分享圈 » Agentic Chunking:AI Agent 驱动的语义文本分块

首席AI分享圈

首席AI分享圈专注于人工智能学习,提供全面的AI学习内容、AI工具和实操指导。我们的目标是通过高质量的内容和实践经验分享,帮助用户掌握AI技术,一起挖掘AI的无限潜能。无论您是AI初学者还是资深专家,这里都是您获取知识、提升技能、实现创新的理想之地。

联系我们
zh_CN简体中文