원클릭으로
langchain-text-splitters
使用 LangChain 中的文本分割器集成指南,包括递归、字符和语义分割器
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
使用 LangChain 中的文本分割器集成指南,包括递归、字符和语义分割器
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
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