从0开始做基于 RAG 架构的多源非结构化数据自动化 ETL 与知识库构建系统(知识检索与大模型智能问答部分)
第一步新建一个总控脚本 src/app.py完整代码如下import os import sys from loguru import logger from langchain_community.vectorstores import FAISS from langchain_zhipu import ZhipuAIEmbeddings, ChatZhipuAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough class RAGQueryEngine: def __init__(self, db_dir: str): 初始化 RAG 智能问答引擎 :param db_dir: 本地已生成的 FAISS 向量资产目录路径 self.db_dir db_dir # 1. 声明与数据入库时 100% 绝对一致的云端 Embedding 路由若维度对不齐余弦相似度会报错 self.embeddings ZhipuAIEmbeddings( api_keyc343f9d987ef460286a030c6ead013c6.mh6aVsGC2E5TkMuE ) # 2. 物理检查本地资产是否存在防止空指针调用 if not os.path.exists(os.path.join(db_dir, index.faiss)): logger.error(f❌ 找不到本地向量资产请确保 {db_dir} 目录下有 index.faiss 文件。) sys.exit(1) logger.info( 正在从 D 盘载入本地 FAISS 高维矩阵资产...) # allow_dangerous_deserializationTrue 是 LangChain 对加载本地 pkl 账本的安全验证自己生成的资产可放心开启 self.vector_store FAISS.load_local( folder_pathself.db_dir, embeddingsself.embeddings, allow_dangerous_deserializationTrue ) logger.success(✅ 本地向量资产内存级装载完毕高维拉网索引就绪) # 3. 实例化智谱大模型选用最新旗舰大模型 GLM-4-Flash / GLM-4控制温度为 0.1 实现最高学术严谨度 logger.info( 正在激活云端大模型思考引擎...) self.llm ChatZhipuAI( api_keyc343f9d987ef460286a030c6ead013c6.mh6aVsGC2E5TkMuE, modelglm-4-flash, temperature0.1 # 核心参数温度越低大模型说话越死板严谨绝不胡说八道RAG黄金铁律 ) logger.success(✅ 云端大模型网关连接成功) def format_docs(self, docs): 【工业级溯源编排】将检索到的多个 Top-K 文本块进行物理拼接并注入元数据信息 formatted_context [] for i, doc in enumerate(docs): source_file doc.metadata.get(source, 未知文献) chunk_info f--- [参考片段 {i1}来源文献: {source_file}] ---\n{doc.page_content}\n formatted_context.append(chunk_info) return \n.join(formatted_context) def ask(self, question: str): 核心 RAG 闭环高维捞针 - 构建Prompt - 大模型严谨作答 - 精准溯源 logger.info(f 收到用户提问: {question}正在执行高维语义空间拉网检索...) # ----------------------------------------------------------------- # STEP 1: Retrieval (高维捞针) # 将用户的中文问题一键向量化并在内存矩阵里进行高速余弦相似度计算捞出最相关的 4 个片段 # ----------------------------------------------------------------- retriever self.vector_store.as_retriever(search_kwargs{k: 4}) retrieved_docs retriever.get_relevant_documents(question) if not retrieved_docs: logger.warning(⚠️ 在本地向量库中未能检索到任何相关上下文片段) context_str 未找到相关本地文献。 else: logger.success(f 成功捞出 {len(retrieved_docs)} 个高价值学术片段正在进行上下文格式化与溯源对齐...) context_str self.format_docs(retrieved_docs) # ----------------------------------------------------------------- # STEP 2: Prompt Engineering (工业级安全提示词工程) # 用最死板的指令死死约束大模型的意志强迫它必须“依据事实”回答 # ----------------------------------------------------------------- template 你是一个极其严谨的军事科研助手的 AI 协作者。请严格根据以下给出的本地参考文献内容来回答用户的专业问题。 如果问题在参考内容中没有提及请直接回答“根据本地知识库未找到相关学术依据拒绝回答”绝对不允许凭空捏造、瞎编乱造。 回答时请保持学术的客观性、条理性和严密性。 【本地参考文献内容】 {context} 【用户需要解答的问题】 {question} 高级答复方案请分条清晰列出并注明依据的参考片段 prompt ChatPromptTemplate.from_template(template) # ----------------------------------------------------------------- # STEP 3: Chain Execution (极简声明式 LCEL 表达式声明) # 拼装 LangChain 最新的极简数据流执行链 # ----------------------------------------------------------------- rag_chain ( {context: lambda x: context_str, question: RunnablePassthrough()} | prompt | self.llm | StrOutputParser() ) # ----------------------------------------------------------------- # STEP 4: Output (大模型开口说话) # ----------------------------------------------------------------- logger.info( 提示词注入完毕云端大模型正在深度思考中...) response rag_chain.invoke(question) print(\n *40 RAG 智能检索答复系统 *40) print(response) print(*102 \n) if __name__ __main__: # 指向你刚才构建完毕的本地 FAISS 向量资产文件夹 VECTOR_DB_DIRECTORY ./data/vector_db engine RAGQueryEngine(db_dirVECTOR_DB_DIRECTORY) # 【 测试大火开打】输入一个针对你刚刚入库的联邦学习论文的硬核专业问题 # 比如你的论文是针对 Non-IID 场景的联邦学习算法优化我们就针对性地拷问它 test_question 针对Non-IID数据场景有哪些常见的联邦学习算法优化研究策略它们是如何解决非独立同分布问题的 engine.ask(test_question)第二步app.py运行测试python src/app.py预设问题可以根据提供的PDF文献内容进行替换。test_question 针对Non-IID数据场景有哪些常见的联邦学习算法优化研究策略第三步架好前端微框架pip install streamlit第四步编写问答网页端src/web_app.py完整代码如下import streamlit as pd # import streamlit as st import os from app import RAGQueryEngine from loguru import logger # # 1. 网页全局配置设置极客范的标签页图标、标题与宽屏布局 # st.set_page_config( page_titleAura RAG - 专属助手, page_icon, layoutwide ) # # 2. 内存级单例模式缓存防止 Streamlit 每次刷新页面都重复从D盘加载资产 # st.cache_resource def init_rag_engine(): VECTOR_DB_DIRECTORY ./data/vector_db # 直接初始化你在 app.py 里写好的 RAG 智脑 return RAGQueryEngine(db_dirVECTOR_DB_DIRECTORY) try: rag_engine init_rag_engine() except Exception as e: st.error(f❌ 向量资产初始化失败请确保你已运行 pipeline.py 生成本地库错误原因: {str(e)}) st.stop() # # 3. 侧边栏Sidebar数据资产看板设计 # with st.sidebar: st.title( 智能资产看板) st.subheader(当前挂载向量底座) st.info( 引擎类型: FAISS (纯数学矩阵版)\n\n 资产路径: ./data/vector_db) st.divider() st.subheader(️ 审计状态记录) # 读取指纹账本在网页端直观展现当前已经吞入的所有文献 log_file_path ./data/vector_db/processed_files.txt if os.path.exists(log_file_path): with open(log_file_path, r, encodingutf-8) as lf: hashes [line.strip() for line in lf if line.strip()] st.success(f已成功冷沉淀文献指纹: {len(hashes)} 个) else: st.warning(暂无历史审计指纹账本) st.divider() st.caption(Developed by Aura Collaborative Pipeline © 2026) # # 4. 主界面Main Body高颜值 UI 设计 # st.title( Aura RAG 专属科研助手) st.markdown(---) # 初始化 Streamlit 的会话状态Session State用来记住页面刷新前的聊天历史 if messages not in st.session_state: st.session_state.messages [ {role: assistant, content: 你好我是你的专属科研助手。我已经全量装载了本地向量资产。请针对入库的文献如联邦学习算法优化、反洗钱监管评价、考研政治等向我进行硬核拷问} ] # 渲染历史聊天记录让网页看起来具有像 ChatGPT 一样的连续对话质感 for message in st.session_state.messages: with st.chat_message(message[role]): st.markdown(message[content]) # # 5. 核心交互输入框与 RAG 数据流对接 # if question : st.chat_input(请输入你的专业问题...): # 1. 立即在网页上渲染出用户刚才说的话 st.session_state.messages.append({role: user, content: question}) with st.chat_message(user): st.markdown(question) # 2. 拉起大模型思考动画Spinner with st.chat_message(assistant): with st.spinner( 正在检索本地高维矩阵并召回真理片段云端大模型深度思考中...): try: # ------------------------------------------------------------- # 【硬核跨文件调用】 # 为了在网页端不仅展示大模型的最终长句还能单独把“捞出了哪些片段”抓出来 # 我们直接借用我们之前在 app.py 里沉淀下来的检索逻辑。 # ------------------------------------------------------------- # 临时利用 retriever 抓取本次问答的支撑片段展示在网页的折叠面板里 retriever rag_engine.vector_store.as_retriever(search_kwargs{k: 4}) retrieved_docs retriever.get_relevant_documents(question) # 调用我们在 app.py 里重构的高级大模型生成链 # 我们将原本直接打印在控制台的输出拦截并重定向到网页端 # 为了获取干净的答复我们直接借用原本编写好的闭环逻辑 # 构建最死板的指令模板 template 你是一个极其严谨的科研助手的 AI 协作者。请严格根据以下给出的本地参考文献内容来回答用户的专业问题。 如果问题在参考内容中没有提及请直接回答“根据本地知识库未找到相关学术依据拒绝回答”绝对不允许凭空捏造、瞎编乱造。 回答时请保持学术的客观性、条理性和严密性。 【本地参考文献内容】 {context} 【用户需要解答的问题】 {question} from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser prompt ChatPromptTemplate.from_template(template) context_str rag_engine.format_docs(retrieved_docs) rag_chain ( {context: lambda x: context_str, question: lambda x: x} | prompt | rag_engine.llm | StrOutputParser() ) # 扔给智谱云端拿到最终答复 response rag_chain.invoke(question) # 3. 网页端高颜值渲染用折叠面板Expander把后台捞出来的“真理片段”亮出来给用户看安全感拉满 if retrieved_docs: with st.expander( 查看本次答复所依据的本地参考文献片段RAG 溯源): st.markdown(ftext\n{context_str}\n) # 4. 渲染大模型的最终严谨正文 st.markdown(response) # 5. 将大模型的回答存入历史记忆防止刷新丢失 st.session_state.messages.append({role: assistant, content: response}) except Exception as e: st.error(f❌ 抱歉处理您的请求时发生异常: {str(e)})第五步web_app.py运行测试streamlit run src/web_app.py敲下回车后控制台会闪过几行本地服务器启动日志紧接着Windows 系统的默认浏览器会自动啪地一声弹出一个崭新的网页标签页。在下方的对话框里再次输入你的专业问题或者随便考它一个论文里的细节。页面上会亮起炫酷的流式思考动画随后大模型不仅会吐出严谨至极的学术解答你还能点击那个“查看本次答复所依据的本地参考文献片段”的折叠框把后台 FAISS 高维捞针抓出来的原文像证据一样展示在网页正中央写的乱七八糟仅作为问答示例展示。第六步Git同步# 1. 将所有代码改动一次性提交到暂存区 git add . # 2. 正式提交并记录 git commit -m feat: 引入FAISS矩阵检索优化 Windows 环境并上线 Streamlit 网页端这个项目就这样暂时完成了这是一个非常简单的智能问答网站上线时间联网搜索这些功能都没有配备还有很多很多改进空间希望我的文章能够帮助到诸君共勉。

相关新闻

Java程序员AI开发新姿势!LangChain4j零基础入门+SpringBoot实战

Java程序员AI开发新姿势!LangChain4j零基础入门+SpringBoot实战

我们是由枫哥组建的IT技术团队,成立于2017年,致力于帮助IT从业者提供实力,成功入职理想企业,我们提供一对一学习辅导,由知名大厂导师指导,分享Java技术、参与项目实战等服务,并为学员定制职业规…

2026/10/16 10:16:21 阅读更多 →
MLX框架入门:为什么Inkling-mlx-2bit是Apple Silicon的最佳选择

MLX框架入门:为什么Inkling-mlx-2bit是Apple Silicon的最佳选择

MLX框架入门:为什么Inkling-mlx-2bit是Apple Silicon的最佳选择 【免费下载链接】Inkling-mlx-2bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Inkling-mlx-2bit Inkling-mlx-2bit是基于MLX框架构建的2bit量化模型,专为Apple …

2026/10/16 22:18:06 阅读更多 →
GripMock安全最佳实践:保护你的Mock服务器免受攻击

GripMock安全最佳实践:保护你的Mock服务器免受攻击

GripMock安全最佳实践:保护你的Mock服务器免受攻击 【免费下载链接】gripmock gRPC Mock Server 项目地址: https://gitcode.com/gh_mirrors/gr/gripmock GripMock作为一款功能强大的gRPC Mock服务器,在为开发团队提供便捷API测试环境的同时&…

2026/10/17 6:05:47 阅读更多 →

最新新闻

FAB工程师谈副业:哪些方向真正可行

FAB工程师谈副业:哪些方向真正可行

一、痛点背景:从一次真实的生产事故说起FAB工程师谈副业:哪些方向真正可行这个问题,在FAB里不是一天两天了。我见过太多工程师踩坑:要么是方法用错导致数据误判,要么是工具选型失误导致项目延期,要么是流程…

2026/10/17 6:34:58 阅读更多 →
从 Suno 迁移到 ACE-Step UI:本地免费生成完整歌曲,5 步跑通

从 Suno 迁移到 ACE-Step UI:本地免费生成完整歌曲,5 步跑通

从 Suno 迁移到 ACE-Step UI:本地免费生成完整歌曲,5 步跑通 【免费下载链接】ace-step-ui 🎵 The Ultimate Open Source Suno Alternative - Professional UI for ACE-Step 1.5 AI Music Generation. Free, local, unlimited. Stop paying f…

2026/10/17 6:34:58 阅读更多 →
lol-skins 仓库中的 Dissonance of Pentakill Viego 幻彩皮肤(Chroma)完整指南:ID 对照、压缩包结构与本地资源说明

lol-skins 仓库中的 Dissonance of Pentakill Viego 幻彩皮肤(Chroma)完整指南:ID 对照、压缩包结构与本地资源说明

【免费下载链接】lol-skins Comprehensive collection of League of Legends skins available for custom use. 项目地址: https://gitcode.com/gh_mirrors/lo/lol-skins 点击查看 免费下载 导读 本文面向 League of Legends(英雄联盟)自定…

2026/10/17 6:34:58 阅读更多 →
RenoDX 实战指南:5步跑通着色器热替换调试闭环,附卡顿崩溃避坑速查

RenoDX 实战指南:5步跑通着色器热替换调试闭环,附卡顿崩溃避坑速查

RenoDX 实战指南:5步跑通着色器热替换调试闭环,附卡顿崩溃避坑速查 【免费下载链接】renodx Renovation Engine for DirectX Games 项目地址: https://gitcode.com/GitHub_Trending/re/renodx 你改好的着色器放进目录、重启游戏,画面却…

2026/10/17 6:34:58 阅读更多 →
RenoDX安装配置完整指南:三步从零构建你的DirectX游戏MOD工具

RenoDX安装配置完整指南:三步从零构建你的DirectX游戏MOD工具

RenoDX安装配置完整指南:三步从零构建你的DirectX游戏MOD工具 【免费下载链接】renodx Renovation Engine for DirectX Games 项目地址: https://gitcode.com/GitHub_Trending/re/renodx RenoDX 是一款开源的 DirectX 游戏 MOD 工具(英文全称 &qu…

2026/10/17 6:34:58 阅读更多 →
刻蚀设备PM后首件:为什么总是不稳定

刻蚀设备PM后首件:为什么总是不稳定

一、痛点背景:从一次真实的生产事故说起刻蚀设备PM后首件:为什么总是不稳定这个问题,在FAB里不是一天两天了。我见过太多工程师踩坑:要么是方法用错导致数据误判,要么是工具选型失误导致项目延期,要么是流程…

2026/10/17 6:33:58 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →