with one click
langchain-text-splitters
使用 LangChain 中的文本分割器集成指南,包括递归、字符和语义分割器
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
使用 LangChain 中的文本分割器集成指南,包括递归、字符和语义分割器
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Mac 系统深度清理和优化工具。使用 Mole (mo 命令) 执行系统清理、磁盘分析、应用卸载、系统优化等任务。 触发场景(当用户提到以下任一内容时使用此 skill): - 清理 Mac、清理磁盘、释放空间、清理缓存、清理系统 - 卸载应用、删除应用、移除应用及其残留 - 磁盘分析、查看磁盘占用、大文件查找、空间分析 - 系统优化、系统维护、刷新系统、重建缓存 - 系统状态、系统监控、CPU/内存/磁盘监控 - 清理 node_modules、清理构建产物、清理项目依赖 - 清理安装包、删除 dmg/pkg 文件 - Mac 清理工具、类似 CleanMyMac 的功能 - "我的 Mac 太慢了"、"磁盘空间不足"、"电脑卡顿" - 即使没有明确说 "Mole",只要涉及上述场景就应使用
快速搭建和配置 pnpm monorepo 项目结构,包含 TypeScript、tsup 构建、私有 npm registry 配置。当用户需要"创建 monorepo"、"初始化 monorepo 项目"、"配置 pnpm workspace"、"设置 monorepo 构建"、"monorepo setup"时使用。特别适合需要统一管理多个包、配置构建工具、处理 TypeScript 路径问题的场景。即使用户只是说"帮我搭建项目结构"或"配置构建",如果涉及多包管理也应该使用此 skill。
智能拆分暂存区的代码变更为多个符合 Conventional Commits 规范的逻辑提交。当用户需要将大量变更按逻辑关系分组提交时使用,比如"拆分这些提交"、"把暂存区的变更分成多个 commit"、"按功能分别提交"、"split commits"等场景。特别适合处理包含多个模块、多种类型文件(配置、代码、测试、文档)的复杂变更集。
OKR 优化与质量评估专家。当用户需要:(1) 评估现有 OKR 的质量,(2) 优化模糊或不可量化的关键结果,(3) 检查 OKR 是否符合核心原则(聚焦、可量化、有挑战),(4) 将任务型 KR 转化为结果型 KR,(5) 提供具体的改进建议时使用。触发词包括"帮我优化 OKR"、"检查这个 OKR"、"这个 KR 写得好吗"、"如何量化这个目标"。
基于 git commits 自动生成 CHANGELOG.md 变更日志。支持语义化版本、分类整理、多格式输出。触发场景包括"生成变更日志"、"更新 CHANGELOG"、"版本记录"。
GitHub PR 代码审查技能。检查代码质量、安全性、性能和最佳实践,生成结构化审查报告。触发场景包括"审查 PR"、"代码检查"、"review pull request"。
| name | langchain-text-splitters |
| description | 使用 LangChain 中的文本分割器集成指南,包括递归、字符和语义分割器 |
| language | js |
文本分割器将大型文档分成更小的块,这些块适合模型上下文窗口并实现有效检索。适当的分块对于 RAG 系统性能至关重要——块必须足够小以便检索,但也必须足够大以保留上下文。
| 分割器 | 最适合 | 包 | 主要特性 |
|---|---|---|---|
| RecursiveCharacterTextSplitter | 通用 | @langchain/textsplitters | 层次化分割、保留结构 |
| CharacterTextSplitter | 简单分割 | @langchain/textsplitters | 按单个分隔符分割 |
| TokenTextSplitter | 令牌感知分割 | @langchain/textsplitters | 计算实际令牌,而非字符 |
| MarkdownTextSplitter | Markdown 文档 | @langchain/textsplitters | 保留 markdown 结构 |
| RecursiveJsonSplitter | JSON 数据 | @langchain/textsplitters | 分割 JSON 同时保留结构 |
选择 RecursiveCharacterTextSplitter 如果:
选择 TokenTextSplitter 如果:
选择 MarkdownTextSplitter 如果:
import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters";
// 基本用法
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 1000, // 每个块的目标字符数
chunkOverlap: 200, // 块之间的重叠
});
const text = "长文档文本在这里...";
const chunks = await splitter.splitText(text);
console.log(`创建了 ${chunks.length} 个块`);
chunks.forEach((chunk, i) => {
console.log(`块 ${i + 1}:${chunk.length} 个字符`);
});
// 分割文档(保留元数据)
import { Document } from "@langchain/core/documents";
const docs = [
new Document({
pageContent: "长文本...",
metadata: { source: "doc1.pdf", page: 1 }
})
];
const splitDocs = await splitter.splitDocuments(docs);
// 元数据被保留并丰富了 loc.lines
// 按顺序尝试在这些分隔符上分割:
// 1. "\n\n"(双换行 - 段落)
// 2. "\n"(单换行)
// 3. " "(空格)
// 4. ""(如果需要,逐字符)
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 1000,
chunkOverlap: 200,
separators: ["\n\n", "\n", " ", ""], // 默认,可以自定义
});
// 这比简单分割更好地保留自然文本结构
import { CharacterTextSplitter } from "@langchain/textsplitters";
// 按单个分隔符分割
const splitter = new CharacterTextSplitter({
separator: "\n\n", // 在双换行符上分割
chunkSize: 1000,
chunkOverlap: 200,
});
const chunks = await splitter.splitText(text);
import { TokenTextSplitter } from "@langchain/textsplitters";
// 基于实际令牌计数分割
const splitter = new TokenTextSplitter({
chunkSize: 512, // 令牌数,而非字符
chunkOverlap: 50,
encodingName: "cl100k_base", // OpenAI 的编码
});
const chunks = await splitter.splitText(text);
// 适合精确的模型上下文窗口管理
// 1 个令牌 ≈ 4 个字符(英文文本),但会有变化
import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters";
// 分割 markdown 同时保留结构
const splitter = RecursiveCharacterTextSplitter.fromLanguage("markdown", {
chunkSize: 1000,
chunkOverlap: 200,
});
const markdown = `
# 标题 1
标题 1 下的一些内容。
## 标题 2
标题 2 下的内容。
`;
const chunks = await splitter.splitText(markdown);
// 尽量将标题与其内容保持在一起
import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters";
import { PDFLoader } from "@langchain/community/document_loaders/fs/pdf";
// 加载 PDF
const loader = new PDFLoader("large-document.pdf");
const docs = await loader.load();
// 分割成可管理的块
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 1000,
chunkOverlap: 200,
});
const splitDocs = await splitter.splitDocuments(docs);
console.log(`${docs.length} 页被分割成 ${splitDocs.length} 个块`);
// 每个块都保留来源元数据
splitDocs.forEach(chunk => {
console.log(chunk.metadata); // 包括原始页码
});
import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters";
// 分割代码同时保留结构
const jsSplitter = RecursiveCharacterTextSplitter.fromLanguage("js", {
chunkSize: 500,
chunkOverlap: 50,
});
const pythonSplitter = RecursiveCharacterTextSplitter.fromLanguage("python", {
chunkSize: 500,
chunkOverlap: 50,
});
// 使用特定语言的分隔符(函数、类等)
import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters";
// 自定义分割逻辑
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 1000,
chunkOverlap: 100,
separators: [
"\n\n\n", // 三换行符(部分中断)
"\n\n", // 双换行符(段落)
"\n", // 单换行符
". ", // 句子
" ", // 单词
"", // 字符
],
});
import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters";
import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { OpenAIEmbeddings } from "@langchain/openai";
import { CheerioWebBaseLoader } from "@langchain/community/document_loaders/web/cheerio";
// 完整的 RAG 管道
const loader = new CheerioWebBaseLoader("https://docs.example.com");
const docs = await loader.load();
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 1000,
chunkOverlap: 200,
});
const splitDocs = await splitter.splitDocuments(docs);
const vectorStore = await MemoryVectorStore.fromDocuments(
splitDocs,
new OpenAIEmbeddings()
);
// 现在可以进行语义搜索
const results = await vectorStore.similaritySearch("query", 4);
✅ 智能分割文本
✅ 处理各种格式
✅ 针对用例优化
✅ 与管道集成
❌ 保证语义边界
❌ 完美估计令牌
❌ 不丢失一些上下文的情况下分割
// ❌ 字符计数 != 令牌计数
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 4000, // 字符
});
// GPT-3.5 有 4096 个令牌限制,这可能会超过!
// ✅ 使用 TokenTextSplitter 进行精确的令牌计数
import { TokenTextSplitter } from "@langchain/textsplitters";
const splitter = new TokenTextSplitter({
chunkSize: 4000, // 实际令牌
encodingName: "cl100k_base",
});
修复:当令牌精度很重要时,使用 TokenTextSplitter。
// ❌ 块太小
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 100, // 非常小
chunkOverlap: 0, // 无重叠
});
// 块缺乏足够的上下文以进行良好的检索
// ✅ 适当的块大小与重叠
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 1000, // 好的大小
chunkOverlap: 200, // 20% 重叠
});
修复:对于大多数情况,使用 500-2000 个字符并带有 10-20% 的重叠。
// ❌ 无重叠
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 1000,
chunkOverlap: 0, // 边界处的信息可能丢失
});
// ✅ 使用重叠保留上下文
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 1000,
chunkOverlap: 200, // 20% 重叠是一个好的默认值
});
修复:始终使用重叠(通常是块大小的 10-20%)。
// ❌ 使用 splitText 丢失元数据
const chunks = await splitter.splitText(documentText);
// 没有元数据!
// ✅ 使用 splitDocuments 保留元数据
const docs = [new Document({
pageContent: documentText,
metadata: { source: "file.pdf" }
})];
const chunks = await splitter.splitDocuments(docs);
// 元数据被保留!
修复:使用 splitDocuments() 而不是 splitText() 来保留元数据。
npm install @langchain/textsplitters