不依赖框架手撸 RAG 流程
很多人的习惯是直接上 LangChain 或 LlamaIndex,但这种黑盒封装其实掩盖了 RAG 最核心的逻辑:检索和增强。如果不想在调试时对着框架的源码发呆,建议先尝试用最原始的 Python 库把流程走一遍。
下一篇
分享一个纯净的免费AI/ML电子书索引 →
这次实操我剔除了所有重型框架,只用 sentence-transformers 处理向量化,用 faiss 做简单的向量检索。整个流程其实就是三个纯技术步骤:
一、文档切片与向量化
不能直接把整个文档塞给模型,得先做 Chunking。我用了简单的字符长度切分,然后通过 Embedding 模型把文本转成向量。
from sentence_transformers import SentenceTransformer
import faiss
model = SentenceTransformer('all-MiniLM-L6-v2')
texts = ["AI Agent 能够自主完成任务", "RAG 解决了大模型的幻觉问题"]
embeddings = model.encode(texts)二、构建向量索引并检索
这里直接用 FAISS 建索引,查询时计算余弦相似度,找出最相关的 Top-K 片段。
dimension = embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(embeddings)
query_vector = model.encode(["什么是RAG?"])
D, I = index.search(query_vector, k=1)三、构造 Prompt 并调用 LLM
把检索到的内容直接拼进 Prompt 的上下文里,让大模型基于这段参考资料回答。
context = texts[I[0][0]]
prompt = f"基于以下内容回答问题:\n{context}\n\n问题:什么是RAG?"
# 随后将 prompt 发送给 LLM 接口这种从零构建的实战方式能让人一眼看出 RAG 性能瓶颈在哪——要么是切片太粗导致检索不准,要么是 Embedding 模型语义偏差。在这种环境下调优,比在框架里改参数要直观得多。
