这篇适合谁
这篇适合想让模型基于自己的文档回答问题的读者。文中走两条路:在 Dify 的界面里建一个知识库;或者用 LangChain 写一小段 Python。读完你能看懂分块、索引和检索设置,也知道两种做法各自的限制。
RAG 是什么
检索增强生成(RAG)的思路是:先从你的文档里找出相关段落,再把这些段落作为上下文交给模型作答。Dify 对这一机制的描述是:导入知识库的文档会被切成更小的片段,叫作分块(chunk);用户提问时,系统在分块中检索,把相关内容交给大模型作为上下文。[2]
整件事的关键在三个设置:文本怎么切、切出来的块怎么建索引、检索怎么做。
第一条路:在 Dify 里建知识库
Dify 的路径从界面开始。进入 Knowledge > Create > Create a ready-to-use knowledge base,然后导入本地文件,或者从 Notion、网页同步内容。[1] 接下来配置分块设置并预览分块结果,指定索引方式和检索设置,最后等待数据处理完成。[1]
分块有两个关键参数。Delimiter 是切分文本的字符或字符序列,比如段落处用 \n\n,换行处用 \n。Maximum chunk length 是每块的最大字符数,超过的文本会被强制切分,不管分隔符怎么设。[2]
Dify 提供两种分块模式:General 和 Parent-child。知识库建好之后不能更改模式,但分隔符和最大分块长度随时可以调。[2] General 模式下所有分块的设置相同,命中的分块直接作为检索结果返回。Parent-child 模式把文本切成较小的子分块和较大的父分块,子分块命中时返回整个父分块。[2] General 还支持分块重叠(chunk overlap):设为 50 个字符时,前一块的最后 50 个字符也会出现在后一块的开头。[2] Dify 的对照表显示,General 可以搭配 High Quality 和 Economical,Parent-child 只能搭配 High Quality。[2]
切分之前可以先清理文本:把连续的空格、换行和制表符合并,三个以上的换行变成两个,多个空格变成一个;也可以删除所有 URL 和邮箱地址。在 Full Doc 父模式下,只处理前 10,000 个 token,超出的部分会被截断。[2]
索引方式决定分块如何变得可搜索。High-Quality 用嵌入模型(embedding)把每块转换成向量,用这种方式建的知识库以后不能切换到 Economical。Economical 每块提取 10 个关键词,不消耗 token,只支持 TopK 设置,可以在知识库设置页升级为 High-Quality。[3]
在 High-Quality 下,Dify 提供三种检索方式:Vector Search(向量检索)、Full-Text Search(全文检索)和 Hybrid Search(混合检索)。混合检索同时运行全文检索和向量检索,再做一次重排序。你可以只设置权重,不用 Rerank 模型;也可以启用 Rerank model。[3] Rerank 模型默认关闭,启用前要到 Integrations > Model Provider 里配置它的 API key。[3] TopK 默认为 3,决定取回最相似的几个分块;Score Threshold 默认为 0.5,是最低相似度分数。两者只在重排序阶段生效,所以用到其中任何一个,都要先添加并启用 Rerank 模型。[3]
知识库建好后,点击左侧边栏的 Retrieval Testing 图标可以模拟用户提问。在这里调整的检索设置只对当前测试会话有效。[10]
上传限制因套餐而异。Sandbox 套餐每次上传 1 个文件,单个文件 15 MB;Professional & Team 套餐分别是 50 个文件、单个 50 MB。[4] 小于 2 MB 的 JPG、JPEG、PNG 和 GIF 图片会自动作为对应分块的附件提取出来,每块最多 10 张。[4]
第二条路:用 LangChain 写一段脚本
LangChain 这条路从头到尾都是代码。安装指南给出 pip install -U langchain 或 uv add langchain,并注明需要 Python 3.10+。模型提供商的集成包要单独安装,比如 pip install -U langchain-openai。[13]
pip install -U langchain教程读取的是一份 Nike 的 10-K PDF 样例,读取用的是 pypdf。它可以用 pip install pypdf、conda install pypdf -c conda-forge 或 uv add pypdf 安装。[12] 用 pypdf.PdfReader 读入这份样例,得到 107 页。[12] 在 LangChain 里,Document 有三个属性:page_content 是文本内容,metadata 是任意元数据的字典,id 是可选的字符串标识。[12]
切分使用 RecursiveCharacterTextSplitter,参数为 chunk_size=1000, chunk_overlap=200, add_start_index=True。教程用这组参数得到 516 个切片,并称它是通用文本场景推荐的切分器。[12] 最小示例如下:[12]
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, chunk_overlap=200, add_start_index=True
)
all_splits = text_splitter.split_documents(docs)
print(len(all_splits))这个切分器会先按换行等常见分隔符递归切分,直到每块达到目标长度。它也可以单独安装:pip install -U langchain-text-splitters 或 uv add langchain-text-splitters。[14]
接下来做向量。教程先执行 pip install -U "langchain-openai",再用 OpenAIEmbeddings(model="text-embedding-3-large") 创建嵌入模型,接着用从 langchain_core.vectorstores 导入的 InMemoryVectorStore(embeddings) 创建向量库,最后执行 ids = vector_store.add_documents(documents=all_splits) 把分块写入。[12] 向量库的统一接口包括 add_documents、delete 和 similarity_search。[16]
最后把向量库包装成检索器。as_retriever 返回一个 VectorStoreRetriever,它的 search_type 可以是 "similarity"(默认)、"mmr"(最大边际相关性)或 "similarity_score_threshold"。[12] 教程用下面的代码对两个问题做检索:[12]
retriever = vector_store.as_retriever(
search_type="similarity",
search_kwargs={"k": 1},
)
retriever.batch(
[
"How many distribution centers does Nike have in the US?",
"When was Nike incorporated?",
],
)LangChain 的另外两个教程把同样的流程放进了智能体。LangGraph 的自定义 RAG 教程抓取网页,用 RecursiveCharacterTextSplitter.from_tiktoken_encoder 切分,参数为 chunk_size=100 和 chunk_overlap=50,再存入 InMemoryVectorStore,并用 @tool 装饰器把检索器包装成工具。[17] Deep Agents 的 RAG 教程分四步建立索引:加载、切分、嵌入、存储,切分参数为 RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200),智能体用 create_deep_agent 构建。[18]
什么情况选哪一条路
Dify 把分块、索引、检索和测试放在同一个界面里,上传、配额和频率限制也由平台管理。如果你想通过点选调整设置,又不想写代码,适合走这条路。LangChain 的每一步都是你在代码里明确选择的:加载器、切分器、嵌入模型和向量库都由你指定。如果检索要嵌进你自己的程序,适合走这条路。两条路遵循的是同一个流程:切分、嵌入、存储、检索。[12]
限制和常见问题
Dify 的上传上限取决于套餐。在 Sandbox 套餐下,每次上传 1 个文件,单个文件最大 15 MB。[4]
频率限制以工作区为单位。每个工作区每分钟可以发起的知识库请求数量有限,经典知识库和 Agent 知识库共用这个额度。在任意 60 秒内用完额度后,下一次请求会被拒绝;通过 Service API 调用时返回 403,错误代码为 forbidden。[5]
存储也是共用的。每个工作区都有文档数量配额和 Knowledge Data Storage(知识数据存储)配额,经典和 Agent 知识库都占用它们。用 High Quality 索引的文档为每个分块存一个向量;用 Economical 索引的文档使用关键词索引,不计入知识数据存储。[6]
索引方式只能单向升级。High Quality 的知识库不能切回 Economical,导入大量文件之前要先想清楚。[3]
在 LangChain 一侧,常用的 PDF 加载器 PyPDFLoader、PyMuPDFLoader、PDFMinerLoader 和 PDFPlumberLoader 都在 langchain-community 包里。这个包已不再维护,加载器页面说这些加载器不应再使用。[15]
下一步
Dify 这条路可以继续读知识库创建指南,它把知识库的每一步都讲了一遍。[1] 检索选项详见 Retrieval Settings 页面。[7] LangChain 这条路最直接的入门是语义搜索教程,想换用其他向量库,可以看向量库集成页面。[12][16]
来源
- 1Create a Ready-to-Use Knowledge BaseDify (Cloud Docs)
- 2Configure the Chunk SettingsDify (Cloud Docs)
- 3Specify the Index Method and Retrieval SettingsDify (Cloud Docs)
- 4Upload Local FilesDify (Cloud Docs)
- 5Knowledge Request Rate LimitDify (Cloud Docs)
- 6Knowledge Storage and Document QuotasDify (Cloud Docs)
- 7Retrieval SettingsDify (Cloud Docs)
- 8KnowledgeDify (Cloud Docs)
- 9Classic Knowledge BaseDify (Cloud Docs)
- 10Test Knowledge RetrievalDify (Cloud Docs)
- 11Create Document by FileDify (Service API Reference)
- 12Build a semantic search engine with LangChainLangChain (Python Docs)
- 13Install LangChainLangChain (Python Docs)
- 14Text splitter integrationsLangChain (Python Docs)
- 15Document loader integrationsLangChain (Python Docs)
- 16Vector store integrationsLangChain (Python Docs)
- 17Build a custom RAG agent with LangGraphLangChain (Python Docs)
- 18Retrieval Augmented Generation (RAG) with Deep AgentsLangChain (Python Docs)
- 19LangChain READMElangchain-ai (GitHub)
引用本页: 搭一个 RAG 知识库:Dify 与 LangChain 两种做法. TellWorld, https://www.tellworld.net/zh/practice/practice-rag-knowledge-base. 更新于 2026-11-14