TellWorldAI 世界档案
问档案English

首页›实践›实践

实践

搭一个 RAG 知识库:Dify 与 LangChain 两种做法

RAG(检索增强生成)让模型基于你自己的文档回答问题。本文先用 Dify 在界面里搭一个知识库,再用 LangChain 写一个短脚本做同样的事,并讲清分块、检索和使用限制。

这篇适合谁

这篇适合想让模型基于自己的文档回答问题的读者。文中走两条路:在 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]

来源

  1. 1
  2. 2
  3. 3
  4. 4
    Upload Local FilesDify (Cloud Docs)
  5. 5
  6. 6
  7. 7
    Retrieval SettingsDify (Cloud Docs)
  8. 8
    KnowledgeDify (Cloud Docs)
  9. 9
    Classic Knowledge BaseDify (Cloud Docs)
  10. 10
    Test Knowledge RetrievalDify (Cloud Docs)
  11. 11
    Create Document by FileDify (Service API Reference)
  12. 12
  13. 13
    Install LangChainLangChain (Python Docs)
  14. 14
    Text splitter integrationsLangChain (Python Docs)
  15. 15
    Document loader integrationsLangChain (Python Docs)
  16. 16
    Vector store integrationsLangChain (Python Docs)
  17. 17
  18. 18
  19. 19
    LangChain READMElangchain-ai (GitHub)

引用本页: 搭一个 RAG 知识库:Dify 与 LangChain 两种做法. TellWorld, https://www.tellworld.net/zh/practice/practice-rag-knowledge-base. 更新于 2026-11-14

相关动态