~附:安装依赖库及工程源码)
别再死磕枯燥理论了AI 时代拿实战作品说话才是硬道理原创不易哈希望可以帮到还有些许学习劲儿的同学们【进阶版还在创作中耗费精力中……】跳转到专栏目录你学习更有方向和思路……入门实践工程十五基于 RAG 的知识库问答检索增强生成~附:安装依赖库及工程源码简介构建完整 RAG 流水线文档分块 → 向量化 → 本地向量检索 → 拼接上下文 → 调用大模型生成答案是当前大模型应用最主流的工程范式。内置一份 AI/Python 知识库大模型调用可选。工程详细介绍核心思想检索增强生成RAG 先检索后生成。把私有知识库分块向量化建索引提问时检索最相关片段作为上下文拼进提示词再由大模型基于上下文生成答案既支持私有知识又缓解幻觉是当下大模型落地主流范式。实现方法数据内置 AI/Python 知识库文档可替换为任意文档。模型sentence-transformers 多语言嵌入检索 OpenAI 兼容大模型生成可选。流程文档按 200 字带 40 重叠分块 → 嵌入归一化建 numpy 向量索引 → 提问编码 → 余弦相似度取 Top-3 → 拼接上下文 问题送大模型生成无 API key 则退化为检索模式返回片段→ Gradio 网页交互。输出命令行测试 Gradio 网页返回回答 运行模式 检索详情。目录结构15_rag_qa/ ├── main.py # 分块 嵌入 检索 生成 Gradio 界面 └── requirements.txt正确安装pipinstallsentence-transformers gradio numpy openai python main.py首次运行自动下载多语言 MiniLM 嵌入模型约 500MB需联网。大模型生成可选配置 OPENAI_API_KEY 等环境变量后即走生成未配置则退化为检索模式见下文「大模型生成模式」。运行方式pipinstall-rrequirements.txt python main.py# 命令行测试 启动 Gradiopython main.py --no-web# 仅命令行测试大模型生成模式可选默认为检索模式。若要让大模型基于上下文生成自然语言答案设置环境变量# PowerShellOpenAI 兼容接口均可如百炼/glm/通义/DeepSeek 等$env:OPENAI_API_KEYyour-key$env:OPENAI_API_BASEhttps://dashscope.aliyuncs.com/compatible-mode/v1$env:LLM_MODELqwen-pluspython main.py未配置 key 时自动退化为检索模式返回最相关片段依然可运行。说明嵌入模型paraphrase-multilingual-MiniLM-L12-v2首次运行需联网下载。向量库用 numpy 实现余弦相似度无需安装 FAISS 即可跑通。知识库内置在main.py的DOCUMENTS中可自行替换为任意文档。预期结果命令行先测试 3 个问题浏览器打开 Gradio提问得到回答 运行模式 检索详情扩展方向用 FAISS / Chroma 替换 numpy 检索支持百万级文档加载本地 PDF/Markdown 文档库LangChain 加载器加入重排序模型reranker提升检索精度支持多轮对话与引用溯源工程源码main.py 入门实践工程十五基于 RAG 的知识库问答检索增强生成 构建完整 RAG 流水线文档分块 - 向量化 - 本地向量检索 - 拼接上下文 - 调用大模型生成答案。 内置一份 AI/Python 知识库文档无需额外准备。 大模型调用可选设置了 OPENAI_API_KEY OPENAI_API_BASE 即走生成 否则退化为检索模式返回最相关片段 模板回复。 运行 python main.py # 命令行问答 Gradio 网页界面 importargparseimportosimportre BASE_DIRos.path.dirname(os.path.abspath(__file__))# ---------------- 内置知识库文档 ----------------DOCUMENTS[PyTorch 是一个基于 Python 的开源深度学习框架由 Meta原 FacebookAI 研究团队开发并维护。 它采用动态计算图机制定义即运行调试方便深受研究者欢迎。 PyTorch 的核心数据结构是张量Tensor类似于 NumPy 的 ndarray但支持 GPU 加速与自动求导。 常用模块包括torch.nn神经网络层、torch.optim优化器、torch.utils.data数据加载。 训练循环通常包含前向传播、计算损失、反向传播、优化器更新四个步骤。,卷积神经网络CNN是一类专门处理具有网格结构数据如图像的深度学习模型。 它通过卷积层提取局部特征、池化层降采样降维、全连接层完成分类。 典型结构有 LeNet、AlexNet、VGG、ResNet 等。ResNet 引入残差连接解决了深层网络梯度消失问题 使得训练上百层的网络成为可能。CNN 在图像分类、目标检测、语义分割等视觉任务上表现优异。,BERTBidirectional Encoder Representations from Transformers是 Google 于 2018 年提出的预训练语言模型。 它基于 Transformer 的编码器使用双向自注意力机制在大规模无标注文本上做掩码语言模型预训练。 微调后可用于文本分类、命名实体识别、问答系统等多种 NLP 任务。 BERT 的出现大幅提升了多项自然语言理解任务的基准是预训练模型的里程碑。,梯度下降是机器学习中最常用的优化算法通过沿损失函数梯度负方向更新参数来最小化损失。 常见变体批量梯度下降BGD使用全部样本、随机梯度下降SGD使用单个样本、小批量梯度下降使用一批样本。 为加速收敛与稳定训练发展出 Momentum、AdaGrad、RMSProp、Adam 等自适应优化器。 Adam 结合了 Momentum 的动量思想与 RMSProp 的自适应学习率是当前最常用的优化器之一。,RAGRetrieval-Augmented Generation检索增强生成是一种结合检索与生成的大模型应用范式。 它先从知识库中检索与用户问题相关的文档片段再将检索到的上下文与问题一起送入大模型 让模型基于上下文生成答案从而缓解大模型的幻觉问题并支持私有知识。 RAG 的关键组件包括文档分块、嵌入模型、向量数据库、检索器、生成模型。 常见向量数据库有 FAISS、Milvus、Chroma 等分块策略常用固定长度窗口或按语义边界切分。,]# ---------------- 文档分块 ----------------defchunk_text(text,chunk_size200,overlap40):按字符长度分块带重叠。textre.sub(r\s, ,text).strip()chunks[]i0whileilen(text):chunks.append(text[i:ichunk_size])ichunk_size-overlapreturnchunksdefbuild_corpus():chunks[]fordocinDOCUMENTS:chunks.extend(chunk_text(doc))returnchunks# ---------------- 向量库 检索器 ----------------classVectorStore:def__init__(self,model_nameparaphrase-multilingual-MiniLM-L12-v2):fromsentence_transformersimportSentenceTransformer self.modelSentenceTransformer(model_name)self.chunksbuild_corpus()print(f知识库分块完成共{len(self.chunks)}个片段)self.embeddingsself.model.encode(self.chunks,normalize_embeddingsTrue)defretrieve(self,query,top_k3):q_embself.model.encode([query],normalize_embeddingsTrue)sims(q_emb self.embeddings.T)[0]# 余弦相似度top_idxsims.argsort()[::-1][:top_k]return[(self.chunks[i],float(sims[i]))foriintop_idx]# ---------------- 生成器可选大模型 ----------------defgenerate_answer(query,context_chunks):若配置了 OpenAI 兼容接口则调用大模型生成否则走模板回复。api_keyos.environ.get(OPENAI_API_KEY)base_urlos.environ.get(OPENAI_API_BASE)oros.environ.get(LLM_BASE_URL)modelos.environ.get(LLM_MODEL,gpt-3.5-turbo)context\n\n.join(context_chunks)ifapi_key:try:fromopenaiimportOpenAI clientOpenAI(api_keyapi_key,base_urlbase_url)respclient.chat.completions.create(modelmodel,messages[{role:system,content:你是一个知识库问答助手仅根据提供的上下文回答问题。若上下文没有相关信息请说明知识库中未包含该内容。},{role:user,content:f上下文\n{context}\n\n问题{query}},],temperature0.3,)returnresp.choices[0].message.content.strip(),TrueexceptExceptionase:returnf[大模型调用失败:{e}退化为检索结果],False# 检索模式reply(未检测到 LLM_API_KEY/OPENAI_API_KEY当前为检索模式仅返回相关上下文。\n\n最相关片段\ncontext)returnreply,False# ---------------- 问答主流程 ----------------defask(store:VectorStore,query:str,top_k:int3):resultsstore.retrieve(query,top_ktop_k)context_chunks[r[0]forrinresults]answer,used_llmgenerate_answer(query,context_chunks)mode生成模式ifused_llmelse检索模式detail\n.join(f· 相似度{s:.2f}{c[:60]}...forc,sinresults)returnanswer,mode,detaildefbuild_gradio(store:VectorStore):importgradioasgrdefanswer_fn(query):ifnotquery.strip():return请输入问题。,,ans,mode,detailask(store,query)returnans,mode,detailwithgr.Blocks(titleRAG 知识库问答)asdemo:gr.Markdown(# RAG 知识库问答 Demo\n内置 AI/Python 知识库提问后将检索相关片段并由大模型生成答案。)inpgr.Textbox(label你的问题,placeholder例如PyTorch 的训练循环包含哪些步骤)withgr.Row():outgr.Textbox(label回答,lines5)modegr.Textbox(label运行模式)detailgr.Textbox(label检索详情,lines3)btngr.Button(提问)btn.click(answer_fn,inputsinp,outputs[out,mode,detail])gr.Examples(examples[什么是 RAG,Adam 优化器有什么特点,ResNet 解决了什么问题],inputsinp,)returndemodefmain():parserargparse.ArgumentParser()parser.add_argument(--no-web,actionstore_true,help只跑命令行不启动 Gradio)argsparser.parse_args()print(加载嵌入模型首次需联网下载...)storeVectorStore()print(\n--- 命令行快速测试 ---)forqin[什么是 RAG,Adam 优化器有什么特点,BERT 是什么]:ans,mode,_ask(store,q)print(f\nQ:{q}[{mode}]\nA:{ans[:200]}\n{-*60})ifnotargs.no_web:print(\n启动 Gradio 网页界面 ...)demobuild_gradio(store)demo.launch()if__name____main__:main()