从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 网页端这个项目就这样暂时完成了这是一个非常简单的智能问答网站上线时间联网搜索这些功能都没有配备还有很多很多改进空间希望我的文章能够帮助到诸君共勉。

相关新闻

智能刷题 Coach 的反馈闭环:做题、评估与弱点定位的自动化流程

智能刷题 Coach 的反馈闭环:做题、评估与弱点定位的自动化流程

智能刷题 Coach 的反馈闭环:做题、评估与弱点定位的自动化流程 一、刷了 500 道题,动态规划还是做不好,问题出在哪 很多刷题者经历过这样的场景:LeetCode 上刷了几个月,题量上去了,但某类问题&#xff08…

2026/7/19 17:17:35阅读更多 →
mlx-community/gemma-4-e2b-it-mxfp8模型架构解析: vision_config与text_config如何协同工作?

mlx-community/gemma-4-e2b-it-mxfp8模型架构解析: vision_config与text_config如何协同工作?

mlx-community/gemma-4-e2b-it-mxfp8模型架构解析: vision_config与text_config如何协同工作? 【免费下载链接】gemma-4-e2b-it-mxfp8 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/gemma-4-e2b-it-mxfp8 mlx-community/gemma-4-…

2026/7/19 17:17:35阅读更多 →
排序算法时间复杂度常系数的工程意义:O(n log n) 也有快慢之分

排序算法时间复杂度常系数的工程意义:O(n log n) 也有快慢之分

排序算法时间复杂度常系数的工程意义:O(n log n) 也有快慢之分 一、归并排序和快速排序都是 O(n log n),为什么工程中几乎不用归并 这是一个在学完时间复杂度理论之后很容易产生的困惑。算法课上教的:归并排序 O(n log n),稳定&am…

2026/7/19 17:17:35阅读更多 →
ngx_output_chain_get_buf

ngx_output_chain_get_buf

1 定义 ngx_output_chain_get_buf 函数 定义在 src/core/ngx_output_chain.cstatic ngx_int_t ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize) {size_t size;ngx_buf_t *b, *in;ngx_uint_t recycled;in ctx->in->buf;size ctx->buf…

2026/7/20 0:15:05阅读更多 →
互联网大厂常见Java面试题及答案汇总(2026持续更新)

互联网大厂常见Java面试题及答案汇总(2026持续更新)

金九银十即将来袭,又是一个跳槽的好季节,准备跳槽的同学都摩拳擦掌准备大面好几场,今天为大家准备了互联网面试必备的 1 到 5 年 Java 面试者都需要掌握的面试题,分别 JVM,并发编程,MySQL,Tomca…

2026/7/20 0:15:05阅读更多 →
python数据可视化技巧的100个练习 -- 31. 类别数据的点图

python数据可视化技巧的100个练习 -- 31. 类别数据的点图

重要性★★★☆☆ 难度★★☆☆☆ 你是一家零售公司的数据分析师。你的经理要求你可视化最近产品发布的客户满意度评级分布。评级是分类的,范围从“非常不满意”到“非常满意”。创建一个点图以显示每个评级类别的频率。使用 Python 进行数据处理和可视化。在代码中生成输入…

2026/7/20 0:13:05阅读更多 →
智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

在2026世界人工智能大会(WAIC 2026)举办期间,千里科技董事长、阶跃星辰董事长印奇作为特邀嘉宾出席大会开幕式并在大会主论坛(上午场)发表主题演讲《当智能体进入物理世界》。在印奇看来,"智能体"…

2026/7/20 0:13:05阅读更多 →
商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

7月18日,在WAIC 2026商汤科技 “基座大模型架构创新与生态合作论坛”上,商汤科技联合创始人、大装置事业群总裁杨帆发表《智变共生——加速AI基础设施持续升级》主题演讲,系统呈现了商汤大装置国产AI基础设施“技术-生态-商业”闭环布局&…

2026/7/20 0:13:05阅读更多 →
2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026年想在郑州学美发,很多零基础学员最先搜索的问题就是:郑州美发学校哪家好?这个问题没有一个只看学校名字就能得出的答案。因为不同学校的课程方向、学习周期、教学方式和适合人群并不一样。有的更适合零基础,有的偏向发型师进修,还有的只做某一项短期技术培训。对于完全没…

2026/7/20 0:11:05阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/20 0:50:54阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/20 0:50:54阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/20 0:50:54阅读更多 →
2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

2026/7/20 0:01:04阅读更多 →
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

2026/7/20 0:01:04阅读更多 →
C# 将逗号分割的字符串转换为long,并添加到List<long>

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

2026/7/20 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/19 22:50:49阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →