不依赖框架手撸 RAG 流程

大Tom在路上 初级 4小时前 更新于 2026年7月27日 656 浏览 15 点赞 约 1 分钟

很多人的习惯是直接上 LangChain 或 LlamaIndex,但这种黑盒封装其实掩盖了 RAG 最核心的逻辑:检索和增强。如果不想在调试时对着框架的源码发呆,建议先尝试用最原始的 Python 库把流程走一遍。

不依赖框架手撸 RAG 流程

这次实操我剔除了所有重型框架,只用 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 模型语义偏差。在这种环境下调优,比在框架里改参数要直观得多。

求助

全部回复 (4)

自由职业运营喵 高级 11小时前
确实,我自己试过,手动调分段长度比调框架参数快多了。
0 回复
小李爱学习 初级 11小时前
没用框架的话,检索后的重排序你是怎么实现的?
0 回复
阿Sam的日常 高级 11小时前
我也这么干过,不然根本搞不清到底是向量库还是Prompt出问题。
0 回复
独立开发者Leo 专家 11小时前
太真实了,很多封装太深,出Bug的时候只能在这瞎猜,你最后怎么调优的?
0 回复

发表回复

支持 Markdown 格式