一句话核心
● Loader:把各种来源(网页、PDF、Word、YouTube 等)转化为统一的 Document 对象。
● Splitter:把大文档切成合适大小的小块(chunk),确保检索效率和精度。
为什么需要 Loader 和 Splitter?
● RAG 的知识来源五花八门,不能手写 Document,需要用 Loader 自动化读取。
● 大文档直接向量化会丢失细节,必须用 Splitter 切成有重叠的小块,保证上下文连贯。
代码实现流程
- 加载网页内容(Loader)
import { CheerioWebBaseLoader } from "@langchain/community/document_loaders/web/cheerio";
const loader = new CheerioWebBaseLoader(
"https://juejin.cn/post/xxx", // 目标 URL
{ selector: '.main-area p' } // 只提取指定区域
);
const docs = await loader.load(); // 得到 Document 数组
● 关键:@langchain/community 包含 180+ 社区 loader(PDF、CSV、YouTube 等)。
● 输出:Document 对象(含 pageContent 和 metadata)。
2. 分割文档器(Splitter)
import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters";
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 500, // 每块最大字符数
chunkOverlap: 50, // 块间重叠,保留上下文
separators: ["。", "!", "?"] // 优先按句子分割
});
const splitDocs = await splitter.splitDocuments(docs); // 切成小块
● 作用:避免单块信息过多/过少,重叠部分防止切断关键语义。
● 输出:多个小型 Document,可直接用于向量化。
3. 完整 RAG 流程(loader + splitter + embeddings + retrieval)
// 初始化模型
const embeddings = new OpenAIEmbeddings({ model: "text-embedding-v3" });
const model = new ChatOpenAI({ model: "qwen-plus" });
// 加载 → 分割 → 向量化存储
const rawDocs = await loader.load();
const splitDocs = await splitter.splitDocuments(rawDocs);
const vectorStore = await MemoryVectorStore.fromDocuments(splitDocs, embeddings);
// 检索 + 生成
const retriever = vectorStore.asRetriever({ k: 2 }); // 取最相似 2 块
const relevant = await retriever.invoke(question);
// 增强生成
const prompt = `基于文章片段回答:\n${relevant.map(d => d.pageContent).join("\n")}\n问题:${question}`;
const answer = await model.invoke(prompt);
补充
● Loader 社区包:将外部数据源转为统一 Document(pageContent + metadata)。LangChain 社区包含 180+ 数据源加载器,如@langchain/community。
● Splitter 核心参数:chunkSize(块大小)、chunkOverlap(重叠)、separators(分割符优先级)。
● 切块原则:优先按句子分割,保留语义完整,重叠避免上下文断裂。
● 向量化:分割后的文档块才交给嵌入模型,否则大文档会丢失细节。
总结
Loader 把万物转成文档,Splitter 把文档切成适口小块,RAG 才能吃下真实世界的复杂知识。

250

被折叠的 条评论
为什么被折叠?



