快速搭建RAG:最小可用方案实战

张开发
2026/4/10 6:48:19 15 分钟阅读

分享文章

快速搭建RAG:最小可用方案实战
很多人聊 RAGRetrieval-Augmented Generation一上来就是各种 fancy 架构、向量数据库对比、评测体系……最后一个 demo 都跑不起来。这篇只干一件事用最少的技术栈搭一个“能用”的 RAG MVP。一、整体架构先把全局搞清楚RAG MVP 本质就 4 步数据 → 向量索引 → 检索 → 大模型生成请求流程用户问题 → 向量检索 → 找到相关文档 → 拼 Prompt → LLM 生成答案二、数据准备与清洗决定上限的环节 MVP 原则不要贪多先保证“干净 可控”1. 数据来源选一个就够你可以选最简单的一种Markdown 文档推荐FAQ问答对产品说明文档txt / pdf MVP建议用 Markdown FAQ2. 数据清洗必须做目标让模型“更容易理解 更容易切块”必做操作去掉无用内容页眉页脚、广告统一格式标题层级删除重复段落修正乱码3. 文本切分Chunking这是 RAG 成败关键点之一。推荐方案from langchain.text_splitter import RecursiveCharacterTextSplittersplitter RecursiveCharacterTextSplitter(chunk_size500,chunk_overlap100)docs splitter.split_text(text)参数建议chunk_size300800overlap50150 原则太小 → 信息碎太大 → 检索不准三、索引构建核心基础设施1. 向量模型Embedding MVP 直接选一个成熟的可选方案OpenAI embedding稳定本地模型bge-smallbge-basee5-small 推荐性价比bge-base-zh中文bge-small-en英文2. 向量数据库不要复杂MVP别上来就搞分布式。推荐三选一✅ 最简单FAISS本地文件from langchain.vectorstores import FAISS✅ 稍微正规Chroma轻量Milvus进阶 MVP推荐FAISS3. 构建索引代码示例from langchain.embeddings import HuggingFaceEmbeddingsfrom langchain.vectorstores import FAISSembedding HuggingFaceEmbeddings(model_nameBAAI/bge-base-zh)db FAISS.from_texts(docs, embedding)db.save_local(faiss_index)四、检索策略优化RAG的灵魂很多人卡在这里。 MVP 不需要 fancy但必须做 3 件事1. Top-K 检索docs db.similarity_search(query, k5) 建议k3~5精准k5~10信息更全2. 加一个简单 rerank强烈建议否则容易“看起来相关但没用”。方案bge-rerankercross-encoder简单思路# 对召回结果重新排序reranked_docs reranker.rank(query, docs) 如果不想加模型直接用“最长文本优先”也比没有强3. 加关键词兜底Hybrid Search纯向量检索会翻车。 MVP补救方案同时做关键词匹配BM25两边结果合并简单版本if len(vector_results) 3:results keyword_search(query)五、生成与提示工程决定“像不像人话”1. Prompt 模板必须写死不要裸问模型。推荐模板你是一个专业助手请基于提供的上下文回答问题。【上下文】{context}【问题】{question}要求1. 只基于上下文回答2. 如果不知道请说“不确定”3. 回答要简洁清晰2. 拼接上下文context \n\n.join([doc.page_content for doc in docs]) 控制长度不超过模型 token 限制一般 20004000 tokens3. 选择模型MVP 推荐APIGPT-4o-miniClaude Haiku本地Qwen2-7BLlama3-8B 原则先用API验证再考虑本地化六、完整最小流程代码核心骨架def rag_pipeline(query):# 1. 检索docs db.similarity_search(query, k5)# 2. 拼上下文context \n.join([d.page_content for d in docs])# 3. 构建promptprompt f你是一个专业助手请基于提供的上下文回答问题。上下文{context}问题{query}# 4. 调用LLMresponse llm(prompt)return response最后上Demo不讲概念直接给一个一键能跑的最小 RAG Demo本地 Python FAISS 开源 embedding OpenAI 生成。1. 项目结构直接照抄rag-mvp/ ├── main.py ├── data.txt └── requirements.txt2. 准备数据data.txt随便写点内容先跑通再说RAG 是一种结合检索和生成的技术可以提升大模型的准确性。 FAISS 是一个向量检索库适合做本地向量搜索。 Chunk 切分是 RAG 的关键步骤之一会影响检索效果。3.依赖requirements.txtlangchain faiss-cpu sentence-transformers openai tqdm安装pip install -r requirements.txt4. 核心代码main.py直接复制运行import os from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.vectorstores import FAISS from langchain.embeddings import HuggingFaceEmbeddings from openai import OpenAI # 1. 配置 os.environ[OPENAI_API_KEY] 你的API_KEY client OpenAI() # 2. 读取数据 with open(data.txt, r, encodingutf-8) as f: text f.read() # 3. 切分 splitter RecursiveCharacterTextSplitter( chunk_size300, chunk_overlap50 ) docs splitter.split_text(text) # 4. 向量化 embedding HuggingFaceEmbeddings( model_nameBAAI/bge-small-zh ) # 5. 建库 db FAISS.from_texts(docs, embedding) # 6. RAG函数 def ask(query): # 检索 results db.similarity_search(query, k3) # 拼上下文 context \n.join([r.page_content for r in results]) # Prompt prompt f 你是一个专业助手请基于上下文回答问题。 上下文 {context} 问题 {query} 要求 - 只基于上下文回答 - 不要编造 # 调用大模型 response client.chat.completions.create( modelgpt-4o-mini, messages[ {role: user, content: prompt} ] ) return response.choices[0].message.content # 7. 交互 if __name__ __main__: while True: q input(\n请输入问题) print(\n回答, ask(q))5.运行python main.py输入RAG 是什么 你会得到一个基于你 data.txt 的回答。

更多文章