ChatGPT 爆火之后,以 ChatPDF 为首的产品组合掀起了知识库问答的热潮。在过去一整年中,大多数人都在完成 RAG 系统到高级 RAG 系统的迭代升级。但是技术发展是迅速的,如何深入了解 RAG 的发展,做出更好的 RAG 系统,其实还是非常困难的。
大模型爆火后的 RAG 系统发展,大体可以将其分为 3 个阶段:初级、高级、超级。初级阶段更多的是搭建起系统的 pipeline;高级阶段是在召回生成侧修修补补,根据 badcase 反推流程上的优化技巧;超级对应了从 Agentic RAG、RAG 不存在了、多模态 RAG、结构化 RAG、GraphRAG、MemoryRAG 等技术飞速发展的阶段。
S1 初级 RAG
S1 阶段处于 23 年元旦前后,最先在 Github 出现了一批尝试去复现 chatpdf 的项目,他们通过对知识库文档进行定长分块建立索引。然后使用用户 query 去索引中召回相关的文档片段,结合预定义的 prompt 模板,让 LLM 生成问题相关的答案。
其中用到的向量和 LLM 模型,闭源一般使用 openai ada 002 + chatgpt。开源中文测的则比较稀缺,常见的如 simbert/text2vec + chatglm v1 6b 等。
一个基础的 RAG 流程图如下:
- 数据加载:读取本地文档(PDF, TXT, Markdown 等)。
- 文本分割:将长文本按字符数或语义切分为 chunk。
- 向量化:使用 Embedding 模型将 chunk 转换为向量。
- 存储:将向量存入向量数据库(如 Chroma, Milvus, FAISS)。
- 检索:将用户 Query 向量化,计算相似度,召回 Top-K 文档。
- 生成:将召回内容与 Prompt 组装,输入 LLM 生成回答。
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.llms import HuggingFacePipeline
# 1. 加载与分割
documents = TextLoader("./data/doc.txt").load()
splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
chunks = splitter.split_documents(documents)
# 2. 向量化与存储
embeddings = HuggingFaceEmbeddings(model_name="text2vec-base-chinese")
vectorstore = FAISS.from_documents(chunks, embeddings)
# 3. 检索与生成
query = "什么是 RAG?"
docs = vectorstore.similarity_search(query, k=3)
prompt = f"基于以下信息回答问题:{docs}"
response = llm.predict(prompt)


